Skip to content

Commit

Permalink
feat(deviation): deviations for stop place (#1365)
Browse files Browse the repository at this point in the history
  • Loading branch information
lindtvedtsebastian authored Dec 12, 2023
1 parent 13496c2 commit 5f21833
Show file tree
Hide file tree
Showing 10 changed files with 122 additions and 27 deletions.
7 changes: 5 additions & 2 deletions next-tavla/src/Board/scenarios/QuayTile/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,14 @@ export function QuayTile({
]
.filter(isNotNullOrUndefined)
.join(' ')

return (
<Tile className={classes.quayTile}>
<TableHeader heading={heading} />
<Table columns={columns} departures={data.quay.estimatedCalls} />
<Table
columns={columns}
departures={data.quay.estimatedCalls}
situations={data.quay.situations}
/>
</Tile>
)
}
1 change: 1 addition & 0 deletions next-tavla/src/Board/scenarios/StopPlaceTile/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export function StopPlaceTile({
<TableHeader heading={data.stopPlace.name} />
<Table
departures={data.stopPlace.estimatedCalls}
situations={data.stopPlace.situations}
columns={columns}
/>
</Tile>
Expand Down
13 changes: 2 additions & 11 deletions next-tavla/src/Board/scenarios/Table/components/Situations.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,11 @@
import { Situation } from './Situation'
import { useEffect, useState } from 'react'
import { TSituationFragment } from 'graphql/index'
import { useCycler } from '../useCycler'

function Situations({ situations }: { situations: TSituationFragment[] }) {
const [index, setIndex] = useState(0)

const index = useCycler(situations)
const numberOfSituations = situations.length

useEffect(() => {
if (numberOfSituations <= 1) {
return
}
const interval = setInterval(() => setIndex((i) => i + 1), 5000)
return () => clearInterval(interval)
}, [numberOfSituations])

if (!situations.length) return null
return <Situation situation={situations[index % numberOfSituations]} />
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { TSituationFragment } from 'graphql/index'
import { useCycler } from '../../useCycler'
import { Situation } from '../Situation'
import classes from './styles.module.css'

function StopPlaceDeviation({
situations,
}: {
situations?: TSituationFragment[]
}) {
const index = useCycler(situations)
const numberOfSituations = situations?.length ?? 0

if (!situations || numberOfSituations === 0) return null

return (
<div className={classes.deviation}>
<Situation situation={situations[index % numberOfSituations]} />
</div>
)
}

export { StopPlaceDeviation }
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
.deviation {
padding-bottom: 0.5em;
}

.header {
color: var(--table-header-color);
font-size: 0.7em;
margin-left: 0.25em;
margin-right: 0.25em;
padding-bottom: 0.5em;
}
36 changes: 22 additions & 14 deletions next-tavla/src/Board/scenarios/Table/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import { TDepartureFragment } from 'graphql/index'
import { TDepartureFragment, TSituationFragment } from 'graphql/index'
import React from 'react'
import { Destination } from './components/Destination'
import classes from './styles.module.css'
Expand All @@ -13,13 +13,16 @@ import { Platform } from './components/Platform'
import { ExpectedTime } from './components/Time/ExpectedTime'
import { Deviation } from './components/Deviation'
import { Line } from './components/Line'
import { StopPlaceDeviation } from './components/StopPlaceDeviation'

function Table({
departures,
columns,
situations,
}: {
departures: TDepartureFragment[]
columns?: TColumn[]
situations?: TSituationFragment[]
}) {
if (!columns || !isArray(columns))
return (
Expand All @@ -29,19 +32,24 @@ function Table({
)

return (
<div className={classes.table}>
<DeparturesContext.Provider value={departures}>
{columns.includes('aimedTime') && <AimedTime />}
{columns.includes('arrivalTime') && <ArrivalTime />}
{columns.includes('line') && <Line />}
{columns.includes('destination') && (
<Destination deviations={!columns.includes('deviations')} />
)}
{columns.includes('deviations') && <Deviation />}
{columns.includes('platform') && <Platform />}
{columns.includes('time') && <ExpectedTime />}
{columns.includes('realtime') && <RealTime />}
</DeparturesContext.Provider>
<div className="flexColumn">
<StopPlaceDeviation situations={situations} />
<div className={classes.table}>
<DeparturesContext.Provider value={departures}>
{columns.includes('aimedTime') && <AimedTime />}
{columns.includes('arrivalTime') && <ArrivalTime />}
{columns.includes('line') && <Line />}
{columns.includes('destination') && (
<Destination
deviations={!columns.includes('deviations')}
/>
)}
{columns.includes('deviations') && <Deviation />}
{columns.includes('platform') && <Platform />}
{columns.includes('time') && <ExpectedTime />}
{columns.includes('realtime') && <RealTime />}
</DeparturesContext.Provider>
</div>
</div>
)
}
Expand Down
18 changes: 18 additions & 0 deletions next-tavla/src/Board/scenarios/Table/useCycler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { useEffect, useState } from 'react'

function useCycler<T>(array: T[] | undefined, step = 5000) {
const [index, setIndex] = useState(0)

const length = array?.length ?? 0

useEffect(() => {
if (length <= 1) {
return
}
const interval = setInterval(() => setIndex((i) => i + 1), step)
return () => clearInterval(interval)
}, [length, step])
return index
}

export { useCycler }
34 changes: 34 additions & 0 deletions next-tavla/src/Shared/graphql/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,20 @@ export type TGetQuayQuery = {
}>
}>
}>
situations: Array<{
__typename?: 'PtSituationElement'
id: string
description: Array<{
__typename?: 'MultilingualString'
value: string
language: string | null
}>
summary: Array<{
__typename?: 'MultilingualString'
value: string
language: string | null
}>
}>
lines: Array<{
__typename?: 'Line'
id: string
Expand Down Expand Up @@ -248,6 +262,20 @@ export type TStopPlaceQuery = {
}>
}>
}>
situations: Array<{
__typename?: 'PtSituationElement'
id: string
description: Array<{
__typename?: 'MultilingualString'
value: string
language: string | null
}>
summary: Array<{
__typename?: 'MultilingualString'
value: string
language: string | null
}>
}>
} | null
}

Expand Down Expand Up @@ -384,6 +412,9 @@ export const GetQuayQuery = new TypedDocumentString(`
) {
...departure
}
situations {
...situation
}
}
}
fragment departure on EstimatedCall {
Expand Down Expand Up @@ -480,6 +511,9 @@ export const StopPlaceQuery = new TypedDocumentString(`
) {
...departure
}
situations {
...situation
}
}
}
fragment departure on EstimatedCall {
Expand Down
3 changes: 3 additions & 0 deletions next-tavla/src/Shared/graphql/queries/quay.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,8 @@ query getQuay(
) {
...departure
}
situations {
...situation
}
}
}
3 changes: 3 additions & 0 deletions next-tavla/src/Shared/graphql/queries/stopPlace.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,8 @@ query StopPlace(
) {
...departure
}
situations {
...situation
}
}
}

0 comments on commit 5f21833

Please sign in to comment.