"use client"; import { updatePasswordAction } from "@/app/(dashboard)/ajustes/actions"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { RiEyeLine, RiEyeOffLine, RiCheckLine, RiCloseLine, RiAlertLine } from "@remixicon/react"; import { useState, useTransition, useMemo } from "react"; import { toast } from "sonner"; type UpdatePasswordFormProps = { authProvider?: string; // 'google' | 'credential' | undefined }; export function UpdatePasswordForm({ authProvider }: UpdatePasswordFormProps) { const [isPending, startTransition] = useTransition(); const [currentPassword, setCurrentPassword] = useState(""); const [newPassword, setNewPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [showCurrentPassword, setShowCurrentPassword] = useState(false); const [showNewPassword, setShowNewPassword] = useState(false); const [showConfirmPassword, setShowConfirmPassword] = useState(false); // Verificar se o usuário usa login via Google const isGoogleAuth = authProvider === "google"; // Validação em tempo real: senhas coincidem const passwordsMatch = useMemo(() => { if (!confirmPassword) return null; // Não mostrar erro se campo vazio return newPassword === confirmPassword; }, [newPassword, confirmPassword]); // Indicador de força da senha (básico) const passwordStrength = useMemo(() => { if (!newPassword) return null; if (newPassword.length < 6) return "weak"; if (newPassword.length >= 12 && /[A-Z]/.test(newPassword) && /[0-9]/.test(newPassword) && /[^A-Za-z0-9]/.test(newPassword)) { return "strong"; } if (newPassword.length >= 8 && (/[A-Z]/.test(newPassword) || /[0-9]/.test(newPassword))) { return "medium"; } return "weak"; }, [newPassword]); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); // Validação frontend antes de enviar if (newPassword !== confirmPassword) { toast.error("As senhas não coincidem"); return; } if (newPassword.length < 6) { toast.error("A senha deve ter no mínimo 6 caracteres"); return; } startTransition(async () => { const result = await updatePasswordAction({ currentPassword, newPassword, confirmPassword, }); if (result.success) { toast.success(result.message); setCurrentPassword(""); setNewPassword(""); setConfirmPassword(""); } else { toast.error(result.error); } }); }; // Se o usuário usa Google OAuth, mostrar aviso if (isGoogleAuth) { return (

Alteração de senha não disponível

Você fez login usando sua conta do Google. A senha é gerenciada diretamente pelo Google e não pode ser alterada aqui. Para modificar sua senha, acesse as configurações de segurança da sua conta Google.

); } return (
{/* Senha atual */}
setCurrentPassword(e.target.value)} disabled={isPending} placeholder="Digite sua senha atual" required aria-required="true" aria-describedby="current-password-help" />

Por segurança, confirme sua senha atual antes de alterá-la

{/* Nova senha */}
setNewPassword(e.target.value)} disabled={isPending} placeholder="Mínimo de 6 caracteres" required minLength={6} aria-required="true" aria-describedby="new-password-help" aria-invalid={newPassword.length > 0 && newPassword.length < 6} />

Use no mínimo 6 caracteres. Recomendado: 12+ caracteres com letras, números e símbolos

{/* Indicador de força da senha */} {passwordStrength && (
{passwordStrength === "weak" ? "Fraca" : passwordStrength === "medium" ? "Média" : "Forte"}
)}
{/* Confirmar nova senha */}
setConfirmPassword(e.target.value)} disabled={isPending} placeholder="Repita a senha" required minLength={6} aria-required="true" aria-describedby="confirm-password-help" aria-invalid={passwordsMatch === false} className={ passwordsMatch === false ? "border-red-500 focus-visible:ring-red-500" : passwordsMatch === true ? "border-green-500 focus-visible:ring-green-500" : "" } /> {/* Indicador visual de match */} {passwordsMatch !== null && (
{passwordsMatch ? ( ) : ( )}
)}
{/* Mensagem de erro em tempo real */} {passwordsMatch === false && ( )} {passwordsMatch === true && (

As senhas coincidem

)}
); }