import { useMemo } from "react"; import { useNavigate, useSearchParams } from "react-router-dom"; import { Button } from "@/components/ui/button"; import { saveSession, type WebSession } from "@/services/session-storage"; type OAuthCallbackPageProps = { onBootstrapSession: (session: WebSession) => void; }; export function OAuthCallbackPage({ onBootstrapSession }: OAuthCallbackPageProps) { const [searchParams] = useSearchParams(); const navigate = useNavigate(); const parseResult = useMemo(() => { const accessToken = searchParams.get("accessToken"); const refreshToken = searchParams.get("refreshToken"); const userId = searchParams.get("userId"); const email = searchParams.get("email"); if (!accessToken || !refreshToken || !userId || !email) { return { ok: false as const, reason: "回调参数不完整,暂时无法建立会话。" }; } return { ok: true as const, session: { accessToken, refreshToken, user: { id: userId, email } } }; }, [searchParams]); function handleContinue(): void { if (!parseResult.ok) { navigate("/login/email", { replace: true }); return; } saveSession(parseResult.session); onBootstrapSession(parseResult.session); navigate("/", { replace: true }); } return (
TodoList

OAuth 回调处理中

{parseResult.ok ? "已收到回调参数,点击继续进入工作台。" : parseResult.reason}

); }