|
1 | 1 | 'use client' |
2 | 2 | import { useTranslations } from 'next-intl' |
3 | | -import { useState } from 'react' |
| 3 | +import { useMemo, useState } from 'react' |
4 | 4 | import useParamContext from 'src/providers/ParamProvider' |
5 | 5 | import { useSearchEquivalent } from 'src/providers/useSearchEquivalent' |
| 6 | +import { ComputedEquivalent } from 'types/equivalent' |
6 | 7 | import { computedEquivalents } from 'data/categories/computedEquivalents' |
7 | 8 | import { deplacements } from 'data/categories/deplacement' |
8 | 9 | import { getEquivalentWithCarpool } from 'utils/carpool' |
9 | 10 | import Button from 'components/base/buttons/Button' |
10 | 11 | import HiddenLabel from 'components/form/HiddenLabel' |
11 | 12 | import Input from 'components/form/Input' |
12 | 13 | import ComparisonEquivalents from './ComparisonEquivalents' |
| 14 | +import SubCategoryEquivalent from './SubCategoryEquivalent' |
| 15 | +import { subCategories } from './equivalentCategories' |
13 | 16 | import styles from './EquivalentsOverscreen.module.css' |
14 | 17 |
|
| 18 | +const allEquivalents = computedEquivalents('transport', deplacements).flatMap(getEquivalentWithCarpool) |
| 19 | + |
15 | 20 | const ComparisonOverscreen = ({ index }: { index: 0 | 1 }) => { |
16 | 21 | const { setOverscreen } = useParamContext() |
17 | 22 | const [search, setSearch] = useState('') |
18 | | - const results = useSearchEquivalent( |
19 | | - search, |
20 | | - false, |
21 | | - 4, |
22 | | - false, |
23 | | - computedEquivalents('transport', deplacements).flatMap(getEquivalentWithCarpool) |
24 | | - ) |
| 23 | + const results = useSearchEquivalent(search, false, 4, false, allEquivalents) |
25 | 24 |
|
26 | 25 | const tSearch = useTranslations('comparateur.overscreen') |
27 | 26 | const t = useTranslations('overscreen.transport') |
28 | 27 | const tModal = useTranslations('modal') |
29 | 28 | const onClose = () => { |
30 | 29 | setOverscreen('transport', '') |
31 | 30 | } |
| 31 | + |
| 32 | + const { categoriesEquivalents, categorizedSlugs } = useMemo(() => { |
| 33 | + const result = {} as Record<string, Record<string, ComputedEquivalent[]>> |
| 34 | + Object.entries(subCategories).forEach(([category, categoryEquivalents]) => { |
| 35 | + const categories = {} as Record<string, ComputedEquivalent[]> |
| 36 | + Object.entries(categoryEquivalents).forEach(([subCategory, subCategoryEquivalents]) => { |
| 37 | + const filteredEquivalents = subCategoryEquivalents |
| 38 | + .map((subCategoryEquivalent) => |
| 39 | + allEquivalents.find((equivalent) => equivalent.slug === subCategoryEquivalent) |
| 40 | + ) |
| 41 | + .filter((equivalent) => equivalent !== undefined) |
| 42 | + if (filteredEquivalents.length > 0) { |
| 43 | + categories[subCategory] = filteredEquivalents |
| 44 | + } |
| 45 | + }) |
| 46 | + if (Object.keys(categories).length > 0) { |
| 47 | + result[category] = categories |
| 48 | + } |
| 49 | + }) |
| 50 | + return { |
| 51 | + categoriesEquivalents: result, |
| 52 | + categorizedSlugs: Object.values(result).flatMap((subCategories) => |
| 53 | + Object.values(subCategories).flatMap((subCategoryEquivalents) => |
| 54 | + subCategoryEquivalents.map((equivalent) => equivalent.slug) |
| 55 | + ) |
| 56 | + ), |
| 57 | + } |
| 58 | + }, []) |
| 59 | + |
32 | 60 | return ( |
33 | 61 | <> |
34 | 62 | <div className={styles.header}> |
@@ -68,7 +96,24 @@ const ComparisonOverscreen = ({ index }: { index: 0 | 1 }) => { |
68 | 96 | </div> |
69 | 97 | ) |
70 | 98 | ) : ( |
71 | | - <ComparisonEquivalents onClose={onClose} equivalents={results} index={index} /> |
| 99 | + <> |
| 100 | + {Object.entries(categoriesEquivalents) |
| 101 | + .filter(([category]) => category.startsWith('voiture')) |
| 102 | + .map(([category, subCategories]) => ( |
| 103 | + <SubCategoryEquivalent |
| 104 | + category={allEquivalents.find((equivalent) => equivalent.slug === category) as ComputedEquivalent} |
| 105 | + categoriesEquivalents={subCategories} |
| 106 | + onClose={onClose} |
| 107 | + index={index} |
| 108 | + key={category} |
| 109 | + /> |
| 110 | + ))} |
| 111 | + <ComparisonEquivalents |
| 112 | + onClose={onClose} |
| 113 | + equivalents={results.filter((equivalent) => !categorizedSlugs.includes(equivalent.slug))} |
| 114 | + index={index} |
| 115 | + /> |
| 116 | + </> |
72 | 117 | )} |
73 | 118 | </ul> |
74 | 119 | <div className={styles.footerCenter}> |
|
0 commit comments