// components/UpdatePasswordLogic.tsx 'use client'; import { useState, useEffect } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { createClientComponentClient } from '@supabase/auth-helpers-nextjs'; import type { SupabaseClient } from '@supabase/supabase-js'; export default function UpdatePasswordLogic() { const router = useRouter(); const searchParams = useSearchParams(); const supabase: SupabaseClient = createClientComponentClient(); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const [error, setError] = useState(null); const [message, setMessage] = useState(null); const [loading, setLoading] = useState(false); const [status, setStatus] = useState<'validating' | 'ready' | 'invalid'>('validating'); useEffect(() => { let isMounted = true; const code = searchParams.get('code'); if (!code) { setStatus('invalid'); setError('Link de redefinição inválido ou expirado.'); setTimeout(() => router.push('/login'), 5000); return; } const processCode = async () => { try { const { error } = await supabase.auth.exchangeCodeForSession(code); if (error) { setStatus('invalid'); setError('Link de redefinição inválido ou expirado.'); setTimeout(() => router.push('/login'), 5000); return; } if (isMounted) { setStatus('ready'); } } catch (err: any) { setStatus('invalid'); setError('Erro inesperado ao validar o link.'); setTimeout(() => router.push('/login'), 5000); } }; processCode(); return () => { isMounted = false; }; }, [searchParams, supabase, router]); const handleUpdatePassword = async (event: React.FormEvent) => { event.preventDefault(); setError(null); setMessage(null); if (password !== confirmPassword) { setError('As senhas não coincidem.'); return; } if (password.length < 6) { setError('A senha deve ter no mínimo 6 caracteres.'); return; } setLoading(true); try { const { error: updateError } = await supabase.auth.updateUser({ password: password }); if (updateError) throw updateError; setMessage('Senha atualizada com sucesso! Redirecionando para o login...'); await supabase.auth.signOut(); setTimeout(() => { router.push('/login'); }, 3000); } catch (err: any) { setError(err.message || 'Erro ao atualizar a senha.'); } finally { setLoading(false); } }; if (status === 'validating') { return (

Verificando Link

Aguarde um momento enquanto validamos seu link de recuperação de senha.

); } return (
{status === 'ready' ? ( <>

Crie sua nova senha

Digite e confirme sua nova senha de acesso abaixo.

setPassword(e.target.value)} className="w-full px-3 py-2 mt-1 border border-gray-300 rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500" placeholder="••••••••" minLength={6} />
setConfirmPassword(e.target.value)} className="w-full px-3 py-2 mt-1 border border-gray-300 rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500" placeholder="••••••••" minLength={6} />
) : null} {error && (
Erro: {error}
)} {message && (
Sucesso: {message}
)}
); }