mirror of
https://github.com/zimplexing/OrionTV.git
synced 2026-02-04 11:44:44 +08:00
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
91 lines
3.0 KiB
TypeScript
91 lines
3.0 KiB
TypeScript
import { create } from "zustand";
|
|
import Cookies from "@react-native-cookies/cookies";
|
|
import { api } from "@/services/api";
|
|
import { useSettingsStore } from "./settingsStore";
|
|
import Toast from "react-native-toast-message";
|
|
|
|
interface AuthState {
|
|
isLoggedIn: boolean;
|
|
isLoginModalVisible: boolean;
|
|
showLoginModal: () => void;
|
|
hideLoginModal: () => void;
|
|
checkLoginStatus: (apiBaseUrl?: string) => Promise<void>;
|
|
logout: () => Promise<void>;
|
|
}
|
|
|
|
const useAuthStore = create<AuthState>((set) => ({
|
|
isLoggedIn: false,
|
|
isLoginModalVisible: false,
|
|
showLoginModal: () => set({ isLoginModalVisible: true }),
|
|
hideLoginModal: () => set({ isLoginModalVisible: false }),
|
|
checkLoginStatus: async (apiBaseUrl?: string) => {
|
|
if (!apiBaseUrl) {
|
|
set({ isLoggedIn: false, isLoginModalVisible: false });
|
|
return;
|
|
}
|
|
try {
|
|
// 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) {
|
|
// 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) {
|
|
const loginResult = await api.login().catch(() => {
|
|
set({ isLoggedIn: false, isLoginModalVisible: true });
|
|
});
|
|
if (loginResult && loginResult.ok) {
|
|
set({ isLoggedIn: true });
|
|
}
|
|
} else {
|
|
const isLoggedIn = cookies && !!cookies.auth;
|
|
set({ isLoggedIn });
|
|
if (!isLoggedIn) {
|
|
set({ isLoginModalVisible: true });
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.info("Failed to check login status:", error);
|
|
if (error instanceof Error && error.message === "UNAUTHORIZED") {
|
|
set({ isLoggedIn: false, isLoginModalVisible: true });
|
|
} else {
|
|
set({ isLoggedIn: false });
|
|
}
|
|
}
|
|
},
|
|
logout: async () => {
|
|
try {
|
|
await Cookies.clearAll();
|
|
set({ isLoggedIn: false, isLoginModalVisible: true });
|
|
} catch (error) {
|
|
console.info("Failed to logout:", error);
|
|
}
|
|
},
|
|
}));
|
|
|
|
export default useAuthStore;
|