import React, { useEffect } from 'react'; import { Stack, useRouter, useSegments } from 'expo-router'; import { StatusBar } from 'expo-status-bar'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { useColorScheme } from 'react-native'; import { Colors } from '../constants/Colors'; import { useAuthStore, setupAuthListener } from '../stores/authStore'; import { LoadingScreen } from '../components/LoadingScreen'; // Create a client const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 5000, // Data is fresh for 5 seconds retry: 2, // Retry failed requests twice refetchOnWindowFocus: false, // Don't refetch on app focus (mobile) }, mutations: { retry: 1, }, }, }); /** * Auth state handler component * Redirects users based on authentication status */ function AuthStateHandler({ children }: { children: React.ReactNode }) { const router = useRouter(); const segments = useSegments(); const session = useAuthStore((state) => state.session); const isInitialized = useAuthStore((state) => state.isInitialized); const initialize = useAuthStore((state) => state.initialize); // Initialize auth state on mount useEffect(() => { initialize(); }, [initialize]); // Setup auth listener on mount useEffect(() => { const unsubscribe = setupAuthListener(); return unsubscribe; }, []); // Handle auth-based routing useEffect(() => { if (!isInitialized) return; const inAuthGroup = segments[0] === '(auth)'; const isAuthenticated = session !== null; if (!isAuthenticated && !inAuthGroup) { // Redirect to login if not authenticated and not already on auth screens router.replace('/(auth)/login'); } else if (isAuthenticated && inAuthGroup) { // Redirect to main app if authenticated and on auth screens router.replace('/(tabs)'); } }, [session, segments, isInitialized, router]); // Show loading screen while initializing if (!isInitialized) { return ; } return <>{children}; } export default function RootLayout() { const colorScheme = useColorScheme() ?? 'light'; const colors = Colors[colorScheme]; return ( ); }