Skip to content

Commit ac6849f

Browse files
committed
improve the chipset widget
1 parent ea9dd19 commit ac6849f

3 files changed

Lines changed: 73 additions & 22 deletions

File tree

src/components/Elements/ChipsSet/ChipsSet.tsx

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { Option } from 'src/types'
21
import { useState } from 'react'
2+
import { Option } from 'src/types'
3+
import './chipset.css'
34

45
type ChipProps = {
56
option: Option
@@ -10,30 +11,41 @@ type ChipProps = {
1011
const 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'
1820
type 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>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
.chipsSet {
2+
margin: 6px 0;
3+
display: flex;
4+
gap: 12px;
5+
flex-wrap: wrap;
6+
}
7+
8+
.chip {
9+
font-weight: 500;
10+
border-radius: 50px;
11+
padding: 6px 12px;
12+
border: transparent;
13+
font-family: 'nunito';
14+
color: var(--chip-text);
15+
background-color: var(--chip-background);
16+
display: flex;
17+
align-items: center;
18+
column-gap: 8px;
19+
cursor: pointer;
20+
}
21+
.chip:hover {
22+
filter: brightness(95%);
23+
}
24+
25+
.chip .chipIcon {
26+
margin: 0;
27+
padding: 0;
28+
line-height: 14px;
29+
}
30+
.chip .chipIcon > img,
31+
.chip .chipIcon > svg {
32+
background-color: white;
33+
color: black;
34+
border-radius: 50px;
35+
padding: 2px;
36+
width: 20px;
37+
height: 20px;
38+
}
39+
.chip.active {
40+
background-color: var(--chip-active-background);
41+
color: var(--chip-active-text);
42+
}

src/components/Elements/FloatingFilter/FloatingFilter.tsx

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,13 @@ export const FloatingFilter = ({ card, filters = ['language'] }: ListingFilterMo
4444
<p className="settingTitle">Language</p>
4545
<div className="settingContent">
4646
<ChipsSet
47-
defaultValue={
48-
availableTagOptions.find(
49-
(tag) => tag.value === cardsSettings[card.value]?.language
50-
) || {
51-
label: GLOBAL_TAG.label,
52-
value: GLOBAL_TAG.value,
53-
}
47+
defaultValues={
48+
availableTagOptions
49+
.filter((tag) => tag.value === cardsSettings[card.value]?.language)
50+
?.map((tag) => tag.label) || [GLOBAL_TAG.value]
5451
}
5552
options={availableTagOptions}
56-
onChange={(option) => {
53+
onChange={(_, option) => {
5754
setCardSettings(card.value, {
5855
...cardsSettings[card.value],
5956
language: option.value,
@@ -70,13 +67,13 @@ export const FloatingFilter = ({ card, filters = ['language'] }: ListingFilterMo
7067
<p className="settingTitle">Date Range</p>
7168
<div className="settingContent">
7269
<ChipsSet
73-
defaultValue={
74-
dateRanges.find(
75-
(date) => date.value === cardsSettings[card.value]?.dateRange
76-
) || dateRanges[0]
70+
defaultValues={
71+
dateRanges
72+
.filter((date) => date.value === cardsSettings[card.value]?.dateRange)
73+
.map((date) => date.value) || dateRanges[0].value
7774
}
7875
options={dateRanges}
79-
onChange={(option) => {
76+
onChange={(_, option) => {
8077
setCardSettings(card.value, {
8178
...cardsSettings[card.value],
8279
dateRange: option.value,

0 commit comments

Comments
 (0)