'use client' import { useState, useEffect, useRef } from 'react' import { useRouter } from 'next/navigation' import { createClient } from '@/lib/supabase/client' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { useToast } from '@/components/ui/use-toast' import { Loader2, ShieldCheck, LogOut } from 'lucide-react' export default function MfaVerifyPage() { const [code, setCode] = useState('') const [isLoading, setIsLoading] = useState(false) const [factorId, setFactorId] = useState(null) const inputRef = useRef(null) const { toast } = useToast() const router = useRouter() const supabase = createClient() useEffect(() => { async function loadFactor() { const { data } = await supabase.auth.mfa.listFactors() const verifiedFactor = data?.totp?.find(f => f.status === 'verified') if (verifiedFactor) { setFactorId(verifiedFactor.id) } else { // No MFA factor enrolled — shouldn't be here router.push('/') } } loadFactor() inputRef.current?.focus() // eslint-disable-next-line react-hooks/exhaustive-deps }, []) const handleVerify = async (e: React.FormEvent) => { e.preventDefault() if (!factorId || code.length !== 6) return setIsLoading(true) try { const { data: challenge, error: challengeError } = await supabase.auth.mfa.challenge({ factorId, }) if (challengeError) { toast({ title: 'Verifiering misslyckades', description: 'Kunde inte starta verifiering. Försök igen.', variant: 'destructive', }) setIsLoading(false) return } const { error: verifyError } = await supabase.auth.mfa.verify({ factorId, challengeId: challenge.id, code, }) if (verifyError) { toast({ title: 'Fel kod', description: 'Kontrollera koden och försök igen.', variant: 'destructive', }) setCode('') inputRef.current?.focus() setIsLoading(false) return } router.push('/') router.refresh() } catch { toast({ title: 'Verifiering misslyckades', description: 'Ett oväntat fel uppstod. Försök igen.', variant: 'destructive', }) } finally { setIsLoading(false) } } const handleLogout = async () => { await supabase.auth.signOut() router.push('/login') } return (

Tvåfaktorsverifiering

Ange den 6-siffriga koden från din autentiseringsapp

setCode(e.target.value.replace(/\D/g, '').slice(0, 6))} required disabled={isLoading} className="h-11 text-center text-lg tracking-[0.5em] font-mono" />
) }