import { Component, createEffect, createSignal, useContext } from "solid-js"; import { createStore } from "solid-js/store"; import { createDateNow } from "@solid-primitives/date"; import { format } from "date-fns"; import { BusinessDataContext } from "./businessData"; import { SearchContext } from "./search"; import { PassagesPanel } from "./passagesPanel"; import { getTransportModeSrc } from "./utils"; import styles from "./passagesDisplay.module.css"; export const PassagesDisplay: Component = () => { const maxPassagePerPanel = 5; const syncPeriodMsec = 20 * 1000; const { passages, getLine, getLinePassages, refreshPassages, clearPassages } = useContext(BusinessDataContext); // TODO: Use props instead const { getDisplayedStops } = useContext(SearchContext); const [displayedPanelId, setDisplayedPanelId] = createSignal(0); const [panels, setPanels] = createStore([]); const [dateNow] = createDateNow(1000); setInterval(() => { let nextPanelId = displayedPanelId() + 1; if (nextPanelId >= panels.length) { nextPanelId = 0; } setDisplayedPanelId(nextPanelId); }, 4000); createEffect(() => { console.log("######### onStopIdUpdate #########"); // Track local.stopIp to force dependency. console.log("getDisplayedStop=", getDisplayedStops()); clearPassages(); }); createEffect(async () => { console.log(`## OnPassageUpdate ${passages()} ##`); const stops = getDisplayedStops(); if (stops.length > 0) { refreshPassages(stops[0].id); } }); setInterval( async () => { const stops = getDisplayedStops(); if (stops.length > 0) { refreshPassages(stops[0].id); } }, syncPeriodMsec ); // TODO: Sort transport modes by weight const Header: Component = (props) => { const computeTransportModes = async (lineIds: Array) => { const lines = await Promise.all(lineIds.map((lineId) => getLine(lineId))); return new Set(lines.map((line) => getTransportModeSrc(line.transportMode, false))); } const [linesIds, setLinesIds] = createSignal([]); const [transportModeUrls] = createResource(linesIds, computeTransportModes); createEffect(() => { setLinesIds(Object.keys(props.passages)); }); return (
{(url) =>
}
{props.title}
{format(dateNow(), "HH:mm")}
); }; const Footer: Component = (props) => { return (
{(positioned) => { const { position } = positioned; return (
); }}
); } return (
{() => { setPanels([]); let newPanels = []; let positioneds = []; let index = 0; let chunk = {}; let chunkSize = 0; console.log("passages=", passages()); for (const lineId of Object.keys(passages())) { console.log("lineId=", lineId); const byLinePassages = getLinePassages(lineId); console.log("byLinePassages=", byLinePassages); const byLinePassagesKeys = Object.keys(byLinePassages); console.log("byLinePassagesKeys=", byLinePassagesKeys); if (byLinePassagesKeys.length <= maxPassagePerPanel - chunkSize) { chunk[lineId] = byLinePassages; chunkSize += byLinePassagesKeys.length; } else { const [store] = createStore(chunk); const panelid = index++; const panel = ; newPanels.push(panel); positioneds.push({ position: panelid, panel }); chunk = {}; chunk[lineId] = byLinePassages; chunkSize = byLinePassagesKeys.length; } } if (chunkSize) { const panelId = index++; const [store] = createStore(chunk); const panel = ; newPanels.push(panel); positioneds.push({ position: panelId, panel }); } setPanels(positioneds); return newPanels; }}
); };