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}</>;
}