61 lines
1.5 KiB
TypeScript
61 lines
1.5 KiB
TypeScript
import { batch, createContext, JSX } from 'solid-js';
|
|
import { createStore } from 'solid-js/store';
|
|
import { Marker as LeafletMarker } from 'leaflet';
|
|
|
|
import { Stop, Stops } from './types';
|
|
|
|
|
|
export type ByStopIdMarkers = Record<number, LeafletMarker[] | undefined>;
|
|
|
|
export interface SearchStore {
|
|
getFoundStops: () => Stop[];
|
|
setFoundStops: (stops: Stop[]) => void;
|
|
|
|
getDisplayedStops: () => Stop[];
|
|
setDisplayedStops: (stops: Stop[]) => void;
|
|
|
|
addMarkers: (stopId: number, markers: LeafletMarker[]) => void;
|
|
};
|
|
|
|
export const SearchContext = createContext<SearchStore>();
|
|
|
|
export function SearchProvider(props: { children: JSX.Element }) {
|
|
|
|
type Store = {
|
|
foundStops: Stop[];
|
|
markers: ByStopIdMarkers;
|
|
displayedStops: Stop[];
|
|
};
|
|
|
|
const [store, setStore] = createStore<Store>({ foundStops: [], markers: {}, displayedStops: [] });
|
|
|
|
const getFoundStops = (): Stop[] => {
|
|
return store.foundStops;
|
|
}
|
|
|
|
const setFoundStops = (stops: Stop[]): void => {
|
|
setStore('foundStops', stops);
|
|
}
|
|
|
|
const getDisplayedStops = (): Stop[] => {
|
|
return store.displayedStops;
|
|
}
|
|
|
|
const setDisplayedStops = (stops: Stop[]): void => {
|
|
setStore((s: Store) => {
|
|
setStore('displayedStops', stops);
|
|
return s;
|
|
});
|
|
}
|
|
|
|
const addMarkers = (stopId: number, markers: L.Marker[]): void => {
|
|
setStore('markers', stopId, markers);
|
|
}
|
|
|
|
return (
|
|
<SearchContext.Provider value={{ getFoundStops, setFoundStops, getDisplayedStops, setDisplayedStops, addMarkers }}>
|
|
{props.children}
|
|
</SearchContext.Provider>
|
|
);
|
|
}
|