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"; import Logger from "@/utils/Logger"; const logger = Logger.withTag('AuthStore'); interface AuthState { isLoggedIn: boolean; isLoginModalVisible: boolean; showLoginModal: () => void; hideLoginModal: () => void; checkLoginStatus: (apiBaseUrl?: string) => Promise; logout: () => Promise; } const useAuthStore = create((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) { logger.error("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) { logger.error("Failed to logout:", error); } }, })); export default useAuthStore;