"use client"; import { ChevronUpIcon } from "@/assets/icons"; import { cn } from "@/lib/utils"; import { ILabelValue } from "@/types/shared"; import { useEffect, useId, useState, type ChangeEvent } from "react"; import { type FieldErrors, type FieldValues, type Path, type UseFormRegister, type UseFormRegisterReturn, } from "react-hook-form"; type PropsType = { name: Path; label: string; items: ILabelValue[]; prefixIcon?: React.ReactNode; onChange?: (e: ChangeEvent) => void; className?: string; register?: UseFormRegister; errors?: FieldErrors; required?: boolean; clearable?: boolean; onClear?: () => void; value?: string; } & ( | { placeholder?: string; defaultValue?: string } | { placeholder: string; defaultValue?: string } ) & Partial; export function Select({ items, label, defaultValue, placeholder, prefixIcon, className, name, register, errors, required, onChange, onBlur, ref, clearable = false, onClear, value: controlledValue, ...props }: PropsType) { const id = useId(); const [isOptionSelected, setIsOptionSelected] = useState(!!defaultValue); const [value, setValue] = useState(defaultValue || ""); const error = errors && errors[name]; useEffect(() => { if (controlledValue !== undefined) { setValue(controlledValue); setIsOptionSelected(!!controlledValue); } }, [controlledValue]); const handleClear = () => { if (controlledValue === undefined) { setValue(""); } setIsOptionSelected(false); onClear?.(); if (onChange) { const event = { target: { value: "", name }, } as unknown as ChangeEvent; onChange(event); } }; return (
{prefixIcon && (
{prefixIcon}
)} {clearable && value && ( )}
{error && (

{error.message as string}

)}
); }