import * as React from "react"; import { Check, AlertCircle } from "lucide-react"; import { cn } from "@/lib/utils"; import { Input } from "@/components/ui/input"; import { useDebouncedCallback } from "use-debounce"; export interface ValidatedInputProps extends React.ComponentProps { validation?: { isValid?: boolean; error?: string; hint?: string; }; showValidation?: boolean; onValidate?: (value: string) => { isValid: boolean; error?: string }; } const ValidatedInput = React.forwardRef( ({ className, validation, showValidation = true, onValidate, onChange, ...props }, ref) => { const [localValidation, setLocalValidation] = React.useState<{ isValid?: boolean; error?: string; }>({}); const debouncedValidate = useDebouncedCallback((value: string) => { if (onValidate) { const result = onValidate(value); setLocalValidation(result); } }, 300); const handleChange = (e: React.ChangeEvent) => { onChange?.(e); if (onValidate && showValidation) { debouncedValidate(e.target.value); } }; const validationState = validation || localValidation; const showSuccess = showValidation && validationState.isValid && props.value; const showError = showValidation && validationState.error; return (
{showValidation && props.value && (
{validationState.isValid && ( )} {validationState.error && ( )}
)}
{showValidation && validation?.hint && !validationState.error && (

{validation.hint}

)} {showError && (

{validationState.error}

)}
); } ); ValidatedInput.displayName = "ValidatedInput"; export { ValidatedInput };