import { useMemo } from "react"; import { Check, X } from "lucide-react"; import { cn } from "@/lib/utils"; interface PasswordStrengthMeterProps { password: string; } interface PasswordRequirement { label: string; test: (password: string) => boolean; } const requirements: PasswordRequirement[] = [ { label: "At least 8 characters", test: (p) => p.length >= 8 }, { label: "Contains uppercase letter", test: (p) => /[A-Z]/.test(p) }, { label: "Contains lowercase letter", test: (p) => /[a-z]/.test(p) }, { label: "Contains number", test: (p) => /\d/.test(p) }, { label: "Contains special character", test: (p) => /[!@#$%^&*(),.?":{}|<>]/.test(p) }, ]; export function PasswordStrengthMeter({ password }: PasswordStrengthMeterProps) { const results = useMemo(() => { return requirements.map((req) => ({ ...req, met: req.test(password), })); }, [password]); const strength = useMemo(() => { const metCount = results.filter((r) => r.met).length; if (metCount === 0) return { level: 0, label: "", color: "bg-muted" }; if (metCount <= 2) return { level: 1, label: "Weak", color: "bg-destructive" }; if (metCount <= 3) return { level: 2, label: "Fair", color: "bg-warning" }; if (metCount <= 4) return { level: 3, label: "Good", color: "bg-accent" }; return { level: 4, label: "Strong", color: "bg-success" }; }, [results]); if (!password) return null; return (
{strength.label}
)}