import { DarkTheme, DefaultTheme, ThemeProvider } from "@react-navigation/native"; import { useFonts } from "expo-font"; import { Stack } from "expo-router"; import * as SplashScreen from "expo-splash-screen"; import { useEffect } from "react"; import { Platform, View, StyleSheet } from "react-native"; import Toast from "react-native-toast-message"; import { SafeAreaProvider } from "react-native-safe-area-context"; import { useSettingsStore } from "@/stores/settingsStore"; import { useRemoteControlStore } from "@/stores/remoteControlStore"; import LoginModal from "@/components/LoginModal"; import useAuthStore from "@/stores/authStore"; import { useUpdateStore, initUpdateStore } from "@/stores/updateStore"; import { UpdateModal } from "@/components/UpdateModal"; import { UPDATE_CONFIG } from "@/constants/UpdateConfig"; import { useResponsiveLayout } from "@/hooks/useResponsiveLayout"; import Logger from '@/utils/Logger'; const logger = Logger.withTag('RootLayout'); // Prevent the splash screen from auto-hiding before asset loading is complete. SplashScreen.preventAutoHideAsync(); export default function RootLayout() { const colorScheme = "dark"; const [loaded, error] = useFonts({ SpaceMono: require("../assets/fonts/SpaceMono-Regular.ttf"), }); const { loadSettings, remoteInputEnabled, apiBaseUrl } = useSettingsStore(); const { startServer, stopServer } = useRemoteControlStore(); const { checkLoginStatus } = useAuthStore(); const { checkForUpdate, lastCheckTime } = useUpdateStore(); const responsiveConfig = useResponsiveLayout(); useEffect(() => { const initializeApp = async () => { await loadSettings(); }; initializeApp(); initUpdateStore(); // 初始化更新存储 }, [loadSettings]); useEffect(() => { if (apiBaseUrl) { checkLoginStatus(apiBaseUrl); } }, [apiBaseUrl, checkLoginStatus]); useEffect(() => { if (loaded || error) { SplashScreen.hideAsync(); if (error) { logger.warn(`Error in loading fonts: ${error}`); } } }, [loaded, error]); // 检查更新 useEffect(() => { if (loaded && UPDATE_CONFIG.AUTO_CHECK && Platform.OS === 'android') { // 检查是否需要自动检查更新 const shouldCheck = Date.now() - lastCheckTime > UPDATE_CONFIG.CHECK_INTERVAL; if (shouldCheck) { checkForUpdate(true); // 静默检查 } } }, [loaded, lastCheckTime, checkForUpdate]); useEffect(() => { // 只有在非手机端才启动远程控制服务器 if (remoteInputEnabled && responsiveConfig.deviceType !== "mobile") { startServer(); } else { stopServer(); } }, [remoteInputEnabled, startServer, stopServer, responsiveConfig.deviceType]); if (!loaded && !error) { return null; } return ( {Platform.OS !== "web" && } ); } const styles = StyleSheet.create({ container: { flex: 1, }, });