) => string;
}) {
const id = `contact-${field.key}`;
const hasError = !!error;
const label = (
{field.label}
{field.isRequired ? (
*
) : (
({t('optional')})
)}
);
const help = field.helpText ? (
{field.helpText}
) : null;
const errorEl = error ? {error}
: null;
const maxLength = field.validation?.maxLength;
const minLength = field.validation?.minLength;
const min = field.validation?.min;
const max = field.validation?.max;
const pattern = field.validation?.pattern;
const strVal = typeof value === 'string' ? value : '';
const iClass = hasError ? inputErrorClass : inputClass;
const tClass = hasError ? textareaErrorClass : textareaClass;
switch (field.type) {
case 'TEXTAREA':
return (
{label}
);
case 'SELECT':
return (
{label}
onChange(e.target.value)}
className={iClass}
>
—
{field.enumValues?.map((opt) => (
{opt.label}
))}
{help}
{errorEl}
);
case 'MULTI_SELECT': {
const arr = Array.isArray(value) ? value : [];
return (
{label}
{field.enumValues?.map((opt) => {
const checked = arr.includes(opt.value);
return (
{
if (e.target.checked) onChange([...arr, opt.value]);
else onChange(arr.filter((v) => v !== opt.value));
}}
/>
{opt.label}
);
})}
{help}
{errorEl}
);
}
case 'CHECKBOX':
return (
onChange(e.target.checked)}
className="mt-0.5"
/>
{field.label}
{help}
{errorEl}
);
case 'NUMBER':
return (
{label}
onChange(e.target.value)}
className={iClass}
/>
{help}
{errorEl}
);
case 'EMAIL':
return (
{label}
onChange(e.target.value)}
className={iClass}
/>
{help}
{errorEl}
);
case 'PHONE':
return (
{label}
onChange(e.target.value)}
className={iClass}
/>
{help}
{errorEl}
);
case 'URL':
return (
{label}
onChange(e.target.value)}
className={iClass}
/>
{help}
{errorEl}
);
case 'DATE':
return (
{label}
onChange(e.target.value)}
className={iClass}
/>
{help}
{errorEl}
);
case 'TEXT':
default:
return (
{label}
onChange(e.target.value)}
className={iClass}
/>
{help}
{errorEl}
);
}
}