65 lines
2.2 KiB
TypeScript
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>
|
|
);
|
|
}
|