import { useCallback } from 'react' import { View, StyleSheet } from 'react-native' import { Stack } from 'expo-router' import { StatusBar } from 'expo-status-bar' import * as SplashScreen from 'expo-splash-screen' import * as Notifications from 'expo-notifications' import { colors } from '../src/theme/mobile-theme' import { OrcaLogo } from '../src/components/OrcaLogo' // Why: keeps the native splash screen visible until the React tree is mounted // and ready to render. Without this the user sees a blank white/black frame // between the native splash and the first React paint. SplashScreen.preventAutoHideAsync() // Why: without this, expo-notifications silently drops notifications when // the app is in the foreground. Setting all three to true makes iOS/Android // display the banner, play the sound, and show the badge even while the // app is active. This runs once at module load time before any notification // is scheduled. Notifications.setNotificationHandler({ handleNotification: async () => ({ shouldShowBanner: true, shouldShowList: true, shouldPlaySound: true, shouldSetBadge: false }) }) export default function RootLayout() { // Why: hide the native splash only once the navigation Stack has been laid // out — this is the earliest moment the user will see actual app content. // Previously the splash hid when a placeholder View rendered, leaving a // grey gap before the real screen appeared. const onNavigatorLayout = useCallback(async () => { await SplashScreen.hideAsync() }, []) return ( }} /> ) } const styles = StyleSheet.create({ root: { flex: 1, backgroundColor: colors.bgBase } })