11'use client'
22import { useTranslations } from 'next-intl'
3- import { useState } from 'react'
3+ import { useMemo , useState } from 'react'
44import useParamContext from 'src/providers/ParamProvider'
55import { useSearchEquivalent } from 'src/providers/useSearchEquivalent'
6+ import { ComputedEquivalent } from 'types/equivalent'
67import { computedEquivalents } from 'data/categories/computedEquivalents'
78import { deplacements } from 'data/categories/deplacement'
89import { getEquivalentWithCarpool } from 'utils/carpool'
910import Button from 'components/base/buttons/Button'
1011import HiddenLabel from 'components/form/HiddenLabel'
1112import Input from 'components/form/Input'
1213import ComparisonEquivalents from './ComparisonEquivalents'
14+ import SubCategoryEquivalent from './SubCategoryEquivalent'
15+ import { subCategories } from './equivalentCategories'
1316import styles from './EquivalentsOverscreen.module.css'
1417
18+ const allEquivalents = computedEquivalents ( 'transport' , deplacements ) . flatMap ( getEquivalentWithCarpool )
19+
1520const ComparisonOverscreen = ( { index } : { index : 0 | 1 } ) => {
1621 const { setOverscreen } = useParamContext ( )
1722 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 )
2524
2625 const tSearch = useTranslations ( 'comparateur.overscreen' )
2726 const t = useTranslations ( 'overscreen.transport' )
2827 const tModal = useTranslations ( 'modal' )
2928 const onClose = ( ) => {
3029 setOverscreen ( 'transport' , '' )
3130 }
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 ) => results . find ( ( equivalent ) => equivalent . slug === subCategoryEquivalent ) )
39+ . filter ( ( equivalent ) => equivalent !== undefined )
40+ if ( filteredEquivalents . length > 0 ) {
41+ categories [ subCategory ] = filteredEquivalents
42+ }
43+ } )
44+ if ( Object . keys ( categories ) . length > 0 ) {
45+ result [ category ] = categories
46+ }
47+ } )
48+ return {
49+ categoriesEquivalents : result ,
50+ categorizedSlugs : Object . values ( result ) . flatMap ( ( subCategories ) =>
51+ Object . values ( subCategories ) . flatMap ( ( subCategoryEquivalents ) =>
52+ subCategoryEquivalents . map ( ( equivalent ) => equivalent . slug )
53+ )
54+ ) ,
55+ }
56+ } , [ results ] )
57+
3258 return (
3359 < >
3460 < div className = { styles . header } >
@@ -48,7 +74,7 @@ const ComparisonOverscreen = ({ index }: { index: 0 | 1 }) => {
4874 { tModal ( 'close' ) }
4975 </ Button >
5076 </ div >
51- < ul className = { styles . content } >
77+ < div className = { styles . content } >
5278 { search ? (
5379 results . length > 0 ? (
5480 < ComparisonEquivalents onClose = { onClose } equivalents = { results } index = { index } />
@@ -68,9 +94,26 @@ const ComparisonOverscreen = ({ index }: { index: 0 | 1 }) => {
6894 </ div >
6995 )
7096 ) : (
71- < ComparisonEquivalents onClose = { onClose } equivalents = { results } index = { index } />
97+ < >
98+ { Object . entries ( categoriesEquivalents )
99+ . filter ( ( [ category ] ) => category . startsWith ( 'voiture' ) )
100+ . map ( ( [ category , subCategories ] ) => (
101+ < SubCategoryEquivalent
102+ category = { allEquivalents . find ( ( equivalent ) => equivalent . slug === category ) as ComputedEquivalent }
103+ categoriesEquivalents = { subCategories }
104+ onClose = { onClose }
105+ index = { index }
106+ key = { category }
107+ />
108+ ) ) }
109+ < ComparisonEquivalents
110+ onClose = { onClose }
111+ equivalents = { results . filter ( ( equivalent ) => ! categorizedSlugs . includes ( equivalent . slug ) ) }
112+ index = { index }
113+ />
114+ </ >
72115 ) }
73- </ ul >
116+ </ div >
74117 < div className = { styles . footerCenter } >
75118 < Button
76119 onClick = { ( ) => {
0 commit comments