import { useEffect, useState } from "react"; import { Stack } from "expo-router"; import { StatusBar } from "expo-status-bar"; import AsyncStorage from "@react-native-async-storage/async-storage"; import { QueryClient } from "@tanstack/react-query"; import { PersistQueryClientProvider } from "@tanstack/react-query-persist-client"; import { createAsyncStoragePersister } from "@tanstack/query-async-storage-persister"; import { useAuth } from "@/lib/auth"; import { AnalyticsProvider } from "@/lib/analytics"; import { BRAND } from "@/lib/brand"; import { t, useI18nVersion } from "@/lib/i18n"; import { colors } from "@/lib/theme"; import { LoadingView } from "@/components/ui"; /** * Rotlayout: React Query med AsyncStorage-persistens för Smart Cache/offline * (spec §44: cachelagrade recept, lager och inköpslista fungerar offline). */ const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 30_000, gcTime: 7 * 24 * 3600_000, // behåll cache en vecka för offline-läge retry: 1, }, }, }); const persister = createAsyncStoragePersister({ storage: AsyncStorage, key: `${BRAND.slug}-query-cache`, }); export default function RootLayout() { const hydrate = useAuth((s) => s.hydrate); const hydrated = useAuth((s) => s.hydrated); const [ready, setReady] = useState(false); // Språkbyte utan omstart (i18n M4): versionen bumpar vid setLocale och // key={} re-monterar hela trädet så att alla t()-strängar byts direkt. const i18nVersion = useI18nVersion(); useEffect(() => { void hydrate().then(() => setReady(true)); }, [hydrate]); if (!hydrated || !ready) return ; return ( ); }