File size: 1,896 Bytes
f2e9a59 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | 'use client';
import {
DetailedHTMLProps,
FC,
forwardRef,
SelectHTMLAttributes,
useMemo,
} from 'react';
import { clsx } from 'clsx';
import { useFormContext } from 'react-hook-form';
import { RegisterOptions } from 'react-hook-form/dist/types/validator';
import { TranslatedLabel } from '../translation/translated-label';
export const Select: FC<
DetailedHTMLProps<
SelectHTMLAttributes<HTMLSelectElement>,
HTMLSelectElement
> & {
error?: any;
extraForm?: RegisterOptions<any>;
disableForm?: boolean;
label: string;
name: string;
hideErrors?: boolean;
translationKey?: string;
translationParams?: Record<string, string | number>;
}
> = forwardRef((props, ref) => {
const {
label,
className,
hideErrors,
disableForm,
error,
extraForm,
translationKey,
translationParams,
...rest
} = props;
const form = useFormContext();
const err = useMemo(() => {
if (error) return error;
if (!form || !form.formState.errors[props?.name!]) return;
return form?.formState?.errors?.[props?.name!]?.message! as string;
}, [form?.formState?.errors?.[props?.name!]?.message, error]);
return (
<div className={clsx('flex flex-col', label ? 'gap-[6px]' : '')}>
<div className={`text-[14px]`}>
<TranslatedLabel
label={label}
translationKey={translationKey}
translationParams={translationParams}
/>
</div>
<select
ref={ref}
{...(disableForm ? {} : form.register(props.name, extraForm))}
className={clsx(
'h-[42px] bg-newBgColorInner px-[16px] outline-none border-newTableBorder border rounded-[8px] text-[14px]',
className
)}
{...rest}
/>
{!hideErrors && (
<div className="text-red-400 text-[12px]">{err || <> </>}</div>
)}
</div>
);
});
|