import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native'; import { Stack, router, useRootNavigationState, useSegments } from 'expo-router'; import * as SplashScreen from 'expo-splash-screen'; import { StatusBar } from 'expo-status-bar'; import { useEffect, useRef } from 'react'; import 'react-native-reanimated'; import { StripeProvider } from '@stripe/stripe-react-native'; import { LoadingSpinner } from '@/components/ui/LoadingSpinner'; import { AuthProvider, useAuth } from '@/contexts/AuthContext'; import { BeneficiaryProvider } from '@/contexts/BeneficiaryContext'; import { useColorScheme } from '@/hooks/use-color-scheme'; // Stripe publishable key (test mode) - must match backend STRIPE_PUBLISHABLE_KEY const STRIPE_PUBLISHABLE_KEY = 'pk_test_51P3kdqP0gvUw6M9C7ixPQHqbPcvga4G5kAYx1h6QXQAt1psbrC2rrmOojW0fTeQzaxD1Q9RKS3zZ23MCvjjZpWLi00eCFWRHMk'; SplashScreen.preventAutoHideAsync(); function RootLayoutNav() { const colorScheme = useColorScheme(); const { isAuthenticated, isInitializing } = useAuth(); const segments = useSegments(); const navigationState = useRootNavigationState(); // Track if initial redirect was done const hasInitialRedirect = useRef(false); useEffect(() => { // Wait for navigation to be ready if (!navigationState?.key) { console.log('[Layout] Navigation not ready yet'); return; } // Wait for INITIAL auth check to complete if (isInitializing) { console.log('[Layout] Still initializing auth state...'); return; } // Hide splash screen safely SplashScreen.hideAsync().catch(() => { }); const inAuthGroup = segments[0] === '(auth)'; console.log('[Layout] Auth check:', { isAuthenticated, inAuthGroup, hasInitialRedirect: hasInitialRedirect.current }); // INITIAL REDIRECT (only once after app starts): // - If not authenticated and not in auth → go to login if (!hasInitialRedirect.current) { hasInitialRedirect.current = true; if (!isAuthenticated && !inAuthGroup) { console.log('[Layout] Initial redirect → login'); router.replace('/(auth)/login'); return; } } // SUBSEQUENT REDIRECTS (only when isAuthenticated changes): // - If authenticated → go to tabs (user just logged in) if (isAuthenticated && inAuthGroup) { console.log('[Layout] User authenticated → tabs'); router.replace('/(tabs)'); } // If not authenticated, do NOTHING - let the auth screens handle their own navigation }, [isAuthenticated, isInitializing, navigationState?.key]); // IMPORTANT: isLoading NOT in deps - we don't want to react to loading state changes // segments also not in deps - we don't want to react to navigation changes if (isInitializing) { return ; } return ( ); } export default function RootLayout() { return ( ); }