From 7c7e8e0b974e60bb94bc668d8d43d45d835a892c Mon Sep 17 00:00:00 2001 From: zimplexing Date: Wed, 6 Aug 2025 21:59:45 +0800 Subject: [PATCH] fix(init): resolve startup error message timing issue Fix race condition where 'please check network or server address' error was shown on first startup even when API was properly configured. - Add isLoadingServerConfig state to track server config fetch status - Modify authStore to wait for server config loading before showing errors - Ensure loadSettings completes fully before triggering login checks - Only show network error when config fetch actually fails, not during loading --- app/_layout.tsx | 9 ++++----- stores/authStore.ts | 30 +++++++++++++++++++++++++++--- stores/settingsStore.ts | 11 +++++++++-- 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/app/_layout.tsx b/app/_layout.tsx index 03f756e..3763521 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -13,7 +13,6 @@ import useAuthStore from "@/stores/authStore"; import { useUpdateStore, initUpdateStore } from "@/stores/updateStore"; import { UpdateModal } from "@/components/UpdateModal"; import { UPDATE_CONFIG } from "@/constants/UpdateConfig"; -import MobileBottomNavigation from "@/components/MobileBottomNavigation"; import { useResponsiveLayout } from "@/hooks/useResponsiveLayout"; // Prevent the splash screen from auto-hiding before asset loading is complete. @@ -31,7 +30,10 @@ export default function RootLayout() { const responsiveConfig = useResponsiveLayout(); useEffect(() => { - loadSettings(); + const initializeApp = async () => { + await loadSettings(); + }; + initializeApp(); initUpdateStore(); // 初始化更新存储 }, [loadSettings]); @@ -73,8 +75,6 @@ export default function RootLayout() { return null; } - const isMobile = responsiveConfig.deviceType === 'mobile'; - return ( @@ -88,7 +88,6 @@ export default function RootLayout() { - {isMobile && } diff --git a/stores/authStore.ts b/stores/authStore.ts index 4efa4c7..082410d 100644 --- a/stores/authStore.ts +++ b/stores/authStore.ts @@ -24,10 +24,34 @@ const useAuthStore = create((set) => ({ return; } try { - const serverConfig = useSettingsStore.getState().serverConfig; + // Wait for server config to be loaded if it's currently loading + const settingsState = useSettingsStore.getState(); + let serverConfig = settingsState.serverConfig; + + // If server config is loading, wait a bit for it to complete + if (settingsState.isLoadingServerConfig) { + // Wait up to 3 seconds for server config to load + const maxWaitTime = 3000; + const checkInterval = 100; + let waitTime = 0; + + while (waitTime < maxWaitTime) { + await new Promise(resolve => setTimeout(resolve, checkInterval)); + waitTime += checkInterval; + const currentState = useSettingsStore.getState(); + if (!currentState.isLoadingServerConfig) { + serverConfig = currentState.serverConfig; + break; + } + } + } + if (!serverConfig?.StorageType) { - Toast.show({ type: "error", text1: "请检查网络或者服务器地址是否可用" }); - return + // Only show error if we're not loading and have tried to fetch the config + if (!settingsState.isLoadingServerConfig) { + Toast.show({ type: "error", text1: "请检查网络或者服务器地址是否可用" }); + } + return; } const cookies = await Cookies.get(api.baseURL); if (serverConfig && serverConfig.StorageType === "localstorage" && !cookies.auth) { diff --git a/stores/settingsStore.ts b/stores/settingsStore.ts index dc16a72..6dbfbed 100644 --- a/stores/settingsStore.ts +++ b/stores/settingsStore.ts @@ -15,6 +15,7 @@ interface SettingsState { }; isModalVisible: boolean; serverConfig: ServerConfig | null; + isLoadingServerConfig: boolean; loadSettings: () => Promise; fetchServerConfig: () => Promise; setApiBaseUrl: (url: string) => void; @@ -33,6 +34,7 @@ export const useSettingsStore = create((set, get) => ({ remoteInputEnabled: false, isModalVisible: false, serverConfig: null, + isLoadingServerConfig: false, videoSource: { enabledAll: true, sources: {}, @@ -48,10 +50,13 @@ export const useSettingsStore = create((set, get) => ({ sources: {}, }, }); - api.setBaseUrl(settings.apiBaseUrl); - await get().fetchServerConfig(); + if (settings.apiBaseUrl) { + api.setBaseUrl(settings.apiBaseUrl); + await get().fetchServerConfig(); + } }, fetchServerConfig: async () => { + set({ isLoadingServerConfig: true }); try { const config = await api.getServerConfig(); if (config) { @@ -61,6 +66,8 @@ export const useSettingsStore = create((set, get) => ({ } catch (error) { set({ serverConfig: null }); console.info("Failed to fetch server config:", error); + } finally { + set({ isLoadingServerConfig: false }); } }, setApiBaseUrl: (url) => set({ apiBaseUrl: url }),