import { Tooltip } from '@components/common/form/Tooltip.js'; import { getNestedError } from '@components/common/form/utils/getNestedError.js'; import { Field, FieldError, FieldLabel, FieldLegend } from '@components/common/ui/Field.js'; import { Label } from '@components/common/ui/Label.js'; import { RadioGroup, RadioGroupItem } from '@components/common/ui/RadioGroup.js'; import { _ } from '@evershop/evershop/lib/locale/translate/_'; import React from 'react'; import { useFormContext, RegisterOptions, FieldPath, FieldValues, Controller } from 'react-hook-form'; interface RadioOption { value: string | number; label: string; disabled?: boolean; } interface RadioGroupFieldProps extends Omit< React.InputHTMLAttributes, 'name' | 'type' | 'value' | 'checked' | 'onChange' | 'onBlur' > { name: FieldPath; options: RadioOption[]; label?: string; error?: string; helperText?: string; required?: boolean; disabled?: boolean; validation?: RegisterOptions; defaultValue?: string | number; wrapperClassName?: string; } export function RadioGroupField({ name, options, label, error, wrapperClassName, helperText, className = '', required = false, disabled = false, validation, defaultValue, ...props }: RadioGroupFieldProps) { const { control, formState: { errors } } = useFormContext(); const fieldError = getNestedError(name, errors, error); const fieldId = `field-${name}`; const validationRules = { ...validation, ...(required && !validation?.required && { required: _('${field} is required', { field: label || name }) }) }; return ( {label && ( <> {label} {required && *} {helperText && } )} ( { const option = options.find((o) => String(o.value) === value); if (option) { field.onChange(option.value); } }} className={className} aria-invalid={fieldError !== undefined ? 'true' : 'false'} aria-describedby={ fieldError !== undefined ? `${fieldId}-error` : undefined } > {options.map((option) => (
{option.label}
))}
)} /> {fieldError && {fieldError}}
); }