diff --git a/src/App.tsx b/src/App.tsx
index 9438c42..4a47f2f 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,7 +1,7 @@
import React, { useEffect } from "react";
import { BrowserRouter, Routes, Route, Navigate, useNavigate } from "react-router-dom";
import { useAppStore } from "./stores/app";
-import { initOta } from "./api/ota";
+import { initOta, inTauri } from "./api/ota";
import Login from "./pages/Login";
import Landing from "./pages/Landing";
import Home from "./pages/Home";
@@ -19,6 +19,29 @@ function ProtectedRoute({ children }: { children: React.ReactNode }) {
return <>{children}>;
}
+// 同步读取已保存的会话 (避免首帧闪烁: RouterGate 的 effect 是异步的)
+function getStoredUser(): unknown {
+ try {
+ const saved = localStorage.getItem("wardrobe_user");
+ if (!saved) return null;
+ const p = JSON.parse(saved);
+ return p?.user ?? null;
+ } catch {
+ return null;
+ }
+}
+
+// 默认路径 /: web 是网络入口(落地页); APP (Tauri) 不进 Landing,
+// 未登录直接去 /login, 已登录直接进内部页面 /home
+function RootGate() {
+ const user = useAppStore((s) => s.user);
+ if (inTauri) {
+ const effective = user ?? getStoredUser();
+ return ;
+ }
+ return ;
+}
+
function RouterGate() {
const user = useAppStore((s) => s.user);
const navigate = useNavigate();
@@ -41,7 +64,7 @@ function RouterGate() {
return (
- } />
+ } />
} />
}>
} />
diff --git a/src/api/ota.ts b/src/api/ota.ts
index 1525084..08e5149 100644
--- a/src/api/ota.ts
+++ b/src/api/ota.ts
@@ -8,7 +8,7 @@
import { APP_VERSION, BUILD_ID } from "../version";
// 判断是否在 Tauri WebView 内 (有 __TAURI_INTERNALS__ 即 Tauri 环境)
-const inTauri = typeof window !== "undefined" && "__TAURI_INTERNALS__" in window;
+export const inTauri = typeof window !== "undefined" && "__TAURI_INTERNALS__" in window;
// 拼接绝对 URL: web 模式同源 (OTA 服务端同时托管 dist), Tauri 不走这里
function resolveUrl(p: string) {