|
1 | 1 | import { IIcon, IconVersion } from "../../../../types";
|
2 |
| -import { IIconFilter } from "../types"; |
| 2 | +import { FilterType, IIconFilter, IIconFilterGroup } from "../types"; |
| 3 | + |
| 4 | +const FilterMapRecord: Record<FilterType, string> = { |
| 5 | + versions: 'versions.svg', |
| 6 | + color: 'color', |
| 7 | + tags: 'tags', |
| 8 | + alias: 'alias', |
| 9 | + name: 'name' |
| 10 | +}; |
| 11 | + |
| 12 | +const getItemsFromPath = (icons: IIcon, path: string): string[] => { |
| 13 | + // eslint-disable-next-line @typescript-eslint/no-explicit-any |
| 14 | + const items = path.split('.').reduce((acc: any, curr: string) => acc[curr], icons); |
| 15 | + return items; |
| 16 | +} |
3 | 17 |
|
4 |
| -export const populateIconFilters = (icons: IIcon[], filters: IIconFilter[], attribute: 'versions.svg' | 'tags') => { |
5 |
| - // Reset filters |
6 |
| - filters.forEach((filter: IIconFilter) => { |
| 18 | +export const populateIconFilters = (icons: IIcon[], filterGroup: IIconFilterGroup) => { |
| 19 | + const itemsPath = FilterMapRecord[filterGroup.filterType]; |
| 20 | + filterGroup.filters.forEach(filter => { |
7 | 21 | filter.numberOfIcons = 0;
|
8 | 22 | });
|
9 | 23 |
|
10 |
| - // Populate filters |
11 |
| - icons.forEach((icon: IIcon) => { |
12 |
| - const items: string[] = attribute === 'versions.svg' ? icon.versions.svg : icon.tags; |
13 |
| - items.forEach((item: string) => { |
14 |
| - const category = filters.find(category => category.filterName === item); |
| 24 | + icons.forEach(icon => { |
| 25 | + const items: string[] = getItemsFromPath(icon, itemsPath); |
| 26 | + items.forEach(item => { |
| 27 | + const category = filterGroup.filters.find(category => category.filterName === item); |
15 | 28 | if (category) {
|
16 | 29 | category.numberOfIcons++;
|
17 | 30 | } else {
|
18 |
| - filters.push({ filterName: item as IconVersion, numberOfIcons: 1, isSelected: false }); |
| 31 | + filterGroup.filters.push({ filterName: item as IconVersion, numberOfIcons: 1, isSelected: false }); |
19 | 32 | }
|
20 | 33 | });
|
21 | 34 | });
|
22 | 35 |
|
23 |
| - // Sort filters |
24 |
| - filters.sort((a, b) => b.numberOfIcons - a.numberOfIcons); |
25 |
| - |
26 |
| - return filters; |
| 36 | + filterGroup.filters.sort((a, b) => b.numberOfIcons - a.numberOfIcons); |
| 37 | + return filterGroup; |
27 | 38 | };
|
28 | 39 |
|
| 40 | +const FilterFunctions: Record<FilterType, (icon: IIcon, criterion: string | IconVersion) => boolean> = { |
| 41 | + name: (icon, name) => [icon.name, ...(icon.altnames ?? [])].some(n => n.toLowerCase().includes(name as string)), |
| 42 | + versions: (icon, version) => icon.versions.svg.includes(version as IconVersion), |
| 43 | + tags: (icon, tag) => icon.tags.includes(tag as string), |
| 44 | + color: () => true, // Placeholder function, update as required |
| 45 | + alias: () => true // Placeholder function, update as required |
| 46 | +}; |
29 | 47 |
|
30 |
| -export const filterIconsByName = (icons: IIcon[], search: string): IIcon[] => { |
31 |
| - search = search.trim().toLowerCase(); |
32 |
| - return icons.filter(icon => { |
33 |
| - const names = [icon.name, ...(icon.altnames ?? [])]; |
34 |
| - return names.some(name => name.toLowerCase().includes(search)); |
35 |
| - }); |
36 |
| -} |
37 |
| - |
38 |
| -export const filterIconsByVersion = (icons: IIcon[], version: IconVersion): IIcon[] => { |
39 |
| - return icons.filter(icon => icon.versions.svg.includes(version)); |
40 |
| -} |
41 |
| - |
42 |
| -export const filterIconsByTag = (icons: IIcon[], tag: string): IIcon[] => { |
43 |
| - return icons.filter(icon => icon.tags.includes(tag)); |
| 48 | +export const filterIcons = (icons: IIcon[], filterType: FilterType, criterion: string | IconVersion): IIcon[] => { |
| 49 | + return icons.filter(icon => FilterFunctions[filterType](icon, criterion)); |
44 | 50 | }
|
45 | 51 |
|
46 |
| -export const updateFilters = (filters: IIconFilter[], filter: IIconFilter) => { |
47 |
| - const updatedFilters = [...filters]; |
48 |
| - const index = updatedFilters.findIndex((c) => c.filterName === filter.filterName); |
49 |
| - updatedFilters[index].isSelected = !updatedFilters[index].isSelected; |
50 |
| - return updatedFilters; |
| 52 | +export const updateFilter = (filterGroup: IIconFilterGroup, filter: IIconFilter) => { |
| 53 | + const tempFilterGroup = { ...filterGroup }; |
| 54 | + const filterIndex = tempFilterGroup.filters.findIndex(item => item.filterName === filter.filterName); |
| 55 | + if (filterIndex === -1) return filterGroup; |
| 56 | + tempFilterGroup.filters[filterIndex].isSelected = !filter.isSelected; |
| 57 | + return tempFilterGroup; |
51 | 58 | }
|
0 commit comments