import { Route, Routes, useNavigate } from "react-router-dom"; import { useEffect, useState } from "react"; import IndexPage from "@/pages/index"; import ChangePasswordPage from "@/pages/change-password"; import DashboardPage from "@/pages/dashboard"; import ForwardPage from "@/pages/forward"; import TunnelPage from "@/pages/tunnel"; import NodePage from "@/pages/node"; import UserPage from "@/pages/user"; import GroupPage from "@/pages/group"; import ProfilePage from "@/pages/profile"; import LimitPage from "@/pages/limit"; import ConfigPage from "@/pages/config"; import PanelSharingPage from "@/pages/panel-sharing"; import { SettingsPage } from "@/pages/settings"; import AdminLayout from "@/layouts/admin"; import H5Layout from "@/layouts/h5"; import H5SimpleLayout from "@/layouts/h5-simple"; import { isLoggedIn } from "@/utils/auth"; import { siteConfig } from "@/config/site"; // 检测是否为H5模式 const useH5Mode = () => { // 立即检测H5模式,避免初始渲染时的闪屏 const getInitialH5Mode = () => { // 检测移动设备或小屏幕 const isMobile = window.innerWidth <= 768; // 检测是否为移动端浏览器 const isMobileBrowser = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( navigator.userAgent, ); // 检测URL参数是否包含h5模式 const urlParams = new URLSearchParams(window.location.search); const isH5Param = urlParams.get("h5") === "true"; return isMobile || isMobileBrowser || isH5Param; }; const [isH5, setIsH5] = useState(getInitialH5Mode); useEffect(() => { const checkH5Mode = () => { // 检测移动设备或小屏幕 const isMobile = window.innerWidth <= 768; // 检测是否为移动端浏览器 const isMobileBrowser = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( navigator.userAgent, ); // 检测URL参数是否包含h5模式 const urlParams = new URLSearchParams(window.location.search); const isH5Param = urlParams.get("h5") === "true"; setIsH5(isMobile || isMobileBrowser || isH5Param); }; window.addEventListener("resize", checkH5Mode); return () => window.removeEventListener("resize", checkH5Mode); }, []); return isH5; }; // 简化的路由保护组件 - 使用 React Router 导航避免循环 const ProtectedRoute = ({ children, useSimpleLayout = false, skipLayout = false, }: { children: React.ReactNode; useSimpleLayout?: boolean; skipLayout?: boolean; }) => { const authenticated = isLoggedIn(); const isH5 = useH5Mode(); const navigate = useNavigate(); useEffect(() => { if (!authenticated) { // 使用 React Router 导航,避免无限跳转 navigate("/", { replace: true }); } }, [authenticated, navigate]); if (!authenticated) { return (