"use client" import type React from "react" import { useEffect, useState } from "react" import { useRouter, useSearchParams } from "next/navigation" import { CheckCircle2, KeyRound } from "lucide-react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { TwoFactorSetupForm, TwoFactorVerifyForm } from "@/components/two-factor-flow" type Status = "checking" | "verifying" | "manual" | "success" | "error" | "2fa-verify" | "2fa-setup" type LoginResult = { status: "success" | "2fa_required" | "2fa_setup_required" user?: { email: string } two_factor_method?: "totp" | "email" } export function VerifyForm() { const router = useRouter() const searchParams = useSearchParams() const urlToken = searchParams.get("token") const [status, setStatus] = useState(urlToken ? "checking" : "manual") const [manualToken, setManualToken] = useState("") const [email, setEmail] = useState(null) const [twoFactorMethod, setTwoFactorMethod] = useState<"totp" | "email">("totp") const [error, setError] = useState(null) async function verify(token: string) { setStatus("verifying") setError(null) try { const res = await fetch("/auth/verify-link", { method: "POST", headers: { "Content-Type": "application/json" }, credentials: "include", body: JSON.stringify({ token }), }) if (!res.ok) { const body = await res.json().catch(() => null) throw new Error(body?.detail?.message ?? "Lenken er ugyldig eller utløpt.") } const result: LoginResult = await res.json() if (result.status === "2fa_required") { setTwoFactorMethod(result.two_factor_method ?? "totp") setStatus("2fa-verify") return } if (result.status === "2fa_setup_required") { setStatus("2fa-setup") return } setEmail(result.user?.email ?? null) setStatus("success") // Kort pause så brukeren rekker å se bekreftelsen før vi går videre. setTimeout(() => router.replace("/dashboard"), 900) } catch (err) { setError(err instanceof Error ? err.message : "Noe gikk galt. Prøv igjen.") setStatus("error") } } function handleTwoFactorSuccess() { router.replace("/dashboard") } useEffect(() => { if (urlToken) void verify(urlToken) // Kjør kun ved mount / når URL-tokenet faktisk endres. // eslint-disable-next-line react-hooks/exhaustive-deps }, [urlToken]) function handleManualSubmit(e: React.FormEvent) { e.preventDefault() if (!manualToken.trim()) return void verify(manualToken.trim()) } if (status === "2fa-verify") { return (
setStatus("manual")} />
) } if (status === "2fa-setup") { return (
) } if (status === "checking" || status === "verifying") { return (
) } if (status === "success") { return (

Du er innlogget

{email && (

Logget inn som {email}.

)}
) } // "manual" eller "error" -- samme skjema, ev. med en feilmelding over knappen. return (
{error && (

{error}

)} Be om en ny lenke
) }