San3yuan | 4d0e803 | 2025-04-04 17:21:40 +0800 | [diff] [blame] | 1 | import { Navigate, Outlet } from 'react-router-dom' |
| 2 | import React from 'react' |
San3yuan | 2534d42 | 2025-04-08 21:43:18 +0800 | [diff] [blame] | 3 | import { useSelector } from 'react-redux' |
San3yuan | 4d0e803 | 2025-04-04 17:21:40 +0800 | [diff] [blame] | 4 | |
| 5 | interface PrivateRouteProps { |
San3yuan | 2534d42 | 2025-04-08 21:43:18 +0800 | [diff] [blame] | 6 | role: number |
San3yuan | 4d0e803 | 2025-04-04 17:21:40 +0800 | [diff] [blame] | 7 | redirectPath?: string |
| 8 | children?: React.ReactNode |
| 9 | } |
| 10 | |
| 11 | const PrivateRoute = ({ |
San3yuan | 2534d42 | 2025-04-08 21:43:18 +0800 | [diff] [blame] | 12 | role, |
San3yuan | 4d0e803 | 2025-04-04 17:21:40 +0800 | [diff] [blame] | 13 | redirectPath = '/login', |
| 14 | children |
| 15 | }: PrivateRouteProps) => { |
San3yuan | 2534d42 | 2025-04-08 21:43:18 +0800 | [diff] [blame] | 16 | const isLogin = useSelector((state: any) => state.user.isLogin) |
| 17 | const userRole = useSelector((state: any) => state.user.role) |
| 18 | |
| 19 | if (!isLogin) { |
San3yuan | 4d0e803 | 2025-04-04 17:21:40 +0800 | [diff] [blame] | 20 | return <Navigate to={redirectPath} replace /> |
| 21 | } |
| 22 | |
San3yuan | 2534d42 | 2025-04-08 21:43:18 +0800 | [diff] [blame] | 23 | if (role && role >= userRole) { |
| 24 | return <Navigate to={redirectPath} replace /> |
| 25 | } |
| 26 | |
| 27 | return children ? ( |
| 28 | <>{children}</> |
| 29 | ) : ( |
| 30 | <Outlet /> |
| 31 | ) |
| 32 | |
San3yuan | 4d0e803 | 2025-04-04 17:21:40 +0800 | [diff] [blame] | 33 | } |
| 34 | |
| 35 | export default PrivateRoute |