import { Tooltip } from '@components/common/form/Tooltip.js'; import { getNestedError } from '@components/common/form/utils/getNestedError.js'; import { Field, FieldError, FieldLabel } from '@components/common/ui/Field.js'; import { InputGroup, InputGroupAddon, InputGroupInput } from '@components/common/ui/InputGroup.js'; import { _ } from '@evershop/evershop/lib/locale/translate/_'; import { Eye, EyeClosed } from 'lucide-react'; import React from 'react'; import { useFormContext, RegisterOptions, FieldPath, FieldValues, Controller } from 'react-hook-form'; interface PasswordFieldProps extends Omit, 'name' | 'type'> { name: FieldPath; label?: string; error?: string; helperText?: string; required?: boolean; minLength?: number; showToggle?: boolean; validation?: RegisterOptions; wrapperClassName?: string; prefixIcon?: React.ReactNode; suffixIcon?: React.ReactNode; } export function PasswordField({ name, label, error, helperText, required, minLength = 6, showToggle = false, validation, wrapperClassName, className, defaultValue, prefixIcon, suffixIcon, ...props }: PasswordFieldProps) { const { control, formState: { errors } } = useFormContext(); const fieldError = getNestedError(name, errors, error); const fieldId = `field-${name}`; const [showPassword, setShowPassword] = React.useState(false); const validationRules = { ...validation, ...(required && !validation?.required && { required: _('${field} is required', { field: label || name }) }), minLength: validation?.minLength || { value: minLength, message: _('Password must be at least ${minLength} characters long', { minLength: minLength.toString() }) } }; const renderToggleButton = () => showToggle ? ( ) : null; const renderInput = () => ( ( )} /> ); return ( {label && ( <> {label} {required && *} {helperText && } )} {renderInput()} {prefixIcon && ( {prefixIcon} )} {(suffixIcon || showToggle) && ( {suffixIcon || renderToggleButton()} )} {fieldError && {fieldError}} ); }