@fremtind/jokul 0.40.3 → 0.41.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/build-stats.html +1 -1
- package/build/cjs/components/cookie-consent/CookieConsent.cjs +1 -1
- package/build/cjs/components/cookie-consent/CookieConsent.cjs.map +1 -1
- package/build/cjs/components/cookie-consent/CookieConsentContext.cjs +1 -1
- package/build/cjs/components/cookie-consent/CookieConsentContext.cjs.map +1 -1
- package/build/cjs/components/cookie-consent/CookieConsentContext.d.cts +6 -43
- package/build/cjs/components/cookie-consent/RequirementCheckbox.cjs +2 -0
- package/build/cjs/components/cookie-consent/RequirementCheckbox.cjs.map +1 -0
- package/build/cjs/components/cookie-consent/{consents/RequirementCheckbox.d.cts → RequirementCheckbox.d.cts} +1 -1
- package/build/cjs/components/cookie-consent/cookieConsentUtils.cjs +1 -1
- package/build/cjs/components/cookie-consent/cookieConsentUtils.cjs.map +1 -1
- package/build/cjs/components/cookie-consent/cookieConsentUtils.d.cts +1 -5
- package/build/cjs/components/cookie-consent/index.d.cts +2 -2
- package/build/cjs/components/cookie-consent/types.d.cts +19 -4
- package/build/es/components/cookie-consent/CookieConsent.js +1 -1
- package/build/es/components/cookie-consent/CookieConsent.js.map +1 -1
- package/build/es/components/cookie-consent/CookieConsentContext.d.ts +6 -43
- package/build/es/components/cookie-consent/CookieConsentContext.js +1 -1
- package/build/es/components/cookie-consent/CookieConsentContext.js.map +1 -1
- package/build/es/components/cookie-consent/{consents/RequirementCheckbox.d.ts → RequirementCheckbox.d.ts} +1 -1
- package/build/es/components/cookie-consent/RequirementCheckbox.js +2 -0
- package/build/es/components/cookie-consent/RequirementCheckbox.js.map +1 -0
- package/build/es/components/cookie-consent/cookieConsentUtils.d.ts +1 -5
- package/build/es/components/cookie-consent/cookieConsentUtils.js +1 -1
- package/build/es/components/cookie-consent/cookieConsentUtils.js.map +1 -1
- package/build/es/components/cookie-consent/index.d.ts +2 -2
- package/build/es/components/cookie-consent/types.d.ts +19 -4
- package/package.json +2 -2
- package/styles/components/button/button.css +2 -2
- package/styles/components/button/button.min.css +1 -1
- package/styles/components/checkbox/checkbox.css +4 -4
- package/styles/components/checkbox/checkbox.min.css +1 -1
- package/styles/components/cookie-consent/cookie-consent.css +0 -69
- package/styles/components/cookie-consent/cookie-consent.min.css +1 -1
- package/styles/components/cookie-consent/cookie-consent.scss +0 -48
- package/styles/components/expander/expandable.css +1 -1
- package/styles/components/expander/expandable.min.css +1 -1
- package/styles/components/expander/expandable.scss +1 -1
- package/styles/components/feedback/feedback.css +2 -2
- package/styles/components/feedback/feedback.min.css +1 -1
- package/styles/components/input-group/input-group.css +2 -2
- package/styles/components/input-group/input-group.min.css +1 -1
- package/styles/components/input-panel/checkbox-panel.css +2 -2
- package/styles/components/input-panel/checkbox-panel.min.css +1 -1
- package/styles/components/input-panel/radio-panel.css +2 -2
- package/styles/components/input-panel/radio-panel.min.css +1 -1
- package/styles/components/loader/loader.css +6 -6
- package/styles/components/loader/loader.min.css +1 -1
- package/styles/components/loader/skeleton-loader.css +5 -5
- package/styles/components/loader/skeleton-loader.min.css +1 -1
- package/styles/components/message/message.css +2 -2
- package/styles/components/message/message.min.css +1 -1
- package/styles/components/progress-bar/progress-bar.css +2 -2
- package/styles/components/progress-bar/progress-bar.min.css +1 -1
- package/styles/components/radio-button/radio-button.css +2 -2
- package/styles/components/radio-button/radio-button.min.css +1 -1
- package/styles/components/system-message/system-message.css +2 -2
- package/styles/components/system-message/system-message.min.css +1 -1
- package/styles/components/toast/toast.css +4 -4
- package/styles/components/toast/toast.min.css +1 -1
- package/styles/styles.css +38 -107
- package/styles/styles.min.css +1 -1
- package/build/cjs/components/cookie-consent/CookieConsentModal.cjs +0 -2
- package/build/cjs/components/cookie-consent/CookieConsentModal.cjs.map +0 -1
- package/build/cjs/components/cookie-consent/CookieConsentModal.d.cts +0 -3
- package/build/cjs/components/cookie-consent/consents/CustomConsents.cjs +0 -2
- package/build/cjs/components/cookie-consent/consents/CustomConsents.cjs.map +0 -1
- package/build/cjs/components/cookie-consent/consents/CustomConsents.d.cts +0 -9
- package/build/cjs/components/cookie-consent/consents/DefaultConsents.cjs +0 -2
- package/build/cjs/components/cookie-consent/consents/DefaultConsents.cjs.map +0 -1
- package/build/cjs/components/cookie-consent/consents/DefaultConsents.d.cts +0 -9
- package/build/cjs/components/cookie-consent/consents/RequirementCheckbox.cjs +0 -2
- package/build/cjs/components/cookie-consent/consents/RequirementCheckbox.cjs.map +0 -1
- package/build/es/components/cookie-consent/CookieConsentModal.d.ts +0 -3
- package/build/es/components/cookie-consent/CookieConsentModal.js +0 -2
- package/build/es/components/cookie-consent/CookieConsentModal.js.map +0 -1
- package/build/es/components/cookie-consent/consents/CustomConsents.d.ts +0 -9
- package/build/es/components/cookie-consent/consents/CustomConsents.js +0 -2
- package/build/es/components/cookie-consent/consents/CustomConsents.js.map +0 -1
- package/build/es/components/cookie-consent/consents/DefaultConsents.d.ts +0 -9
- package/build/es/components/cookie-consent/consents/DefaultConsents.js +0 -2
- package/build/es/components/cookie-consent/consents/DefaultConsents.js.map +0 -1
- package/build/es/components/cookie-consent/consents/RequirementCheckbox.js +0 -2
- package/build/es/components/cookie-consent/consents/RequirementCheckbox.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),n=require("react-dom"),o=require("../button/Button.cjs"),i=require("../modal/Modal.cjs"),s=require("../modal/useModal.cjs"),r=require("./CookieConsentContext.cjs"),a=require("./cookieConsentUtils.cjs"),l=require("./RequirementCheckbox.cjs");exports.CookieConsent=({blocking:c,onAccept:d,...u})=>{const{currentConsent:k,cookieName:m,cookieDomain:g,requirement:j,isOpen:f,setIsOpen:p,updateCurrentConsents:b}=r.useInternalState(),[h,C]=s.useModal({id:`jkl-cookie-modal-${t.useId()}`,role:c?"alertdialog":"dialog",title:"Informasjonskapsler"});if(t.useEffect((()=>{f?null==h||h.show():null==h||h.hide()}),[h,f]),t.useEffect((()=>{const e=()=>p(!1);return null==h||h.on("hide",e),()=>{null==h||h.off("hide",e)}}),[h,p]),typeof document>"u")return null;if(typeof navigator<"u"&&!navigator.cookieEnabled)return d&&d({functional:"denied",marketing:"denied",statistics:"denied"}),null;const x=(e=a.convertBooleanConsentObjectToConsentObject({functional:!0,statistics:!0,marketing:!0},j))=>{const t=Object.fromEntries(Object.entries(e).filter((([,e])=>typeof e<"u"))),n={...k,...t};a.setConsentCookie({consent:n,name:m,domain:g}),b(),null==d||d(n),null==h||h.hide()};return n.createPortal(e.jsxs(i.ModalContainer,{...C.container,...u,children:[e.jsx(i.ModalOverlay,{...C.overlay}),e.jsxs(i.Modal,{component:"form",...C.modal,onSubmit:e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=a.convertBooleanConsentObjectToConsentObject({functional:"true"===t.get("functional"),statistics:"true"===t.get("statistics"),marketing:"true"===t.get("marketing")},j);x(n)},children:[e.jsx(i.ModalHeader,{children:e.jsx(i.ModalTitle,{...C.title,children:"Velg informasjonskapsler"})}),e.jsxs(i.ModalBody,{children:[e.jsx("p",{children:"For at nettsidene skal fungere må vi bruke tekniske informasjonskaplser. Disse lagres derfor uten samtykke."}),j.functional&&e.jsx(l.RequirementCheckbox,{name:"functional",label:"Tillat funksjonelle",defaultChecked:"accepted"===k.functional,children:"Funksjonelle informasjonskapsler lagrer opplysninger om din bruk av nettsidene og hvilke innstillinger du har gjort, slik at du kan få funksjonalitet tilpasset deg."},`functional-${k.functional}`),j.statistics&&e.jsx(l.RequirementCheckbox,{name:"statistics",label:"Tillat statistikk",defaultChecked:"accepted"===k.statistics,children:"Informasjonskapslene lagrer statistikk som hjelper oss med å forstå hvordan nettsidene blir brukt, slik at vi kan gjøre dem bedre og enklere å bruke."},`statistics-${k.statistics}`),j.marketing&&e.jsx(l.RequirementCheckbox,{name:"marketing",label:"Tillat personlig markedsføring",defaultChecked:"accepted"===k.marketing,children:"Dette gjør at vi kan gi deg mer relevant og tilpasset markedsføring, også gjennom våre samarbeidspartnere, på for eksempel nettsider, annonser og i sosiale medier."},`marketing-${k.marketing}`)]}),e.jsxs(i.ModalActions,{children:[e.jsx(o.SecondaryButton,{"data-testid":"jkl-cookie-consent-godta-alle",type:"button",onClick:()=>x(),children:"Godta alle"}),e.jsx(o.SecondaryButton,{"data-testid":"jkl-cookie-consent-godta",type:"submit",children:"Godta mine valg"})]})]})]}),document.body)};
|
|
2
2
|
//# sourceMappingURL=CookieConsent.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CookieConsent.cjs","sources":["../../../../src/components/cookie-consent/CookieConsent.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { usePreviousValue } from \"../../hooks/usePreviousValue/usePreviousValue.js\";\nimport { useCookieConsentState } from \"./CookieConsentContext.js\";\nimport { CookieConsentModal } from \"./CookieConsentModal.js\";\nimport { setConsentCookie } from \"./cookieConsentUtils.js\";\nimport { AcceptConsentCallback, Consent } from \"./types.js\";\n\nexport interface CookieConsentProps {\n blocking?: boolean;\n onAccept?: AcceptConsentCallback;\n}\n\nexport const CookieConsent = ({\n blocking,\n onAccept,\n ...rest\n}: CookieConsentProps): JSX.Element | null => {\n const { dispatch, consent, cookieName, cookieDomain } =\n useCookieConsentState();\n const prevConsent = usePreviousValue(consent);\n\n useEffect(() => {\n if (onAccept) {\n // Prevent onAccept from being triggered every time state changes\\\n if (consent !== prevConsent) {\n onAccept(consent);\n }\n }\n }, [onAccept, consent, prevConsent]);\n\n // Cookies are disabled in the browser\n if (typeof navigator !== \"undefined\" && !navigator.cookieEnabled) {\n if (onAccept) {\n onAccept({\n functional: \"denied\",\n marketing: \"denied\",\n statistics: \"denied\",\n });\n }\n\n return null;\n }\n\n const handleAccept = (newConsent: Partial<Consent>) => {\n // Filter out null values from the new consent\n const newConsentWithoutNullValues = Object.fromEntries(\n Object.entries(newConsent).filter(([, value]) => value != null),\n );\n\n // Merge the existing consent with the new consent\n const updatedConsent: Consent = {\n ...consent,\n ...newConsentWithoutNullValues,\n };\n\n dispatch({ type: \"UPDATE_CONSENT\", payload: updatedConsent });\n dispatch({ type: \"SET_SHOW_CONSENT\", payload: false });\n setConsentCookie({\n consent: updatedConsent,\n name: cookieName,\n domain: cookieDomain,\n });\n };\n\n // This returns different variants of consents based on the behavior required to get the consent\n // Blocking implies a blocking modal demanding an active action before the user can interact with the application\n if (blocking) {\n return <CookieConsentModal {...rest} onAccept={handleAccept} />;\n }\n\n return null;\n};\n"],"names":["blocking","onAccept","rest","dispatch","consent","cookieName","cookieDomain","useCookieConsentState","prevConsent","usePreviousValue","useEffect","navigator","cookieEnabled","functional","marketing","statistics","jsx","CookieConsentModal","newConsent","newConsentWithoutNullValues","Object","fromEntries","entries","filter","value","updatedConsent","type","payload","setConsentCookie","name","domain"],"mappings":"iVAY6B,EACzBA,SAAAA,EACAC,SAAAA,KACGC,MAEH,MAAQC,SAAAA,EAAUC,QAAAA,EAASC,WAAAA,EAAYC,aAAAA,GACnCC,EAAAA,wBACEC,EAAcC,mBAAiBL,GAYrC,GAVAM,EAAAA,WAAU,KACFT,GAEIG,IAAYI,GACZP,EAASG,EAAO,GAGzB,CAACH,EAAUG,EAASI,WAGZG,UAAc,MAAgBA,UAAUC,cAC/C,OAAIX,GACSA,EAAA,CACLY,WAAY,SACZC,UAAW,SACXC,WAAY,WAIb,KA0BX,OAAIf,EACQgB,EAAAA,IAAAC,EAAAA,mBAAA,IAAuBf,EAAMD,SAxBnBiB,IAElB,MAAMC,EAA8BC,OAAOC,YACvCD,OAAOE,QAAQJ,GAAYK,QAAO,GAAIC,KAAoB,MAATA,KAI/CC,EAA0B,IACzBrB,KACAe,GAGPhB,EAAS,CAAEuB,KAAM,iBAAkBC,QAASF,IAC5CtB,EAAS,CAAEuB,KAAM,mBAAoBC,SAAS,IAC7BC,mBAAA,CACbxB,QAASqB,EACTI,KAAMxB,EACNyB,OAAQxB,GACX,IASE"}
|
|
1
|
+
{"version":3,"file":"CookieConsent.cjs","sources":["../../../../src/components/cookie-consent/CookieConsent.tsx"],"sourcesContent":["import React, { FormEventHandler, useEffect, useId } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { SecondaryButton } from \"../button/Button.js\";\nimport {\n Modal,\n ModalActions,\n ModalBody,\n ModalContainer,\n ModalHeader,\n ModalOverlay,\n ModalTitle,\n} from \"../modal/Modal.js\";\nimport { useModal } from \"../modal/useModal.js\";\nimport { useInternalState } from \"./CookieConsentContext.js\";\nimport {\n convertBooleanConsentObjectToConsentObject,\n setConsentCookie,\n} from \"./cookieConsentUtils.js\";\nimport { RequirementCheckbox } from \"./RequirementCheckbox.js\";\nimport { AcceptConsentCallback, Consent } from \"./types.js\";\n\nexport interface CookieConsentProps {\n blocking?: boolean;\n onAccept?: AcceptConsentCallback;\n}\n\nexport const CookieConsent = ({\n blocking,\n onAccept,\n ...rest\n}: CookieConsentProps): JSX.Element | null => {\n const {\n currentConsent,\n cookieName,\n cookieDomain,\n requirement,\n isOpen,\n setIsOpen,\n updateCurrentConsents,\n } = useInternalState();\n\n const [instance, modalConfig] = useModal({\n id: `jkl-cookie-modal-${useId()}`,\n // The optional `role` attribute of the dialog element, either `dialog`\n // (default) or `alertdialog` to make it a modal (preventing closing on\n // click outside of ESC key).\n role: blocking ? \"alertdialog\" : \"dialog\",\n // The required dialog title, mandatory in the document\n // to provide context to assistive technology.\n title: \"Informasjonskapsler\",\n });\n\n useEffect(() => {\n if (isOpen) {\n instance?.show();\n } else {\n instance?.hide();\n }\n }, [instance, isOpen]);\n\n useEffect(() => {\n const onHide = () => setIsOpen(false);\n instance?.on(\"hide\", onHide);\n return () => {\n instance?.off(\"hide\", onHide);\n };\n }, [instance, setIsOpen]);\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n // Cookies are disabled in the browser\n if (typeof navigator !== \"undefined\" && !navigator.cookieEnabled) {\n if (onAccept) {\n onAccept({\n functional: \"denied\",\n marketing: \"denied\",\n statistics: \"denied\",\n });\n }\n\n return null;\n }\n\n const accept = (\n selection = convertBooleanConsentObjectToConsentObject(\n {\n functional: true,\n statistics: true,\n marketing: true,\n },\n requirement,\n ),\n ) => {\n const selectionWithoutEmptyValues = Object.fromEntries(\n Object.entries(selection).filter(\n ([, value]) => typeof value !== \"undefined\",\n ),\n );\n\n const updatedConsent: Consent = {\n ...currentConsent,\n ...selectionWithoutEmptyValues,\n };\n\n setConsentCookie({\n consent: updatedConsent,\n name: cookieName,\n domain: cookieDomain,\n });\n\n updateCurrentConsents();\n\n onAccept?.(updatedConsent);\n\n instance?.hide();\n };\n\n const onSubmit: FormEventHandler<HTMLFormElement> = (e) => {\n e.preventDefault();\n\n const formData = new FormData(e.currentTarget);\n\n const newConsents = convertBooleanConsentObjectToConsentObject(\n {\n functional: formData.get(\"functional\") === \"true\",\n statistics: formData.get(\"statistics\") === \"true\",\n marketing: formData.get(\"marketing\") === \"true\",\n },\n requirement,\n );\n\n accept(newConsents);\n };\n\n return ReactDOM.createPortal(\n <ModalContainer {...modalConfig.container} {...rest}>\n <ModalOverlay {...modalConfig.overlay} />\n <Modal component=\"form\" {...modalConfig.modal} {...{ onSubmit }}>\n <ModalHeader>\n <ModalTitle {...modalConfig.title}>\n Velg informasjonskapsler\n </ModalTitle>\n </ModalHeader>\n <ModalBody>\n <p>\n For at nettsidene skal fungere må vi bruke tekniske\n informasjonskaplser. Disse lagres derfor uten samtykke.\n </p>\n {requirement.functional && (\n <RequirementCheckbox\n name=\"functional\"\n label=\"Tillat funksjonelle\"\n defaultChecked={\n currentConsent.functional === \"accepted\"\n }\n key={`functional-${currentConsent.functional}`}\n >\n Funksjonelle informasjonskapsler lagrer opplysninger\n om din bruk av nettsidene og hvilke innstillinger du\n har gjort, slik at du kan få funksjonalitet\n tilpasset deg.\n </RequirementCheckbox>\n )}\n {requirement.statistics && (\n <RequirementCheckbox\n name=\"statistics\"\n label=\"Tillat statistikk\"\n defaultChecked={\n currentConsent.statistics === \"accepted\"\n }\n key={`statistics-${currentConsent.statistics}`}\n >\n Informasjonskapslene lagrer statistikk som hjelper\n oss med å forstå hvordan nettsidene blir brukt, slik\n at vi kan gjøre dem bedre og enklere å bruke.\n </RequirementCheckbox>\n )}\n {requirement.marketing && (\n <RequirementCheckbox\n name=\"marketing\"\n label=\"Tillat personlig markedsføring\"\n defaultChecked={\n currentConsent.marketing === \"accepted\"\n }\n key={`marketing-${currentConsent.marketing}`}\n >\n Dette gjør at vi kan gi deg mer relevant og\n tilpasset markedsføring, også gjennom våre\n samarbeidspartnere, på for eksempel nettsider,\n annonser og i sosiale medier.\n </RequirementCheckbox>\n )}\n </ModalBody>\n <ModalActions>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta-alle\"\n type=\"button\"\n onClick={() => accept()}\n >\n Godta alle\n </SecondaryButton>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta\"\n type=\"submit\"\n >\n Godta mine valg\n </SecondaryButton>\n </ModalActions>\n </Modal>\n </ModalContainer>,\n document.body,\n );\n};\n"],"names":["blocking","onAccept","rest","currentConsent","cookieName","cookieDomain","requirement","isOpen","setIsOpen","updateCurrentConsents","useInternalState","instance","modalConfig","useModal","id","useId","role","title","useEffect","show","hide","onHide","on","off","document","navigator","cookieEnabled","functional","marketing","statistics","accept","selection","convertBooleanConsentObjectToConsentObject","selectionWithoutEmptyValues","Object","fromEntries","entries","filter","value","updatedConsent","setConsentCookie","consent","name","domain","ReactDOM","createPortal","ModalContainer","container","children","jsx","ModalOverlay","overlay","jsxs","Modal","component","modal","onSubmit","e","preventDefault","formData","FormData","currentTarget","newConsents","get","ModalHeader","ModalTitle","ModalBody","RequirementCheckbox","label","defaultChecked","ModalActions","SecondaryButton","type","onClick","body"],"mappings":"+YA0B6B,EACzBA,SAAAA,EACAC,SAAAA,KACGC,MAEG,MACFC,eAAAA,EACAC,WAAAA,EACAC,aAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAC,UAAAA,EACAC,sBAAAA,GACAC,sBAEGC,EAAUC,GAAeC,WAAS,CACrCC,GAAI,oBAAoBC,EAAAA,UAIxBC,KAAMhB,EAAW,cAAgB,SAGjCiB,MAAO,wBAmBP,GAhBJC,EAAAA,WAAU,KACFX,EACA,MAAAI,GAAAA,EAAUQ,OAEV,MAAAR,GAAAA,EAAUS,MAAA,GAEf,CAACT,EAAUJ,IAEdW,EAAAA,WAAU,KACA,MAAAG,EAAS,IAAMb,GAAU,GACrB,OAAA,MAAAG,GAAAA,EAAAW,GAAG,OAAQD,GACd,KACO,MAAAV,GAAAA,EAAAY,IAAI,OAAQF,EAC1B,CAAA,GACD,CAACV,EAAUH,WAEHgB,SAAa,IACb,OAAA,KAIX,UAAWC,UAAc,MAAgBA,UAAUC,cAC/C,OAAIzB,GACSA,EAAA,CACL0B,WAAY,SACZC,UAAW,SACXC,WAAY,WAIb,KAGL,MAAAC,EAAS,CACXC,EAAYC,EAAAA,2CACR,CACIL,YAAY,EACZE,YAAY,EACZD,WAAW,GAEftB,MAGJ,MAAM2B,EAA8BC,OAAOC,YACvCD,OAAOE,QAAQL,GAAWM,QACtB,EAAI,CAAAC,YAAkBA,EAAU,OAIlCC,EAA0B,IACzBpC,KACA8B,GAGUO,mBAAA,CACbC,QAASF,EACTG,KAAMtC,EACNuC,OAAQtC,IAGUI,IAEtB,MAAAR,GAAAA,EAAWsC,GAEX,MAAA5B,GAAAA,EAAUS,MAAA,EAoBd,OAAOwB,EAASC,oBACXC,EAAgBA,eAAA,IAAGlC,EAAYmC,aAAe7C,EAC3C8C,SAAA,CAACC,EAAAA,IAAAC,EAAAA,aAAA,IAAiBtC,EAAYuC,UAC9BC,EAAAA,KAACC,EAAMA,MAAA,CAAAC,UAAU,UAAW1C,EAAY2C,MAAaC,SApBRC,IACjDA,EAAEC,iBAEF,MAAMC,EAAW,IAAIC,SAASH,EAAEI,eAE1BC,EAAc9B,EAAAA,2CAChB,CACIL,WAA2C,SAA/BgC,EAASI,IAAI,cACzBlC,WAA2C,SAA/B8B,EAASI,IAAI,cACzBnC,UAAyC,SAA9B+B,EAASI,IAAI,cAE5BzD,GAGJwB,EAAOgC,EAAW,EAOVd,SAAA,CAAAC,EAAAA,IAACe,eACGhB,SAACC,EAAAA,IAAAgB,EAAAA,WAAA,IAAerD,EAAYK,MAAO+B,+CAItCkB,EAAAA,UACG,CAAAlB,SAAA,CAAAC,EAAAA,IAAC,KAAED,SAGH,gHACC1C,EAAYqB,YACTsB,EAAAA,IAACkB,EAAAA,oBAAA,CACGzB,KAAK,aACL0B,MAAM,sBACNC,eACkC,aAA9BlE,EAAewB,WAGtBqB,SAAA,wKADQ,cAAc7C,EAAewB,cAQzCrB,EAAYuB,YACToB,EAAAA,IAACkB,EAAAA,oBAAA,CACGzB,KAAK,aACL0B,MAAM,oBACNC,eACkC,aAA9BlE,EAAe0B,WAGtBmB,SAAA,yJADQ,cAAc7C,EAAe0B,cAOzCvB,EAAYsB,WACTqB,EAAAA,IAACkB,EAAAA,oBAAA,CACGzB,KAAK,YACL0B,MAAM,iCACNC,eACiC,aAA7BlE,EAAeyB,UAGtBoB,SAAA,uKADQ,aAAa7C,EAAeyB,uBAS5C0C,EAAAA,aACG,CAAAtB,SAAA,CAAAC,EAAAA,IAACsB,EAAAA,gBAAA,CACG,cAAY,gCACZC,KAAK,SACLC,QAAS,IAAM3C,IAClBkB,SAAA,eAGDC,EAAAA,IAACsB,EAAAA,gBAAA,CACG,cAAY,2BACZC,KAAK,SACRxB,SAAA,6BAMbxB,SAASkD,KACb"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),o=require("./cookieConsentUtils.cjs"),n="fremtind-cookie-consent",s=t.createContext(void 0)
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),o=require("./cookieConsentUtils.cjs"),n="fremtind-cookie-consent",s=t.createContext(void 0);exports.CookieConsentProvider=({children:r,cookieAdapter:i,marketing:u,functional:a,statistics:c,cookieName:C=n,cookieDomain:l})=>{const[d,k]=t.useState((()=>Date.now())),m=t.useMemo((()=>o.buildRequirementsObject({marketing:u,functional:a,statistics:c})),[u,a,c]),p=t.useMemo((()=>o.getConsentCookie({adapter:i,name:C})??{marketing:null,functional:null,statistics:null}),[i,C,d]),[x,v]=t.useState((()=>o.shouldShowConsentDialog(m,p)));return e.jsx(s.Provider,{value:{isOpen:x,setIsOpen:v,updateCurrentConsents:()=>k(Date.now()),requirement:m,currentConsent:p,cookieName:C,cookieDomain:l},children:r})},exports.DEFAULT_COOKIE_NAME=n,exports.useCookieConsent=()=>{const e=t.useContext(s);if(void 0===e)throw new Error("useCookieConsent must be used within a CookieConsentProvider");return{openConsentModal:()=>{e.setIsOpen(!0)},consents:e.currentConsent}},exports.useInternalState=()=>{const e=t.useContext(s);if(void 0===e)throw new Error("CookieConsent must be used within a CookieConsentProvider");return e};
|
|
2
2
|
//# sourceMappingURL=CookieConsentContext.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CookieConsentContext.cjs","sources":["../../../../src/components/cookie-consent/CookieConsentContext.tsx"],"sourcesContent":["import React, {
|
|
1
|
+
{"version":3,"file":"CookieConsentContext.cjs","sources":["../../../../src/components/cookie-consent/CookieConsentContext.tsx"],"sourcesContent":["import React, { useContext, useMemo, useState } from \"react\";\nimport {\n buildRequirementsObject,\n getConsentCookie,\n shouldShowConsentDialog,\n} from \"./cookieConsentUtils.js\";\nimport {\n Consent,\n CookieConsentProviderProps,\n InternalContext,\n} from \"./types.js\";\n\nexport const DEFAULT_COOKIE_NAME = \"fremtind-cookie-consent\";\n\nconst Context = React.createContext<InternalContext | undefined>(undefined);\n\nexport const CookieConsentProvider: React.FC<CookieConsentProviderProps> = ({\n children,\n cookieAdapter,\n marketing,\n functional,\n statistics,\n cookieName = DEFAULT_COOKIE_NAME,\n cookieDomain,\n}) => {\n const [timestamp, setTimestamp] = useState(() => Date.now());\n\n const requirement = useMemo(\n () => buildRequirementsObject({ marketing, functional, statistics }),\n [marketing, functional, statistics],\n );\n\n const consentCookie = useMemo(() => {\n return (\n getConsentCookie({ adapter: cookieAdapter, name: cookieName }) ?? {\n marketing: null,\n functional: null,\n statistics: null,\n }\n );\n /* Use timestamp as a dependency to be ablet to force re-reading of cookie */\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [cookieAdapter, cookieName, timestamp]);\n\n const [isOpen, setIsOpen] = useState(() => {\n return shouldShowConsentDialog(requirement, consentCookie);\n });\n\n return (\n <Context.Provider\n value={{\n isOpen,\n setIsOpen,\n updateCurrentConsents: () => setTimestamp(Date.now()),\n requirement,\n currentConsent: consentCookie,\n cookieName,\n cookieDomain,\n }}\n >\n {children}\n </Context.Provider>\n );\n};\n\nexport const useInternalState = () => {\n const context = React.useContext(Context);\n if (context === undefined) {\n throw new Error(\n \"CookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n return context;\n};\n\ntype UseCookieConsent = {\n openConsentModal: () => void;\n consents: Consent;\n};\n\nexport const useCookieConsent = (): UseCookieConsent => {\n const context = useContext(Context);\n\n if (context === undefined) {\n throw new Error(\n \"useCookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n const openConsentModal = () => {\n context.setIsOpen(true);\n };\n\n const consents = context.currentConsent;\n\n return { openConsentModal, consents };\n};\n"],"names":["DEFAULT_COOKIE_NAME","Context","React","createContext","children","cookieAdapter","marketing","functional","statistics","cookieName","cookieDomain","timestamp","setTimestamp","useState","Date","now","requirement","useMemo","buildRequirementsObject","consentCookie","getConsentCookie","adapter","name","isOpen","setIsOpen","shouldShowConsentDialog","jsx","Provider","value","updateCurrentConsents","currentConsent","context","useContext","Error","openConsentModal","consents"],"mappings":"8KAYaA,EAAsB,0BAE7BC,EAAUC,EAAMC,mBAA2C,iCAEU,EACvEC,SAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,EACAC,WAAAA,EAAaT,EACbU,aAAAA,MAEM,MAACC,EAAWC,GAAgBC,YAAS,IAAMC,KAAKC,QAEhDC,EAAcC,EAAAA,SAChB,IAAMC,EAAwBA,wBAAA,CAAEZ,UAAAA,EAAWC,WAAAA,EAAYC,WAAAA,KACvD,CAACF,EAAWC,EAAYC,IAGtBW,EAAgBF,EAAAA,SAAQ,IAEtBG,EAAAA,iBAAiB,CAAEC,QAAShB,EAAeiB,KAAMb,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAKrB,CAACH,EAAeI,EAAYE,KAExBY,EAAQC,GAAaX,YAAS,IAC1BY,EAAAA,wBAAwBT,EAAaG,KAI5C,OAAAO,EAAAA,IAACzB,EAAQ0B,SAAR,CACGC,MAAO,CACHL,OAAAA,EACAC,UAAAA,EACAK,sBAAuB,IAAMjB,EAAaE,KAAKC,OAC/CC,YAAAA,EACAc,eAAgBX,EAChBV,WAAAA,EACAC,aAAAA,GAGHN,SAAAA,GACL,yDAoBwB,KACtB,MAAA2B,EAAUC,aAAW/B,GAE3B,QAAgB,IAAZ8B,EACA,MAAM,IAAIE,MACN,gEAUD,MAAA,CAAEC,iBANgB,KACrBH,EAAQP,WAAU,EAAI,EAKCW,SAFVJ,EAAQD,eAEW,2BA/BR,KACtB,MAAAC,EAAU7B,EAAM8B,WAAW/B,GACjC,QAAgB,IAAZ8B,EACA,MAAM,IAAIE,MACN,6DAID,OAAAF"}
|
|
@@ -1,48 +1,11 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import { Consent, ConsentRequirement } from './types.cjs';
|
|
4
|
-
interface SetShowConsentAction {
|
|
5
|
-
type: "SET_SHOW_CONSENT";
|
|
6
|
-
payload: boolean;
|
|
7
|
-
}
|
|
8
|
-
interface SetShowSettingsAction {
|
|
9
|
-
type: "SET_SHOW_SETTINGS";
|
|
10
|
-
payload: boolean;
|
|
11
|
-
}
|
|
12
|
-
interface UpdateConsentAction {
|
|
13
|
-
type: "UPDATE_CONSENT";
|
|
14
|
-
payload: Consent;
|
|
15
|
-
}
|
|
16
|
-
interface UpdateRequirementsAction {
|
|
17
|
-
type: "UPDATE_REQUIREMENTS";
|
|
18
|
-
payload: ConsentRequirement;
|
|
19
|
-
}
|
|
20
|
-
type Action = SetShowConsentAction | UpdateConsentAction | SetShowSettingsAction | UpdateRequirementsAction;
|
|
21
|
-
type Dispatch = (action: Action) => void;
|
|
22
|
-
interface State {
|
|
23
|
-
isOpen: boolean;
|
|
24
|
-
showSettings: boolean;
|
|
25
|
-
requirement: ConsentRequirement;
|
|
26
|
-
consent: Consent;
|
|
27
|
-
}
|
|
2
|
+
import { Consent, CookieConsentProviderProps, InternalContext } from './types.cjs';
|
|
28
3
|
export declare const DEFAULT_COOKIE_NAME = "fremtind-cookie-consent";
|
|
29
|
-
export
|
|
30
|
-
|
|
31
|
-
cookieName?: string;
|
|
32
|
-
cookieDomain?: string;
|
|
33
|
-
}
|
|
34
|
-
declare const CookieConsentProvider: React.FC<CookieConsentProviderProps>;
|
|
35
|
-
interface UseCookieConsentState extends State {
|
|
36
|
-
dispatch: Dispatch;
|
|
37
|
-
cookieName: string;
|
|
38
|
-
cookieDomain?: string;
|
|
39
|
-
}
|
|
40
|
-
declare const useCookieConsentState: () => UseCookieConsentState;
|
|
4
|
+
export declare const CookieConsentProvider: React.FC<CookieConsentProviderProps>;
|
|
5
|
+
export declare const useInternalState: () => InternalContext;
|
|
41
6
|
type UseCookieConsent = {
|
|
42
|
-
|
|
43
|
-
openConsentModalWithDefaults: () => void;
|
|
44
|
-
/** Se hvilke samtykker som er gitt, om du for eksempel trenger styre UI basert på samtykker. */
|
|
7
|
+
openConsentModal: () => void;
|
|
45
8
|
consents: Consent;
|
|
46
9
|
};
|
|
47
|
-
declare const useCookieConsent: () => UseCookieConsent;
|
|
48
|
-
export {
|
|
10
|
+
export declare const useCookieConsent: () => UseCookieConsent;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),c=require("../checkbox/Checkbox.cjs");exports.RequirementCheckbox=({defaultChecked:o,name:t,label:r,children:l})=>e.jsxs(e.Fragment,{children:[e.jsx(c.Checkbox,{className:"jkl-cookie-consent-modal__checkbox",value:"true",name:t,defaultChecked:o,children:r}),e.jsx("p",{className:"jkl-cookie-consent-modal__info-text",children:l})]});
|
|
2
|
+
//# sourceMappingURL=RequirementCheckbox.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequirementCheckbox.cjs","sources":["../../../../src/components/cookie-consent/RequirementCheckbox.tsx"],"sourcesContent":["import React from \"react\";\nimport { WithChildren } from \"../../core/types.js\";\nimport { Checkbox } from \"../checkbox/Checkbox.js\";\n\ninterface RequirementCheckboxProps extends WithChildren {\n defaultChecked: boolean;\n name: \"functional\" | \"marketing\" | \"statistics\";\n label: string;\n}\n\nexport const RequirementCheckbox = ({\n defaultChecked,\n name,\n label,\n children,\n}: RequirementCheckboxProps) => {\n return (\n <>\n <Checkbox\n className=\"jkl-cookie-consent-modal__checkbox\"\n value=\"true\"\n name={name}\n defaultChecked={defaultChecked}\n >\n {label}\n </Checkbox>\n <p className=\"jkl-cookie-consent-modal__info-text\">{children}</p>\n </>\n );\n};\n"],"names":["defaultChecked","name","label","children","jsxs","Fragment","jsx","Checkbox","className","value"],"mappings":"uLAUmC,EAC/BA,eAAAA,EACAC,KAAAA,EACAC,MAAAA,EACAC,SAAAA,KAIQC,EAAAA,KAAAC,WAAA,CAAAF,SAAA,CAAAG,EAAAA,IAACC,EAAAA,SAAA,CACGC,UAAU,qCACVC,MAAM,OACNR,KAAAA,EACAD,eAAAA,EAECG,SAAAD,IAEJI,EAAAA,IAAA,IAAA,CAAEE,UAAU,sCAAuCL,SAAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
-
import { WithChildren } from '
|
|
2
|
+
import { WithChildren } from '../../core/types.cjs';
|
|
3
3
|
interface RequirementCheckboxProps extends WithChildren {
|
|
4
4
|
defaultChecked: boolean;
|
|
5
5
|
name: "functional" | "marketing" | "statistics";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=t=>typeof t>"u"?null:!1===t||"false"===String(t).toLowerCase()?"denied":"accepted";exports.buildRequirementsObject=({marketing:t,functional:e,statistics:o})=>({...t&&{marketing:t},...e&&{functional:e},...o&&{statistics:o}}),exports.convertBooleanConsentObjectToConsentObject=(e,o)=>({functional:o.functional?t(e.functional):void 0,statistics:o.statistics?t(e.statistics):void 0,marketing:o.marketing?t(e.marketing):void 0}),exports.convertBooleanToConsentValue=t,exports.getConsentCookie=({adapter:t,name:e})=>{const o=(t=>{if(typeof document>"u")return;const e=document.cookie.split(";").map((t=>t.trim().split("="))).find((e=>e[0]===t));return e||void 0})(e);return o?JSON.parse(o[1]):t?t():void 0},exports.setConsentCookie=({consent:t,maxAge:e=10368e3,name:o,domain:n})=>{document.cookie=[`${o}=${JSON.stringify(t)}`,`max-age=${e}`,"SameSite=Lax",!!n&&`domain=${n}`].filter((t=>t)).join(";")},exports.shouldShowConsentDialog=(t,e)=>{if(e){const o=new Map(Object.entries(e)),n=Object.entries(t);for(const[t,e]of n)if(e&&null===o.get(t))return!0;return!1}return Object.values(t).some((t=>t))};
|
|
2
2
|
//# sourceMappingURL=cookieConsentUtils.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookieConsentUtils.cjs","sources":["../../../../src/components/cookie-consent/cookieConsentUtils.ts"],"sourcesContent":["import type { Consent, ConsentRequirement, ConsentState } from \"./types.js\";\n\nconst getCookie = (name: string) => {\n if (typeof document === \"undefined\") {\n return undefined;\n }\n\n const cookie = document.cookie\n // split a string of cookies into array of cookies\n .split(\";\")\n // split cookies into [name, value]\n .map((s) => s.trim().split(\"=\"))\n // find our golden nugget\n .find((c) => c[0] === name);\n\n if (!cookie) {\n return undefined;\n }\n\n return cookie;\n};\n\nexport const getConsentCookie = ({\n adapter,\n name,\n}: {\n adapter?: () => Consent | undefined;\n name: string;\n}): Consent | undefined => {\n const cookie = getCookie(name);\n\n if (cookie) {\n const consent = JSON.parse(cookie[1]);\n\n return consent as Consent;\n }\n\n if (adapter) {\n return adapter();\n }\n\n return undefined;\n};\n\n// 120 days\nconst DEFAULT_MAX_AGE = 10368000;\n\nexport const setConsentCookie = ({\n consent,\n maxAge = DEFAULT_MAX_AGE,\n name,\n domain,\n}: {\n consent: Consent;\n maxAge?: number;\n name: string;\n domain?: string;\n}): void => {\n document.cookie = [\n `${name}=${JSON.stringify(consent)}`,\n `max-age=${maxAge}`,\n `SameSite=Lax`,\n !!domain && `domain=${domain}`,\n ]\n .filter((f) => f)\n .join(\";\");\n};\n\nexport const shouldShowConsentDialog = (\n requirement: ConsentRequirement,\n consent: Consent | undefined,\n): boolean => {\n if (!consent) {\n // check if requirement has truthy values. should show consent if it has\n return Object.values(requirement).some(\n (requirementValue) => requirementValue,\n );\n } else {\n // convert to a map to ease accessing dynamic keys\n const consentMap = new Map(Object.entries(consent));\n\n // pls spare the CPU of converting to an entries array 3 times\n const requirementEntries = Object.entries(requirement);\n\n for (const [name, required] of requirementEntries) {\n // no need to check more if the value isn't required\n if (!required) {\n continue;\n }\n\n // cancel and show consent if a value isn't decided\n if (consentMap.get(name) === null) {\n return true;\n }\n }\n\n return false;\n }\n};\n\nexport const
|
|
1
|
+
{"version":3,"file":"cookieConsentUtils.cjs","sources":["../../../../src/components/cookie-consent/cookieConsentUtils.ts"],"sourcesContent":["import type { Consent, ConsentRequirement, ConsentState } from \"./types.js\";\n\nconst getCookie = (name: string) => {\n if (typeof document === \"undefined\") {\n return undefined;\n }\n\n const cookie = document.cookie\n // split a string of cookies into array of cookies\n .split(\";\")\n // split cookies into [name, value]\n .map((s) => s.trim().split(\"=\"))\n // find our golden nugget\n .find((c) => c[0] === name);\n\n if (!cookie) {\n return undefined;\n }\n\n return cookie;\n};\n\nexport const getConsentCookie = ({\n adapter,\n name,\n}: {\n adapter?: () => Consent | undefined;\n name: string;\n}): Consent | undefined => {\n const cookie = getCookie(name);\n\n if (cookie) {\n const consent = JSON.parse(cookie[1]);\n\n return consent as Consent;\n }\n\n if (adapter) {\n return adapter();\n }\n\n return undefined;\n};\n\n// 120 days\nconst DEFAULT_MAX_AGE = 10368000;\n\nexport const setConsentCookie = ({\n consent,\n maxAge = DEFAULT_MAX_AGE,\n name,\n domain,\n}: {\n consent: Consent;\n maxAge?: number;\n name: string;\n domain?: string;\n}): void => {\n document.cookie = [\n `${name}=${JSON.stringify(consent)}`,\n `max-age=${maxAge}`,\n `SameSite=Lax`,\n !!domain && `domain=${domain}`,\n ]\n .filter((f) => f)\n .join(\";\");\n};\n\nexport const shouldShowConsentDialog = (\n requirement: ConsentRequirement,\n consent: Consent | undefined,\n): boolean => {\n if (!consent) {\n // check if requirement has truthy values. should show consent if it has\n return Object.values(requirement).some(\n (requirementValue) => requirementValue,\n );\n } else {\n // convert to a map to ease accessing dynamic keys\n const consentMap = new Map(Object.entries(consent));\n\n // pls spare the CPU of converting to an entries array 3 times\n const requirementEntries = Object.entries(requirement);\n\n for (const [name, required] of requirementEntries) {\n // no need to check more if the value isn't required\n if (!required) {\n continue;\n }\n\n // cancel and show consent if a value isn't decided\n if (consentMap.get(name) === null) {\n return true;\n }\n }\n\n return false;\n }\n};\n\nexport const convertBooleanToConsentValue = (\n formValue: boolean | undefined,\n): ConsentState => {\n if (typeof formValue === \"undefined\") {\n return null;\n }\n\n if (formValue === false || String(formValue).toLowerCase() === \"false\") {\n return \"denied\";\n }\n\n return \"accepted\";\n};\n\nexport const convertBooleanConsentObjectToConsentObject = (\n consent: Partial<Record<keyof Consent, boolean | undefined>>,\n requirement: ConsentRequirement,\n): Consent => {\n return {\n functional: requirement.functional\n ? convertBooleanToConsentValue(consent.functional)\n : undefined,\n statistics: requirement.statistics\n ? convertBooleanToConsentValue(consent.statistics)\n : undefined,\n marketing: requirement.marketing\n ? convertBooleanToConsentValue(consent.marketing)\n : undefined,\n };\n};\n\nexport const buildRequirementsObject = ({\n marketing,\n functional,\n statistics,\n}: ConsentRequirement) => {\n return {\n ...(marketing && { marketing }),\n ...(functional && { functional }),\n ...(statistics && { statistics }),\n };\n};\n"],"names":["convertBooleanToConsentValue","formValue","String","toLowerCase","marketing","functional","statistics","consent","requirement","adapter","name","cookie","document","split","map","s","trim","find","c","getCookie","JSON","parse","maxAge","domain","stringify","filter","f","join","consentMap","Map","Object","entries","requirementEntries","required","get","values","some","requirementValue"],"mappings":"gFAEA,MAkGaA,EACTC,UAEWA,EAAc,IACd,MAGO,IAAdA,GAA2D,UAApCC,OAAOD,GAAWE,cAClC,SAGJ,2CAoB4B,EACnCC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,MAEO,IACCF,GAAa,CAAEA,UAAAA,MACfC,GAAc,CAAEA,WAAAA,MAChBC,GAAc,CAAEA,WAAAA,wDAzB8B,CACtDC,EACAC,KAAAA,CAGIH,WAAYG,EAAYH,WAClBL,EAA6BO,EAAQF,iBACrC,EACNC,WAAYE,EAAYF,WAClBN,EAA6BO,EAAQD,iBACrC,EACNF,UAAWI,EAAYJ,UACjBJ,EAA6BO,EAAQH,gBACrC,oEAzGkB,EAC5BK,QAAAA,EACAC,KAAAA,MAKM,MAAAC,EA3BSD,KACX,UAAOE,SAAa,IACb,OAGL,MAAAD,EAASC,SAASD,OAEnBE,MAAM,KAENC,KAAKC,GAAMA,EAAEC,OAAOH,MAAM,OAE1BI,MAAMC,GAAMA,EAAE,KAAOR,IAE1B,OAAKC,QAAL,CAIOA,EAUQQ,CAAUT,GAEzB,OAAIC,EACgBS,KAAKC,MAAMV,EAAO,IAKlCF,EACOA,SADX,CACmB,2BASS,EAC5BF,QAAAA,EACAe,OAAAA,EAJoB,QAKpBZ,KAAAA,EACAa,OAAAA,MAOAX,SAASD,OAAS,CACd,GAAGD,KAAQU,KAAKI,UAAUjB,KAC1B,WAAWe,IACX,iBACEC,GAAU,UAAUA,KAErBE,QAAQC,GAAMA,IACdC,KAAK,IAAG,kCAGsB,CACnCnB,EACAD,KAEA,GAAKA,EAKE,CAEH,MAAMqB,EAAa,IAAIC,IAAIC,OAAOC,QAAQxB,IAGpCyB,EAAqBF,OAAOC,QAAQvB,GAE1C,IAAW,MAACE,EAAMuB,KAAaD,EAE3B,GAAKC,GAKwB,OAAzBL,EAAWM,IAAIxB,GACR,OAAA,EAIR,OAAA,CAAA,QAtBAoB,OAAOK,OAAO3B,GAAa4B,MAC7BC,GAAqBA,GAC1B"}
|
|
@@ -10,12 +10,8 @@ export declare const setConsentCookie: ({ consent, maxAge, name, domain, }: {
|
|
|
10
10
|
domain?: string;
|
|
11
11
|
}) => void;
|
|
12
12
|
export declare const shouldShowConsentDialog: (requirement: ConsentRequirement, consent: Consent | undefined) => boolean;
|
|
13
|
-
export declare const convertConsentValueToFormValue: (consent: ConsentState) => boolean | undefined;
|
|
14
|
-
export declare const convertConsentObjectToBooleans: (consent: Partial<Record<keyof Consent, ConsentState>>) => {
|
|
15
|
-
[k: string]: boolean | undefined;
|
|
16
|
-
};
|
|
17
13
|
export declare const convertBooleanToConsentValue: (formValue: boolean | undefined) => ConsentState;
|
|
18
|
-
export declare const convertBooleanConsentObjectToConsentObject: (consent: Partial<Record<keyof Consent, boolean | undefined
|
|
14
|
+
export declare const convertBooleanConsentObjectToConsentObject: (consent: Partial<Record<keyof Consent, boolean | undefined>>, requirement: ConsentRequirement) => Consent;
|
|
19
15
|
export declare const buildRequirementsObject: ({ marketing, functional, statistics, }: ConsentRequirement) => {
|
|
20
16
|
statistics?: true | undefined;
|
|
21
17
|
functional?: true | undefined;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { CookieConsent, type CookieConsentProps } from './CookieConsent.cjs';
|
|
2
|
-
export { CookieConsentProvider, useCookieConsent,
|
|
3
|
-
export type { AcceptConsentCallback, Consent, ConsentState } from './types.cjs';
|
|
2
|
+
export { CookieConsentProvider, useCookieConsent, } from './CookieConsentContext.cjs';
|
|
3
|
+
export type { AcceptConsentCallback, Consent, ConsentState, CookieConsentProviderProps, } from './types.cjs';
|
|
@@ -1,12 +1,27 @@
|
|
|
1
|
+
import { WithChildren } from '../../core/types.cjs';
|
|
1
2
|
export type ConsentState = null | "denied" | "accepted";
|
|
2
3
|
export type ConsentRequirement = Partial<Record<keyof Consent, boolean>>;
|
|
3
|
-
export
|
|
4
|
+
export type Consent = {
|
|
4
5
|
marketing?: ConsentState;
|
|
5
6
|
functional?: ConsentState;
|
|
6
7
|
statistics?: ConsentState;
|
|
7
|
-
}
|
|
8
|
+
};
|
|
8
9
|
export type AcceptConsentCallback = (consent: Consent) => void;
|
|
9
|
-
export
|
|
10
|
+
export type ConsentComponentBaseProps = {
|
|
10
11
|
className?: string;
|
|
11
12
|
onAccept: AcceptConsentCallback;
|
|
12
|
-
}
|
|
13
|
+
};
|
|
14
|
+
export type InternalContext = {
|
|
15
|
+
isOpen: boolean;
|
|
16
|
+
setIsOpen: (isOpen: boolean) => void;
|
|
17
|
+
updateCurrentConsents: () => void;
|
|
18
|
+
requirement: ConsentRequirement;
|
|
19
|
+
currentConsent: Consent;
|
|
20
|
+
cookieName: string;
|
|
21
|
+
cookieDomain?: string;
|
|
22
|
+
};
|
|
23
|
+
export type CookieConsentProviderProps = Partial<ConsentRequirement> & WithChildren & {
|
|
24
|
+
cookieAdapter?: () => Consent | undefined;
|
|
25
|
+
cookieName?: string;
|
|
26
|
+
cookieDomain?: string;
|
|
27
|
+
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as
|
|
1
|
+
import{jsxs as e,jsx as t}from"react/jsx-runtime";import{useId as n,useEffect as o}from"react";import a from"react-dom";import{SecondaryButton as i}from"../button/Button.js";import{ModalContainer as s,ModalOverlay as r,Modal as l,ModalHeader as d,ModalTitle as c,ModalBody as m,ModalActions as u}from"../modal/Modal.js";import{useModal as k}from"../modal/useModal.js";import{useInternalState as f}from"./CookieConsentContext.js";import{setConsentCookie as g,convertBooleanConsentObjectToConsentObject as p}from"./cookieConsentUtils.js";import{RequirementCheckbox as j}from"./RequirementCheckbox.js";const h=({blocking:h,onAccept:b,...C})=>{const{currentConsent:v,cookieName:y,cookieDomain:M,requirement:x,isOpen:O,setIsOpen:T,updateCurrentConsents:D}=f(),[I,B]=k({id:`jkl-cookie-modal-${n()}`,role:h?"alertdialog":"dialog",title:"Informasjonskapsler"});if(o((()=>{O?null==I||I.show():null==I||I.hide()}),[I,O]),o((()=>{const e=()=>T(!1);return null==I||I.on("hide",e),()=>{null==I||I.off("hide",e)}}),[I,T]),typeof document>"u")return null;if(typeof navigator<"u"&&!navigator.cookieEnabled)return b&&b({functional:"denied",marketing:"denied",statistics:"denied"}),null;const $=(e=p({functional:!0,statistics:!0,marketing:!0},x))=>{const t=Object.fromEntries(Object.entries(e).filter((([,e])=>typeof e<"u"))),n={...v,...t};g({consent:n,name:y,domain:M}),D(),null==b||b(n),null==I||I.hide()};return a.createPortal(e(s,{...B.container,...C,children:[t(r,{...B.overlay}),e(l,{component:"form",...B.modal,onSubmit:e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=p({functional:"true"===t.get("functional"),statistics:"true"===t.get("statistics"),marketing:"true"===t.get("marketing")},x);$(n)},children:[t(d,{children:t(c,{...B.title,children:"Velg informasjonskapsler"})}),e(m,{children:[t("p",{children:"For at nettsidene skal fungere må vi bruke tekniske informasjonskaplser. Disse lagres derfor uten samtykke."}),x.functional&&t(j,{name:"functional",label:"Tillat funksjonelle",defaultChecked:"accepted"===v.functional,children:"Funksjonelle informasjonskapsler lagrer opplysninger om din bruk av nettsidene og hvilke innstillinger du har gjort, slik at du kan få funksjonalitet tilpasset deg."},`functional-${v.functional}`),x.statistics&&t(j,{name:"statistics",label:"Tillat statistikk",defaultChecked:"accepted"===v.statistics,children:"Informasjonskapslene lagrer statistikk som hjelper oss med å forstå hvordan nettsidene blir brukt, slik at vi kan gjøre dem bedre og enklere å bruke."},`statistics-${v.statistics}`),x.marketing&&t(j,{name:"marketing",label:"Tillat personlig markedsføring",defaultChecked:"accepted"===v.marketing,children:"Dette gjør at vi kan gi deg mer relevant og tilpasset markedsføring, også gjennom våre samarbeidspartnere, på for eksempel nettsider, annonser og i sosiale medier."},`marketing-${v.marketing}`)]}),e(u,{children:[t(i,{"data-testid":"jkl-cookie-consent-godta-alle",type:"button",onClick:()=>$(),children:"Godta alle"}),t(i,{"data-testid":"jkl-cookie-consent-godta",type:"submit",children:"Godta mine valg"})]})]})]}),document.body)};export{h as CookieConsent};
|
|
2
2
|
//# sourceMappingURL=CookieConsent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CookieConsent.js","sources":["../../../../src/components/cookie-consent/CookieConsent.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { usePreviousValue } from \"../../hooks/usePreviousValue/usePreviousValue.js\";\nimport { useCookieConsentState } from \"./CookieConsentContext.js\";\nimport { CookieConsentModal } from \"./CookieConsentModal.js\";\nimport { setConsentCookie } from \"./cookieConsentUtils.js\";\nimport { AcceptConsentCallback, Consent } from \"./types.js\";\n\nexport interface CookieConsentProps {\n blocking?: boolean;\n onAccept?: AcceptConsentCallback;\n}\n\nexport const CookieConsent = ({\n blocking,\n onAccept,\n ...rest\n}: CookieConsentProps): JSX.Element | null => {\n const { dispatch, consent, cookieName, cookieDomain } =\n useCookieConsentState();\n const prevConsent = usePreviousValue(consent);\n\n useEffect(() => {\n if (onAccept) {\n // Prevent onAccept from being triggered every time state changes\\\n if (consent !== prevConsent) {\n onAccept(consent);\n }\n }\n }, [onAccept, consent, prevConsent]);\n\n // Cookies are disabled in the browser\n if (typeof navigator !== \"undefined\" && !navigator.cookieEnabled) {\n if (onAccept) {\n onAccept({\n functional: \"denied\",\n marketing: \"denied\",\n statistics: \"denied\",\n });\n }\n\n return null;\n }\n\n const handleAccept = (newConsent: Partial<Consent>) => {\n // Filter out null values from the new consent\n const newConsentWithoutNullValues = Object.fromEntries(\n Object.entries(newConsent).filter(([, value]) => value != null),\n );\n\n // Merge the existing consent with the new consent\n const updatedConsent: Consent = {\n ...consent,\n ...newConsentWithoutNullValues,\n };\n\n dispatch({ type: \"UPDATE_CONSENT\", payload: updatedConsent });\n dispatch({ type: \"SET_SHOW_CONSENT\", payload: false });\n setConsentCookie({\n consent: updatedConsent,\n name: cookieName,\n domain: cookieDomain,\n });\n };\n\n // This returns different variants of consents based on the behavior required to get the consent\n // Blocking implies a blocking modal demanding an active action before the user can interact with the application\n if (blocking) {\n return <CookieConsentModal {...rest} onAccept={handleAccept} />;\n }\n\n return null;\n};\n"],"names":["CookieConsent","blocking","onAccept","rest","dispatch","consent","cookieName","cookieDomain","useCookieConsentState","prevConsent","usePreviousValue","useEffect","navigator","cookieEnabled","functional","marketing","statistics","jsx","CookieConsentModal","newConsent","newConsentWithoutNullValues","Object","fromEntries","entries","filter","value","updatedConsent","type","payload","setConsentCookie","name","domain"],"mappings":"wVAYO,MAAMA,EAAgB,EACzBC,SAAAA,EACAC,SAAAA,KACGC,MAEH,MAAQC,SAAAA,EAAUC,QAAAA,EAASC,WAAAA,EAAYC,aAAAA,GACnCC,IACEC,EAAcC,EAAiBL,GAYrC,GAVAM,GAAU,KACFT,GAEIG,IAAYI,GACZP,EAASG,EAAO,GAGzB,CAACH,EAAUG,EAASI,WAGZG,UAAc,MAAgBA,UAAUC,cAC/C,OAAIX,GACSA,EAAA,CACLY,WAAY,SACZC,UAAW,SACXC,WAAY,WAIb,KA0BPf,OAAAA,EACQgB,EAAAC,EAAA,IAAuBf,EAAMD,SAxBnBiB,IAElB,MAAMC,EAA8BC,OAAOC,YACvCD,OAAOE,QAAQJ,GAAYK,QAAO,GAAIC,KAAoB,MAATA,KAI/CC,EAA0B,IACzBrB,KACAe,GAGPhB,EAAS,CAAEuB,KAAM,iBAAkBC,QAASF,IAC5CtB,EAAS,CAAEuB,KAAM,mBAAoBC,SAAS,IAC7BC,EAAA,CACbxB,QAASqB,EACTI,KAAMxB,EACNyB,OAAQxB,GACX,IASE,IAAA"}
|
|
1
|
+
{"version":3,"file":"CookieConsent.js","sources":["../../../../src/components/cookie-consent/CookieConsent.tsx"],"sourcesContent":["import React, { FormEventHandler, useEffect, useId } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { SecondaryButton } from \"../button/Button.js\";\nimport {\n Modal,\n ModalActions,\n ModalBody,\n ModalContainer,\n ModalHeader,\n ModalOverlay,\n ModalTitle,\n} from \"../modal/Modal.js\";\nimport { useModal } from \"../modal/useModal.js\";\nimport { useInternalState } from \"./CookieConsentContext.js\";\nimport {\n convertBooleanConsentObjectToConsentObject,\n setConsentCookie,\n} from \"./cookieConsentUtils.js\";\nimport { RequirementCheckbox } from \"./RequirementCheckbox.js\";\nimport { AcceptConsentCallback, Consent } from \"./types.js\";\n\nexport interface CookieConsentProps {\n blocking?: boolean;\n onAccept?: AcceptConsentCallback;\n}\n\nexport const CookieConsent = ({\n blocking,\n onAccept,\n ...rest\n}: CookieConsentProps): JSX.Element | null => {\n const {\n currentConsent,\n cookieName,\n cookieDomain,\n requirement,\n isOpen,\n setIsOpen,\n updateCurrentConsents,\n } = useInternalState();\n\n const [instance, modalConfig] = useModal({\n id: `jkl-cookie-modal-${useId()}`,\n // The optional `role` attribute of the dialog element, either `dialog`\n // (default) or `alertdialog` to make it a modal (preventing closing on\n // click outside of ESC key).\n role: blocking ? \"alertdialog\" : \"dialog\",\n // The required dialog title, mandatory in the document\n // to provide context to assistive technology.\n title: \"Informasjonskapsler\",\n });\n\n useEffect(() => {\n if (isOpen) {\n instance?.show();\n } else {\n instance?.hide();\n }\n }, [instance, isOpen]);\n\n useEffect(() => {\n const onHide = () => setIsOpen(false);\n instance?.on(\"hide\", onHide);\n return () => {\n instance?.off(\"hide\", onHide);\n };\n }, [instance, setIsOpen]);\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n // Cookies are disabled in the browser\n if (typeof navigator !== \"undefined\" && !navigator.cookieEnabled) {\n if (onAccept) {\n onAccept({\n functional: \"denied\",\n marketing: \"denied\",\n statistics: \"denied\",\n });\n }\n\n return null;\n }\n\n const accept = (\n selection = convertBooleanConsentObjectToConsentObject(\n {\n functional: true,\n statistics: true,\n marketing: true,\n },\n requirement,\n ),\n ) => {\n const selectionWithoutEmptyValues = Object.fromEntries(\n Object.entries(selection).filter(\n ([, value]) => typeof value !== \"undefined\",\n ),\n );\n\n const updatedConsent: Consent = {\n ...currentConsent,\n ...selectionWithoutEmptyValues,\n };\n\n setConsentCookie({\n consent: updatedConsent,\n name: cookieName,\n domain: cookieDomain,\n });\n\n updateCurrentConsents();\n\n onAccept?.(updatedConsent);\n\n instance?.hide();\n };\n\n const onSubmit: FormEventHandler<HTMLFormElement> = (e) => {\n e.preventDefault();\n\n const formData = new FormData(e.currentTarget);\n\n const newConsents = convertBooleanConsentObjectToConsentObject(\n {\n functional: formData.get(\"functional\") === \"true\",\n statistics: formData.get(\"statistics\") === \"true\",\n marketing: formData.get(\"marketing\") === \"true\",\n },\n requirement,\n );\n\n accept(newConsents);\n };\n\n return ReactDOM.createPortal(\n <ModalContainer {...modalConfig.container} {...rest}>\n <ModalOverlay {...modalConfig.overlay} />\n <Modal component=\"form\" {...modalConfig.modal} {...{ onSubmit }}>\n <ModalHeader>\n <ModalTitle {...modalConfig.title}>\n Velg informasjonskapsler\n </ModalTitle>\n </ModalHeader>\n <ModalBody>\n <p>\n For at nettsidene skal fungere må vi bruke tekniske\n informasjonskaplser. Disse lagres derfor uten samtykke.\n </p>\n {requirement.functional && (\n <RequirementCheckbox\n name=\"functional\"\n label=\"Tillat funksjonelle\"\n defaultChecked={\n currentConsent.functional === \"accepted\"\n }\n key={`functional-${currentConsent.functional}`}\n >\n Funksjonelle informasjonskapsler lagrer opplysninger\n om din bruk av nettsidene og hvilke innstillinger du\n har gjort, slik at du kan få funksjonalitet\n tilpasset deg.\n </RequirementCheckbox>\n )}\n {requirement.statistics && (\n <RequirementCheckbox\n name=\"statistics\"\n label=\"Tillat statistikk\"\n defaultChecked={\n currentConsent.statistics === \"accepted\"\n }\n key={`statistics-${currentConsent.statistics}`}\n >\n Informasjonskapslene lagrer statistikk som hjelper\n oss med å forstå hvordan nettsidene blir brukt, slik\n at vi kan gjøre dem bedre og enklere å bruke.\n </RequirementCheckbox>\n )}\n {requirement.marketing && (\n <RequirementCheckbox\n name=\"marketing\"\n label=\"Tillat personlig markedsføring\"\n defaultChecked={\n currentConsent.marketing === \"accepted\"\n }\n key={`marketing-${currentConsent.marketing}`}\n >\n Dette gjør at vi kan gi deg mer relevant og\n tilpasset markedsføring, også gjennom våre\n samarbeidspartnere, på for eksempel nettsider,\n annonser og i sosiale medier.\n </RequirementCheckbox>\n )}\n </ModalBody>\n <ModalActions>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta-alle\"\n type=\"button\"\n onClick={() => accept()}\n >\n Godta alle\n </SecondaryButton>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta\"\n type=\"submit\"\n >\n Godta mine valg\n </SecondaryButton>\n </ModalActions>\n </Modal>\n </ModalContainer>,\n document.body,\n );\n};\n"],"names":["CookieConsent","blocking","onAccept","rest","currentConsent","cookieName","cookieDomain","requirement","isOpen","setIsOpen","updateCurrentConsents","useInternalState","instance","modalConfig","useModal","id","useId","role","title","useEffect","show","hide","onHide","on","off","document","navigator","cookieEnabled","functional","marketing","statistics","accept","selection","convertBooleanConsentObjectToConsentObject","selectionWithoutEmptyValues","Object","fromEntries","entries","filter","value","updatedConsent","setConsentCookie","consent","name","domain","ReactDOM","createPortal","ModalContainer","container","children","jsx","ModalOverlay","overlay","jsxs","Modal","component","modal","onSubmit","e","preventDefault","formData","FormData","currentTarget","newConsents","get","ModalHeader","ModalTitle","ModalBody","RequirementCheckbox","label","defaultChecked","ModalActions","SecondaryButton","type","onClick","body"],"mappings":"ulBA0BO,MAAMA,EAAgB,EACzBC,SAAAA,EACAC,SAAAA,KACGC,MAEG,MACFC,eAAAA,EACAC,WAAAA,EACAC,aAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAC,UAAAA,EACAC,sBAAAA,GACAC,KAEGC,EAAUC,GAAeC,EAAS,CACrCC,GAAI,oBAAoBC,MAIxBC,KAAMhB,EAAW,cAAgB,SAGjCiB,MAAO,wBAmBP,GAhBJC,GAAU,KACFX,EACA,MAAAI,GAAAA,EAAUQ,OAEV,MAAAR,GAAAA,EAAUS,MAAA,GAEf,CAACT,EAAUJ,IAEdW,GAAU,KACAG,MAAAA,EAAS,IAAMb,GAAU,GACrB,OAAA,MAAAG,GAAAA,EAAAW,GAAG,OAAQD,GACd,KACO,MAAAV,GAAAA,EAAAY,IAAI,OAAQF,EAAAA,CAC1B,GACD,CAACV,EAAUH,WAEHgB,SAAa,IACb,OAAA,KAIX,UAAWC,UAAc,MAAgBA,UAAUC,cAC/C,OAAIzB,GACSA,EAAA,CACL0B,WAAY,SACZC,UAAW,SACXC,WAAY,WAIb,KAGLC,MAAAA,EAAS,CACXC,EAAYC,EACR,CACIL,YAAY,EACZE,YAAY,EACZD,WAAW,GAEftB,MAGJ,MAAM2B,EAA8BC,OAAOC,YACvCD,OAAOE,QAAQL,GAAWM,QACtB,EAAI,CAAAC,YAAkBA,EAAU,OAIlCC,EAA0B,IACzBpC,KACA8B,GAGUO,EAAA,CACbC,QAASF,EACTG,KAAMtC,EACNuC,OAAQtC,IAGUI,IAEtB,MAAAR,GAAAA,EAAWsC,GAEX,MAAA5B,GAAAA,EAAUS,MAAA,EAoBd,OAAOwB,EAASC,eACXC,EAAgB,IAAGlC,EAAYmC,aAAe7C,EAC3C8C,SAAA,CAACC,EAAAC,EAAA,IAAiBtC,EAAYuC,UAC9BC,EAACC,EAAM,CAAAC,UAAU,UAAW1C,EAAY2C,MAAaC,SApBRC,IACjDA,EAAEC,iBAEF,MAAMC,EAAW,IAAIC,SAASH,EAAEI,eAE1BC,EAAc9B,EAChB,CACIL,WAA2C,SAA/BgC,EAASI,IAAI,cACzBlC,WAA2C,SAA/B8B,EAASI,IAAI,cACzBnC,UAAyC,SAA9B+B,EAASI,IAAI,cAE5BzD,GAGJwB,EAAOgC,EAAW,EAOVd,SAAA,CAAAC,EAACe,GACGhB,SAACC,EAAAgB,EAAA,IAAerD,EAAYK,MAAO+B,0CAItCkB,EACG,CAAAlB,SAAA,CAAAC,EAAC,KAAED,SAGH,gHACC1C,EAAYqB,YACTsB,EAACkB,EAAA,CACGzB,KAAK,aACL0B,MAAM,sBACNC,eACkC,aAA9BlE,EAAewB,WAGtBqB,SAAA,wKADQ,cAAc7C,EAAewB,cAQzCrB,EAAYuB,YACToB,EAACkB,EAAA,CACGzB,KAAK,aACL0B,MAAM,oBACNC,eACkC,aAA9BlE,EAAe0B,WAGtBmB,SAAA,yJADQ,cAAc7C,EAAe0B,cAOzCvB,EAAYsB,WACTqB,EAACkB,EAAA,CACGzB,KAAK,YACL0B,MAAM,iCACNC,eACiC,aAA7BlE,EAAeyB,UAGtBoB,SAAA,uKADQ,aAAa7C,EAAeyB,kBAS5C0C,EACG,CAAAtB,SAAA,CAAAC,EAACsB,EAAA,CACG,cAAY,gCACZC,KAAK,SACLC,QAAS,IAAM3C,IAClBkB,SAAA,eAGDC,EAACsB,EAAA,CACG,cAAY,2BACZC,KAAK,SACRxB,SAAA,6BAMbxB,SAASkD,KACb"}
|
|
@@ -1,48 +1,11 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import { Consent, ConsentRequirement } from './types.js';
|
|
4
|
-
interface SetShowConsentAction {
|
|
5
|
-
type: "SET_SHOW_CONSENT";
|
|
6
|
-
payload: boolean;
|
|
7
|
-
}
|
|
8
|
-
interface SetShowSettingsAction {
|
|
9
|
-
type: "SET_SHOW_SETTINGS";
|
|
10
|
-
payload: boolean;
|
|
11
|
-
}
|
|
12
|
-
interface UpdateConsentAction {
|
|
13
|
-
type: "UPDATE_CONSENT";
|
|
14
|
-
payload: Consent;
|
|
15
|
-
}
|
|
16
|
-
interface UpdateRequirementsAction {
|
|
17
|
-
type: "UPDATE_REQUIREMENTS";
|
|
18
|
-
payload: ConsentRequirement;
|
|
19
|
-
}
|
|
20
|
-
type Action = SetShowConsentAction | UpdateConsentAction | SetShowSettingsAction | UpdateRequirementsAction;
|
|
21
|
-
type Dispatch = (action: Action) => void;
|
|
22
|
-
interface State {
|
|
23
|
-
isOpen: boolean;
|
|
24
|
-
showSettings: boolean;
|
|
25
|
-
requirement: ConsentRequirement;
|
|
26
|
-
consent: Consent;
|
|
27
|
-
}
|
|
2
|
+
import { Consent, CookieConsentProviderProps, InternalContext } from './types.js';
|
|
28
3
|
export declare const DEFAULT_COOKIE_NAME = "fremtind-cookie-consent";
|
|
29
|
-
export
|
|
30
|
-
|
|
31
|
-
cookieName?: string;
|
|
32
|
-
cookieDomain?: string;
|
|
33
|
-
}
|
|
34
|
-
declare const CookieConsentProvider: React.FC<CookieConsentProviderProps>;
|
|
35
|
-
interface UseCookieConsentState extends State {
|
|
36
|
-
dispatch: Dispatch;
|
|
37
|
-
cookieName: string;
|
|
38
|
-
cookieDomain?: string;
|
|
39
|
-
}
|
|
40
|
-
declare const useCookieConsentState: () => UseCookieConsentState;
|
|
4
|
+
export declare const CookieConsentProvider: React.FC<CookieConsentProviderProps>;
|
|
5
|
+
export declare const useInternalState: () => InternalContext;
|
|
41
6
|
type UseCookieConsent = {
|
|
42
|
-
|
|
43
|
-
openConsentModalWithDefaults: () => void;
|
|
44
|
-
/** Se hvilke samtykker som er gitt, om du for eksempel trenger styre UI basert på samtykker. */
|
|
7
|
+
openConsentModal: () => void;
|
|
45
8
|
consents: Consent;
|
|
46
9
|
};
|
|
47
|
-
declare const useCookieConsent: () => UseCookieConsent;
|
|
48
|
-
export {
|
|
10
|
+
export declare const useCookieConsent: () => UseCookieConsent;
|
|
11
|
+
export {};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e}from"react/jsx-runtime";import t,
|
|
1
|
+
import{jsx as e}from"react/jsx-runtime";import o,{useState as t,useMemo as n,useContext as s}from"react";import{buildRequirementsObject as i,getConsentCookie as r,shouldShowConsentDialog as a}from"./cookieConsentUtils.js";const u="fremtind-cookie-consent",c=o.createContext(void 0),C=({children:o,cookieAdapter:s,marketing:C,functional:m,statistics:d,cookieName:l=u,cookieDomain:k})=>{const[p,f]=t((()=>Date.now())),w=n((()=>i({marketing:C,functional:m,statistics:d})),[C,m,d]),h=n((()=>r({adapter:s,name:l})??{marketing:null,functional:null,statistics:null}),[s,l,p]),[v,x]=t((()=>a(w,h)));return e(c.Provider,{value:{isOpen:v,setIsOpen:x,updateCurrentConsents:()=>f(Date.now()),requirement:w,currentConsent:h,cookieName:l,cookieDomain:k},children:o})},m=()=>{const e=o.useContext(c);if(void 0===e)throw new Error("CookieConsent must be used within a CookieConsentProvider");return e},d=()=>{const e=s(c);if(void 0===e)throw new Error("useCookieConsent must be used within a CookieConsentProvider");return{openConsentModal:()=>{e.setIsOpen(!0)},consents:e.currentConsent}};export{C as CookieConsentProvider,u as DEFAULT_COOKIE_NAME,d as useCookieConsent,m as useInternalState};
|
|
2
2
|
//# sourceMappingURL=CookieConsentContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CookieConsentContext.js","sources":["../../../../src/components/cookie-consent/CookieConsentContext.tsx"],"sourcesContent":["import React, {
|
|
1
|
+
{"version":3,"file":"CookieConsentContext.js","sources":["../../../../src/components/cookie-consent/CookieConsentContext.tsx"],"sourcesContent":["import React, { useContext, useMemo, useState } from \"react\";\nimport {\n buildRequirementsObject,\n getConsentCookie,\n shouldShowConsentDialog,\n} from \"./cookieConsentUtils.js\";\nimport {\n Consent,\n CookieConsentProviderProps,\n InternalContext,\n} from \"./types.js\";\n\nexport const DEFAULT_COOKIE_NAME = \"fremtind-cookie-consent\";\n\nconst Context = React.createContext<InternalContext | undefined>(undefined);\n\nexport const CookieConsentProvider: React.FC<CookieConsentProviderProps> = ({\n children,\n cookieAdapter,\n marketing,\n functional,\n statistics,\n cookieName = DEFAULT_COOKIE_NAME,\n cookieDomain,\n}) => {\n const [timestamp, setTimestamp] = useState(() => Date.now());\n\n const requirement = useMemo(\n () => buildRequirementsObject({ marketing, functional, statistics }),\n [marketing, functional, statistics],\n );\n\n const consentCookie = useMemo(() => {\n return (\n getConsentCookie({ adapter: cookieAdapter, name: cookieName }) ?? {\n marketing: null,\n functional: null,\n statistics: null,\n }\n );\n /* Use timestamp as a dependency to be ablet to force re-reading of cookie */\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [cookieAdapter, cookieName, timestamp]);\n\n const [isOpen, setIsOpen] = useState(() => {\n return shouldShowConsentDialog(requirement, consentCookie);\n });\n\n return (\n <Context.Provider\n value={{\n isOpen,\n setIsOpen,\n updateCurrentConsents: () => setTimestamp(Date.now()),\n requirement,\n currentConsent: consentCookie,\n cookieName,\n cookieDomain,\n }}\n >\n {children}\n </Context.Provider>\n );\n};\n\nexport const useInternalState = () => {\n const context = React.useContext(Context);\n if (context === undefined) {\n throw new Error(\n \"CookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n return context;\n};\n\ntype UseCookieConsent = {\n openConsentModal: () => void;\n consents: Consent;\n};\n\nexport const useCookieConsent = (): UseCookieConsent => {\n const context = useContext(Context);\n\n if (context === undefined) {\n throw new Error(\n \"useCookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n const openConsentModal = () => {\n context.setIsOpen(true);\n };\n\n const consents = context.currentConsent;\n\n return { openConsentModal, consents };\n};\n"],"names":["DEFAULT_COOKIE_NAME","Context","React","createContext","CookieConsentProvider","children","cookieAdapter","marketing","functional","statistics","cookieName","cookieDomain","timestamp","setTimestamp","useState","Date","now","requirement","useMemo","buildRequirementsObject","consentCookie","getConsentCookie","adapter","name","isOpen","setIsOpen","shouldShowConsentDialog","jsx","Provider","value","updateCurrentConsents","currentConsent","useInternalState","context","useContext","Error","useCookieConsent","openConsentModal","consents"],"mappings":"8NAYO,MAAMA,EAAsB,0BAE7BC,EAAUC,EAAMC,mBAA2C,GAEpDC,EAA8D,EACvEC,SAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,EACAC,WAAAA,EAAaV,EACbW,aAAAA,MAEM,MAACC,EAAWC,GAAgBC,GAAS,IAAMC,KAAKC,QAEhDC,EAAcC,GAChB,IAAMC,EAAwB,CAAEZ,UAAAA,EAAWC,WAAAA,EAAYC,WAAAA,KACvD,CAACF,EAAWC,EAAYC,IAGtBW,EAAgBF,GAAQ,IAEtBG,EAAiB,CAAEC,QAAShB,EAAeiB,KAAMb,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAKrB,CAACH,EAAeI,EAAYE,KAExBY,EAAQC,GAAaX,GAAS,IAC1BY,EAAwBT,EAAaG,KAI5C,OAAAO,EAAC1B,EAAQ2B,SAAR,CACGC,MAAO,CACHL,OAAAA,EACAC,UAAAA,EACAK,sBAAuB,IAAMjB,EAAaE,KAAKC,OAC/CC,YAAAA,EACAc,eAAgBX,EAChBV,WAAAA,EACAC,aAAAA,GAGHN,SAAAA,GACL,EAIK2B,EAAmB,KACtBC,MAAAA,EAAU/B,EAAMgC,WAAWjC,GACjC,QAAgB,IAAZgC,EACA,MAAM,IAAIE,MACN,6DAIDF,OAAAA,CAAAA,EAQEG,EAAmB,KACtBH,MAAAA,EAAUC,EAAWjC,GAE3B,QAAgB,IAAZgC,EACA,MAAM,IAAIE,MACN,gEAUD,MAAA,CAAEE,iBANgB,KACrBJ,EAAQR,WAAU,EAAI,EAKCa,SAFVL,EAAQF,eAEW"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
-
import { WithChildren } from '
|
|
2
|
+
import { WithChildren } from '../../core/types.js';
|
|
3
3
|
interface RequirementCheckboxProps extends WithChildren {
|
|
4
4
|
defaultChecked: boolean;
|
|
5
5
|
name: "functional" | "marketing" | "statistics";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{jsxs as e,Fragment as c,jsx as o}from"react/jsx-runtime";import{Checkbox as a}from"../checkbox/Checkbox.js";const s=({defaultChecked:s,name:l,label:n,children:t})=>e(c,{children:[o(a,{className:"jkl-cookie-consent-modal__checkbox",value:"true",name:l,defaultChecked:s,children:n}),o("p",{className:"jkl-cookie-consent-modal__info-text",children:t})]});export{s as RequirementCheckbox};
|
|
2
|
+
//# sourceMappingURL=RequirementCheckbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequirementCheckbox.js","sources":["../../../../src/components/cookie-consent/RequirementCheckbox.tsx"],"sourcesContent":["import React from \"react\";\nimport { WithChildren } from \"../../core/types.js\";\nimport { Checkbox } from \"../checkbox/Checkbox.js\";\n\ninterface RequirementCheckboxProps extends WithChildren {\n defaultChecked: boolean;\n name: \"functional\" | \"marketing\" | \"statistics\";\n label: string;\n}\n\nexport const RequirementCheckbox = ({\n defaultChecked,\n name,\n label,\n children,\n}: RequirementCheckboxProps) => {\n return (\n <>\n <Checkbox\n className=\"jkl-cookie-consent-modal__checkbox\"\n value=\"true\"\n name={name}\n defaultChecked={defaultChecked}\n >\n {label}\n </Checkbox>\n <p className=\"jkl-cookie-consent-modal__info-text\">{children}</p>\n </>\n );\n};\n"],"names":["RequirementCheckbox","defaultChecked","name","label","children","jsxs","Fragment","jsx","Checkbox","className","value"],"mappings":"mHAUO,MAAMA,EAAsB,EAC/BC,eAAAA,EACAC,KAAAA,EACAC,MAAAA,EACAC,SAAAA,KAIQC,EAAAC,EAAA,CAAAF,SAAA,CAAAG,EAACC,EAAA,CACGC,UAAU,qCACVC,MAAM,OACNR,KAAAA,EACAD,eAAAA,EAECG,SAAAD,IAEJI,EAAA,IAAA,CAAEE,UAAU,sCAAuCL,SAAAA"}
|
|
@@ -10,12 +10,8 @@ export declare const setConsentCookie: ({ consent, maxAge, name, domain, }: {
|
|
|
10
10
|
domain?: string;
|
|
11
11
|
}) => void;
|
|
12
12
|
export declare const shouldShowConsentDialog: (requirement: ConsentRequirement, consent: Consent | undefined) => boolean;
|
|
13
|
-
export declare const convertConsentValueToFormValue: (consent: ConsentState) => boolean | undefined;
|
|
14
|
-
export declare const convertConsentObjectToBooleans: (consent: Partial<Record<keyof Consent, ConsentState>>) => {
|
|
15
|
-
[k: string]: boolean | undefined;
|
|
16
|
-
};
|
|
17
13
|
export declare const convertBooleanToConsentValue: (formValue: boolean | undefined) => ConsentState;
|
|
18
|
-
export declare const convertBooleanConsentObjectToConsentObject: (consent: Partial<Record<keyof Consent, boolean | undefined
|
|
14
|
+
export declare const convertBooleanConsentObjectToConsentObject: (consent: Partial<Record<keyof Consent, boolean | undefined>>, requirement: ConsentRequirement) => Consent;
|
|
19
15
|
export declare const buildRequirementsObject: ({ marketing, functional, statistics, }: ConsentRequirement) => {
|
|
20
16
|
statistics?: true | undefined;
|
|
21
17
|
functional?: true | undefined;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const
|
|
1
|
+
const t=({adapter:t,name:e})=>{const n=(t=>{if(typeof document>"u")return;const e=document.cookie.split(";").map((t=>t.trim().split("="))).find((e=>e[0]===t));return e||void 0})(e);return n?JSON.parse(n[1]):t?t():void 0},e=({consent:t,maxAge:e=10368e3,name:n,domain:o})=>{document.cookie=[`${n}=${JSON.stringify(t)}`,`max-age=${e}`,"SameSite=Lax",!!o&&`domain=${o}`].filter((t=>t)).join(";")},n=(t,e)=>{if(e){const n=new Map(Object.entries(e)),o=Object.entries(t);for(const[t,e]of o)if(e&&null===n.get(t))return!0;return!1}return Object.values(t).some((t=>t))},o=t=>typeof t>"u"?null:!1===t||"false"===String(t).toLowerCase()?"denied":"accepted",i=(t,e)=>({functional:e.functional?o(t.functional):void 0,statistics:e.statistics?o(t.statistics):void 0,marketing:e.marketing?o(t.marketing):void 0}),s=({marketing:t,functional:e,statistics:n})=>({...t&&{marketing:t},...e&&{functional:e},...n&&{statistics:n}});export{s as buildRequirementsObject,i as convertBooleanConsentObjectToConsentObject,o as convertBooleanToConsentValue,t as getConsentCookie,e as setConsentCookie,n as shouldShowConsentDialog};
|
|
2
2
|
//# sourceMappingURL=cookieConsentUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookieConsentUtils.js","sources":["../../../../src/components/cookie-consent/cookieConsentUtils.ts"],"sourcesContent":["import type { Consent, ConsentRequirement, ConsentState } from \"./types.js\";\n\nconst getCookie = (name: string) => {\n if (typeof document === \"undefined\") {\n return undefined;\n }\n\n const cookie = document.cookie\n // split a string of cookies into array of cookies\n .split(\";\")\n // split cookies into [name, value]\n .map((s) => s.trim().split(\"=\"))\n // find our golden nugget\n .find((c) => c[0] === name);\n\n if (!cookie) {\n return undefined;\n }\n\n return cookie;\n};\n\nexport const getConsentCookie = ({\n adapter,\n name,\n}: {\n adapter?: () => Consent | undefined;\n name: string;\n}): Consent | undefined => {\n const cookie = getCookie(name);\n\n if (cookie) {\n const consent = JSON.parse(cookie[1]);\n\n return consent as Consent;\n }\n\n if (adapter) {\n return adapter();\n }\n\n return undefined;\n};\n\n// 120 days\nconst DEFAULT_MAX_AGE = 10368000;\n\nexport const setConsentCookie = ({\n consent,\n maxAge = DEFAULT_MAX_AGE,\n name,\n domain,\n}: {\n consent: Consent;\n maxAge?: number;\n name: string;\n domain?: string;\n}): void => {\n document.cookie = [\n `${name}=${JSON.stringify(consent)}`,\n `max-age=${maxAge}`,\n `SameSite=Lax`,\n !!domain && `domain=${domain}`,\n ]\n .filter((f) => f)\n .join(\";\");\n};\n\nexport const shouldShowConsentDialog = (\n requirement: ConsentRequirement,\n consent: Consent | undefined,\n): boolean => {\n if (!consent) {\n // check if requirement has truthy values. should show consent if it has\n return Object.values(requirement).some(\n (requirementValue) => requirementValue,\n );\n } else {\n // convert to a map to ease accessing dynamic keys\n const consentMap = new Map(Object.entries(consent));\n\n // pls spare the CPU of converting to an entries array 3 times\n const requirementEntries = Object.entries(requirement);\n\n for (const [name, required] of requirementEntries) {\n // no need to check more if the value isn't required\n if (!required) {\n continue;\n }\n\n // cancel and show consent if a value isn't decided\n if (consentMap.get(name) === null) {\n return true;\n }\n }\n\n return false;\n }\n};\n\nexport const
|
|
1
|
+
{"version":3,"file":"cookieConsentUtils.js","sources":["../../../../src/components/cookie-consent/cookieConsentUtils.ts"],"sourcesContent":["import type { Consent, ConsentRequirement, ConsentState } from \"./types.js\";\n\nconst getCookie = (name: string) => {\n if (typeof document === \"undefined\") {\n return undefined;\n }\n\n const cookie = document.cookie\n // split a string of cookies into array of cookies\n .split(\";\")\n // split cookies into [name, value]\n .map((s) => s.trim().split(\"=\"))\n // find our golden nugget\n .find((c) => c[0] === name);\n\n if (!cookie) {\n return undefined;\n }\n\n return cookie;\n};\n\nexport const getConsentCookie = ({\n adapter,\n name,\n}: {\n adapter?: () => Consent | undefined;\n name: string;\n}): Consent | undefined => {\n const cookie = getCookie(name);\n\n if (cookie) {\n const consent = JSON.parse(cookie[1]);\n\n return consent as Consent;\n }\n\n if (adapter) {\n return adapter();\n }\n\n return undefined;\n};\n\n// 120 days\nconst DEFAULT_MAX_AGE = 10368000;\n\nexport const setConsentCookie = ({\n consent,\n maxAge = DEFAULT_MAX_AGE,\n name,\n domain,\n}: {\n consent: Consent;\n maxAge?: number;\n name: string;\n domain?: string;\n}): void => {\n document.cookie = [\n `${name}=${JSON.stringify(consent)}`,\n `max-age=${maxAge}`,\n `SameSite=Lax`,\n !!domain && `domain=${domain}`,\n ]\n .filter((f) => f)\n .join(\";\");\n};\n\nexport const shouldShowConsentDialog = (\n requirement: ConsentRequirement,\n consent: Consent | undefined,\n): boolean => {\n if (!consent) {\n // check if requirement has truthy values. should show consent if it has\n return Object.values(requirement).some(\n (requirementValue) => requirementValue,\n );\n } else {\n // convert to a map to ease accessing dynamic keys\n const consentMap = new Map(Object.entries(consent));\n\n // pls spare the CPU of converting to an entries array 3 times\n const requirementEntries = Object.entries(requirement);\n\n for (const [name, required] of requirementEntries) {\n // no need to check more if the value isn't required\n if (!required) {\n continue;\n }\n\n // cancel and show consent if a value isn't decided\n if (consentMap.get(name) === null) {\n return true;\n }\n }\n\n return false;\n }\n};\n\nexport const convertBooleanToConsentValue = (\n formValue: boolean | undefined,\n): ConsentState => {\n if (typeof formValue === \"undefined\") {\n return null;\n }\n\n if (formValue === false || String(formValue).toLowerCase() === \"false\") {\n return \"denied\";\n }\n\n return \"accepted\";\n};\n\nexport const convertBooleanConsentObjectToConsentObject = (\n consent: Partial<Record<keyof Consent, boolean | undefined>>,\n requirement: ConsentRequirement,\n): Consent => {\n return {\n functional: requirement.functional\n ? convertBooleanToConsentValue(consent.functional)\n : undefined,\n statistics: requirement.statistics\n ? convertBooleanToConsentValue(consent.statistics)\n : undefined,\n marketing: requirement.marketing\n ? convertBooleanToConsentValue(consent.marketing)\n : undefined,\n };\n};\n\nexport const buildRequirementsObject = ({\n marketing,\n functional,\n statistics,\n}: ConsentRequirement) => {\n return {\n ...(marketing && { marketing }),\n ...(functional && { functional }),\n ...(statistics && { statistics }),\n };\n};\n"],"names":["getConsentCookie","adapter","name","cookie","document","split","map","s","trim","find","c","getCookie","JSON","parse","setConsentCookie","consent","maxAge","domain","stringify","filter","f","join","shouldShowConsentDialog","requirement","consentMap","Map","Object","entries","requirementEntries","required","get","values","some","requirementValue","convertBooleanToConsentValue","formValue","String","toLowerCase","convertBooleanConsentObjectToConsentObject","functional","statistics","marketing","buildRequirementsObject"],"mappings":"AAEA,MAoBaA,EAAmB,EAC5BC,QAAAA,EACAC,KAAAA,MAKMC,MAAAA,EA3BQ,CAACD,IACX,UAAOE,SAAa,IACb,OAGLD,MAAAA,EAASC,SAASD,OAEnBE,MAAM,KAENC,KAAKC,GAAMA,EAAEC,OAAOH,MAAM,OAE1BI,MAAMC,GAAMA,EAAE,KAAOR,IAErBC,OAAAA,QAAAA,CAIEA,EAUQQ,CAAUT,GAErBC,OAAAA,EACgBS,KAAKC,MAAMV,EAAO,IAKlCF,EACOA,SADPA,CACe,EASVa,EAAmB,EAC5BC,QAAAA,EACAC,OAAAA,EAAS,QACTd,KAAAA,EACAe,OAAAA,MAOAb,SAASD,OAAS,CACd,GAAGD,KAAQU,KAAKM,UAAUH,KAC1B,WAAWC,IACX,iBACEC,GAAU,UAAUA,KAErBE,QAAQC,GAAMA,IACdC,KAAK,IAAG,EAGJC,EAA0B,CACnCC,EACAR,KAEA,GAAKA,EAKE,CAEGS,MAAAA,EAAa,IAAIC,IAAIC,OAAOC,QAAQZ,IAGpCa,EAAqBF,OAAOC,QAAQJ,GAE/B,IAAA,MAACrB,EAAM2B,KAAaD,EAE3B,GAAKC,GAKwB,OAAzBL,EAAWM,IAAI5B,GACR,OAAA,EAIR,OAAA,CAAA,CAtBA,OAAAwB,OAAOK,OAAOR,GAAaS,MAC7BC,GAAqBA,GAC1B,EAwBKC,EACTC,UAEWA,EAAc,IACd,MAGO,IAAdA,GAA2D,UAApCC,OAAOD,GAAWE,cAClC,SAGJ,WAGEC,EAA6C,CACtDvB,EACAQ,KAEO,CACHgB,WAAYhB,EAAYgB,WAClBL,EAA6BnB,EAAQwB,iBACrC,EACNC,WAAYjB,EAAYiB,WAClBN,EAA6BnB,EAAQyB,iBACrC,EACNC,UAAWlB,EAAYkB,UACjBP,EAA6BnB,EAAQ0B,gBACrC,IAIDC,EAA0B,EACnCD,UAAAA,EACAF,WAAAA,EACAC,WAAAA,MAEO,IACCC,GAAa,CAAEA,UAAAA,MACfF,GAAc,CAAEA,WAAAA,MAChBC,GAAc,CAAEA,WAAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { CookieConsent, type CookieConsentProps } from './CookieConsent.js';
|
|
2
|
-
export { CookieConsentProvider, useCookieConsent,
|
|
3
|
-
export type { AcceptConsentCallback, Consent, ConsentState } from './types.js';
|
|
2
|
+
export { CookieConsentProvider, useCookieConsent, } from './CookieConsentContext.js';
|
|
3
|
+
export type { AcceptConsentCallback, Consent, ConsentState, CookieConsentProviderProps, } from './types.js';
|