Skip to content

Commit edcdc79

Browse files
committed
handle subFinality description in typing and DOM
1 parent 4a94ba5 commit edcdc79

File tree

5 files changed

+72
-27
lines changed

5 files changed

+72
-27
lines changed

src/consentManagement/ConsentBannerAndConsentManagement/ConsentBannerAndConsentManagement.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import React, { useReducer, useEffect, type ReactNode } from "react";
22
import type { RegisteredLinkProps } from "../../link";
3-
import type { ExtractFinalityFromFinalityDescription, FinalityConsent } from "../types";
3+
import type {
4+
ExtractFinalityFromFinalityDescription,
5+
FinalityConsent,
6+
SubFinalityContent
7+
} from "../types";
48
import type { ProcessConsentChanges } from "../processConsentChanges";
59
import { FooterBottomItem } from "../../Footer";
610
import { createConsentBanner } from "./ConsentBanner";
@@ -10,7 +14,11 @@ import { useTranslation } from "./translation";
1014
export function createConsentBannerAndConsentManagement<
1115
FinalityDescription extends Record<
1216
string,
13-
{ title: ReactNode; description?: ReactNode; subFinalities?: Record<string, ReactNode> }
17+
{
18+
title: ReactNode;
19+
description?: ReactNode;
20+
subFinalities?: Record<string, SubFinalityContent>;
21+
}
1422
>
1523
>(params: {
1624
finalityDescription: ((params: { lang: string }) => FinalityDescription) | FinalityDescription;

src/consentManagement/ConsentBannerAndConsentManagement/ConsentManagement.tsx

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ import React, { useEffect, useMemo, useState, useId, type ReactNode } from "reac
22
import { fr } from "../../fr";
33
import type { RegisteredLinkProps } from "../../link";
44
import { createModal } from "../../Modal";
5-
import type { ExtractFinalityFromFinalityDescription, FinalityConsent } from "../types";
5+
import type {
6+
ExtractFinalityFromFinalityDescription,
7+
FinalityConsent,
8+
SubFinalityContent
9+
} from "../types";
610
import type { ProcessConsentChanges } from "../processConsentChanges";
711
import { useLang } from "../../i18n";
812
import { useIsModalOpen } from "../../Modal/useIsModalOpen";
@@ -20,7 +24,11 @@ import { useConst } from "../../tools/powerhooks/useConst";
2024
export function createConsentManagement<
2125
FinalityDescription extends Record<
2226
string,
23-
{ title: ReactNode; description?: ReactNode; subFinalities?: Record<string, ReactNode> }
27+
{
28+
title: ReactNode;
29+
description?: ReactNode;
30+
subFinalities?: Record<string, SubFinalityContent>;
31+
}
2432
>
2533
>(params: {
2634
personalDataPolicyLinkProps: RegisteredLinkProps | undefined;
@@ -238,7 +246,7 @@ export function createConsentManagement<
238246
function ConsentService(props: {
239247
title: ReactNode;
240248
description: ReactNode | undefined;
241-
subFinalities: Record<string, ReactNode> | undefined;
249+
subFinalities: Record<string, { title: ReactNode; description?: ReactNode }> | undefined;
242250
finalityConsent:
243251
| boolean
244252
| ({
@@ -378,19 +386,22 @@ export function createConsentManagement<
378386
className={fr.cx("fr-consent-services", "fr-collapse")}
379387
id={subFinalityDivId}
380388
>
381-
{Object.entries(subFinalities).map(([subFinality, title]) => (
382-
<SubConsentService
383-
key={subFinality}
384-
title={title}
385-
isConsentGiven={finalityConsent[subFinality]}
386-
onChange={({ isConsentGiven }) =>
387-
onChange({
388-
subFinality,
389-
isConsentGiven
390-
})
391-
}
392-
/>
393-
))}
389+
{Object.entries(subFinalities).map(
390+
([subFinality, { title, description }]) => (
391+
<SubConsentService
392+
key={subFinality}
393+
title={title}
394+
description={description}
395+
isConsentGiven={finalityConsent[subFinality]}
396+
onChange={({ isConsentGiven }) =>
397+
onChange({
398+
subFinality,
399+
isConsentGiven
400+
})
401+
}
402+
/>
403+
)
404+
)}
394405
</div>
395406
</>
396407
))}
@@ -401,10 +412,11 @@ export function createConsentManagement<
401412

402413
function SubConsentService(props: {
403414
title: ReactNode;
415+
description?: ReactNode;
404416
onChange: (params: { isConsentGiven: boolean }) => void;
405417
isConsentGiven: boolean;
406418
}) {
407-
const { title, onChange, isConsentGiven } = props;
419+
const { title, description, onChange, isConsentGiven } = props;
408420

409421
const { t } = useTranslation();
410422

@@ -421,6 +433,9 @@ export function createConsentManagement<
421433
<div className={fr.cx("fr-consent-service")}>
422434
<fieldset className={fr.cx("fr-fieldset", "fr-fieldset--inline")}>
423435
<legend className={fr.cx("fr-consent-service__title")}>{title}</legend>
436+
{description !== undefined && (
437+
<p className={fr.cx("fr-consent-service__desc")}>{description}</p>
438+
)}
424439
<div className={fr.cx("fr-consent-service__radios", "fr-fieldset--inline")}>
425440
<div className={fr.cx("fr-radio-group")}>
426441
<input

src/consentManagement/createConsentManagement.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useReducer, useEffect, type ReactNode } from "react";
2-
import type { ExtractFinalityFromFinalityDescription } from "./types";
2+
import type { ExtractFinalityFromFinalityDescription, SubFinalityContent } from "./types";
33
import type { RegisteredLinkProps } from "../link";
44
import { createUseConsent } from "./useConsent";
55
import { createProcessConsentChanges, type ConsentCallback } from "./processConsentChanges";
@@ -14,7 +14,11 @@ export const defaultLocalStorageKeyPrefix = "@codegouvfr/react-dsfr finalityCons
1414
export function createConsentManagement<
1515
FinalityDescription extends Record<
1616
string,
17-
{ title: ReactNode; description?: ReactNode; subFinalities?: Record<string, ReactNode> }
17+
{
18+
title: ReactNode;
19+
description?: ReactNode;
20+
subFinalities?: Record<string, SubFinalityContent>;
21+
}
1822
>
1923
>(params: {
2024
finalityDescription: ((params: { lang: string }) => FinalityDescription) | FinalityDescription;
@@ -112,7 +116,11 @@ export function createConsentManagement<
112116
export function getFinalitiesFromFinalityDescription<
113117
FinalityDescription extends Record<
114118
string,
115-
{ title: ReactNode; description?: ReactNode; subFinalities?: Record<string, ReactNode> }
119+
{
120+
title: ReactNode;
121+
description?: ReactNode;
122+
subFinalities?: Record<string, SubFinalityContent>;
123+
}
116124
>
117125
>(params: {
118126
finalityDescription: FinalityDescription;

src/consentManagement/types.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,26 @@ export type FinalityConsent<Finality extends string> = {
1414
export type ExtractFinalityFromFinalityDescription<
1515
FinalityDescription extends Record<
1616
string,
17-
{ title: ReactNode; subFinalities?: Record<string, ReactNode> }
17+
{
18+
title: ReactNode;
19+
description?: ReactNode;
20+
subFinalities?: Record<string, SubFinalityContent>;
21+
}
1822
>
1923
> = {
2024
[K in keyof FinalityDescription]: K extends string
21-
? FinalityDescription[K] extends { subFinalities: Record<string, any> }
25+
? FinalityDescription[K] extends { subFinalities: Record<string, SubFinalityContent> }
2226
? `${K}.${ExtractFinalityFromFinalityDescription.SubFinalities<FinalityDescription[K]>}`
2327
: K
2428
: never;
2529
}[keyof FinalityDescription];
2630

2731
export namespace ExtractFinalityFromFinalityDescription {
2832
export type SubFinalities<T> = T extends { subFinalities: infer U }
29-
? U extends Record<string, any>
33+
? U extends Record<string, SubFinalityContent>
3034
? keyof U
3135
: never
3236
: never;
3337
}
38+
39+
export type SubFinalityContent = { title: ReactNode; description?: ReactNode };

stories/ConsentManagement.stories.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,16 @@ const {
236236
"description":
237237
"Nous utilisons des cookies pour mesurer l’audience de notre site et améliorer son contenu.",
238238
"subFinalities": {
239-
"deviceInfo": "Informations sur votre appareil",
240-
"traffic": "Informations sur votre navigation"
239+
"deviceInfo": {
240+
"title": "Informations sur votre appareil",
241+
"description":
242+
"Nous utilisons des cookies pour mesurer l’audience de notre site et améliorer son contenu."
243+
},
244+
"traffic": {
245+
"title": "Informations sur votre navigation",
246+
"description":
247+
"Nous utilisons des cookies pour mesurer l’audience de notre site et améliorer son contenu."
248+
}
241249
}
242250
}
243251
},

0 commit comments

Comments
 (0)