import type { ErrorBoundaryProps } from 'expo-router' import { ToastProvider } from '@gluestack-ui/core/toast/creator' import { useFonts } from 'expo-font' import { Stack, useRouter } from 'expo-router' import * as SplashScreen from 'expo-splash-screen' import { StatusBar } from 'expo-status-bar' import { useEffect } from 'react' import { GestureHandlerRootView } from 'react-native-gesture-handler' import { KeyboardProvider } from 'react-native-keyboard-controller' import { MenuProvider } from 'react-native-popup-menu' import { AButton } from '@/components/common/ao' import EmptyState from '@/components/common/EmptyStatus' import { GluestackUIProvider } from '@/components/ui/gluestack-ui-provider' import { useMoneyCategoryStore } from '@/store/moneyCategory' import { useUserStore } from '@/store/user' import { ToastProviderWrapper } from '@/utils/toast' import '@/styles/global.css' import 'react-native-reanimated' SplashScreen.preventAutoHideAsync() export const unstable_settings = { initialRouteName: 'money', } export function ErrorBoundary({ error, retry }: ErrorBoundaryProps) { return ( 再试一下 )} /> ) } export default function RootLayout() { const router = useRouter() const userStore = useUserStore() const moneyCategoryStore = useMoneyCategoryStore() const [fontsLoaded] = useFonts({ SpaceMono: require('@/static/fonts/SpaceMono-Regular.ttf'), }) // splash screen 隐藏 & 登录跳转 useEffect(() => { if (fontsLoaded) { SplashScreen.hideAsync() } }, [fontsLoaded]) if (!fontsLoaded) { // 字体未加载,显示空白或 Splash return null } if (!userStore.isLoggedIn()) { router.replace('/auth/index') return null } moneyCategoryStore.init() return ( ) }