import clsx from 'clsx'; import { FormError } from '@@/form-components/FormError'; import { FormSectionTitle } from '@@/form-components/FormSectionTitle'; import { BoxSelectorItem } from './BoxSelectorItem'; import { BoxSelectorOption, Value } from './types'; interface IsMultiProps { isMulti: true; value: T[]; onChange(value: T[], limitedToBE: boolean): void; } interface SingleProps { isMulti?: never; value: T; onChange(value: T, limitedToBE: boolean): void; } type Union = IsMultiProps | SingleProps; export type Props = Union & { radioName: string; options: ReadonlyArray> | Array>; slim?: boolean; hiddenSpacingCount?: number; error?: string; useGridLayout?: boolean; className?: string; label?: string; }; export function BoxSelector({ radioName, options, slim = false, hiddenSpacingCount, error, useGridLayout, className, label, ...props }: Props) { const rootClassName = clsx( useGridLayout ? 'grid grid-cols-1 gap-2.5 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4' : 'mb-1 mt-1 flex w-full flex-wrap gap-2.5 overflow-hidden', className ); return ( <> {!!label && {label}}
{options .filter((option) => !option.hide) .map((option) => ( ))} {hiddenSpacingCount && Array.from(Array(hiddenSpacingCount)).map((_, index) => (
))}
{!!error && {error}}
); function handleSelect(optionValue: T, limitedToBE: boolean) { if (props.isMulti) { const newValue = isSelected(optionValue) ? props.value.filter((v) => v !== optionValue) : [...props.value, optionValue]; props.onChange(newValue, limitedToBE); return; } if (isSelected(optionValue)) { return; } props.onChange(optionValue, limitedToBE); } function isSelected(optionValue: T) { if (props.isMulti) { return props.value.includes(optionValue); } return props.value === optionValue; } }