import { useEffect, useRef, useState } from "react"; type ExchangeState = "working" | "failed" | "missing"; const MagicLink = function () { const started = useRef(false); const [state, setState] = useState("working"); useEffect(() => { // React Strict Mode runs effects twice in development. Never redeem twice. if (started.current) return; started.current = true; const params = new URLSearchParams(window.location.search); const token = params.get("token"); if (!token) { setState("missing"); return; } // Keep the credential out of browser history and subsequent Referer headers. window.history.replaceState({}, "", window.location.pathname); void fetch("/auth/magic-link/exchange", { method: "POST", credentials: "include", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ token: token }), }) .then((response) => { if (!response.ok) throw new Error("Magic-link exchange failed"); window.location.replace("/"); }) .catch(() => setState("failed")); }, []); if (state === "missing") { return

This login link is missing its token.

; } if (state === "failed") { return

This login link is invalid or has expired.

; } return

Signing you in…

; }; export default MagicLink;