RedirectIfAuthed.tsx
969 Bytes
// REQ-USR-004: /login 守卫(BR2)。已登录访问登录页 → 回 from 或 /。
import type { ReactNode } from 'react';
import { Navigate, useLocation } from 'react-router-dom';
import { useAppSelector } from '../store/hooks';
interface RedirectIfAuthedProps {
children: ReactNode;
}
/**
* 已登录态判定(D:仅 token 即视为已登录,与 RequireAuth 的「token 存在即非未登录」语义对齐;
* 避免 token 已持久化、user 尚在拉取时登录页与守卫之间互相弹跳)。
* 已登录 → 重定向到 location.state.from(来源)或 /;否则渲染 children(LoginPage)。
*/
export default function RedirectIfAuthed({ children }: RedirectIfAuthedProps) {
const token = useAppSelector((s) => s.auth.token);
const location = useLocation();
if (token) {
const from = (location.state as { from?: string } | null)?.from;
return <Navigate to={from ?? '/'} replace />;
}
return <>{children}</>;
}