1- import { Option } from 'src/types'
21import { useState } from 'react'
2+ import { Option } from 'src/types'
3+ import './chipset.css'
34
45type ChipProps = {
56 option : Option
@@ -10,30 +11,41 @@ type ChipProps = {
1011const Chip = ( { option, onSelect, active = false } : ChipProps ) => {
1112 return (
1213 < button className = { 'chip ' + ( active && 'active' ) } onClick = { ( ) => onSelect ( option ) } >
14+ { option . icon && < span className = "chipIcon" > { option . icon } </ span > }
1315 { option . label }
1416 </ button >
1517 )
1618}
17-
19+ type ChangeAction = 'ADD' | 'REMOVE'
1820type ChipsSetProps = {
1921 options : Option [ ]
20- defaultValue : Option
21- onChange : ( option : Option ) => void
22+ defaultValues ?: string [ ]
23+ onChange ? : ( action : ChangeAction , option : Option ) => void
2224}
2325
24- export const ChipsSet = ( { options, onChange, defaultValue } : ChipsSetProps ) => {
25- const [ selectedChip , setSelectedChip ] = useState < Option > ( defaultValue )
26+ export const ChipsSet = ( { options, onChange, defaultValues } : ChipsSetProps ) => {
27+ const [ selectedChips , setSelectedChips ] = useState < string [ ] | undefined > ( defaultValues || [ ] )
2628
2729 const onSelect = ( option : Option ) => {
28- setSelectedChip ( option )
29- onChange ( option )
30+ if ( selectedChips ?. some ( ( chipValue ) => chipValue === option . value ) ) {
31+ setSelectedChips ( ( prev ) => prev ?. filter ( ( chipValue ) => chipValue !== option . value ) )
32+ onChange && onChange ( 'REMOVE' , option )
33+ } else {
34+ setSelectedChips ( ( prev ) => [ ...( prev || [ ] ) , option . value ] )
35+ onChange && onChange ( 'ADD' , option )
36+ }
3037 }
3138
3239 return (
3340 < div className = "chipsSet" >
3441 { options . map ( ( option ) => {
3542 return (
36- < Chip option = { option } onSelect = { onSelect } active = { selectedChip . value === option . value } />
43+ < Chip
44+ key = { option . value }
45+ option = { option }
46+ onSelect = { onSelect }
47+ active = { selectedChips ?. some ( ( chipValue ) => chipValue === option . value ) || false }
48+ />
3749 )
3850 } ) }
3951 </ div >
0 commit comments