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
This commit is contained in:
zimplexing
2025-08-06 21:59:45 +08:00
parent 9e9e4597cc
commit 7c7e8e0b97
3 changed files with 40 additions and 10 deletions

View File

@@ -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 (
<ThemeProvider value={colorScheme === "dark" ? DarkTheme : DefaultTheme}>
<View style={styles.container}>
@@ -88,7 +88,6 @@ export default function RootLayout() {
<Stack.Screen name="favorites" options={{ headerShown: false }} />
<Stack.Screen name="+not-found" />
</Stack>
{isMobile && <MobileBottomNavigation colorScheme={colorScheme} />}
</View>
<Toast />
<LoginModal />

View File

@@ -24,10 +24,34 @@ const useAuthStore = create<AuthState>((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) {

View File

@@ -15,6 +15,7 @@ interface SettingsState {
};
isModalVisible: boolean;
serverConfig: ServerConfig | null;
isLoadingServerConfig: boolean;
loadSettings: () => Promise<void>;
fetchServerConfig: () => Promise<void>;
setApiBaseUrl: (url: string) => void;
@@ -33,6 +34,7 @@ export const useSettingsStore = create<SettingsState>((set, get) => ({
remoteInputEnabled: false,
isModalVisible: false,
serverConfig: null,
isLoadingServerConfig: false,
videoSource: {
enabledAll: true,
sources: {},
@@ -48,10 +50,13 @@ export const useSettingsStore = create<SettingsState>((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<SettingsState>((set, get) => ({
} catch (error) {
set({ serverConfig: null });
console.info("Failed to fetch server config:", error);
} finally {
set({ isLoadingServerConfig: false });
}
},
setApiBaseUrl: (url) => set({ apiBaseUrl: url }),