'use client' import { Check, X } from 'lucide-react' import { useT } from '@open-mercato/shared/lib/i18n/context' import { cn } from '@open-mercato/shared/lib/utils' import type { PasswordPolicy, PasswordRequirement, PasswordRequirementId, PasswordValidationResult, } from '@open-mercato/shared/lib/auth/passwordPolicy' type PasswordStrengthStatusProps = { hasInput: boolean passwordPolicy: PasswordPolicy passwordRequirements: PasswordRequirement[] passwordValidation: PasswordValidationResult className?: string framed?: boolean } type RequirementItemProps = { fulfilled: boolean hasInput: boolean label: string } const requirementTextById: Record, { key: string; fallback: string }> = { digit: { key: 'auth.password.requirements.digit', fallback: 'One number' }, uppercase: { key: 'auth.password.requirements.uppercase', fallback: 'One uppercase letter' }, special: { key: 'auth.password.requirements.special', fallback: 'One special character' }, } function RequirementItem({ fulfilled, hasInput, label }: RequirementItemProps) { return (
  • {hasInput ? ( fulfilled ? : ) : ( )} {label}
  • ) } function resolveRequirementLabel( requirement: PasswordRequirement, policy: PasswordPolicy, t: ReturnType, ): string { if (requirement.id === 'minLength') { return t( 'auth.password.requirements.minLength', 'At least {min} characters', { min: requirement.value ?? policy.minLength }, ) } const requirementText = requirementTextById[requirement.id] return t(requirementText.key, requirementText.fallback) } export function PasswordStrengthStatus({ hasInput, passwordPolicy, passwordRequirements, passwordValidation, className, framed = true, }: PasswordStrengthStatusProps) { const t = useT() return (

    {t('security.profile.password.form.requirementsTitle', 'Password requirements')}

      {passwordRequirements.map((requirement) => { const fulfilled = !passwordValidation.violations.includes(requirement.id) const label = resolveRequirementLabel(requirement, passwordPolicy, t) return ( ) })}
    ) }