|
1 | | -import { useCallback } from 'react' |
| 1 | +import { useCallback, useMemo } from 'react' |
| 2 | +import { FaGlobe } from 'react-icons/fa' |
2 | 3 | import { TiPlus } from 'react-icons/ti' |
3 | 4 | import { Link } from 'react-router-dom' |
4 | 5 | import { useUserPreferences } from 'src/stores/preferences' |
5 | 6 | import { useShallow } from 'zustand/shallow' |
6 | 7 |
|
7 | 8 | export const UserTags = () => { |
8 | | - const { cards, userSelectedTags, cardsSettings, setCardSettings } = useUserPreferences( |
9 | | - useShallow((state) => ({ |
10 | | - cards: state.cards, |
11 | | - userSelectedTags: state.userSelectedTags, |
12 | | - cardsSettings: state.cardsSettings, |
13 | | - setCardSettings: state.setCardSettings, |
14 | | - })) |
15 | | - ) |
| 9 | + const { cards, userSelectedTags, cardsSettings, setCardSettings, clearCardSettingsLanguages } = |
| 10 | + useUserPreferences( |
| 11 | + useShallow((state) => ({ |
| 12 | + cards: state.cards, |
| 13 | + userSelectedTags: state.userSelectedTags, |
| 14 | + cardsSettings: state.cardsSettings, |
| 15 | + setCardSettings: state.setCardSettings, |
| 16 | + clearCardSettingsLanguages: state.clearCardSettingsLanguages, |
| 17 | + })) |
| 18 | + ) |
16 | 19 |
|
17 | | - const onTagClicked = useCallback((tagValue: string) => { |
18 | | - cards.forEach((card) => { |
19 | | - setCardSettings(card.name, { |
20 | | - ...cardsSettings[card.id], |
21 | | - language: tagValue, |
| 20 | + const onTagClicked = useCallback( |
| 21 | + (tagValue: string) => { |
| 22 | + if (tagValue === 'all') { |
| 23 | + clearCardSettingsLanguages() |
| 24 | + return |
| 25 | + } |
| 26 | + |
| 27 | + cards.forEach((card) => { |
| 28 | + setCardSettings(card.name, { |
| 29 | + ...cardsSettings[card.id], |
| 30 | + language: tagValue, |
| 31 | + }) |
22 | 32 | }) |
23 | | - }) |
24 | | - }, []) |
| 33 | + }, |
| 34 | + [cards, cardsSettings, setCardSettings] |
| 35 | + ) |
| 36 | + |
| 37 | + const tagsList = useMemo(() => { |
| 38 | + const tags = userSelectedTags.map((tag) => ({ |
| 39 | + label: tag.label, |
| 40 | + value: tag.value, |
| 41 | + icon: undefined, |
| 42 | + })) |
| 43 | + |
| 44 | + if (tags.length === 0) { |
| 45 | + return tags |
| 46 | + } |
| 47 | + |
| 48 | + return [ |
| 49 | + { |
| 50 | + label: 'All', |
| 51 | + value: 'all', |
| 52 | + icon: <FaGlobe className="tagIcon" />, |
| 53 | + }, |
| 54 | + ...tags, |
| 55 | + ] |
| 56 | + }, [userSelectedTags]) |
25 | 57 |
|
26 | 58 | return ( |
27 | 59 | <div className="tags"> |
28 | | - {userSelectedTags.map((tag, index) => ( |
| 60 | + {tagsList.map((tag, index) => ( |
29 | 61 | <button key={index} className="tag tagHoverable" onClick={() => onTagClicked(tag.value)}> |
30 | | - {tag.label} |
| 62 | + {tag.icon} {tag.label} |
31 | 63 | </button> |
32 | 64 | ))} |
33 | 65 | <Link to="/settings/topics" className="tag tagHoverable" aria-label="Open settings"> |
|
0 commit comments