import type { AnyFieldMeta } from '@tanstack/react-form'; import { LucideEye, LucideEyeClosed } from 'lucide-react'; import { useCallback, useId, useState } from 'react'; export type TextFieldProps = { label?: string; value?: string; onChange?: (e: React.ChangeEvent) => void; labelProps?: React.LabelHTMLAttributes; labelDivProps?: React.HTMLAttributes; } & React.InputHTMLAttributes & { type?: 'password'; showPasswordToggle?: boolean; }; export function TextField({ label, value, onChange, labelProps, labelDivProps, showPasswordToggle, ...rest }: TextFieldProps) { const id = useId(); const [isPasswordVisible, setIsPasswordVisible] = useState(false); const handlePasswordVisibilitySet = useCallback( (e: React.MouseEvent | React.TouchEvent, visible: boolean) => { if (rest.type !== 'password') return; e.preventDefault(); setIsPasswordVisible(() => visible); }, [rest.type] ); return ( ); } export type TextFieldErrorMessageProps = AnyFieldMeta & { errorMessage?: string; }; export function TextFieldErrorMessage({ isValid, errors, errorMessage }: TextFieldErrorMessageProps) { return ( !isValid && (
{errorMessage ?? errors?.reduce((msg, err) => msg + err.message + ' ', '')}
) ); }