Messenger/packages/mobile/app/_layout.tsx
Заид Омар Медхат | Zaid Omar Medhat f653b083aa f
2026-07-13 12:32:00 +05:00

65 lines
2.2 KiB
TypeScript

import 'react-native-gesture-handler';
import { useEffect } from 'react';
import type { ReactElement } from 'react';
import { ActivityIndicator, View } from 'react-native';
import { Stack } from 'expo-router';
import { StatusBar } from 'expo-status-bar';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
import { KeyboardProvider } from 'react-native-keyboard-controller';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import { setAudioModeAsync } from 'expo-audio';
import { ThemeProvider, useTheme } from '@/theme';
import { useSession } from '@/stores/session';
import { ErrorBoundary } from '@/components';
// Voice notes must play even with the iPhone mute switch on (Telegram
// behavior) — without this, playback "works" but is silent on most devices.
void setAudioModeAsync({ playsInSilentMode: true });
const RootNavigator = (): ReactElement => {
const { colors, name } = useTheme();
const status = useSession((s) => s.status);
const bootstrap = useSession((s) => s.bootstrap);
useEffect(() => {
void bootstrap();
}, [bootstrap]);
if (status === 'loading') {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: colors.background }}>
<ActivityIndicator color={colors.accent} />
</View>
);
}
return (
<>
<StatusBar style={name === 'dark' ? 'light' : 'dark'} />
<Stack screenOptions={{ headerShown: false, contentStyle: { backgroundColor: colors.background } }}>
<Stack.Protected guard={status === 'authenticated'}>
<Stack.Screen name="(app)" />
</Stack.Protected>
<Stack.Protected guard={status !== 'authenticated'}>
<Stack.Screen name="(auth)" />
</Stack.Protected>
</Stack>
</>
);
};
export default function RootLayout(): ReactElement {
return (
<GestureHandlerRootView style={{ flex: 1 }}>
<ErrorBoundary>
<SafeAreaProvider>
<KeyboardProvider>
<ThemeProvider>
<RootNavigator />
</ThemeProvider>
</KeyboardProvider>
</SafeAreaProvider>
</ErrorBoundary>
</GestureHandlerRootView>
);
}