ybt | da5978b | 2025-05-31 15:58:05 +0800 | [diff] [blame^] | 1 | import React, { useEffect } from "react"; |
| 2 | import { Navigate, useLocation } from "react-router-dom"; |
| 3 | import { useAuth } from "../features/auth/contexts/AuthContext"; // 更新路径 |
| 4 | import { Spin } from "antd"; // 用于加载状态 |
ybt | 02e716d | 2025-04-15 17:19:32 +0800 | [diff] [blame] | 5 | |
| 6 | const ProtectedRoute = ({ children }) => { |
ybt | da5978b | 2025-05-31 15:58:05 +0800 | [diff] [blame^] | 7 | const { isAuthenticated, loading } = useAuth(); |
| 8 | const location = useLocation(); |
ybt | 02e716d | 2025-04-15 17:19:32 +0800 | [diff] [blame] | 9 | |
ybt | da5978b | 2025-05-31 15:58:05 +0800 | [diff] [blame^] | 10 | // 可以添加一个调试日志,查看认证状态变化 |
ybt | 02e716d | 2025-04-15 17:19:32 +0800 | [diff] [blame] | 11 | useEffect(() => { |
ybt | da5978b | 2025-05-31 15:58:05 +0800 | [diff] [blame^] | 12 | console.log("ProtectedRoute - isAuthenticated:", isAuthenticated); |
| 13 | }, [isAuthenticated]); |
ybt | 02e716d | 2025-04-15 17:19:32 +0800 | [diff] [blame] | 14 | |
| 15 | if (loading) { |
ybt | da5978b | 2025-05-31 15:58:05 +0800 | [diff] [blame^] | 16 | // 当 AuthContext 正在加载认证状态时,显示加载指示器 |
ybt | 02e716d | 2025-04-15 17:19:32 +0800 | [diff] [blame] | 17 | return ( |
ybt | da5978b | 2025-05-31 15:58:05 +0800 | [diff] [blame^] | 18 | <div className="flex justify-center items-center min-h-screen"> |
| 19 | <Spin size="large" /> |
ybt | 02e716d | 2025-04-15 17:19:32 +0800 | [diff] [blame] | 20 | </div> |
| 21 | ); |
| 22 | } |
| 23 | |
| 24 | if (!isAuthenticated) { |
ybt | da5978b | 2025-05-31 15:58:05 +0800 | [diff] [blame^] | 25 | // 用户未认证,重定向到登录页,并保存当前位置以便登录后返回 |
| 26 | return <Navigate to="/login" state={{ from: location }} replace />; |
ybt | 02e716d | 2025-04-15 17:19:32 +0800 | [diff] [blame] | 27 | } |
| 28 | |
ybt | da5978b | 2025-05-31 15:58:05 +0800 | [diff] [blame^] | 29 | return children; // 用户已认证,渲染子组件 |
ybt | 02e716d | 2025-04-15 17:19:32 +0800 | [diff] [blame] | 30 | }; |
| 31 | |
ybt | da5978b | 2025-05-31 15:58:05 +0800 | [diff] [blame^] | 32 | export default ProtectedRoute; |