import { Manrope_400Regular, Manrope_600SemiBold, Manrope_700Bold, Manrope_800ExtraBold, useFonts, } from '@expo-google-fonts/manrope'; import NetInfo from '@react-native-community/netinfo'; import AsyncStorage from '@react-native-async-storage/async-storage'; import { createAsyncStoragePersister } from '@tanstack/query-async-storage-persister'; import { onlineManager, QueryClient } from '@tanstack/react-query'; import { PersistQueryClientProvider } from '@tanstack/react-query-persist-client'; import { Stack } from 'expo-router'; import { StatusBar } from 'expo-status-bar'; import { useEffect, useState } from 'react'; import { HorsLigneProvider } from '@/auth/session'; import { chargerFile } from '@/file/store'; import { rejouer } from '@/file/synchro'; import { useTokens } from '@/theme/tokens'; /** Racine de l'app (D1 validée) : le cache TanStack est PERSISTÉ dans * AsyncStorage — les OT lus restent lisibles hors-ligne, y compris après * redémarrage. NetInfo pilote onlineManager (pas de retry dans le vide) * et le drapeau hors-ligne des écrans. */ const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 60_000, gcTime: 7 * 24 * 3600_000, // une semaine de lecture hors-ligne retry: 1, }, }, }); const persister = createAsyncStoragePersister({ storage: AsyncStorage, key: 'siop.cache', }); export default function RacineApp() { const t = useTokens(); const [horsLigne, setHorsLigne] = useState(false); const [polices] = useFonts({ Manrope_400Regular, Manrope_600SemiBold, Manrope_700Bold, Manrope_800ExtraBold, }); useEffect(() => { // D1 : la file survit au redémarrage — on la recharge avant tout. void chargerFile().then(() => rejouer(queryClient)); return NetInfo.addEventListener((etat) => { const enLigne = !!etat.isConnected; onlineManager.setOnline(enLigne); setHorsLigne(!enLigne); if (enLigne) void rejouer(queryClient); // le retour du réseau vide la file }); }, []); if (!polices) return null; return ( ); }