import { createSyncStoragePersister } from "@tanstack/query-sync-storage-persister"; import { QueryClient, QueryKey, onlineManager } from "@tanstack/react-query"; import * as Network from 'expo-network'; import { MMKVStorage } from "../storages"; import { useNetworkStore } from "../storages/network"; export const BASE_URL = 'https://api.getwemap.com/v3.0'; export const persister = createSyncStoragePersister({ storage: MMKVStorage, }) export const queryClient = new QueryClient({ defaultOptions: { queries: { networkMode: 'always', refetchOnWindowFocus: false, gcTime: Infinity, staleTime: Infinity, retry: 0, }, } }); onlineManager.setEventListener((setOnline) => { return () => { Network.addNetworkStateListener((state) => { setOnline(state.isConnected ?? false) }) } }) export const queryAll = async (baseURL: URL, options: { slice: number, queryKey: QueryKey } = { slice: 100, queryKey: [] }) => { const totalResults: T[] = []; let count = 0; let offset = 0; baseURL.searchParams.set('limit', options.slice.toString()); do { baseURL.searchParams.set('offset', offset.toString()); const queryKey = ['queryAll', ...options.queryKey, offset]; const data: SearchResponse = await queryClient.fetchQuery({ queryKey: queryKey, queryFn: async () => { if (useNetworkStore.getState().isOnline) { const response = await fetch(baseURL).then((response) => response.json()); MMKVStorage.setItem(queryKey.toString(), JSON.stringify(response)); return response; } const cachedData = JSON.parse(MMKVStorage.getItem(queryKey.toString()) ?? 'null'); if (cachedData) return cachedData; throw new Error('Offline - cannot fetch data and cache is empty'); } }); count = count || data.count; totalResults.push(...data.results); offset += options.slice; } while (totalResults.length < count); return { count: count, next: null, previous: null, results: totalResults }; } export type SearchResponse = { count: number next: string | null; previous: string | null; results: T[]; }