import { GraphRouter, Itinerary } from "@wemap/routers"; import { TravelMode, Graph } from "@wemap/routers"; import { MULTIROUTER_URL } from "../core/constants"; import { queryClient } from "."; import type { MultiRouterResponse, MultiRouterRequest } from "../types"; import { useNetworkStore } from "../storages/network"; import { Coordinates } from "@wemap/geo"; import { MMKVStorage } from "../storages"; // TMP LOCAL GRAPH import localGraph from '../assets/graph.json'; export const itineraryKeys = { fetchItineraries: (from: string, to: string, mode: TravelMode) => ['itineraries', from, to, mode], } const getItineraryFromLocalGraph = (routerRequest: MultiRouterRequest) => { const router = new GraphRouter(Graph.fromJson(localGraph as any)); const start = new Coordinates(routerRequest.origin.lat, routerRequest.origin.lng); const end = new Coordinates(routerRequest.destination.lat, routerRequest.destination.lng); const route = router.calculateShortestPath(start, end).route(); const itinerary = Itinerary.fromGraphRoute(route); return itinerary; } export const fetchItineraries = async (routerRequest: MultiRouterRequest) => { const queryKey = itineraryKeys.fetchItineraries(routerRequest.origin.toString(), routerRequest.destination.toString(), routerRequest.travelMode); return queryClient.fetchQuery({ queryKey: queryKey, queryFn: async () => { const cachedData: MultiRouterResponse | null = JSON.parse(MMKVStorage.getItem(queryKey.toString()) ?? 'null'); if (useNetworkStore.getState().isOnline) { const response: MultiRouterResponse = await fetch(`${MULTIROUTER_URL}v2/compute-itineraries`, { method: 'POST', body: JSON.stringify(routerRequest), headers: { 'Content-Type': 'application/json' } }).then((response) => response.json()); MMKVStorage.setItem(queryKey.toString(), JSON.stringify(response)); return response; } else if (!cachedData && !useNetworkStore.getState().isOnline) { return { itineraries: [getItineraryFromLocalGraph(routerRequest).toJson()] }; } else if (cachedData) { return cachedData; } throw new Error('Offline - cannot fetch itineraries and cache is empty'); } }) }