import '../global.css';
import { useEffect, useState } from 'react';
import { Platform, View, AppState } from 'react-native';
import { Stack, useRouter, useSegments } from 'expo-router';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
import { AuthProvider, useAuth } from '~/contexts/AuthContext';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import { preloadModels } from '~/store/modelStore';
import { ErrorBoundary } from '~/components/ErrorBoundary';
import { ThemeProvider } from '~/contexts/ThemeContext';
import { logger } from '~/utils/logger';
export const unstable_settings = {
// Ensure that reloading on `/modal` keeps a back button present.
initialRouteName: '(tabs)',
};
function RootLayoutNav() {
const { user, loading } = useAuth();
const segments = useSegments();
const router = useRouter();
const [isNavigating, setIsNavigating] = useState(false);
useEffect(() => {
// Prevent navigation during loading or if already navigating
if (loading || isNavigating) {
console.log('âŗ Skipping navigation:', { loading, isNavigating });
return;
}
const inAuthGroup = segments[0] === '(auth)';
console.log('đ Auth routing check:', {
hasUser: !!user,
userId: user?.id,
currentSegment: segments[0],
inAuthGroup
});
// Use requestAnimationFrame to defer navigation and prevent timing issues
const navigationTimeout = requestAnimationFrame(() => {
try {
if (!user && !inAuthGroup) {
// Redirect to login if not authenticated
console.log('đ Redirecting to login...');
setIsNavigating(true);
router.replace('/(auth)/login');
setIsNavigating(false);
} else if (user && inAuthGroup) {
// Redirect to main app if authenticated
console.log('â
Redirecting to tabs...');
setIsNavigating(true);
router.replace('/(tabs)');
setIsNavigating(false);
// TEMPORARY FIX: Disabled preload to debug crash
// TODO: Re-enable with proper error handling after navigation completes
// setTimeout(() => {
// preloadModels().catch(err => {
// logger.error('Failed to preload models:', err);
// });
// }, 1000);
} else {
console.log('âšī¸ No navigation needed');
}
} catch (error) {
logger.error('Navigation error:', error);
setIsNavigating(false);
}
});
return () => {
cancelAnimationFrame(navigationTimeout);
};
}, [user, segments, loading, isNavigating]);
return (
);
}
export default function RootLayout() {
// For web, ensure the app fills the viewport
if (Platform.OS === 'web') {
return (
);
}
return (
);
}