import { useState, type FormEvent } from 'react' import { validarConfirmacion, validarPasswordNueva } from '../lib/password' import { cambiarPassword } from '../services/auth' const CLASE_INPUT = 'w-full rounded-lg border border-[#D1D5DB] bg-white px-3 dark:border-[#334155] dark:bg-[#0F172A] dark:text-[#E2E8F0] py-2.5 text-sm transition-colors focus:border-accent focus:outline-none focus:ring-2 focus:ring-accent/20' const CLASE_LABEL = 'mb-2 block text-xs font-medium text-[#4B5563] dark:text-[#CBD5E1]' /** * Modal "Cambiar contraseña": actual + nueva + confirmar. Valida en cliente * con la misma regla del API y muestra el mensaje del API si la actual no es * correcta. Al éxito la sesión sigue intacta (el JWT no cambia). */ export default function CambiarPasswordModal({ onCerrar }: { onCerrar: () => void }) { const [actual, setActual] = useState('') const [nueva, setNueva] = useState('') const [confirmar, setConfirmar] = useState('') const [error, setError] = useState(null) const [exito, setExito] = useState(false) const [cargando, setCargando] = useState(false) async function enviar(e: FormEvent) { e.preventDefault() const errorCliente = validarPasswordNueva(nueva) ?? validarConfirmacion(nueva, confirmar) if (errorCliente) { setError(errorCliente) return } setError(null) setCargando(true) try { await cambiarPassword(actual, nueva) setExito(true) } catch (err) { setError(err instanceof Error ? err.message : 'No se pudo cambiar la contraseña') } finally { setCargando(false) } } return (

Cambiar contraseña

{exito ? ( <>

Contraseña actualizada

) : (
setActual(e.target.value)} autoComplete="current-password" autoFocus required className={CLASE_INPUT} />
setNueva(e.target.value)} autoComplete="new-password" required className={CLASE_INPUT} />

Mínimo 8 caracteres y un número

setConfirmar(e.target.value)} autoComplete="new-password" required className={CLASE_INPUT} />
{error && (

{error}

)}
)}
) }