@codegouvfr/react-dsfr
Version:
French State Design System React integration library
83 lines • 3.48 kB
JavaScript
import { useReducer, useEffect } from "react";
import { createUseConsent } from "./useConsent";
import { createProcessConsentChanges } from "./processConsentChanges";
import { createStatefulObservable } from "../tools/StatefulObservable";
import { useRerenderOnChange } from "../tools/StatefulObservable/hooks";
import { createConsentBannerAndConsentManagement } from "./ConsentBannerAndConsentManagement";
import { isBrowser } from "../tools/isBrowser";
export const defaultLocalStorageKeyPrefix = "@codegouvfr/react-dsfr finalityConsent";
export function createConsentManagement(params) {
const { finalityDescription, personalDataPolicyLinkProps, consentCallback, localStorageKeyPrefix = defaultLocalStorageKeyPrefix } = params;
const finalities = getFinalitiesFromFinalityDescription({
"finalityDescription": typeof finalityDescription === "function"
? finalityDescription({ "lang": "fr" })
: finalityDescription
});
const localStorageKey = `${localStorageKeyPrefix} ${finalities.join("-")}`;
const $finalityConsent = createStatefulObservable(() => {
if (!isBrowser) {
return undefined;
}
const serializedFinalityConsent = localStorage.getItem(localStorageKey);
if (serializedFinalityConsent === null) {
return undefined;
}
return JSON.parse(serializedFinalityConsent);
});
const { processConsentChanges, useConsentCallback } = createProcessConsentChanges({
consentCallback,
finalities,
"getFinalityConsent": () => $finalityConsent.current,
"setFinalityConsent": ({ finalityConsent, prAllConsentCallbacksRun }) => {
localStorage.setItem(localStorageKey, JSON.stringify(finalityConsent));
prAllConsentCallbacksRun.then(() => ($finalityConsent.current = finalityConsent));
}
});
function useFinalityConsent() {
useRerenderOnChange($finalityConsent);
const [isHydrated, setIsHydrated] = useReducer(() => true, true);
useEffect(() => {
setIsHydrated();
}, []);
if (!isHydrated) {
return undefined;
}
return $finalityConsent.current;
}
const { useConsent } = createUseConsent({
useFinalityConsent,
processConsentChanges,
useConsentCallback
});
const { ConsentBannerAndConsentManagement, FooterConsentManagementItem, FooterPersonalDataPolicyItem } = createConsentBannerAndConsentManagement({
finalityDescription,
personalDataPolicyLinkProps,
processConsentChanges,
useFinalityConsent,
finalities
});
return {
useConsent,
ConsentBannerAndConsentManagement,
FooterConsentManagementItem,
FooterPersonalDataPolicyItem
};
}
/** pure, exported for testing */
export function getFinalitiesFromFinalityDescription(params) {
const { finalityDescription } = params;
const finalities = [];
for (const mainFinality in finalityDescription) {
const description = finalityDescription[mainFinality];
const { subFinalities } = description;
if (subFinalities === undefined) {
finalities.push(mainFinality);
continue;
}
for (const subFinality in subFinalities) {
finalities.push(`${mainFinality}.${subFinality}`);
}
}
return finalities;
}
//# sourceMappingURL=createConsentManagement.js.map