import { useMemo } from 'react'; import { cn } from '@/lib/utils'; import { validatePasswordStrength } from '@/lib/passwordValidator'; interface PasswordStrengthIndicatorProps { password: string; } interface PasswordStrength { score: number; // 0-5 checks: { length: boolean; upper: boolean; lower: boolean; number: boolean; special: boolean; }; } export function PasswordStrengthIndicator({ password, }: PasswordStrengthIndicatorProps) { // T0197: Use validatePasswordStrength from passwordValidator const strength = useMemo(() => { const validation = validatePasswordStrength(password); const score = (validation.strength.length ? 1 : 0) + (validation.strength.upper ? 1 : 0) + (validation.strength.lower ? 1 : 0) + (validation.strength.number ? 1 : 0) + (validation.strength.special ? 1 : 0); return { score, checks: validation.strength, }; }, [password]); const strengthLabels = ['Very Weak', 'Weak', 'Fair', 'Good', 'Strong']; const strengthColors = [ 'bg-kodo-red', 'bg-kodo-orange', 'bg-kodo-gold', 'bg-kodo-cyan', 'bg-kodo-lime', ]; const strengthTextColors = [ 'text-kodo-red', 'text-kodo-orange', 'text-kodo-gold', 'text-kodo-steel', 'text-kodo-lime', ]; if (!password) return null; const currentStrengthLabel = strengthLabels[strength.score - 1] || 'Very Weak'; const currentStrengthColor = strengthColors[strength.score - 1] || 'bg-kodo-steel'; const currentTextColor = strengthTextColors[strength.score - 1] || 'text-kodo-content-dim'; return (
{currentStrengthLabel}
  • {strength.checks.length ? '✓' : '○'} At least 8 characters
  • {strength.checks.upper ? '✓' : '○'} One uppercase letter
  • {strength.checks.lower ? '✓' : '○'} One lowercase letter
  • {strength.checks.number ? '✓' : '○'} One number
  • {strength.checks.special ? '✓' : '○'} One special character
); }