@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.
Files changed (84) hide show
  1. package/build/build-stats.html +1 -1
  2. package/build/cjs/components/cookie-consent/CookieConsent.cjs +1 -1
  3. package/build/cjs/components/cookie-consent/CookieConsent.cjs.map +1 -1
  4. package/build/cjs/components/cookie-consent/CookieConsentContext.cjs +1 -1
  5. package/build/cjs/components/cookie-consent/CookieConsentContext.cjs.map +1 -1
  6. package/build/cjs/components/cookie-consent/CookieConsentContext.d.cts +6 -43
  7. package/build/cjs/components/cookie-consent/RequirementCheckbox.cjs +2 -0
  8. package/build/cjs/components/cookie-consent/RequirementCheckbox.cjs.map +1 -0
  9. package/build/cjs/components/cookie-consent/{consents/RequirementCheckbox.d.cts → RequirementCheckbox.d.cts} +1 -1
  10. package/build/cjs/components/cookie-consent/cookieConsentUtils.cjs +1 -1
  11. package/build/cjs/components/cookie-consent/cookieConsentUtils.cjs.map +1 -1
  12. package/build/cjs/components/cookie-consent/cookieConsentUtils.d.cts +1 -5
  13. package/build/cjs/components/cookie-consent/index.d.cts +2 -2
  14. package/build/cjs/components/cookie-consent/types.d.cts +19 -4
  15. package/build/es/components/cookie-consent/CookieConsent.js +1 -1
  16. package/build/es/components/cookie-consent/CookieConsent.js.map +1 -1
  17. package/build/es/components/cookie-consent/CookieConsentContext.d.ts +6 -43
  18. package/build/es/components/cookie-consent/CookieConsentContext.js +1 -1
  19. package/build/es/components/cookie-consent/CookieConsentContext.js.map +1 -1
  20. package/build/es/components/cookie-consent/{consents/RequirementCheckbox.d.ts → RequirementCheckbox.d.ts} +1 -1
  21. package/build/es/components/cookie-consent/RequirementCheckbox.js +2 -0
  22. package/build/es/components/cookie-consent/RequirementCheckbox.js.map +1 -0
  23. package/build/es/components/cookie-consent/cookieConsentUtils.d.ts +1 -5
  24. package/build/es/components/cookie-consent/cookieConsentUtils.js +1 -1
  25. package/build/es/components/cookie-consent/cookieConsentUtils.js.map +1 -1
  26. package/build/es/components/cookie-consent/index.d.ts +2 -2
  27. package/build/es/components/cookie-consent/types.d.ts +19 -4
  28. package/package.json +2 -2
  29. package/styles/components/button/button.css +2 -2
  30. package/styles/components/button/button.min.css +1 -1
  31. package/styles/components/checkbox/checkbox.css +4 -4
  32. package/styles/components/checkbox/checkbox.min.css +1 -1
  33. package/styles/components/cookie-consent/cookie-consent.css +0 -69
  34. package/styles/components/cookie-consent/cookie-consent.min.css +1 -1
  35. package/styles/components/cookie-consent/cookie-consent.scss +0 -48
  36. package/styles/components/expander/expandable.css +1 -1
  37. package/styles/components/expander/expandable.min.css +1 -1
  38. package/styles/components/expander/expandable.scss +1 -1
  39. package/styles/components/feedback/feedback.css +2 -2
  40. package/styles/components/feedback/feedback.min.css +1 -1
  41. package/styles/components/input-group/input-group.css +2 -2
  42. package/styles/components/input-group/input-group.min.css +1 -1
  43. package/styles/components/input-panel/checkbox-panel.css +2 -2
  44. package/styles/components/input-panel/checkbox-panel.min.css +1 -1
  45. package/styles/components/input-panel/radio-panel.css +2 -2
  46. package/styles/components/input-panel/radio-panel.min.css +1 -1
  47. package/styles/components/loader/loader.css +6 -6
  48. package/styles/components/loader/loader.min.css +1 -1
  49. package/styles/components/loader/skeleton-loader.css +5 -5
  50. package/styles/components/loader/skeleton-loader.min.css +1 -1
  51. package/styles/components/message/message.css +2 -2
  52. package/styles/components/message/message.min.css +1 -1
  53. package/styles/components/progress-bar/progress-bar.css +2 -2
  54. package/styles/components/progress-bar/progress-bar.min.css +1 -1
  55. package/styles/components/radio-button/radio-button.css +2 -2
  56. package/styles/components/radio-button/radio-button.min.css +1 -1
  57. package/styles/components/system-message/system-message.css +2 -2
  58. package/styles/components/system-message/system-message.min.css +1 -1
  59. package/styles/components/toast/toast.css +4 -4
  60. package/styles/components/toast/toast.min.css +1 -1
  61. package/styles/styles.css +38 -107
  62. package/styles/styles.min.css +1 -1
  63. package/build/cjs/components/cookie-consent/CookieConsentModal.cjs +0 -2
  64. package/build/cjs/components/cookie-consent/CookieConsentModal.cjs.map +0 -1
  65. package/build/cjs/components/cookie-consent/CookieConsentModal.d.cts +0 -3
  66. package/build/cjs/components/cookie-consent/consents/CustomConsents.cjs +0 -2
  67. package/build/cjs/components/cookie-consent/consents/CustomConsents.cjs.map +0 -1
  68. package/build/cjs/components/cookie-consent/consents/CustomConsents.d.cts +0 -9
  69. package/build/cjs/components/cookie-consent/consents/DefaultConsents.cjs +0 -2
  70. package/build/cjs/components/cookie-consent/consents/DefaultConsents.cjs.map +0 -1
  71. package/build/cjs/components/cookie-consent/consents/DefaultConsents.d.cts +0 -9
  72. package/build/cjs/components/cookie-consent/consents/RequirementCheckbox.cjs +0 -2
  73. package/build/cjs/components/cookie-consent/consents/RequirementCheckbox.cjs.map +0 -1
  74. package/build/es/components/cookie-consent/CookieConsentModal.d.ts +0 -3
  75. package/build/es/components/cookie-consent/CookieConsentModal.js +0 -2
  76. package/build/es/components/cookie-consent/CookieConsentModal.js.map +0 -1
  77. package/build/es/components/cookie-consent/consents/CustomConsents.d.ts +0 -9
  78. package/build/es/components/cookie-consent/consents/CustomConsents.js +0 -2
  79. package/build/es/components/cookie-consent/consents/CustomConsents.js.map +0 -1
  80. package/build/es/components/cookie-consent/consents/DefaultConsents.d.ts +0 -9
  81. package/build/es/components/cookie-consent/consents/DefaultConsents.js +0 -2
  82. package/build/es/components/cookie-consent/consents/DefaultConsents.js.map +0 -1
  83. package/build/es/components/cookie-consent/consents/RequirementCheckbox.js +0 -2
  84. 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"),o=require("react"),t=require("../../hooks/usePreviousValue/usePreviousValue.cjs"),n=require("./CookieConsentContext.cjs"),i=require("./CookieConsentModal.cjs"),s=require("./cookieConsentUtils.cjs");exports.CookieConsent=({blocking:r,onAccept:c,...u})=>{const{dispatch:a,consent:l,cookieName:C,cookieDomain:d}=n.useCookieConsentState(),k=t.usePreviousValue(l);if(o.useEffect((()=>{c&&l!==k&&c(l)}),[c,l,k]),typeof navigator<"u"&&!navigator.cookieEnabled)return c&&c({functional:"denied",marketing:"denied",statistics:"denied"}),null;return r?e.jsx(i.CookieConsentModal,{...u,onAccept:e=>{const o=Object.fromEntries(Object.entries(e).filter((([,e])=>null!=e))),t={...l,...o};a({type:"UPDATE_CONSENT",payload:t}),a({type:"SET_SHOW_CONSENT",payload:!1}),s.setConsentCookie({consent:t,name:C,domain:d})}}):null};
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),i=(e,t)=>{switch(t.type){case"SET_SHOW_CONSENT":return{...e,isOpen:t.payload};case"SET_SHOW_SETTINGS":return{...e,showSettings:t.payload};case"UPDATE_CONSENT":return{...e,consent:{...e.consent,...t.payload}};case"UPDATE_REQUIREMENTS":return{...e,requirement:{...e.requirement,...t.payload}};default:throw new Error(`Unhandled action type: ${t.type}`)}};exports.CookieConsentProvider=({children:a,cookieAdapter:r,marketing:c,functional:u,statistics:d,cookieName:p=n,cookieDomain:S})=>{const l=t.useMemo((()=>o.getConsentCookie({adapter:r,name:p})??{marketing:null,functional:null,statistics:null}),[r,p]),C=t.useMemo((()=>o.buildRequirementsObject({marketing:c,functional:u,statistics:d})),[c,u,d]),[E,T]=t.useReducer(i,{isOpen:!1,showSettings:!1,requirement:C,consent:l});t.useEffect((()=>{o.shouldShowConsentDialog(C,l)?T({type:"SET_SHOW_CONSENT",payload:!0}):l&&T({type:"UPDATE_CONSENT",payload:l})}),[C,l]);const m={state:E,dispatch:T,cookieName:p,cookieDomain:S};return e.jsx(s.Provider,{value:m,children:a})},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{openConsentModalWithSettings:()=>{e.dispatch({type:"SET_SHOW_CONSENT",payload:!0}),e.dispatch({type:"SET_SHOW_SETTINGS",payload:!0})},openConsentModalWithDefaults:()=>{e.dispatch({type:"SET_SHOW_CONSENT",payload:!0}),e.dispatch({type:"SET_SHOW_SETTINGS",payload:!1})},consents:e.state.consent}},exports.useCookieConsentState=()=>{const e=t.useContext(s);if(void 0===e)throw new Error("useCookieConsentState must be used within a CookieConsentProvider");return{dispatch:e.dispatch,cookieName:e.cookieName,cookieDomain:e.cookieDomain,...e.state}};
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, { useEffect, useMemo } from \"react\";\nimport { WithChildren } from \"../../core/types.js\";\nimport {\n buildRequirementsObject,\n getConsentCookie,\n shouldShowConsentDialog,\n} from \"./cookieConsentUtils.js\";\nimport { Consent, ConsentRequirement } from \"./types.js\";\n\n// https://kentcdodds.com/blog/how-to-use-react-context-effectively\n\ninterface SetShowConsentAction {\n type: \"SET_SHOW_CONSENT\";\n payload: boolean;\n}\n\ninterface SetShowSettingsAction {\n type: \"SET_SHOW_SETTINGS\";\n payload: boolean;\n}\n\ninterface UpdateConsentAction {\n type: \"UPDATE_CONSENT\";\n payload: Consent;\n}\n\ninterface UpdateRequirementsAction {\n type: \"UPDATE_REQUIREMENTS\";\n payload: ConsentRequirement;\n}\n\ntype Action =\n | SetShowConsentAction\n | UpdateConsentAction\n | SetShowSettingsAction\n | UpdateRequirementsAction;\ntype Dispatch = (action: Action) => void;\n\ninterface State {\n isOpen: boolean;\n showSettings: boolean;\n requirement: ConsentRequirement;\n consent: Consent;\n}\n\nexport const DEFAULT_COOKIE_NAME = \"fremtind-cookie-consent\";\n\nconst CookieConsentContext = React.createContext<\n | {\n state: State;\n dispatch: Dispatch;\n cookieName: string;\n cookieDomain?: string;\n }\n | undefined\n>(undefined);\n\nconst cookieConsentReducer = (state: State, action: Action): State => {\n switch (action.type) {\n case \"SET_SHOW_CONSENT\":\n return { ...state, isOpen: action.payload };\n\n case \"SET_SHOW_SETTINGS\":\n return {\n ...state,\n showSettings: action.payload,\n };\n\n case \"UPDATE_CONSENT\":\n return {\n ...state,\n consent: {\n ...state.consent,\n ...action.payload,\n },\n };\n\n case \"UPDATE_REQUIREMENTS\":\n return {\n ...state,\n requirement: {\n ...state.requirement,\n ...action.payload,\n },\n };\n\n default: {\n // @ts-ignore Denne skal ikke oppstå, men den _kan_ oppstå\n throw new Error(`Unhandled action type: ${action.type}`);\n }\n }\n};\n\nexport interface CookieConsentProviderProps\n extends Partial<ConsentRequirement>,\n WithChildren {\n cookieAdapter?: () => Consent | undefined;\n cookieName?: string;\n cookieDomain?: string;\n}\n\nconst CookieConsentProvider: React.FC<CookieConsentProviderProps> = ({\n children,\n cookieAdapter,\n marketing,\n functional,\n statistics,\n cookieName = DEFAULT_COOKIE_NAME,\n cookieDomain,\n}) => {\n // Load existing consent at initial render\n const consentCookie = useMemo(() => {\n return (\n getConsentCookie({ adapter: cookieAdapter, name: cookieName }) ?? {\n marketing: null,\n functional: null,\n statistics: null,\n }\n );\n }, [cookieAdapter, cookieName]);\n\n const requirement = useMemo(\n () => buildRequirementsObject({ marketing, functional, statistics }),\n [marketing, functional, statistics],\n );\n\n const [state, dispatch] = React.useReducer(cookieConsentReducer, {\n isOpen: false,\n showSettings: false,\n requirement,\n consent: consentCookie,\n });\n\n useEffect(() => {\n if (shouldShowConsentDialog(requirement, consentCookie)) {\n dispatch({ type: \"SET_SHOW_CONSENT\", payload: true });\n } else if (consentCookie) {\n dispatch({ type: \"UPDATE_CONSENT\", payload: consentCookie });\n }\n }, [requirement, consentCookie]);\n\n const value = { state, dispatch, cookieName, cookieDomain };\n return (\n <CookieConsentContext.Provider value={value}>\n {children}\n </CookieConsentContext.Provider>\n );\n};\n\ninterface UseCookieConsentState extends State {\n dispatch: Dispatch;\n cookieName: string;\n cookieDomain?: string;\n}\n\n// control and state for internal use\nconst useCookieConsentState = (): UseCookieConsentState => {\n const context = React.useContext(CookieConsentContext);\n if (context === undefined) {\n throw new Error(\n \"useCookieConsentState must be used within a CookieConsentProvider\",\n );\n }\n\n return {\n dispatch: context.dispatch,\n cookieName: context.cookieName,\n cookieDomain: context.cookieDomain,\n ...context.state,\n };\n};\n\ntype UseCookieConsent = {\n openConsentModalWithSettings: () => void;\n openConsentModalWithDefaults: () => void;\n /** Se hvilke samtykker som er gitt, om du for eksempel trenger styre UI basert på samtykker. */\n consents: Consent;\n};\n\n// expose functionality to be used by consumers\nconst useCookieConsent = (): UseCookieConsent => {\n const context = React.useContext(CookieConsentContext);\n if (context === undefined) {\n throw new Error(\n \"useCookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n const openConsentModalWithSettings = () => {\n context.dispatch({ type: \"SET_SHOW_CONSENT\", payload: true });\n context.dispatch({ type: \"SET_SHOW_SETTINGS\", payload: true });\n };\n\n const openConsentModalWithDefaults = () => {\n context.dispatch({ type: \"SET_SHOW_CONSENT\", payload: true });\n context.dispatch({ type: \"SET_SHOW_SETTINGS\", payload: false });\n };\n\n const consents = context.state.consent;\n\n return {\n openConsentModalWithSettings,\n openConsentModalWithDefaults,\n consents,\n };\n};\n\nexport { CookieConsentProvider, useCookieConsent, useCookieConsentState };\n"],"names":["DEFAULT_COOKIE_NAME","CookieConsentContext","React","createContext","cookieConsentReducer","state","action","type","isOpen","payload","showSettings","consent","requirement","Error","children","cookieAdapter","marketing","functional","statistics","cookieName","cookieDomain","consentCookie","useMemo","getConsentCookie","adapter","name","buildRequirementsObject","dispatch","useReducer","useEffect","shouldShowConsentDialog","value","jsx","Provider","context","useContext","openConsentModalWithSettings","openConsentModalWithDefaults","consents"],"mappings":"8KA6CaA,EAAsB,0BAE7BC,EAAuBC,EAAMC,mBAQjC,GAEIC,EAAuB,CAACC,EAAcC,KACxC,OAAQA,EAAOC,MACX,IAAK,mBACD,MAAO,IAAKF,EAAOG,OAAQF,EAAOG,SAEtC,IAAK,oBACM,MAAA,IACAJ,EACHK,aAAcJ,EAAOG,SAG7B,IAAK,iBACM,MAAA,IACAJ,EACHM,QAAS,IACFN,EAAMM,WACNL,EAAOG,UAItB,IAAK,sBACM,MAAA,IACAJ,EACHO,YAAa,IACNP,EAAMO,eACNN,EAAOG,UAItB,QAEI,MAAM,IAAII,MAAM,0BAA0BP,EAAOC,QACrD,gCAY4D,EAChEO,SAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,EACAC,WAAAA,EAAanB,EACboB,aAAAA,MAGM,MAAAC,EAAgBC,EAAAA,SAAQ,IAEtBC,EAAAA,iBAAiB,CAAEC,QAAST,EAAeU,KAAMN,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAGrB,CAACH,EAAeI,IAEbP,EAAcU,EAAAA,SAChB,IAAMI,EAAwBA,wBAAA,CAAEV,UAAAA,EAAWC,WAAAA,EAAYC,WAAAA,KACvD,CAACF,EAAWC,EAAYC,KAGrBb,EAAOsB,GAAYzB,EAAM0B,WAAWxB,EAAsB,CAC7DI,QAAQ,EACRE,cAAc,EACdE,YAAAA,EACAD,QAASU,IAGbQ,EAAAA,WAAU,KACFC,EAAAA,wBAAwBlB,EAAaS,GACrCM,EAAS,CAAEpB,KAAM,mBAAoBE,SAAS,IACvCY,GACPM,EAAS,CAAEpB,KAAM,iBAAkBE,QAASY,GAAe,GAEhE,CAACT,EAAaS,IAEjB,MAAMU,EAAQ,CAAE1B,MAAAA,EAAOsB,SAAAA,EAAUR,WAAAA,EAAYC,aAAAA,GAC7C,OACKY,EAAAA,IAAA/B,EAAqBgC,SAArB,CAA8BF,MAAAA,EAC1BjB,SAAAA,GACL,yDAmCiB,KACf,MAAAoB,EAAUhC,EAAMiC,WAAWlC,GACjC,QAAgB,IAAZiC,EACA,MAAM,IAAIrB,MACN,gEAgBD,MAAA,CACHuB,6BAbiC,KACjCF,EAAQP,SAAS,CAAEpB,KAAM,mBAAoBE,SAAS,IACtDyB,EAAQP,SAAS,CAAEpB,KAAM,oBAAqBE,SAAS,GAAM,EAY7D4B,6BATiC,KACjCH,EAAQP,SAAS,CAAEpB,KAAM,mBAAoBE,SAAS,IACtDyB,EAAQP,SAAS,CAAEpB,KAAM,oBAAqBE,SAAS,GAAO,EAQ9D6B,SALaJ,EAAQ7B,MAAMM,QAM/B,gCAhD0B,KACpB,MAAAuB,EAAUhC,EAAMiC,WAAWlC,GACjC,QAAgB,IAAZiC,EACA,MAAM,IAAIrB,MACN,qEAID,MAAA,CACHc,SAAUO,EAAQP,SAClBR,WAAYe,EAAQf,WACpBC,aAAcc,EAAQd,gBACnBc,EAAQ7B,MACf"}
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 { WithChildren } from '../../core/types.cjs';
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 interface CookieConsentProviderProps extends Partial<ConsentRequirement>, WithChildren {
30
- cookieAdapter?: () => Consent | undefined;
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
- openConsentModalWithSettings: () => void;
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 { CookieConsentProvider, useCookieConsent, useCookieConsentState };
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 '../../../core/types.cjs';
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 e=e=>{if(e)return"denied"!==e},t=e=>typeof e>"u"?null:!1===e||"false"===String(e).toLowerCase()?"denied":"accepted";exports.buildRequirementsObject=({marketing:e,functional:t,statistics:n})=>({...e&&{marketing:e},...t&&{functional:t},...n&&{statistics:n}}),exports.convertBooleanConsentObjectToConsentObject=e=>{const n=Object.entries({functional:void 0,marketing:void 0,statistics:void 0,...e}).map((([e,n])=>[e,t(n)]));return Object.fromEntries(n)},exports.convertBooleanToConsentValue=t,exports.convertConsentObjectToBooleans=t=>{const n=Object.entries({functional:null,marketing:null,statistics:null,...t}).map((([t,n])=>[t,e(n)]));return Object.fromEntries(n)},exports.convertConsentValueToFormValue=e,exports.getConsentCookie=({adapter:e,name:t})=>{const n=(e=>{if(typeof document>"u")return;const t=document.cookie.split(";").map((e=>e.trim().split("="))).find((t=>t[0]===e));return t||void 0})(t);return n?JSON.parse(n[1]):e?e():void 0},exports.setConsentCookie=({consent:e,maxAge:t=10368e3,name:n,domain:o})=>{document.cookie=[`${n}=${JSON.stringify(e)}`,`max-age=${t}`,"SameSite=Lax",!!o&&`domain=${o}`].filter((e=>e)).join(";")},exports.shouldShowConsentDialog=(e,t)=>{if(t){const n=new Map(Object.entries(t)),o=Object.entries(e);for(const[e,t]of o)if(t&&null===n.get(e))return!0;return!1}return Object.values(e).some((e=>e))};
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 convertConsentValueToFormValue = (\n consent: ConsentState,\n): boolean | undefined => {\n if (!consent) {\n return undefined;\n }\n\n if (consent === \"denied\") {\n return false;\n }\n\n return true;\n};\n\nexport const convertConsentObjectToBooleans = (\n consent: Partial<Record<keyof Consent, ConsentState>>,\n): { [k: string]: boolean | undefined } => {\n const defaultConsent = {\n functional: null,\n marketing: null,\n statistics: null,\n };\n\n const consentEntries: Array<[string, boolean | undefined]> = Object.entries(\n { ...defaultConsent, ...consent },\n ).map(([consentName, value]) => [\n consentName,\n convertConsentValueToFormValue(value),\n ]);\n return Object.fromEntries(consentEntries);\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): Consent => {\n const defaultObject = {\n functional: undefined,\n marketing: undefined,\n statistics: undefined,\n };\n\n const consentEntries = Object.entries({ ...defaultObject, ...consent }).map(\n ([consentName, value]) => [\n consentName,\n convertBooleanToConsentValue(value),\n ],\n );\n\n return Object.fromEntries(consentEntries);\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":["convertConsentValueToFormValue","consent","convertBooleanToConsentValue","formValue","String","toLowerCase","marketing","functional","statistics","consentEntries","Object","entries","map","consentName","value","fromEntries","adapter","name","cookie","document","split","s","trim","find","c","getCookie","JSON","parse","maxAge","domain","stringify","filter","f","join","requirement","consentMap","Map","requirementEntries","required","get","values","some","requirementValue"],"mappings":"gFAEA,MAkGaA,EACTC,IAEA,GAAKA,EAIL,MAAgB,WAAZA,CAAY,EAyBPC,EACTC,UAEWA,EAAc,IACd,MAGO,IAAdA,GAA2D,UAApCC,OAAOD,GAAWE,cAClC,SAGJ,2CAsB4B,EACnCC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,UAGQF,GAAa,CAAEA,UAAAA,MACfC,GAAc,CAAEA,WAAAA,MAChBC,GAAc,CAAEA,WAAAA,wDA1BxBP,IAQM,MAAAQ,EAAiBC,OAAOC,QAAQ,CALlCJ,gBAAY,EACZD,eAAW,EACXE,gBAAY,KAG6CP,IAAWW,KACpE,EAAEC,EAAaC,KAAW,CACtBD,EACAX,EAA6BY,MAI9B,OAAAJ,OAAOK,YAAYN,EAAc,gFA/CxCR,IAQA,MAAMQ,EAAuDC,OAAOC,QAChE,CANAJ,WAAY,KACZD,UAAW,KACXE,WAAY,QAIYP,IAC1BW,KAAI,EAAEC,EAAaC,KAAW,CAC5BD,EACAb,EAA+Bc,MAE5B,OAAAJ,OAAOK,YAAYN,EAAc,oEA3GZ,EAC5BO,QAAAA,EACAC,KAAAA,MAKM,MAAAC,EA3BSD,KACX,UAAOE,SAAa,IACb,OAGL,MAAAD,EAASC,SAASD,OAEnBE,MAAM,KAENR,KAAKS,GAAMA,EAAEC,OAAOF,MAAM,OAE1BG,MAAMC,GAAMA,EAAE,KAAOP,IAE1B,OAAKC,QAAL,CAIOA,EAUQO,CAAUR,GAEzB,OAAIC,EACgBQ,KAAKC,MAAMT,EAAO,IAKlCF,EACOA,SADX,CACmB,2BASS,EAC5Bf,QAAAA,EACA2B,OAAAA,EAJoB,QAKpBX,KAAAA,EACAY,OAAAA,MAOAV,SAASD,OAAS,CACd,GAAGD,KAAQS,KAAKI,UAAU7B,KAC1B,WAAW2B,IACX,iBACEC,GAAU,UAAUA,KAErBE,QAAQC,GAAMA,IACdC,KAAK,IAAG,kCAGsB,CACnCC,EACAjC,KAEA,GAAKA,EAKE,CAEH,MAAMkC,EAAa,IAAIC,IAAI1B,OAAOC,QAAQV,IAGpCoC,EAAqB3B,OAAOC,QAAQuB,GAE1C,IAAW,MAACjB,EAAMqB,KAAaD,EAE3B,GAAKC,GAKwB,OAAzBH,EAAWI,IAAItB,GACR,OAAA,EAIR,OAAA,CAAA,QAtBAP,OAAO8B,OAAON,GAAaO,MAC7BC,GAAqBA,GAC1B"}
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>>) => Consent;
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, type CookieConsentProviderProps, } from './CookieConsentContext.cjs';
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 interface Consent {
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 interface ConsentComponentBaseProps {
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 o}from"react/jsx-runtime";import{useEffect as e}from"react";import{usePreviousValue as t}from"../../hooks/usePreviousValue/usePreviousValue.js";import{useCookieConsentState as n}from"./CookieConsentContext.js";import{CookieConsentModal as s}from"./CookieConsentModal.js";import{setConsentCookie as i}from"./cookieConsentUtils.js";const a=({blocking:a,onAccept:r,...c})=>{const{dispatch:m,consent:u,cookieName:l,cookieDomain:C}=n(),p=t(u);if(e((()=>{r&&u!==p&&r(u)}),[r,u,p]),typeof navigator<"u"&&!navigator.cookieEnabled)return r&&r({functional:"denied",marketing:"denied",statistics:"denied"}),null;return a?o(s,{...c,onAccept:o=>{const e=Object.fromEntries(Object.entries(o).filter((([,o])=>null!=o))),t={...u,...e};m({type:"UPDATE_CONSENT",payload:t}),m({type:"SET_SHOW_CONSENT",payload:!1}),i({consent:t,name:l,domain:C})}}):null};export{a as CookieConsent};
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 { WithChildren } from '../../core/types.js';
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 interface CookieConsentProviderProps extends Partial<ConsentRequirement>, WithChildren {
30
- cookieAdapter?: () => Consent | undefined;
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
- openConsentModalWithSettings: () => void;
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 { CookieConsentProvider, useCookieConsent, useCookieConsentState };
10
+ export declare const useCookieConsent: () => UseCookieConsent;
11
+ export {};
@@ -1,2 +1,2 @@
1
- import{jsx as e}from"react/jsx-runtime";import t,{useMemo as o,useEffect as n}from"react";import{getConsentCookie as s,buildRequirementsObject as a,shouldShowConsentDialog as i}from"./cookieConsentUtils.js";const r="fremtind-cookie-consent",c=t.createContext(void 0),d=(e,t)=>{switch(t.type){case"SET_SHOW_CONSENT":return{...e,isOpen:t.payload};case"SET_SHOW_SETTINGS":return{...e,showSettings:t.payload};case"UPDATE_CONSENT":return{...e,consent:{...e.consent,...t.payload}};case"UPDATE_REQUIREMENTS":return{...e,requirement:{...e.requirement,...t.payload}};default:throw new Error(`Unhandled action type: ${t.type}`)}},u=({children:u,cookieAdapter:p,marketing:S,functional:l,statistics:C,cookieName:E=r,cookieDomain:m})=>{const T=o((()=>s({adapter:p,name:E})??{marketing:null,functional:null,statistics:null}),[p,E]),h=o((()=>a({marketing:S,functional:l,statistics:C})),[S,l,C]),[k,N]=t.useReducer(d,{isOpen:!1,showSettings:!1,requirement:h,consent:T});n((()=>{i(h,T)?N({type:"SET_SHOW_CONSENT",payload:!0}):T&&N({type:"UPDATE_CONSENT",payload:T})}),[h,T]);const y={state:k,dispatch:N,cookieName:E,cookieDomain:m};return e(c.Provider,{value:y,children:u})},p=()=>{const e=t.useContext(c);if(void 0===e)throw new Error("useCookieConsentState must be used within a CookieConsentProvider");return{dispatch:e.dispatch,cookieName:e.cookieName,cookieDomain:e.cookieDomain,...e.state}},S=()=>{const e=t.useContext(c);if(void 0===e)throw new Error("useCookieConsent must be used within a CookieConsentProvider");return{openConsentModalWithSettings:()=>{e.dispatch({type:"SET_SHOW_CONSENT",payload:!0}),e.dispatch({type:"SET_SHOW_SETTINGS",payload:!0})},openConsentModalWithDefaults:()=>{e.dispatch({type:"SET_SHOW_CONSENT",payload:!0}),e.dispatch({type:"SET_SHOW_SETTINGS",payload:!1})},consents:e.state.consent}};export{u as CookieConsentProvider,r as DEFAULT_COOKIE_NAME,S as useCookieConsent,p as useCookieConsentState};
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, { useEffect, useMemo } from \"react\";\nimport { WithChildren } from \"../../core/types.js\";\nimport {\n buildRequirementsObject,\n getConsentCookie,\n shouldShowConsentDialog,\n} from \"./cookieConsentUtils.js\";\nimport { Consent, ConsentRequirement } from \"./types.js\";\n\n// https://kentcdodds.com/blog/how-to-use-react-context-effectively\n\ninterface SetShowConsentAction {\n type: \"SET_SHOW_CONSENT\";\n payload: boolean;\n}\n\ninterface SetShowSettingsAction {\n type: \"SET_SHOW_SETTINGS\";\n payload: boolean;\n}\n\ninterface UpdateConsentAction {\n type: \"UPDATE_CONSENT\";\n payload: Consent;\n}\n\ninterface UpdateRequirementsAction {\n type: \"UPDATE_REQUIREMENTS\";\n payload: ConsentRequirement;\n}\n\ntype Action =\n | SetShowConsentAction\n | UpdateConsentAction\n | SetShowSettingsAction\n | UpdateRequirementsAction;\ntype Dispatch = (action: Action) => void;\n\ninterface State {\n isOpen: boolean;\n showSettings: boolean;\n requirement: ConsentRequirement;\n consent: Consent;\n}\n\nexport const DEFAULT_COOKIE_NAME = \"fremtind-cookie-consent\";\n\nconst CookieConsentContext = React.createContext<\n | {\n state: State;\n dispatch: Dispatch;\n cookieName: string;\n cookieDomain?: string;\n }\n | undefined\n>(undefined);\n\nconst cookieConsentReducer = (state: State, action: Action): State => {\n switch (action.type) {\n case \"SET_SHOW_CONSENT\":\n return { ...state, isOpen: action.payload };\n\n case \"SET_SHOW_SETTINGS\":\n return {\n ...state,\n showSettings: action.payload,\n };\n\n case \"UPDATE_CONSENT\":\n return {\n ...state,\n consent: {\n ...state.consent,\n ...action.payload,\n },\n };\n\n case \"UPDATE_REQUIREMENTS\":\n return {\n ...state,\n requirement: {\n ...state.requirement,\n ...action.payload,\n },\n };\n\n default: {\n // @ts-ignore Denne skal ikke oppstå, men den _kan_ oppstå\n throw new Error(`Unhandled action type: ${action.type}`);\n }\n }\n};\n\nexport interface CookieConsentProviderProps\n extends Partial<ConsentRequirement>,\n WithChildren {\n cookieAdapter?: () => Consent | undefined;\n cookieName?: string;\n cookieDomain?: string;\n}\n\nconst CookieConsentProvider: React.FC<CookieConsentProviderProps> = ({\n children,\n cookieAdapter,\n marketing,\n functional,\n statistics,\n cookieName = DEFAULT_COOKIE_NAME,\n cookieDomain,\n}) => {\n // Load existing consent at initial render\n const consentCookie = useMemo(() => {\n return (\n getConsentCookie({ adapter: cookieAdapter, name: cookieName }) ?? {\n marketing: null,\n functional: null,\n statistics: null,\n }\n );\n }, [cookieAdapter, cookieName]);\n\n const requirement = useMemo(\n () => buildRequirementsObject({ marketing, functional, statistics }),\n [marketing, functional, statistics],\n );\n\n const [state, dispatch] = React.useReducer(cookieConsentReducer, {\n isOpen: false,\n showSettings: false,\n requirement,\n consent: consentCookie,\n });\n\n useEffect(() => {\n if (shouldShowConsentDialog(requirement, consentCookie)) {\n dispatch({ type: \"SET_SHOW_CONSENT\", payload: true });\n } else if (consentCookie) {\n dispatch({ type: \"UPDATE_CONSENT\", payload: consentCookie });\n }\n }, [requirement, consentCookie]);\n\n const value = { state, dispatch, cookieName, cookieDomain };\n return (\n <CookieConsentContext.Provider value={value}>\n {children}\n </CookieConsentContext.Provider>\n );\n};\n\ninterface UseCookieConsentState extends State {\n dispatch: Dispatch;\n cookieName: string;\n cookieDomain?: string;\n}\n\n// control and state for internal use\nconst useCookieConsentState = (): UseCookieConsentState => {\n const context = React.useContext(CookieConsentContext);\n if (context === undefined) {\n throw new Error(\n \"useCookieConsentState must be used within a CookieConsentProvider\",\n );\n }\n\n return {\n dispatch: context.dispatch,\n cookieName: context.cookieName,\n cookieDomain: context.cookieDomain,\n ...context.state,\n };\n};\n\ntype UseCookieConsent = {\n openConsentModalWithSettings: () => void;\n openConsentModalWithDefaults: () => void;\n /** Se hvilke samtykker som er gitt, om du for eksempel trenger styre UI basert på samtykker. */\n consents: Consent;\n};\n\n// expose functionality to be used by consumers\nconst useCookieConsent = (): UseCookieConsent => {\n const context = React.useContext(CookieConsentContext);\n if (context === undefined) {\n throw new Error(\n \"useCookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n const openConsentModalWithSettings = () => {\n context.dispatch({ type: \"SET_SHOW_CONSENT\", payload: true });\n context.dispatch({ type: \"SET_SHOW_SETTINGS\", payload: true });\n };\n\n const openConsentModalWithDefaults = () => {\n context.dispatch({ type: \"SET_SHOW_CONSENT\", payload: true });\n context.dispatch({ type: \"SET_SHOW_SETTINGS\", payload: false });\n };\n\n const consents = context.state.consent;\n\n return {\n openConsentModalWithSettings,\n openConsentModalWithDefaults,\n consents,\n };\n};\n\nexport { CookieConsentProvider, useCookieConsent, useCookieConsentState };\n"],"names":["DEFAULT_COOKIE_NAME","CookieConsentContext","React","createContext","cookieConsentReducer","state","action","type","isOpen","payload","showSettings","consent","requirement","Error","CookieConsentProvider","children","cookieAdapter","marketing","functional","statistics","cookieName","cookieDomain","consentCookie","useMemo","getConsentCookie","adapter","name","buildRequirementsObject","dispatch","useReducer","useEffect","shouldShowConsentDialog","value","jsx","Provider","useCookieConsentState","context","useContext","useCookieConsent","openConsentModalWithSettings","openConsentModalWithDefaults","consents"],"mappings":"+MA6CO,MAAMA,EAAsB,0BAE7BC,EAAuBC,EAAMC,mBAQjC,GAEIC,EAAuB,CAACC,EAAcC,KACxC,OAAQA,EAAOC,MACX,IAAK,mBACD,MAAO,IAAKF,EAAOG,OAAQF,EAAOG,SAEtC,IAAK,oBACM,MAAA,IACAJ,EACHK,aAAcJ,EAAOG,SAG7B,IAAK,iBACM,MAAA,IACAJ,EACHM,QAAS,IACFN,EAAMM,WACNL,EAAOG,UAItB,IAAK,sBACM,MAAA,IACAJ,EACHO,YAAa,IACNP,EAAMO,eACNN,EAAOG,UAItB,QAEI,MAAM,IAAII,MAAM,0BAA0BP,EAAOC,QACrD,EAYFO,EAA8D,EAChEC,SAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,EACAC,WAAAA,EAAapB,EACbqB,aAAAA,MAGMC,MAAAA,EAAgBC,GAAQ,IAEtBC,EAAiB,CAAEC,QAAST,EAAeU,KAAMN,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAGrB,CAACH,EAAeI,IAEbR,EAAcW,GAChB,IAAMI,EAAwB,CAAEV,UAAAA,EAAWC,WAAAA,EAAYC,WAAAA,KACvD,CAACF,EAAWC,EAAYC,KAGrBd,EAAOuB,GAAY1B,EAAM2B,WAAWzB,EAAsB,CAC7DI,QAAQ,EACRE,cAAc,EACdE,YAAAA,EACAD,QAASW,IAGbQ,GAAU,KACFC,EAAwBnB,EAAaU,GACrCM,EAAS,CAAErB,KAAM,mBAAoBE,SAAS,IACvCa,GACPM,EAAS,CAAErB,KAAM,iBAAkBE,QAASa,GAAe,GAEhE,CAACV,EAAaU,IAEXU,MAAAA,EAAQ,CAAE3B,MAAAA,EAAOuB,SAAAA,EAAUR,WAAAA,EAAYC,aAAAA,GAExC,OAAAY,EAAAhC,EAAqBiC,SAArB,CAA8BF,MAAAA,EAC1BjB,SAAAA,GACL,EAWFoB,EAAwB,KACpBC,MAAAA,EAAUlC,EAAMmC,WAAWpC,GACjC,QAAgB,IAAZmC,EACA,MAAM,IAAIvB,MACN,qEAID,MAAA,CACHe,SAAUQ,EAAQR,SAClBR,WAAYgB,EAAQhB,WACpBC,aAAce,EAAQf,gBACnBe,EAAQ/B,MACf,EAWEiC,EAAmB,KACfF,MAAAA,EAAUlC,EAAMmC,WAAWpC,GACjC,QAAgB,IAAZmC,EACA,MAAM,IAAIvB,MACN,gEAgBD,MAAA,CACH0B,6BAbiC,KACjCH,EAAQR,SAAS,CAAErB,KAAM,mBAAoBE,SAAS,IACtD2B,EAAQR,SAAS,CAAErB,KAAM,oBAAqBE,SAAS,GAAM,EAY7D+B,6BATiC,KACjCJ,EAAQR,SAAS,CAAErB,KAAM,mBAAoBE,SAAS,IACtD2B,EAAQR,SAAS,CAAErB,KAAM,oBAAqBE,SAAS,GAAO,EAQ9DgC,SALaL,EAAQ/B,MAAMM,QAM/B"}
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 '../../../core/types.js';
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>>) => Consent;
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 e=({adapter:e,name:t})=>{const n=(e=>{if(typeof document>"u")return;const t=document.cookie.split(";").map((e=>e.trim().split("="))).find((t=>t[0]===e));return t||void 0})(t);return n?JSON.parse(n[1]):e?e():void 0},t=({consent:e,maxAge:t=10368e3,name:n,domain:o})=>{document.cookie=[`${n}=${JSON.stringify(e)}`,`max-age=${t}`,"SameSite=Lax",!!o&&`domain=${o}`].filter((e=>e)).join(";")},n=(e,t)=>{if(t){const n=new Map(Object.entries(t)),o=Object.entries(e);for(const[e,t]of o)if(t&&null===n.get(e))return!0;return!1}return Object.values(e).some((e=>e))},o=e=>{if(e)return"denied"!==e},s=e=>{const t=Object.entries({functional:null,marketing:null,statistics:null,...e}).map((([e,t])=>[e,o(t)]));return Object.fromEntries(t)},i=e=>typeof e>"u"?null:!1===e||"false"===String(e).toLowerCase()?"denied":"accepted",a=e=>{const t=Object.entries({functional:void 0,marketing:void 0,statistics:void 0,...e}).map((([e,t])=>[e,i(t)]));return Object.fromEntries(t)},r=({marketing:e,functional:t,statistics:n})=>({...e&&{marketing:e},...t&&{functional:t},...n&&{statistics:n}});export{r as buildRequirementsObject,a as convertBooleanConsentObjectToConsentObject,i as convertBooleanToConsentValue,s as convertConsentObjectToBooleans,o as convertConsentValueToFormValue,e as getConsentCookie,t as setConsentCookie,n as shouldShowConsentDialog};
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 convertConsentValueToFormValue = (\n consent: ConsentState,\n): boolean | undefined => {\n if (!consent) {\n return undefined;\n }\n\n if (consent === \"denied\") {\n return false;\n }\n\n return true;\n};\n\nexport const convertConsentObjectToBooleans = (\n consent: Partial<Record<keyof Consent, ConsentState>>,\n): { [k: string]: boolean | undefined } => {\n const defaultConsent = {\n functional: null,\n marketing: null,\n statistics: null,\n };\n\n const consentEntries: Array<[string, boolean | undefined]> = Object.entries(\n { ...defaultConsent, ...consent },\n ).map(([consentName, value]) => [\n consentName,\n convertConsentValueToFormValue(value),\n ]);\n return Object.fromEntries(consentEntries);\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): Consent => {\n const defaultObject = {\n functional: undefined,\n marketing: undefined,\n statistics: undefined,\n };\n\n const consentEntries = Object.entries({ ...defaultObject, ...consent }).map(\n ([consentName, value]) => [\n consentName,\n convertBooleanToConsentValue(value),\n ],\n );\n\n return Object.fromEntries(consentEntries);\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","convertConsentValueToFormValue","convertConsentObjectToBooleans","consentEntries","functional","marketing","statistics","consentName","value","fromEntries","convertBooleanToConsentValue","formValue","String","toLowerCase","convertBooleanConsentObjectToConsentObject","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,EACTnB,IAEKA,GAAAA,EAIL,MAAgB,WAAZA,CAAY,EAOPoB,EACTpB,IAQA,MAAMqB,EAAuDV,OAAOC,QAChE,CANAU,WAAY,KACZC,UAAW,KACXC,WAAY,QAIYxB,IAC1BT,KAAI,EAAEkC,EAAaC,KAAW,CAC5BD,EACAN,EAA+BO,MAE5B,OAAAf,OAAOgB,YAAYN,EAAc,EAG/BO,EACTC,UAEWA,EAAc,IACd,MAGO,IAAdA,GAA2D,UAApCC,OAAOD,GAAWE,cAClC,SAGJ,WAGEC,EACThC,IAQM,MAAAqB,EAAiBV,OAAOC,QAAQ,CALlCU,gBAAY,EACZC,eAAW,EACXC,gBAAY,KAG6CxB,IAAWT,KACpE,EAAEkC,EAAaC,KAAW,CACtBD,EACAG,EAA6BF,MAI9B,OAAAf,OAAOgB,YAAYN,EAAc,EAG/BY,EAA0B,EACnCV,UAAAA,EACAD,WAAAA,EACAE,WAAAA,MAEO,IACCD,GAAa,CAAEA,UAAAA,MACfD,GAAc,CAAEA,WAAAA,MAChBE,GAAc,CAAEA,WAAAA"}
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, type CookieConsentProviderProps, } from './CookieConsentContext.js';
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';