import * as React from 'react'; import classNames from 'classnames'; import {ChipContext} from './useChipContext'; import {generateId} from '../utils'; import Flex from '../flex/Flex'; import type {ResponsivePropType} from '../utils/responsive-props'; type DirectionType = 'row' | 'column'; export type ChipGroupPropsType = { /** * Chip group inner elements * @example Label */ children?: React.ReactNode; /** * Optional string. Additional classnames. */ className?: string | null | undefined; /** * Specify items display direction. * @example * @default "row" */ direction?: DirectionType; /** * Sets whether the group is disabled. * @example */ disabled?: boolean; /** * Sets whether the group is required. * @example */ required?: boolean; /** * The name of Chip inputs. * @example */ name?: string; /** * Function called with an object containing the react synthetic event, whenever selected radio input changes. */ onChange?: ( event: React.SyntheticEvent, value: string | null | undefined ) => void; /** * Sets whether the Chip is multi select or single select. * @example */ multiSelect?: boolean; /** * Currently selected radio input. * @example Label */ value?: string | null | undefined | Array; /** * It will wrap component * @example * component content * */ wrap?: ResponsivePropType; } & Omit< React.AllHTMLAttributes, | 'children' | 'className' | 'direction' | 'disabled' | 'name' | 'onChange' | 'value' | 'multiSelect' | 'as' | 'wrap' >; const getGroupValue = ( currentValue: string | null | undefined | Array, toggledValue: string | null | undefined, multiSelect?: boolean ) => { if (multiSelect) { if (Array.isArray(currentValue)) { // @ts-ignore TS2345 return currentValue.includes(toggledValue) ? currentValue.filter(v => v !== toggledValue) : [...currentValue, toggledValue]; } return currentValue === toggledValue ? null : [toggledValue]; } return currentValue === toggledValue ? null : toggledValue; }; const ChipGroup = ({ className, children, disabled, name, required, value, onChange, multiSelect, wrap = true, ...props }: ChipGroupPropsType) => { const chipGroupClass = classNames('sg-chip-group', className); const groupRole = multiSelect ? 'group' : 'radiogroup'; const {current: groupName} = React.useRef( name || `ChipGroup_${generateId()}` ); const [selectedValue, setSelectedValue] = React.useState(value || null); React.useEffect(() => { // @ts-ignore TS2345 setSelectedValue(value); }, [value]); // @ts-ignore TS7006 const setValue = (event, chipValue) => { // @ts-ignore TS2345 setSelectedValue(getGroupValue(selectedValue, chipValue, multiSelect)); if (onChange) onChange(event, chipValue); }; return ( {children} ); }; export default ChipGroup;