/** * BUS-Tickets - Root Layout * Copyright (c) 2024-2026 IT Enterprise */ import { useEffect } from 'react'; import { View } from 'react-native'; import { Stack } from 'expo-router'; import { StatusBar } from 'expo-status-bar'; import { useColorScheme } from 'react-native'; import * as SplashScreen from 'expo-splash-screen'; import { useFonts } from 'expo-font'; import { GestureHandlerRootView } from 'react-native-gesture-handler'; import { ThemeProvider, useTheme } from '@/contexts/ThemeContext'; import { AuthProvider, useAuth } from '@/contexts/AuthContext'; import { ConfigProvider, useConfig } from '@/contexts/ConfigContext'; import { ApiProvider } from '@/contexts/ApiContext'; import { NetworkProvider } from '@/contexts/NetworkContext'; import { LocaleProvider, useLocale } from '@/contexts/LocaleContext'; import { ProvidersProvider } from '@/contexts/ProvidersContext'; import { OfflineBanner } from '@/components/OfflineBanner'; import { useNotifications } from '@/hooks/useNotifications'; import { notificationService } from '@/services/NotificationService'; // Prevent splash screen from auto-hiding SplashScreen.preventAutoHideAsync(); function NotificationInitializer() { const { user } = useAuth(); const { config } = useConfig(); const { expoPushToken } = useNotifications(); useEffect(() => { // Register push token with backend when user logs in const apiUrl = config.backend.apiUrl || config.backend.url; if (user && expoPushToken && apiUrl) { notificationService.registerTokenWithBackend( apiUrl, user.id ); } }, [user, expoPushToken, config.backend.apiUrl, config.backend.url]); return null; } function RootLayoutNav() { const { colors, isDark } = useTheme(); return ( ); } function AppContent() { const { config } = useConfig(); const apiUrl = config.backend.apiUrl || config.backend.url; return ( ); } export default function RootLayout() { const colorScheme = useColorScheme(); const [fontsLoaded] = useFonts({ // Add custom fonts here if needed }); useEffect(() => { // Initialize notifications notificationService.initialize(); }, []); useEffect(() => { if (fontsLoaded) { SplashScreen.hideAsync(); } }, [fontsLoaded]); if (!fontsLoaded) { return null; } return ( ); }