diff --git a/src/components/DraftBanner/DraftBanner.tsx b/src/components/DraftBanner/DraftBanner.tsx index 06674171..8fdf5932 100644 --- a/src/components/DraftBanner/DraftBanner.tsx +++ b/src/components/DraftBanner/DraftBanner.tsx @@ -13,7 +13,7 @@ import { SaveMessage } from './SaveMessage'; import { BannerAddress } from './BannerAddress'; import { loadSourceDataContext } from '../loadSourceData/LoadSourceDataContext'; import { useAsyncEffect } from '../../hooks/useAsyncEffect'; -import { createPersonalizationMap } from '../orchestrator/UseLunatic'; +import { getPersonalizationByName } from '../orchestrator/UseLunatic'; const useStyles = makeStyles()({ container: { @@ -79,8 +79,9 @@ export function DraftBanner(props: PropsWithChildren) { dependenciesHaveChanged(currentChange, bannerLabelDependencies) ) { const updatedSUData = await getSurveyUnitData(); - const newPersonalization: Record = - createPersonalizationMap(updatedSUData?.personalization || []); + const newPersonalization = getPersonalizationByName( + updatedSUData?.personalization || [] + ); setlabel( newPersonalization.bannerLabel ? newPersonalization.bannerLabel : '' ); diff --git a/src/components/orchestrator/UseLunatic.tsx b/src/components/orchestrator/UseLunatic.tsx index 9f447ebd..fc73e346 100644 --- a/src/components/orchestrator/UseLunatic.tsx +++ b/src/components/orchestrator/UseLunatic.tsx @@ -1,4 +1,10 @@ -import { useEffect, useState, PropsWithChildren, useCallback } from 'react'; +import { + PropsWithChildren, + useCallback, + useEffect, + useMemo, + useState, +} from 'react'; import { useLunatic } from '@inseefr/lunatic'; import * as custom from '@inseefr/lunatic-dsfr'; import { @@ -11,12 +17,10 @@ import { CloneElements } from './CloneElements'; import { useQuestionnaireTitle } from './useQuestionnaireTitle'; import { useRedirectIfAlreadyValidated } from './useRedirectIfAlreadyValidated'; -export function createPersonalizationMap( +export function getPersonalizationByName( personalization: Array -) { - return personalization.reduce((acc, { name, value }) => { - return { ...acc, [name]: value }; - }, {}); +): Record { + return Object.fromEntries(personalization.map((p) => [p.name, p.value])); } export function UseLunatic(props: PropsWithChildren) { @@ -33,25 +37,19 @@ export function UseLunatic(props: PropsWithChildren) { disabled, metadata, } = props; - const [args, setArgs] = useState>({}); - - const [personalizationMap, setPersonalizationMap] = useState< - Record> - >({}); const { data, stateData, personalization = [] } = surveyUnitData ?? {}; const { currentPage: pageFromAPI, state } = stateData ?? {}; const [currentChange, setCurrentChange] = useState<{ name: string }>(); - const onChange = useCallback(({ name }: { name: string }, value: unknown) => { setCurrentChange({ name }); }, []); + const personalizationMap = useMemo( + () => getPersonalizationByName(personalization), + [personalization] + ); - useEffect(() => { - setPersonalizationMap(createPersonalizationMap(personalization)); - }, [personalization]); - - useEffect(() => { - setArgs({ + const args = useMemo( + () => ({ getReferentiel, custom, preferences, @@ -59,16 +57,17 @@ export function UseLunatic(props: PropsWithChildren) { savingType, autoSuggesterLoading, onChange, - }); - }, [ - getReferentiel, - preferences, - features, - savingType, - autoSuggesterLoading, - onChange, - paginated, - ]); + }), + [ + getReferentiel, + preferences, + features, + savingType, + autoSuggesterLoading, + onChange, + paginated, + ] + ); const { getComponents, diff --git a/src/components/orchestrator/useQuestionnaireTitle.tsx b/src/components/orchestrator/useQuestionnaireTitle.tsx index ba852cc1..51eaf56d 100644 --- a/src/components/orchestrator/useQuestionnaireTitle.tsx +++ b/src/components/orchestrator/useQuestionnaireTitle.tsx @@ -7,17 +7,15 @@ function getTitleByPage( source?: LunaticSource, defaultTitle = '' ): Record { - const base = {} as Record; - if (!source) { - return base; - } - let title = defaultTitle; - return source.components.reduce((acc, component) => { - if (component.componentType === 'Sequence') { - title = component.title ?? defaultTitle; - } - return { ...acc, [component.page]: title }; - }, base); + let sequenceTitle = defaultTitle; + const titleEntries = + source?.components.map((c) => { + if (c.componentType === 'Sequence') { + sequenceTitle = c.title ?? defaultTitle ?? ''; + } + return [c.page, sequenceTitle]; + }) ?? []; + return Object.fromEntries(titleEntries); } /**