mirror of
https://github.com/zimplexing/OrionTV.git
synced 2026-03-12 15:17:29 +08:00
feat: enhance login status management and improve error logging across services
This commit is contained in:
@@ -19,15 +19,19 @@ export default function RootLayout() {
|
|||||||
const [loaded, error] = useFonts({
|
const [loaded, error] = useFonts({
|
||||||
SpaceMono: require("../assets/fonts/SpaceMono-Regular.ttf"),
|
SpaceMono: require("../assets/fonts/SpaceMono-Regular.ttf"),
|
||||||
});
|
});
|
||||||
const { loadSettings, remoteInputEnabled } = useSettingsStore();
|
const { loadSettings, remoteInputEnabled, apiBaseUrl } = useSettingsStore();
|
||||||
const { startServer, stopServer } = useRemoteControlStore();
|
const { startServer, stopServer } = useRemoteControlStore();
|
||||||
const { checkLoginStatus } = useAuthStore();
|
const { checkLoginStatus } = useAuthStore();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
loadSettings().then(() => {
|
loadSettings();
|
||||||
checkLoginStatus();
|
}, [loadSettings]);
|
||||||
});
|
|
||||||
}, [loadSettings, checkLoginStatus]);
|
useEffect(() => {
|
||||||
|
if (apiBaseUrl) {
|
||||||
|
checkLoginStatus(apiBaseUrl);
|
||||||
|
}
|
||||||
|
}, [apiBaseUrl, checkLoginStatus]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (loaded || error) {
|
if (loaded || error) {
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ export default function SearchScreen() {
|
|||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError("搜索失败,请稍后重试。");
|
setError("搜索失败,请稍后重试。");
|
||||||
console.error("Search failed:", err);
|
console.info("Search failed:", err);
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ let cachedConfig: Config;
|
|||||||
try {
|
try {
|
||||||
cachedConfig = JSON.parse(fs.readFileSync(configPath, "utf-8")) as Config;
|
cachedConfig = JSON.parse(fs.readFileSync(configPath, "utf-8")) as Config;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`Error reading or parsing config.json at ${configPath}`, error);
|
console.info(`Error reading or parsing config.json at ${configPath}`, error);
|
||||||
// Provide a default fallback config to prevent crashes
|
// Provide a default fallback config to prevent crashes
|
||||||
cachedConfig = {
|
cachedConfig = {
|
||||||
api_site: {},
|
api_site: {},
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ router.get("/", async (req: Request, res: Response) => {
|
|||||||
res.status(500).send("Image response has no body");
|
res.status(500).send("Image response has no body");
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Image proxy error:", error);
|
console.info("Image proxy error:", error);
|
||||||
res.status(500).send("Error fetching image");
|
res.status(500).send("Error fetching image");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import { StyledButton } from "./StyledButton";
|
|||||||
|
|
||||||
const LoginModal = () => {
|
const LoginModal = () => {
|
||||||
const { isLoginModalVisible, hideLoginModal, checkLoginStatus } = useAuthStore();
|
const { isLoginModalVisible, hideLoginModal, checkLoginStatus } = useAuthStore();
|
||||||
const { serverConfig } = useSettingsStore();
|
const { serverConfig, apiBaseUrl } = useSettingsStore();
|
||||||
const { refreshPlayRecords } = useHomeStore();
|
const { refreshPlayRecords } = useHomeStore();
|
||||||
const [username, setUsername] = useState("");
|
const [username, setUsername] = useState("");
|
||||||
const [password, setPassword] = useState("");
|
const [password, setPassword] = useState("");
|
||||||
@@ -28,7 +28,7 @@ const LoginModal = () => {
|
|||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
try {
|
try {
|
||||||
await api.login(isLocalStorage ? undefined : username, password);
|
await api.login(isLocalStorage ? undefined : username, password);
|
||||||
await checkLoginStatus();
|
await checkLoginStatus(apiBaseUrl);
|
||||||
await refreshPlayRecords();
|
await refreshPlayRecords();
|
||||||
Toast.show({ type: "success", text1: "登录成功" });
|
Toast.show({ type: "success", text1: "登录成功" });
|
||||||
hideLoginModal();
|
hideLoginModal();
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ export default function VideoCard({
|
|||||||
router.replace("/");
|
router.replace("/");
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to delete play record:", error);
|
console.info("Failed to delete play record:", error);
|
||||||
Alert.alert("错误", "删除观看记录失败,请重试");
|
Alert.alert("错误", "删除观看记录失败,请重试");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import useAuthStore from "@/stores/authStore";
|
|
||||||
|
|
||||||
// region: --- Interface Definitions ---
|
// region: --- Interface Definitions ---
|
||||||
export interface DoubanItem {
|
export interface DoubanItem {
|
||||||
@@ -97,7 +96,6 @@ export class API {
|
|||||||
const response = await fetch(`${this.baseURL}${url}`, options);
|
const response = await fetch(`${this.baseURL}${url}`, options);
|
||||||
|
|
||||||
if (response.status === 401) {
|
if (response.status === 401) {
|
||||||
useAuthStore.getState().showLoginModal();
|
|
||||||
throw new Error("UNAUTHORIZED");
|
throw new Error("UNAUTHORIZED");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ export const fetchAndParseM3u = async (m3uUrl: string): Promise<Channel[]> => {
|
|||||||
const m3uText = await response.text();
|
const m3uText = await response.text();
|
||||||
return parseM3U(m3uText);
|
return parseM3U(m3uText);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error fetching or parsing M3U:", error);
|
console.info("Error fetching or parsing M3U:", error);
|
||||||
return []; // Return empty array on error
|
return []; // Return empty array on error
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ const getRemotePageHTML = () => {
|
|||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
window.addEventListener('DOMContentLoaded', () => {
|
window.addEventListener('DOMContentLoaded', () => {
|
||||||
fetch('/handshake', { method: 'POST' }).catch(console.error);
|
fetch('/handshake', { method: 'POST' }).catch(console.info);
|
||||||
});
|
});
|
||||||
function send() {
|
function send() {
|
||||||
const input = document.getElementById("text");
|
const input = document.getElementById("text");
|
||||||
@@ -36,7 +36,7 @@ const getRemotePageHTML = () => {
|
|||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
body: JSON.stringify({ message: value })
|
body: JSON.stringify({ message: value })
|
||||||
})
|
})
|
||||||
.catch(err => console.error(err));
|
.catch(err => console.info(err));
|
||||||
input.value = '';
|
input.value = '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -80,7 +80,7 @@ class RemoteControlService {
|
|||||||
body: JSON.stringify({ status: "ok" }),
|
body: JSON.stringify({ status: "ok" }),
|
||||||
};
|
};
|
||||||
} catch (parseError) {
|
} catch (parseError) {
|
||||||
console.error("[RemoteControl] Failed to parse message body:", parseError);
|
console.info("[RemoteControl] Failed to parse message body:", parseError);
|
||||||
return {
|
return {
|
||||||
statusCode: 400,
|
statusCode: 400,
|
||||||
headers: { "Content-Type": "application/json" },
|
headers: { "Content-Type": "application/json" },
|
||||||
@@ -102,7 +102,7 @@ class RemoteControlService {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("[RemoteControl] Request handler error:", error);
|
console.info("[RemoteControl] Request handler error:", error);
|
||||||
return {
|
return {
|
||||||
statusCode: 500,
|
statusCode: 500,
|
||||||
headers: { "Content-Type": "application/json" },
|
headers: { "Content-Type": "application/json" },
|
||||||
@@ -125,7 +125,7 @@ class RemoteControlService {
|
|||||||
console.log(`[RemoteControl] Server started successfully at: ${url}`);
|
console.log(`[RemoteControl] Server started successfully at: ${url}`);
|
||||||
return url;
|
return url;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("[RemoteControl] Failed to start server:", error);
|
console.info("[RemoteControl] Failed to start server:", error);
|
||||||
throw new Error(error instanceof Error ? error.message : "Failed to start server");
|
throw new Error(error instanceof Error ? error.message : "Failed to start server");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ export class PlayerSettingsManager {
|
|||||||
const data = await AsyncStorage.getItem(STORAGE_KEYS.PLAYER_SETTINGS);
|
const data = await AsyncStorage.getItem(STORAGE_KEYS.PLAYER_SETTINGS);
|
||||||
return data ? JSON.parse(data) : {};
|
return data ? JSON.parse(data) : {};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to get all player settings:", error);
|
console.info("Failed to get all player settings:", error);
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -192,13 +192,13 @@ export class SettingsManager {
|
|||||||
sources: {},
|
sources: {},
|
||||||
},
|
},
|
||||||
m3uUrl:
|
m3uUrl:
|
||||||
"https://ghfast.top/https://raw.githubusercontent.com/sjnhnp/adblock/refs/heads/main/filtered_http_only_valid.m3u",
|
"",
|
||||||
};
|
};
|
||||||
try {
|
try {
|
||||||
const data = await AsyncStorage.getItem(STORAGE_KEYS.SETTINGS);
|
const data = await AsyncStorage.getItem(STORAGE_KEYS.SETTINGS);
|
||||||
return data ? { ...defaultSettings, ...JSON.parse(data) } : defaultSettings;
|
return data ? { ...defaultSettings, ...JSON.parse(data) } : defaultSettings;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to get settings:", error);
|
console.info("Failed to get settings:", error);
|
||||||
return defaultSettings;
|
return defaultSettings;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ class TCPHttpServer {
|
|||||||
|
|
||||||
return { method, url, headers, body };
|
return { method, url, headers, body };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('[TCPHttpServer] Error parsing HTTP request:', error);
|
console.info('[TCPHttpServer] Error parsing HTTP request:', error);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -140,7 +140,7 @@ class TCPHttpServer {
|
|||||||
socket.write(errorResponse);
|
socket.write(errorResponse);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('[TCPHttpServer] Error handling request:', error);
|
console.info('[TCPHttpServer] Error handling request:', error);
|
||||||
const errorResponse = this.formatHttpResponse({
|
const errorResponse = this.formatHttpResponse({
|
||||||
statusCode: 500,
|
statusCode: 500,
|
||||||
headers: { 'Content-Type': 'text/plain' },
|
headers: { 'Content-Type': 'text/plain' },
|
||||||
@@ -155,7 +155,7 @@ class TCPHttpServer {
|
|||||||
});
|
});
|
||||||
|
|
||||||
socket.on('error', (error: Error) => {
|
socket.on('error', (error: Error) => {
|
||||||
console.error('[TCPHttpServer] Socket error:', error);
|
console.info('[TCPHttpServer] Socket error:', error);
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('close', () => {
|
socket.on('close', () => {
|
||||||
@@ -170,13 +170,13 @@ class TCPHttpServer {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.server.on('error', (error: Error) => {
|
this.server.on('error', (error: Error) => {
|
||||||
console.error('[TCPHttpServer] Server error:', error);
|
console.info('[TCPHttpServer] Server error:', error);
|
||||||
this.isRunning = false;
|
this.isRunning = false;
|
||||||
reject(error);
|
reject(error);
|
||||||
});
|
});
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('[TCPHttpServer] Failed to start server:', error);
|
console.info('[TCPHttpServer] Failed to start server:', error);
|
||||||
reject(error);
|
reject(error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
import { create } from "zustand";
|
import { create } from "zustand";
|
||||||
import Cookies from "@react-native-cookies/cookies";
|
import Cookies from "@react-native-cookies/cookies";
|
||||||
import { api } from "@/services/api";
|
import { api } from "@/services/api";
|
||||||
import { useSettingsStore } from "./settingsStore";
|
|
||||||
|
|
||||||
interface AuthState {
|
interface AuthState {
|
||||||
isLoggedIn: boolean;
|
isLoggedIn: boolean;
|
||||||
isLoginModalVisible: boolean;
|
isLoginModalVisible: boolean;
|
||||||
showLoginModal: () => void;
|
showLoginModal: () => void;
|
||||||
hideLoginModal: () => void;
|
hideLoginModal: () => void;
|
||||||
checkLoginStatus: () => Promise<void>;
|
checkLoginStatus: (apiBaseUrl?: string) => Promise<void>;
|
||||||
logout: () => Promise<void>;
|
logout: () => Promise<void>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -17,27 +16,30 @@ const useAuthStore = create<AuthState>((set) => ({
|
|||||||
isLoginModalVisible: false,
|
isLoginModalVisible: false,
|
||||||
showLoginModal: () => set({ isLoginModalVisible: true }),
|
showLoginModal: () => set({ isLoginModalVisible: true }),
|
||||||
hideLoginModal: () => set({ isLoginModalVisible: false }),
|
hideLoginModal: () => set({ isLoginModalVisible: false }),
|
||||||
checkLoginStatus: async () => {
|
checkLoginStatus: async (apiBaseUrl?: string) => {
|
||||||
const { apiBaseUrl } = useSettingsStore.getState();
|
|
||||||
if (!apiBaseUrl) {
|
if (!apiBaseUrl) {
|
||||||
set({ isLoggedIn: false, isLoginModalVisible: false });
|
set({ isLoggedIn: false, isLoginModalVisible: false });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const { ok } = await api.login();
|
await api.login();
|
||||||
if (ok) {
|
set({ isLoginModalVisible: true });
|
||||||
set({ isLoggedIn: true });
|
} catch {
|
||||||
return;
|
try {
|
||||||
|
const cookies = await Cookies.get(api.baseURL);
|
||||||
|
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 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
const cookies = await Cookies.get(api.baseURL);
|
|
||||||
const isLoggedIn = cookies && !!cookies.auth;
|
|
||||||
set({ isLoggedIn });
|
|
||||||
if (!isLoggedIn) {
|
|
||||||
set({ isLoginModalVisible: true });
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Failed to check login status:", error);
|
|
||||||
set({ isLoggedIn: false, isLoginModalVisible: true });
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
logout: async () => {
|
logout: async () => {
|
||||||
@@ -45,7 +47,7 @@ const useAuthStore = create<AuthState>((set) => ({
|
|||||||
await Cookies.clearAll();
|
await Cookies.clearAll();
|
||||||
set({ isLoggedIn: false, isLoginModalVisible: true });
|
set({ isLoggedIn: false, isLoginModalVisible: true });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to logout:", error);
|
console.info("Failed to logout:", error);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ const useDetailStore = create<DetailState>((set, get) => ({
|
|||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if ((e as Error).name !== "AbortError") {
|
if ((e as Error).name !== "AbortError") {
|
||||||
console.error(`Failed to get resolution for ${searchResult.source_name}`, e);
|
console.info(`Failed to get resolution for ${searchResult.source_name}`, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return { ...searchResult, resolution };
|
return { ...searchResult, resolution };
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { create } from "zustand";
|
|||||||
import { api, SearchResult, PlayRecord } from "@/services/api";
|
import { api, SearchResult, PlayRecord } from "@/services/api";
|
||||||
import { PlayRecordManager } from "@/services/storage";
|
import { PlayRecordManager } from "@/services/storage";
|
||||||
import useAuthStore from "./authStore";
|
import useAuthStore from "./authStore";
|
||||||
|
import { useSettingsStore } from "./settingsStore";
|
||||||
|
|
||||||
export type RowItem = (SearchResult | PlayRecord) & {
|
export type RowItem = (SearchResult | PlayRecord) & {
|
||||||
id: string;
|
id: string;
|
||||||
@@ -80,6 +81,8 @@ const useHomeStore = create<HomeState>((set, get) => ({
|
|||||||
error: null,
|
error: null,
|
||||||
|
|
||||||
fetchInitialData: async () => {
|
fetchInitialData: async () => {
|
||||||
|
const { apiBaseUrl } = useSettingsStore.getState();
|
||||||
|
await useAuthStore.getState().checkLoginStatus(apiBaseUrl);
|
||||||
set({ loading: true, contentData: [], pageStart: 0, hasMore: true, error: null });
|
set({ loading: true, contentData: [], pageStart: 0, hasMore: true, error: null });
|
||||||
await get().loadMoreData();
|
await get().loadMoreData();
|
||||||
},
|
},
|
||||||
@@ -163,6 +166,8 @@ const useHomeStore = create<HomeState>((set, get) => ({
|
|||||||
},
|
},
|
||||||
|
|
||||||
refreshPlayRecords: async () => {
|
refreshPlayRecords: async () => {
|
||||||
|
const { apiBaseUrl } = useSettingsStore.getState();
|
||||||
|
await useAuthStore.getState().checkLoginStatus(apiBaseUrl);
|
||||||
const { isLoggedIn } = useAuthStore.getState();
|
const { isLoggedIn } = useAuthStore.getState();
|
||||||
if (!isLoggedIn) {
|
if (!isLoggedIn) {
|
||||||
set((state) => {
|
set((state) => {
|
||||||
@@ -194,9 +199,7 @@ const useHomeStore = create<HomeState>((set, get) => ({
|
|||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
});
|
});
|
||||||
if (get().selectedCategory.type === "record") {
|
get().fetchInitialData();
|
||||||
get().fetchInitialData();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ const usePlayerStore = create<PlayerState>((set, get) => ({
|
|||||||
outroStartTime: playRecord?.outroStartTime,
|
outroStartTime: playRecord?.outroStartTime,
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to load play record", error);
|
console.info("Failed to load play record", error);
|
||||||
set({ isLoading: false });
|
set({ isLoading: false });
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -217,7 +217,7 @@ const usePlayerStore = create<PlayerState>((set, get) => ({
|
|||||||
handlePlaybackStatusUpdate: (newStatus) => {
|
handlePlaybackStatusUpdate: (newStatus) => {
|
||||||
if (!newStatus.isLoaded) {
|
if (!newStatus.isLoaded) {
|
||||||
if (newStatus.error) {
|
if (newStatus.error) {
|
||||||
console.error(`Playback Error: ${newStatus.error}`);
|
console.info(`Playback Error: ${newStatus.error}`);
|
||||||
}
|
}
|
||||||
set({ status: newStatus });
|
set({ status: newStatus });
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ export const useRemoteControlStore = create<RemoteControlState>((set, get) => ({
|
|||||||
set({ isServerRunning: true, serverUrl: url, error: null });
|
set({ isServerRunning: true, serverUrl: url, error: null });
|
||||||
} catch {
|
} catch {
|
||||||
const errorMessage = '启动失败,请强制退应用后重试。';
|
const errorMessage = '启动失败,请强制退应用后重试。';
|
||||||
console.error('[RemoteControlStore] Failed to start server:', errorMessage);
|
console.info('[RemoteControlStore] Failed to start server:', errorMessage);
|
||||||
set({ error: errorMessage });
|
set({ error: errorMessage });
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
import { create } from 'zustand';
|
import { create } from 'zustand';
|
||||||
import { SettingsManager } from '@/services/storage';
|
import { SettingsManager } from '@/services/storage';
|
||||||
import { api, ServerConfig } from '@/services/api';
|
import { api, ServerConfig } from '@/services/api';
|
||||||
import useHomeStore from './homeStore';
|
// import useHomeStore from './homeStore';
|
||||||
import useAuthStore from './authStore';
|
|
||||||
|
|
||||||
|
|
||||||
interface SettingsState {
|
interface SettingsState {
|
||||||
@@ -58,7 +57,7 @@ export const useSettingsStore = create<SettingsState>((set, get) => ({
|
|||||||
const config = await api.getServerConfig();
|
const config = await api.getServerConfig();
|
||||||
set({ serverConfig: config });
|
set({ serverConfig: config });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to fetch server config:", error);
|
console.info("Failed to fetch server config:", error);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
setApiBaseUrl: (url) => set({ apiBaseUrl: url }),
|
setApiBaseUrl: (url) => set({ apiBaseUrl: url }),
|
||||||
@@ -75,8 +74,7 @@ export const useSettingsStore = create<SettingsState>((set, get) => ({
|
|||||||
});
|
});
|
||||||
api.setBaseUrl(apiBaseUrl);
|
api.setBaseUrl(apiBaseUrl);
|
||||||
set({ isModalVisible: false });
|
set({ isModalVisible: false });
|
||||||
useHomeStore.getState().fetchInitialData();
|
// useHomeStore.getState().fetchInitialData();
|
||||||
useAuthStore.getState().checkLoginStatus();
|
|
||||||
},
|
},
|
||||||
showModal: () => set({ isModalVisible: true }),
|
showModal: () => set({ isModalVisible: true }),
|
||||||
hideModal: () => set({ isModalVisible: false }),
|
hideModal: () => set({ isModalVisible: false }),
|
||||||
|
|||||||
Reference in New Issue
Block a user