"use client"; import { useEffect, useState } from "react"; import { Eye, EyeOff, Check, AlertTriangle, Loader2 } from "lucide-react"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; type Strength = { ok: boolean; reason?: string; checking?: boolean }; export function PasswordField({ value, onChange, onValidationChange, label = "Passwort", id = "password", autoComplete = "new-password", disabled, }: { value: string; onChange: (v: string) => void; onValidationChange?: (v: Strength) => void; label?: string; id?: string; autoComplete?: string; disabled?: boolean; }) { const [show, setShow] = useState(false); const [strength, setStrength] = useState({ ok: false }); useEffect(() => { if (!value) { setStrength({ ok: false }); onValidationChange?.({ ok: false }); return; } setStrength((s) => ({ ...s, checking: true })); const t = setTimeout(async () => { try { const r = await fetch("/api/password-check", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ password: value }) }); const d = await r.json(); const next: Strength = { ok: !!d.ok, reason: d.reason }; setStrength(next); onValidationChange?.(next); } catch { setStrength({ ok: false, reason: "Prüfung nicht möglich." }); } }, 400); return () => clearTimeout(t); }, [value, onValidationChange]); return (
onChange(e.target.value)} disabled={disabled} autoComplete={autoComplete} className="pr-10" />
{value && (
{strength.checking ? ( <>prüfe… ) : strength.ok ? ( <>Passwort OK ) : ( <>{strength.reason || "zu schwach"} )}
)}
); }