/**
* 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 (
);
}