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;