blob: 4caa16c72b4adec8d98dec3fe1b66c2c9fb034b8 [file] [log] [blame]
ybtda5978b2025-05-31 15:58:05 +08001import React, { useEffect } from "react";
2import { Navigate, useLocation } from "react-router-dom";
3import { useAuth } from "../features/auth/contexts/AuthContext"; // 更新路径
4import { Spin } from "antd"; // 用于加载状态
ybt02e716d2025-04-15 17:19:32 +08005
6const ProtectedRoute = ({ children }) => {
ybtda5978b2025-05-31 15:58:05 +08007 const { isAuthenticated, loading } = useAuth();
8 const location = useLocation();
ybt02e716d2025-04-15 17:19:32 +08009
ybtda5978b2025-05-31 15:58:05 +080010 // 可以添加一个调试日志,查看认证状态变化
ybt02e716d2025-04-15 17:19:32 +080011 useEffect(() => {
ybtda5978b2025-05-31 15:58:05 +080012 console.log("ProtectedRoute - isAuthenticated:", isAuthenticated);
13 }, [isAuthenticated]);
ybt02e716d2025-04-15 17:19:32 +080014
15 if (loading) {
ybtda5978b2025-05-31 15:58:05 +080016 // 当 AuthContext 正在加载认证状态时,显示加载指示器
ybt02e716d2025-04-15 17:19:32 +080017 return (
ybtda5978b2025-05-31 15:58:05 +080018 <div className="flex justify-center items-center min-h-screen">
19 <Spin size="large" />
ybt02e716d2025-04-15 17:19:32 +080020 </div>
21 );
22 }
23
24 if (!isAuthenticated) {
ybtda5978b2025-05-31 15:58:05 +080025 // 用户未认证,重定向到登录页,并保存当前位置以便登录后返回
26 return <Navigate to="/login" state={{ from: location }} replace />;
ybt02e716d2025-04-15 17:19:32 +080027 }
28
ybtda5978b2025-05-31 15:58:05 +080029 return children; // 用户已认证,渲染子组件
ybt02e716d2025-04-15 17:19:32 +080030};
31
ybtda5978b2025-05-31 15:58:05 +080032export default ProtectedRoute;