import React, { useState } from 'react'; import { Div, Label } from '@cloudflare/elements'; import { createStyledComponent } from '@cloudflare/style-container'; import Radio from './Radio'; import Error from './Error'; import { useRenderOnResize } from '@cloudflare/util-hooks'; type FormRadiosProps = { name: string; label?: React.ReactNode; labelProps?: React.ComponentType; options: { label: React.ReactNode; value: ValueType; disabled?: boolean; }[]; value?: ValueType; onChange: (value: ValueType) => void; className?: string; error?: React.ReactNode; errorProps?: React.ComponentProps; disabled?: boolean; }; let count = 0; function Radios({ name, label, labelProps, options, value, onChange, className, error, errorProps, disabled }: FormRadiosProps) { useRenderOnResize(); const [ids] = useState(() => ({ label: `cf-form-radios-label${++count}`, error: `cf-form-radios-error${++count}` })); return (
{label && ( )} {options.map((option, index) => ( name={name} label={option.label} value={option.value} checked={option.value === value} onChange={() => onChange(option.value)} disabled={disabled || option.disabled} labelFirst={false} noLabel invalid={!!error} labelProps={{ marginLeft: 3, display: 'inline-block' }} erroredBy={error ? ids.error : undefined} describedBy={label ? ids.label : undefined} componentStyleProps={{ display: 'inline-block' }} marginBottom={error && index === options.length - 1 ? 2 : 3} /> ))} {error && ( {error} )}
); } const StyledFormRadios = createStyledComponent(() => ({}), Radios); export type RadiosProps = FormRadiosProps & Omit, 'onChange'>; export default function FormRadios(props: RadiosProps) { // @ts-ignore return ; }