import { useEffect, useState } from "react"; import type { LucideIcon } from "lucide-react"; import { Bell, ChevronLeft, ChevronRight, LayoutDashboard, ListTodo, LogOut, Menu, Moon, Settings, Sparkles, Sun, X } from "lucide-react"; import { Navigate, Route, Routes, useLocation, useNavigate } from "react-router-dom"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; import { EmailLoginPage } from "@/pages/email-login-page"; import { OAuthCallbackPage } from "@/pages/oauth-callback-page"; import { TodoShellPage } from "@/pages/todo-shell-page"; import { revokeRefreshToken, type EmailLoginResult } from "@/services/auth-api"; import { clearSession, loadSession, saveSession, type WebSession } from "@/services/session-storage"; import { applyThemeMode, loadThemeMode, saveThemeMode, type ThemeMode } from "@/services/theme-storage"; type SidebarItem = { key: string; label: string; icon: LucideIcon; }; const SIDEBAR_ITEMS: SidebarItem[] = [ { key: "dashboard", label: "概览面板", icon: LayoutDashboard }, { key: "todo", label: "待办事项", icon: ListTodo }, { key: "ai", label: "AI 建议", icon: Sparkles }, { key: "notice", label: "提醒中心", icon: Bell }, { key: "settings", label: "系统设置", icon: Settings } ]; function toWebSession(payload: EmailLoginResult): WebSession { return { accessToken: payload.accessToken, refreshToken: payload.refreshToken, user: { id: payload.user.id, email: payload.user.email } }; } function App() { const [session, setSession] = useState(() => loadSession()); const [loggingOut, setLoggingOut] = useState(false); const [themeMode, setThemeMode] = useState(() => loadThemeMode()); const [sidebarCollapsed, setSidebarCollapsed] = useState(false); const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false); const navigate = useNavigate(); const location = useLocation(); const isAuthPage = location.pathname === "/login/email" || location.pathname.startsWith("/auth/callback/"); useEffect(() => { applyThemeMode(themeMode); saveThemeMode(themeMode); }, [themeMode]); async function handleLogout(): Promise { if (!session || loggingOut) { return; } try { setLoggingOut(true); await revokeRefreshToken(session.refreshToken); } catch { // 无论接口成功与否,都要清理本地会话,避免页面卡在登录态。 } finally { clearSession(); setSession(null); setLoggingOut(false); setMobileSidebarOpen(false); navigate("/login/email", { replace: true }); } } function handleToggleTheme(): void { setThemeMode((currentTheme) => (currentTheme === "dark" ? "light" : "dark")); } function handleLoginSuccess(payload: EmailLoginResult): void { const nextSession = toWebSession(payload); saveSession(nextSession); setSession(nextSession); setMobileSidebarOpen(false); navigate("/", { replace: true }); } function handleBootstrapSession(nextSession: WebSession): void { setSession(nextSession); setMobileSidebarOpen(false); } function renderSidebarContent(options: { collapsed: boolean; mobile: boolean }) { const { collapsed, mobile } = options; return (
{mobile ? (
) : null}
); } if (isAuthPage) { return (
} /> } /> } />
); } return (
TodoList TodoList
{session ? session.user.email : "未登录"}
{mobileSidebarOpen ? (
) : ( ) } /> } />
); } export default App;