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 { RefreshCw } from 'lucide-react-native' import { useEffect, useState } from 'react' import EmptyState from '@/components/common/EmptyStatus' import { GluestackUIProvider } from '@/components/ui/gluestack-ui-provider' import { useUserStore } from '@/store/user' import { ToastProviderWrapper } from '@/utils/toast' import '@/styles/global.css' import 'react-native-reanimated' import 'react-native-gesture-handler' SplashScreen.preventAutoHideAsync() export function ErrorBoundary({ error, retry }: ErrorBoundaryProps) { return ( ) } export default function RootLayout() { const router = useRouter() const token = useUserStore(state => state.token) const [fontsLoaded] = useFonts({ SpaceMono: require('@/static/fonts/SpaceMono-Regular.ttf'), }) const [storeLoaded, setStoreLoaded] = useState(false) // 等待 store 恢复数据 useEffect(() => { if (token !== undefined) { setStoreLoaded(true) } }, [token]) // splash screen 隐藏 & 登录跳转 useEffect(() => { if (fontsLoaded && storeLoaded) { SplashScreen.hideAsync() // 如果没有 token,则跳转登录页 if (token === null) { router.replace('/auth') } } }, [fontsLoaded, storeLoaded, token]) return ( ) }