import React, { forwardRef, memo, useState } from 'react'; import { Chip } from '@cleartrip/ct-design-chip'; import { Box } from '@cleartrip/ct-design-box'; import { Container, ContainerRef } from '@cleartrip/ct-design-container'; import { Typography } from '@cleartrip/ct-design-typography'; import { useStyles } from '@cleartrip/ct-design-style-manager'; import useIsomorphicEffect from '@cleartrip/ct-design-use-isomorphic-effect'; import { ISingleSelectProps, SingleChipProps } from './type'; import { ChipOrientation } from './constants'; import { singleSelectChipStaticStyles } from './style'; interface ChipAtomsProps { data: SingleChipProps[]; selectedChip: string | null; onClickCb: (chip: SingleChipProps) => () => void; chipStyleConfig?: ISingleSelectProps['styleConfig'] extends infer T ? T extends { chip?: infer C } ? C : never : never; } const ChipAtoms = memo(({ data, selectedChip, onClickCb, chipStyleConfig }: ChipAtomsProps) => { return ( <> {data.map((item) => { const isSelected = item?.id === selectedChip; return ( ); })} ); }); ChipAtoms.displayName = 'ChipAtoms'; const SingleSelectChip = forwardRef( ({ onChange, data, orientation = ChipOrientation.row, selected = null, prompt, styleConfig = {} }, ref) => { const { hasError = false, Icon: promptIcon, message: promptMessage } = prompt || {}; const { root: customRootStyles = [], chipContainer: chipContainerStyles = [], promptBox: promptBoxStyles = [], promptIconContainer: promptIconContainerStyles = [], promptMessageTypography: promptMessageTypographyStyles, chip: chipStyleConfig, } = styleConfig; const [selectedChip, setSelectedChip] = useState(selected ?? null); useIsomorphicEffect(() => { if ((selected ?? null) !== selectedChip) { setSelectedChip(selected ?? null); } }, [selected]); const onClickCb = (chip: SingleChipProps) => () => { const { id } = chip ?? {}; if (selectedChip !== id) { setSelectedChip(id); onChange?.(id); } }; const dynamicStyles = useStyles( () => ({ chipWrapper: { flexDirection: orientation === ChipOrientation.row ? 'row' : 'column', }, }), [orientation], ); return ( {(promptIcon || promptMessage) && ( {promptIcon && ( {promptIcon} )} {promptMessage && ( {promptMessage} )} )} ); }, ); SingleSelectChip.displayName = 'SingleSelectChip'; export default memo(SingleSelectChip);