import { Inter_400Regular, Inter_500Medium, Inter_600SemiBold, Inter_700Bold, useFonts, } from "@expo-google-fonts/inter"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { router, Stack } from "expo-router"; import * as SplashScreen from "expo-splash-screen"; import React, { useEffect } from "react"; import { Alert } from "react-native"; import { GestureHandlerRootView } from "react-native-gesture-handler"; import { KeyboardProvider } from "react-native-keyboard-controller"; import { SafeAreaProvider } from "react-native-safe-area-context"; import { ErrorBoundary } from "@/components/ErrorBoundary"; import { PostizProvider, usePostiz } from "@/context/PostizContext"; import { useNotifications } from "@/hooks/useNotifications"; SplashScreen.preventAutoHideAsync(); const queryClient = new QueryClient({ defaultOptions: { queries: { retry: 1, staleTime: 30000, }, }, }); function NotificationBootstrap() { useNotifications(); return null; } function UnauthorizedHandler() { const { unauthorized, clearUnauthorized } = usePostiz(); useEffect(() => { if (!unauthorized) return; Alert.alert( "API key invalid", "Your API key was rejected (401). Update it in Settings.", [ { text: "Open Settings", onPress: () => { clearUnauthorized(); router.push("/(tabs)/settings"); }, }, { text: "Dismiss", style: "cancel", onPress: clearUnauthorized }, ] ); }, [unauthorized, clearUnauthorized]); return null; } function RootLayoutNav() { return ( ); } export default function RootLayout() { const [fontsLoaded, fontError] = useFonts({ Inter_400Regular, Inter_500Medium, Inter_600SemiBold, Inter_700Bold, }); useEffect(() => { if (fontsLoaded || fontError) { SplashScreen.hideAsync(); } }, [fontsLoaded, fontError]); if (!fontsLoaded && !fontError) return null; return ( ); }