⚡️ Reduce the refresh on passages update to the TtwPassage component
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { createContext, createSignal, JSX } from 'solid-js';
|
||||
import { batch, createContext, createSignal, JSX } from 'solid-js';
|
||||
import { createStore } from 'solid-js/store';
|
||||
|
||||
import { Line, Lines, Passage, Passages, Stop, Stops } from './types';
|
||||
@@ -7,8 +7,11 @@ import { Line, Lines, Passage, Passages, Stop, Stops } from './types';
|
||||
export interface BusinessDataStore {
|
||||
getLine: (lineId: string) => Promise<Line>;
|
||||
getLinePassages: (lineId: string) => Record<string, Passage[]>;
|
||||
getLineDestinations: (lineId: string) => string[];
|
||||
getDestinationPassages: (lineId: string, destination: string) => Passage[];
|
||||
|
||||
passages: () => Passages;
|
||||
getPassagesLineIds: () => string[];
|
||||
refreshPassages: (stopId: number) => Promise<void>;
|
||||
addPassages: (passages: Passages) => void;
|
||||
clearPassages: () => void;
|
||||
@@ -46,12 +49,24 @@ export function BusinessDataProvider(props: { children: JSX.Element }) {
|
||||
|
||||
const getLinePassages = (lineId: string): Record<string, Passage[]> => {
|
||||
return store.passages[lineId];
|
||||
};
|
||||
}
|
||||
|
||||
const getLineDestinations = (lineId: string): string[] => {
|
||||
return Object.keys(store.passages[lineId]);
|
||||
}
|
||||
|
||||
const getDestinationPassages = (lineId: string, destination: string): Passage[] => {
|
||||
return store.passages[lineId][destination];
|
||||
}
|
||||
|
||||
const passages = (): Passages => {
|
||||
return store.passages;
|
||||
}
|
||||
|
||||
const getPassagesLineIds = (): string[] => {
|
||||
return Object.keys(store.passages);
|
||||
}
|
||||
|
||||
const _cleanupPassages = (passages: Passages): void => {
|
||||
const deadline = Math.floor(Date.now() / 1000) - 60;
|
||||
for (const linePassages of Object.values(passages)) {
|
||||
@@ -64,7 +79,6 @@ export function BusinessDataProvider(props: { children: JSX.Element }) {
|
||||
}
|
||||
}
|
||||
linePassages[destination] = cleaned;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -79,20 +93,45 @@ export function BusinessDataProvider(props: { children: JSX.Element }) {
|
||||
}
|
||||
|
||||
const addPassages = (passages: Passages): void => {
|
||||
const storePassages = store.passages;
|
||||
for (const lineId of Object.keys(passages)) {
|
||||
const newLinePassages = passages[lineId];
|
||||
const linePassages = storePassages[lineId];
|
||||
if (linePassages === undefined) {
|
||||
setStore('passages', lineId, newLinePassages);
|
||||
}
|
||||
else {
|
||||
for (const destination of Object.keys(newLinePassages)) {
|
||||
const newLinePassagesDestination = newLinePassages[destination];
|
||||
setStore('passages', lineId, destination, newLinePassagesDestination);
|
||||
batch(() => {
|
||||
const storePassages = store.passages;
|
||||
for (const lineId of Object.keys(passages)) {
|
||||
const newLinePassages = passages[lineId];
|
||||
const linePassages = storePassages[lineId];
|
||||
if (linePassages === undefined) {
|
||||
setStore('passages', lineId, newLinePassages);
|
||||
}
|
||||
else {
|
||||
for (const destination of Object.keys(newLinePassages)) {
|
||||
const newLinePassagesDestination = newLinePassages[destination];
|
||||
const linePassagesDestination = linePassages[destination];
|
||||
if (linePassagesDestination === undefined) {
|
||||
setStore('passages', lineId, destination, newLinePassagesDestination);
|
||||
}
|
||||
else {
|
||||
if (linePassagesDestination.length - newLinePassagesDestination.length != 0) {
|
||||
console.log(`Server provides ${newLinePassagesDestination.length} passages, \
|
||||
${linePassagesDestination.length} here... refresh all them.`);
|
||||
setStore('passages', lineId, destination, newLinePassagesDestination);
|
||||
}
|
||||
else {
|
||||
linePassagesDestination.forEach((passage, index) => {
|
||||
const newPassage = newLinePassagesDestination[index];
|
||||
if (passage.expectedDepartTs != newPassage.expectedDepartTs) {
|
||||
console.log(`Refresh expectedDepartTs (${passage.expectedDepartTs} -> ${newPassage.expectedDepartTs}`);
|
||||
setStore('passages', lineId, destination, index, 'expectedDepartTs', newPassage.expectedDepartTs);
|
||||
}
|
||||
if (passage.expectedArrivalTs != newPassage.expectedArrivalTs) {
|
||||
console.log(`Refresh expectedArrivalTs (${passage.expectedArrivalTs} -> ${newPassage.expectedArrivalTs}`);
|
||||
setStore('passages', lineId, destination, index, 'expectedArrivalTs', newPassage.expectedArrivalTs);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const clearPassages = (): void => {
|
||||
@@ -124,7 +163,8 @@ export function BusinessDataProvider(props: { children: JSX.Element }) {
|
||||
|
||||
return (
|
||||
<BusinessDataContext.Provider value={{
|
||||
getLine, getLinePassages, passages, refreshPassages, addPassages, clearPassages, getStop, searchStopByName
|
||||
getLine, getLinePassages, getLineDestinations, getDestinationPassages, passages, getPassagesLineIds,
|
||||
refreshPassages, addPassages, clearPassages, getStop, searchStopByName
|
||||
}}>
|
||||
{props.children}
|
||||
</BusinessDataContext.Provider>
|
||||
|
Reference in New Issue
Block a user