Skip to content

Commit

Permalink
(PC-31042) feat: use new categoryTree in categoriesModal
Browse files Browse the repository at this point in the history
  • Loading branch information
thconte committed Sep 16, 2024
1 parent 866bb7e commit f93485e
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import styled from 'styled-components/native'

import { SearchGroupNameEnumv2 } from 'api/gen'
import { CategoriesSectionItem } from 'features/search/components/CategoriesSectionItem/CategoriesSectionItem'
import { CategoryTree } from 'features/search/helpers/categoriesHelpers/categoryTree'
import {
MappedGenreTypes,
MappedNativeCategories,
Expand All @@ -14,7 +15,11 @@ import { RadioButton } from 'ui/components/radioButtons/RadioButton'
import { VerticalUl } from 'ui/components/Ul'
import { AccessibleBicolorIcon } from 'ui/svg/icons/types'

export type CategoriesMapping = MappingTree | MappedNativeCategories | MappedGenreTypes
export type CategoriesMapping =
| CategoryTree
| MappingTree
| MappedNativeCategories
| MappedGenreTypes

export interface CategoriesSectionProps<
T extends CategoriesMapping,
Expand All @@ -24,7 +29,7 @@ export interface CategoriesSectionProps<
allValue: N
data?: T
descriptionContext: DescriptionContext
getIcon?: T extends MappingTree
getIcon?: T extends MappingTree | CategoryTree
? (categoryName: SearchGroupNameEnumv2) => FC<AccessibleBicolorIcon> | undefined
: undefined
onSelect: (item: N) => void
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@ import {
isOnlyOnline,
searchGroupOrNativeCategorySortComparator,
} from 'features/search/helpers/categoriesHelpers/categoriesHelpers'
import { createMappingTree } from 'features/search/helpers/categoriesHelpers/mapping-tree'
import { createCategoryTree } from 'features/search/helpers/categoriesHelpers/categoryTree'
import { BooksNativeCategoriesEnum, SearchState } from 'features/search/types'
import { FACETS_FILTERS_ENUM } from 'libs/algolia/enums/facetsEnums'
import {
categoriesDataTest,
searchGroupsDataTest,
subcategoriesDataTest,
} from 'libs/subcategories/fixtures/subcategoriesResponse'
Expand All @@ -25,9 +26,7 @@ let mockSearchState: SearchState = {
...initialSearchState,
}

const mockedFacets = undefined

const tree = createMappingTree(subcategoriesDataTest, mockedFacets)
const categoryTree = createCategoryTree(categoriesDataTest)

jest.mock('libs/firebase/analytics/analytics')
jest.mock('libs/firebase/remoteConfig/remoteConfig.services')
Expand Down Expand Up @@ -296,7 +295,9 @@ describe('categoriesHelpers', () => {
offerCategories: [],
}

expect(getDefaultFormView(tree, mockSearchState)).toEqual(CategoriesModalView.CATEGORIES)
expect(getDefaultFormView(categoryTree, mockSearchState)).toEqual(
CategoriesModalView.CATEGORIES
)
})

it('when category selected is "Cartes jeunes" because it does not native categories', () => {
Expand All @@ -305,7 +306,9 @@ describe('categoriesHelpers', () => {
offerCategories: [SearchGroupNameEnumv2.CARTES_JEUNES],
}

expect(getDefaultFormView(tree, mockSearchState)).toEqual(CategoriesModalView.CATEGORIES)
expect(getDefaultFormView(categoryTree, mockSearchState)).toEqual(
CategoriesModalView.CATEGORIES
)
})
})

Expand All @@ -317,7 +320,7 @@ describe('categoriesHelpers', () => {
offerNativeCategories: [],
}

expect(getDefaultFormView(tree, mockSearchState)).toEqual(
expect(getDefaultFormView(categoryTree, mockSearchState)).toEqual(
CategoriesModalView.NATIVE_CATEGORIES
)
})
Expand All @@ -329,7 +332,7 @@ describe('categoriesHelpers', () => {
offerNativeCategories: [NativeCategoryIdEnumv2.LIVRES_AUDIO_PHYSIQUES],
}

expect(getDefaultFormView(tree, mockSearchState)).toEqual(
expect(getDefaultFormView(categoryTree, mockSearchState)).toEqual(
CategoriesModalView.NATIVE_CATEGORIES
)
})
Expand All @@ -343,7 +346,9 @@ describe('categoriesHelpers', () => {
offerNativeCategories: [NativeCategoryIdEnumv2.SPECTACLES_REPRESENTATIONS],
}

expect(getDefaultFormView(tree, mockSearchState)).toEqual(CategoriesModalView.GENRES)
expect(getDefaultFormView(categoryTree, mockSearchState)).toEqual(
CategoriesModalView.GENRES
)
})

it('when a category, a native category, a genre type categories selected', () => {
Expand All @@ -356,7 +361,9 @@ describe('categoriesHelpers', () => {
],
}

expect(getDefaultFormView(tree, mockSearchState)).toEqual(CategoriesModalView.GENRES)
expect(getDefaultFormView(categoryTree, mockSearchState)).toEqual(
CategoriesModalView.GENRES
)
})
})
})
Expand Down
21 changes: 10 additions & 11 deletions src/features/search/helpers/categoriesHelpers/categoriesHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@ import {
SearchGroupResponseModelv2,
SubcategoriesResponseModelv2,
} from 'api/gen'
import { useSearchResults } from 'features/search/api/useSearchResults/useSearchResults'
import { CATEGORY_CRITERIA, CategoriesModalView } from 'features/search/enums'
import {
CategoryTree,
createCategoryTree,
} from 'features/search/helpers/categoriesHelpers/categoryTree'
import {
MappedNativeCategories,
MappingTree,
createMappingTree,
getBooksGenreTypes,
getBooksNativeCategories,
getKeyFromStringLabel,
Expand All @@ -27,7 +28,7 @@ import {
SearchState,
} from 'features/search/types'
import { FACETS_FILTERS_ENUM } from 'libs/algolia/enums/facetsEnums'
import { useSubcategories } from 'libs/subcategories/useSubcategories'
import { useCategories } from 'libs/subcategories/useCategories'

type Item = SearchGroupNameEnumv2 | NativeCategoryIdEnumv2 | string | null

Expand Down Expand Up @@ -342,15 +343,13 @@ export function getNativeCategories(
}

export const useNativeCategories = (searchGroup?: SearchGroupNameEnumv2) => {
const { data: subcategories } = useSubcategories()
const { facets } = useSearchResults()

const tree = createMappingTree(subcategories, facets)
const { data: categoryTree } = useCategories()
const tree = createCategoryTree(categoryTree)

const mappedNativeCategories =
searchGroup &&
searchGroup !== SearchGroupNameEnumv2.NONE &&
(tree[searchGroup].children as MappedNativeCategories)
(tree[searchGroup]?.children as MappedNativeCategories)

const nativeCategories = mappedNativeCategories ? Object.entries(mappedNativeCategories) : []

Expand Down Expand Up @@ -499,7 +498,7 @@ export function getDescription(
return undefined
}

export function getDefaultFormView(tree: MappingTree, searchState: SearchState) {
export function getDefaultFormView(tree: CategoryTree, searchState: SearchState) {
const { offerGenreTypes, offerCategories, offerNativeCategories } = searchState

if (!offerCategories?.[0]) return CategoriesModalView.CATEGORIES
Expand All @@ -516,7 +515,7 @@ export function getDefaultFormView(tree: MappingTree, searchState: SearchState)
}

export function getDefaultFormValues(
tree: MappingTree | undefined,
tree: CategoryTree | undefined,
searchState: SearchState
): CategoriesModalFormProps {
if (!tree)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,14 @@ import {
getIcon,
handleCategoriesSearchPress,
} from 'features/search/helpers/categoriesHelpers/categoriesHelpers'
import { createCategoryTree } from 'features/search/helpers/categoriesHelpers/categoryTree'
import {
createMappingTree,
MappedGenreTypes,
MappedNativeCategories,
} from 'features/search/helpers/categoriesHelpers/mapping-tree'
import { NativeCategoryEnum, SearchState } from 'features/search/types'
import { FacetData } from 'libs/algolia/types'
import { useCategories } from 'libs/subcategories/useCategories'
import { useSubcategories } from 'libs/subcategories/useSubcategories'
import { Form } from 'ui/components/Form'
import { AppModal } from 'ui/components/modals/AppModal'
Expand Down Expand Up @@ -54,15 +55,15 @@ export const CategoriesModal = ({
isVisible = false,
hideModal,
onClose,
facets,
}: CategoriesModalProps) => {
const { data } = useSubcategories()
const { data: categoryList } = useCategories()
const { data: subcategoriesData } = useSubcategories()
const { modal } = useTheme()
const { dispatch, searchState } = useSearch()

const tree = useMemo(() => {
return createMappingTree(data, facets)
}, [data, facets])
return createCategoryTree(categoryList)
}, [categoryList])

const {
formState: { isSubmitting },
Expand All @@ -80,9 +81,8 @@ export const CategoriesModal = ({
}, [reset, searchState, tree])

const nativeCategories = useMemo(() => {
return (category &&
category !== SearchGroupNameEnumv2.NONE &&
tree[category].children) as MappedNativeCategories
return ((category && category !== SearchGroupNameEnumv2.NONE && tree[category]?.children) ||
{}) as MappedNativeCategories
}, [category, tree])

const genreTypes = useMemo(() => {
Expand Down Expand Up @@ -115,8 +115,7 @@ export const CategoriesModal = ({
setValue('genreType', null)
}

// @ts-expect-error: because of noUncheckedIndexedAccess
if (nativeCategoryKey && nativeCategories[nativeCategoryKey].children) {
if (nativeCategoryKey && nativeCategories[nativeCategoryKey]?.children) {
setValue('currentView', CategoriesModalView.GENRES)
}
},
Expand Down Expand Up @@ -160,11 +159,11 @@ export const CategoriesModal = ({

const handleSearchPress = useCallback(
(form: CategoriesModalFormProps) => {
if (!data) {
if (!subcategoriesData) {
return
}

const searchPressData = handleCategoriesSearchPress(form, data)
const searchPressData = handleCategoriesSearchPress(form, subcategoriesData)

let additionalSearchState: SearchState = { ...searchState, ...searchPressData?.payload }
additionalSearchState = {
Expand All @@ -175,7 +174,7 @@ export const CategoriesModal = ({
dispatch({ type: 'SET_STATE', payload: additionalSearchState })
hideModal()
},
[data, dispatch, hideModal, searchState]
[subcategoriesData, dispatch, hideModal, searchState]
)

const handleReset = useCallback(() => {
Expand All @@ -197,8 +196,8 @@ export const CategoriesModal = ({
)

const modalTitle = useMemo(() => {
return getCategoriesModalTitle(data, currentView, category, nativeCategory)
}, [category, currentView, data, nativeCategory])
return getCategoriesModalTitle(subcategoriesData, currentView, category, nativeCategory)
}, [category, currentView, subcategoriesData, nativeCategory])

const shouldDisplayBackButton = useMemo(
() =>
Expand Down
5 changes: 3 additions & 2 deletions src/libs/subcategories/fixtures/subcategoriesResponse.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { SubcategoriesResponseModelv2 } from 'api/gen'
import { PLACEHOLDER_DATA } from 'libs/subcategories/placeholderData'
import { CategoriesResponseModel, SubcategoriesResponseModelv2 } from 'api/gen'
import { CATEGORY_TREE_PLACE_HOLDER, PLACEHOLDER_DATA } from 'libs/subcategories/placeholderData'

export const subcategoriesDataTest: SubcategoriesResponseModelv2 = PLACEHOLDER_DATA
export const categoriesDataTest: CategoriesResponseModel = CATEGORY_TREE_PLACE_HOLDER

export const searchGroupsDataTest = PLACEHOLDER_DATA.searchGroups

0 comments on commit f93485e

Please sign in to comment.