feat(app): APP 不再接入默认路径 /, 直接进登录或内部页面
- 新增 RootGate: Tauri 环境下访问 / 时, 未登录重定向 /login, 已登录重定向 /home; web 浏览器仍走 Landing 作为网络入口 - 同步读取 localStorage 已保存会话, 避免已登录用户闪一下登录页 - ota.ts 导出 inTauri 检测, App.tsx 复用
This commit is contained in:
+25
-2
@@ -1,7 +1,7 @@
|
|||||||
import React, { useEffect } from "react";
|
import React, { useEffect } from "react";
|
||||||
import { BrowserRouter, Routes, Route, Navigate, useNavigate } from "react-router-dom";
|
import { BrowserRouter, Routes, Route, Navigate, useNavigate } from "react-router-dom";
|
||||||
import { useAppStore } from "./stores/app";
|
import { useAppStore } from "./stores/app";
|
||||||
import { initOta } from "./api/ota";
|
import { initOta, inTauri } from "./api/ota";
|
||||||
import Login from "./pages/Login";
|
import Login from "./pages/Login";
|
||||||
import Landing from "./pages/Landing";
|
import Landing from "./pages/Landing";
|
||||||
import Home from "./pages/Home";
|
import Home from "./pages/Home";
|
||||||
@@ -19,6 +19,29 @@ function ProtectedRoute({ children }: { children: React.ReactNode }) {
|
|||||||
return <>{children}</>;
|
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 <Navigate to={effective ? "/home" : "/login"} replace />;
|
||||||
|
}
|
||||||
|
return <Landing />;
|
||||||
|
}
|
||||||
|
|
||||||
function RouterGate() {
|
function RouterGate() {
|
||||||
const user = useAppStore((s) => s.user);
|
const user = useAppStore((s) => s.user);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
@@ -41,7 +64,7 @@ function RouterGate() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Routes>
|
<Routes>
|
||||||
<Route path="/" element={<Landing />} />
|
<Route path="/" element={<RootGate />} />
|
||||||
<Route path="/login" element={<Login />} />
|
<Route path="/login" element={<Login />} />
|
||||||
<Route element={<ProtectedRoute><Layout /></ProtectedRoute>}>
|
<Route element={<ProtectedRoute><Layout /></ProtectedRoute>}>
|
||||||
<Route path="/home" element={<Home />} />
|
<Route path="/home" element={<Home />} />
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@
|
|||||||
import { APP_VERSION, BUILD_ID } from "../version";
|
import { APP_VERSION, BUILD_ID } from "../version";
|
||||||
|
|
||||||
// 判断是否在 Tauri WebView 内 (有 __TAURI_INTERNALS__ 即 Tauri 环境)
|
// 判断是否在 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 不走这里
|
// 拼接绝对 URL: web 模式同源 (OTA 服务端同时托管 dist), Tauri 不走这里
|
||||||
function resolveUrl(p: string) {
|
function resolveUrl(p: string) {
|
||||||
|
|||||||
Reference in New Issue
Block a user