@washingtonpost/subs-de-inputs 1.1.2-react18.0 → 1.2.0-canary.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.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@washingtonpost/subs-sdk"),t=require("react"),o=require("@washingtonpost/wpds-ui-kit"),n=require("@washingtonpost/subs-hooks"),a=require("@washingtonpost/wpds-assets");const r={COLLECT:"COLLECT",DO_NOT_COLLECT:"DO_NOT_COLLECT"},i={EXPLICIT:"explicit",IMPLICIT:"implicit"},s=()=>(e.getCookie("OptanonAlertBoxClosed")||"").length>12,l=()=>{if("undefined"==typeof window)return!1;const{intl_region:t,country_code:o}=e.WPGeo();if("US"===o)return!!e.getCookie("wp_usp");const n=(()=>{const t=e.getCookie("OptanonConsent")||"";return!!t.includes("C0004%3A1")||!t.includes("C0004%3A0")&&null})();return"boolean"==typeof n&&s()?n:"EEA"===t},c=`${e.ENDPOINTS.base}/de/v1`,d={},u=async({fieldName:t})=>{if(d[t])return d[t];const o=[t];try{const n=new URL(`${c}/attributes`);n.searchParams.set("attributes",o.join(","));const a=await fetch(n.toString(),{credentials:"include",headers:e.JSON_HEADERS}),r=await a.json();if(a.ok&&r.status===e.ResponseStatus.SUCCESS){const e=r.attributes||[];return d[t]=e,e}return[]}catch(e){return console.debug(e),[]}},p=`${e.ENDPOINTS.base}/de/v1`,E=o.styled("select",{padding:"12px 16px 12px 6px",display:"flex",justifyContent:"space-between",width:"100%",backgroundColor:"$secondary",color:"$primary",fontFamily:"$meta",fontSize:"$100",fontWeight:"$light",lineHeight:"$125",paddingBlockRight:"$125",textOverflow:"ellipsis",position:"relative",borderColor:"transparent",borderRightWidth:"10px",borderRightColor:"transparent",appearance:"none","-webkit-appearance":"none","&:disabled":{backgroundColor:o.theme.colors.disabled,borderColor:o.theme.colors.disabled,color:o.theme.colors.onDisabled,cursor:"not-allowed"}}),f=o.styled("div",{width:"100%",maxWidth:"380px",borderRadius:"$012",borderColor:"$subtle",borderStyle:"solid",borderWidth:"1px",backgroundColor:"$secondary",position:"relative"}),w=o.styled("option",{fontFamily:"inherit",fontSize:"inherit",color:"inherit"}),_=({id:e,label:r,values:i,required:s=!1,defaultValue:l,onChange:c=(()=>{}),disabled:d=!1})=>{const[u,p]=t.useState(),{isMobileSize:_}=n.useWindowSize();t.useEffect((()=>{u&&c(u)}),[u]);const g=d?{disabled:!0}:{},S=u?{defaultValue:u}:l?{defaultValue:l}:{},b=e=>u?e===u?{selected:!0}:{}:e===l?{selected:!0}:{};return _?t.createElement(f,null,t.createElement(E,{id:"",required:s,onChange:e=>p(e.target.value),...g},t.createElement("label",null,r),t.createElement(w,{value:"",disabled:!0,selected:!0,style:{color:"#666666"}},r),i.map((e=>t.createElement(w,{value:e,key:e,...b(e)},e)))),t.createElement(o.Icon,{label:"",size:"100",fill:o.theme.colors.gray80,style:{pointerEvents:"none",position:"absolute",right:"10px",top:"50%",transform:"translateY(-50%)"}},t.createElement(a.ChevronDown,{style:{position:"absolute",right:"10px"}}))):t.createElement(o.Select.Root,{onValueChange:e=>p(e),required:s,...S,...g},t.createElement(o.Select.Trigger,{"data-test-id":`${e}-select-trigger`},t.createElement(o.Select.Label,null,r),t.createElement(o.Select.Value,null)),t.createElement(o.Select.Content,{css:{zIndex:o.theme.zIndices.page},"data-test-id":`${e}-select-content`},i.map((e=>t.createElement(o.Select.Item,{value:e,key:e},e)))))},g=`${e.ENDPOINTS.base}/de-utils/twpdeu.min.js`,S=o.styled("div",{boxSizing:"border-box",display:"flex",marginBottom:"$100",flexDirection:"column","& button":{padding:"1px 6px"},"& *":{boxSizing:"border-box"}}),b=`${"https://subscribe.washingtonpost.com"===e.ENDPOINTS.base?"https://www.washingtonpost.com/subscribe":e.ENDPOINTS.base}/config/de/disclosure.json`;exports.AttributesState={SUCCESS:"100"},exports.CollectionBehaviors=r,exports.DEDisclosure=({onFinished:o=(()=>{}),allowCookieStore:n=!0,onPrivacyPolicyClick:a=(e=>{})})=>{const[r,i]=t.useState(null),[l,c]=t.useState(null),[d,u]=t.useState(),{alertBoxClosed:p}=(({allowCookieStore:o})=>{const[n,a]=t.useState(),[r,i]=t.useState(!1),[l,c]=t.useState(!1);return t.useEffect((()=>{var e;s()?a(!0):(window.__tcfapi||console.warn("warning: __tcfapi not found"),null!==(e=window)&&void 0!==e&&e.cookieStore&&o?i(!0):window.__tcfapi?c(!0):console.warn("warning: neither cookieStore nor __tcfapi found"))}),[]),t.useEffect((()=>{let t=()=>{};return r&&window.cookieStore&&(t=e.listenToCookieStore("OptanonAlertBoxClosed",(()=>{s()?a(!0):a(!1)}))),t||(()=>{})}),[r]),t.useEffect((()=>{let e;return l&&window.__tcfapi&&window.__tcfapi("addEventListener",2,((t,o)=>{o&&(e=t.listenerId,s()&&a(!0))})),()=>{window.__tcfapi&&e&&window.__tcfapi("removeEventListener",2,(e=>{console.debug(e)}),e)}}),[l]),{alertBoxClosed:n,listenToCookieStore:r,listenToTcfApi:l}})({allowCookieStore:n});return t.useEffect((()=>{(async()=>{const t=await(async()=>{let t;const o=await fetch(b),n=await o.json(),{country_code:a,intl_region:r}=e.WPGeo();return Object.keys(n).forEach((e=>{(a&&e.split("|").includes(a.toLowerCase())||"EEA"===r&&"eea"===e)&&(t=n[e])})),void 0===t&&n._&&(t=n._),t})();u(t),t||console.error("No config found")})()}),[]),t.useEffect((()=>{d&&("checkBannerStatus"in d&&d.checkBannerStatus?i(p?d.disclosure_afterbanner:d.disclosure_beforebanner):"disclosure"in d?i(d.disclosure):console.error("Invalid config"))}),[d,p]),t.useEffect((()=>{r&&Array.isArray(r)&&(c(r.reduce(((e,o)=>t.createElement(t.Fragment,null,e,t.createElement("p",null,((e,o=(()=>{}))=>e.split(/({{PRIVACY_POLICY}})/g).map(((e,n)=>"{{PRIVACY_POLICY}}"===e?t.createElement("a",{key:`privacy-link-${n}`,rel:"noopener noreferrer",target:"_blank",style:{color:"inherit"},className:"underline",href:"https://www.washingtonpost.com/privacy-policy/",onClick:e=>o(e)},"Privacy Policy"):e)).reduce(((e,o)=>t.createElement(t.Fragment,null,e,o)),t.createElement(t.Fragment,null)))(o,a)))),t.createElement(t.Fragment,null))),o({isFinished:!0,isError:!1}))}),[r]),null===r?t.createElement("div",{"data-test-id":"de-disclosure-loading"}):t.createElement("div",{"data-test-id":"de-disclosure"},l)},exports.DESelect=({source:a,fieldName:r,label:i,dataDictionaryConfig:s,defaultValue:l,disabled:c,submit:d,onChange:u=(()=>{}),onFinished:p=(()=>{}),valuesFilter:E=(()=>!0),children:f})=>{const[w,b]=t.useState(s),[m,h]=t.useState(""),C=n.useScript(g);t.useEffect((()=>{C!==n.ScriptStatus.READY||f||w||(async()=>{try{var e;const t=await(null===(e=window)||void 0===e||null===(e=e.__twpdeu)||void 0===e?void 0:e.getFieldConfigs({fieldName:r}));t?b(t[0]):console.error("unable to get config",r)}catch(e){console.warn("unable to get config",r,e)}})()}),[C]),t.useEffect((()=>{C===n.ScriptStatus.READY&&d&&m&&(async()=>{try{var t;const o=await(null===(t=window)||void 0===t||null===(t=t.__twpdeu)||void 0===t?void 0:t.push({submitData:{fieldName:r,value:m},source:a}));p({isFinished:!0,isError:!0!==o&&(!o||o.status!==e.ResponseStatus.SUCCESS)})}catch(e){p({isFinished:!1,isError:!0})}})()}),[C,d]);const I=l&&w?{defaultValue:l}:{},y=c||!f&&!w?{disabled:!0}:{},N=w?[...w.values].sort(((e,t)=>e.order-t.order)).filter((e=>!0!==e.archived)).filter(E):[];return t.createElement(S,null,f&&t.createElement(o.Select.Root,{onValueChange:e=>{h(e),u({value:e})},...I,...y},f),!f&&!w&&t.createElement(_,{id:"loading",label:"Loading...",values:[],disabled:!0}),!f&&w&&t.createElement(_,{id:w.name,label:i||w.name,onChange:e=>{h(e),u({value:e})},values:N.map((e=>e.name)),defaultValue:l,disabled:c}))},exports.FirstPartyIngestDataTypes={JOB_LEVEL:"profile_job_level",JOB_INDUSTRY:"profile_job_industry",PERSONAL_GOALS:"personal_goals",HOBBIES:"hobbies",PROFESSIONAL_GOALS:"professional_goals",INDUSTRY:"industry",NEWS_LOCATION:"news_location",NY_PERSONAL_GOALS:"new_year_personal_goals",NY_HOBBIES:"new_year_hobbies",NY_PROFESSIONAL_GOALS:"new_year_professional_goals",NY_INDUSTRY:"new_year_industry",NY_NEWS_LOCATION:"new_year_news_location"},exports.IngestResponseState={SUCCESS:"100",SYSTEM_ERROR:"101",INVALID_TYPE:"102",INVALID_IDENTIFIER:"103",INVALID_DATA:"104",INVALID_ATTRIBUTE_DEFINITION:"105",INVALID_META_DEFINITION:"106",UNAUTHENTICATED:"107",MISMATCHED_IDENTIFIER:"108",DISABLED_ATTRIBUTE_DEFINITION:"109",DO_NOT_COLLECT:"110"},exports.IngestType=i,exports.getAttributes=u,exports.hasRequiredPrivacyCookies=l,exports.push=async({submitData:t,source:o})=>{if(!l())throw new Error("does not satisfy cookie check");if("undefined"!=typeof window&&e.getCookie("wp_wv")&&!e.isLoggedIn())throw new Error("does not satisfy cookie check");const{fieldName:n}=t,a=await u({fieldName:n});if(a[0]&&a[0].name===n&&a[0].collection_behavior===r.DO_NOT_COLLECT)throw new Error("do not collect");return(a[0]&&!0===a[0].explicit?i.EXPLICIT:i.IMPLICIT)===i.EXPLICIT?(async({submitData:{fieldName:t,value:o},source:n})=>{const a=`${p}/ingest`,r=e.getCookie("wapo_login_id"),s={jucid:localStorage.getItem("uuid"),ga:e.getCookie("_ga"),type:i.EXPLICIT,wapo_login_id:r,data:{[t]:[o]},metadata:{source:n}};try{const t=await fetch(a,{method:"POST",credentials:"include",headers:e.JSON_HEADERS,body:JSON.stringify(s)});return await t.json()}catch(e){return console.debug(e),null}})({submitData:t,source:o}):(async({submitData:{fieldName:e,value:t},source:o})=>((e=>{if("undefined"==typeof window)return;window.dataLayer=window.dataLayer||[];const t={...e};window.dataLayer.push(t)})({event:"site-onpage-click",action:"site-onpage-click",category:"profile",label:e,"de-label":e,[e]:t,section:"profile",subsection:o}),!0))({submitData:t,source:o})};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@washingtonpost/subs-sdk"),t=require("react"),o=require("@washingtonpost/wpds-ui-kit"),n=require("@washingtonpost/subs-hooks"),i=require("@washingtonpost/wpds-assets");const r={COLLECT:"COLLECT",DO_NOT_COLLECT:"DO_NOT_COLLECT"},a={EXPLICIT:"explicit",IMPLICIT:"implicit"},s=()=>(e.getCookie("OptanonAlertBoxClosed")||"").length>12,l=()=>{if("undefined"==typeof window)return!1;const{intl_region:t,country_code:o}=e.WPGeo();if("US"===o)return!!e.getCookie("wp_usp");const n=(()=>{const t=e.getCookie("OptanonConsent")||"";return!!t.includes("C0004%3A1")||!t.includes("C0004%3A0")&&null})();return"boolean"==typeof n&&s()?n:"EEA"===t},c=`${e.ENDPOINTS.base}/de/v1`,d={},u=async({fieldName:t})=>{if(d[t])return d[t];const o=[t];try{const n=new URL(`${c}/attributes`);n.searchParams.set("attributes",o.join(","));const i=await fetch(n.toString(),{credentials:"include",headers:e.JSON_HEADERS}),r=await i.json();if(i.ok&&r.status===e.ResponseStatus.SUCCESS){const e=r.attributes||[];return d[t]=e,e}return[]}catch(e){return console.debug(e),[]}},p=`${e.ENDPOINTS.base}/de/v1`,E=o.styled("select",{padding:"12px 16px 12px 6px",display:"flex",justifyContent:"space-between",width:"100%",backgroundColor:"$secondary",color:"$primary",fontFamily:"$meta",fontSize:"$100",fontWeight:"$light",lineHeight:"$125",paddingBlockRight:"$125",textOverflow:"ellipsis",position:"relative",borderColor:"transparent",borderRightWidth:"10px",borderRightColor:"transparent",appearance:"none","-webkit-appearance":"none","&:disabled":{backgroundColor:o.theme.colors.disabled,borderColor:o.theme.colors.disabled,color:o.theme.colors.onDisabled,cursor:"not-allowed"}}),f=o.styled("div",{width:"100%",maxWidth:"380px",borderRadius:"$012",borderColor:"$subtle",borderStyle:"solid",borderWidth:"1px",backgroundColor:"$secondary",position:"relative"}),g=o.styled("option",{fontFamily:"inherit",fontSize:"inherit",color:"inherit"}),w=({id:e,label:r,values:a,required:s=!1,defaultValue:l,onChange:c=(()=>{}),disabled:d=!1})=>{const[u,p]=t.useState(),{isMobileSize:w}=n.useWindowSize();t.useEffect((()=>{u&&c(u)}),[u]);const S=d?{disabled:!0}:{},_=u?{defaultValue:u}:l?{defaultValue:l}:{},b=e=>u?e===u?{selected:!0}:{}:e===l?{selected:!0}:{};return w?t.createElement(f,null,t.createElement(E,{id:"",required:s,onChange:e=>p(e.target.value),...S},t.createElement("label",null,r),t.createElement(g,{value:"",disabled:!0,selected:!0,style:{color:"#666666"}},r),a.map((e=>t.createElement(g,{value:e,key:e,...b(e)},e)))),t.createElement(o.Icon,{label:"",size:"100",fill:o.theme.colors.gray80,style:{pointerEvents:"none",position:"absolute",right:"10px",top:"50%",transform:"translateY(-50%)"}},t.createElement(i.ChevronDown,{style:{position:"absolute",right:"10px"}}))):t.createElement(o.Select.Root,{onValueChange:e=>p(e),required:s,..._,...S},t.createElement(o.Select.Trigger,{"data-test-id":`${e}-select-trigger`},t.createElement(o.Select.Label,null,r),t.createElement(o.Select.Value,null)),t.createElement(o.Select.Content,{css:{zIndex:o.theme.zIndices.page},"data-test-id":`${e}-select-content`},a.map((e=>t.createElement(o.Select.Item,{value:e,key:e},e)))))},S=`${e.ENDPOINTS.base}/de-utils/twpdeu.min.js`,_=o.styled("div",{boxSizing:"border-box",display:"flex",marginBottom:"$100",flexDirection:"column","& button":{padding:"1px 6px"},"& *":{boxSizing:"border-box"}}),b=`${"https://subscribe.washingtonpost.com"===e.ENDPOINTS.base?"https://www.washingtonpost.com/subscribe":e.ENDPOINTS.base}/config/de/disclosure.json`,C=(e,o=(()=>{}))=>e.split(/({{PRIVACY_POLICY}})/g).map(((e,n)=>"{{PRIVACY_POLICY}}"===e?t.createElement("a",{key:`privacy-link-${n}`,rel:"noopener noreferrer",target:"_blank",style:{color:"inherit"},className:"underline",href:"https://www.washingtonpost.com/privacy-policy/",onClick:e=>o(e)},"Privacy Policy"):e)).reduce(((e,o)=>t.createElement(t.Fragment,null,e,o)),t.createElement(t.Fragment,null)),h=()=>(e.getCookie("OptanonConsent")||"").length>12,m=({config:o,onFinished:n,allowCookieStore:i=!0,onPrivacyPolicyClick:r=(()=>{})})=>{const[a,l]=t.useState(null),[c,d]=t.useState(null),{alertBoxClosed:u,consentCookieExists:p}=(({allowCookieStore:o})=>{const[n,i]=t.useState(),[r,a]=t.useState(),[l,c]=t.useState(!1),[d,u]=t.useState(!1);return t.useEffect((()=>{var e;h()&&i(!0),s()?a(!0):(window.__tcfapi||console.warn("warning: __tcfapi not found"),null!==(e=window)&&void 0!==e&&e.cookieStore&&o?c(!0):window.__tcfapi?u(!0):console.warn("warning: neither cookieStore nor __tcfapi found"))}),[]),t.useEffect((()=>{let t=[];if(l&&window.cookieStore){const o=e.listenToCookieStore("OptanonConsent",(()=>{h()&&i(!0)}));t.push(o);const n=e.listenToCookieStore("OptanonAlertBoxClosed",(()=>{s()?a(!0):a(!1)}));t.push(n)}return()=>{t.forEach((e=>e&&e()))}}),[l]),t.useEffect((()=>{let e;return d&&window.__tcfapi&&window.__tcfapi("addEventListener",2,((t,o)=>{o&&(e=t.listenerId,h()&&i(!0),s()&&a(!0))})),()=>{window.__tcfapi&&e&&window.__tcfapi("removeEventListener",2,(e=>{console.debug(e)}),e)}}),[d]),{consentCookieExists:n,alertBoxClosed:r,listenToCookieStore:l,listenToTcfApi:d}})({allowCookieStore:i});return t.useEffect((()=>{o&&l(u?o.disclosure_afterbanner:o.disclosure_beforebanner)}),[u]),t.useEffect((()=>{a&&Array.isArray(a)&&d(a.reduce(((e,o)=>t.createElement(t.Fragment,null,e,t.createElement("p",null,C(o,r)))),t.createElement(t.Fragment,null)))}),[a]),t.useEffect((()=>{c&&p&&n({isFinished:!0,isError:!1})}),[c,p]),c},y=({config:e,onFinished:o,onPrivacyPolicyClick:n=(()=>{})})=>{const[i,r]=t.useState(null),[a,s]=t.useState(null);return t.useEffect((()=>{e&&r(e.disclosure)}),[e]),t.useEffect((()=>{i&&Array.isArray(i)&&s(i.reduce(((e,o)=>t.createElement(t.Fragment,null,e,t.createElement("p",null,C(o,n)))),t.createElement(t.Fragment,null)))}),[i]),t.useEffect((()=>{a&&o({isFinished:!0,isError:!1})}),[a]),a};exports.AttributesState={SUCCESS:"100"},exports.CollectionBehaviors=r,exports.DEDisclosure=({onFinished:o=(()=>{}),allowCookieStore:n=!0,onPrivacyPolicyClick:i=(e=>{})})=>{const[r,a]=t.useState(null),[s,l]=t.useState();return t.useEffect((()=>{(async()=>{const t=await(async()=>{let t;const o=await fetch(b),n=await o.json(),{country_code:i,intl_region:r}=e.WPGeo();return Object.keys(n).forEach((e=>{(i&&e.split("|").includes(i.toLowerCase())||"EEA"===r&&"eea"===e)&&(t=n[e])})),void 0===t&&n._&&(t=n._),t})();l(t),t||console.error("No config found")})()}),[]),t.useEffect((()=>{s&&("checkBannerStatus"in s&&s.checkBannerStatus?a(t.createElement(m,{config:s,allowCookieStore:n,onFinished:o,onPrivacyPolicyClick:i})):"disclosure"in s?a(t.createElement(y,{config:s,onFinished:o,onPrivacyPolicyClick:i})):console.error("Invalid config"))}),[s]),r?t.createElement("div",{"data-test-id":"de-disclosure"},r):t.createElement("div",{"data-test-id":"de-disclosure-loading"})},exports.DESelect=({source:i,fieldName:r,label:a,dataDictionaryConfig:s,defaultValue:l,disabled:c,submit:d,onChange:u=(()=>{}),onFinished:p=(()=>{}),valuesFilter:E=(()=>!0),children:f})=>{const[g,b]=t.useState(s),[C,h]=t.useState(""),m=n.useScript(S);t.useEffect((()=>{m!==n.ScriptStatus.READY||f||g||(async()=>{try{var e;const t=await(null===(e=window)||void 0===e||null===(e=e.__twpdeu)||void 0===e?void 0:e.getFieldConfigs({fieldName:r}));t?b(t[0]):console.error("unable to get config",r)}catch(e){console.warn("unable to get config",r,e)}})()}),[m]),t.useEffect((()=>{m===n.ScriptStatus.READY&&d&&C&&(async()=>{try{var t;const o=await(null===(t=window)||void 0===t||null===(t=t.__twpdeu)||void 0===t?void 0:t.push({submitData:{fieldName:r,value:C},source:i}));p({isFinished:!0,isError:!0!==o&&(!o||o.status!==e.ResponseStatus.SUCCESS)})}catch(e){p({isFinished:!1,isError:!0})}})()}),[m,d]);const y=l&&g?{defaultValue:l}:{},I=c||!f&&!g?{disabled:!0}:{},N=g?[...g.values].sort(((e,t)=>e.order-t.order)).filter((e=>!0!==e.archived)).filter(E):[];return t.createElement(_,null,f&&t.createElement(o.Select.Root,{onValueChange:e=>{h(e),u({value:e})},...y,...I},f),!f&&!g&&t.createElement(w,{id:"loading",label:"Loading...",values:[],disabled:!0}),!f&&g&&t.createElement(w,{id:g.name,label:a||g.name,onChange:e=>{h(e),u({value:e})},values:N.map((e=>e.name)),defaultValue:l,disabled:c}))},exports.FirstPartyIngestDataTypes={JOB_LEVEL:"profile_job_level",JOB_INDUSTRY:"profile_job_industry",PERSONAL_GOALS:"personal_goals",HOBBIES:"hobbies",PROFESSIONAL_GOALS:"professional_goals",INDUSTRY:"industry",NEWS_LOCATION:"news_location",NY_PERSONAL_GOALS:"new_year_personal_goals",NY_HOBBIES:"new_year_hobbies",NY_PROFESSIONAL_GOALS:"new_year_professional_goals",NY_INDUSTRY:"new_year_industry",NY_NEWS_LOCATION:"new_year_news_location"},exports.IngestResponseState={SUCCESS:"100",SYSTEM_ERROR:"101",INVALID_TYPE:"102",INVALID_IDENTIFIER:"103",INVALID_DATA:"104",INVALID_ATTRIBUTE_DEFINITION:"105",INVALID_META_DEFINITION:"106",UNAUTHENTICATED:"107",MISMATCHED_IDENTIFIER:"108",DISABLED_ATTRIBUTE_DEFINITION:"109",DO_NOT_COLLECT:"110"},exports.IngestType=a,exports.getAttributes=u,exports.hasRequiredPrivacyCookies=l,exports.push=async({submitData:t,source:o})=>{if(!l())throw new Error("does not satisfy cookie check");if("undefined"!=typeof window&&e.getCookie("wp_wv")&&!e.isLoggedIn())throw new Error("does not satisfy cookie check");const{fieldName:n}=t,i=await u({fieldName:n});if(i[0]&&i[0].name===n&&i[0].collection_behavior===r.DO_NOT_COLLECT)throw new Error("do not collect");return(i[0]&&!0===i[0].explicit?a.EXPLICIT:a.IMPLICIT)===a.EXPLICIT?(async({submitData:{fieldName:t,value:o},source:n})=>{const i=`${p}/ingest`,r=e.getCookie("wapo_login_id"),s={jucid:localStorage.getItem("uuid"),ga:e.getCookie("_ga"),type:a.EXPLICIT,wapo_login_id:r,data:{[t]:[o]},metadata:{source:n}};try{const t=await fetch(i,{method:"POST",credentials:"include",headers:e.JSON_HEADERS,body:JSON.stringify(s)});return await t.json()}catch(e){return console.debug(e),null}})({submitData:t,source:o}):(async({submitData:{fieldName:e,value:t},source:o})=>((e=>{if("undefined"==typeof window)return;window.dataLayer=window.dataLayer||[];const t={...e};window.dataLayer.push(t)})({event:"site-onpage-click",action:"site-onpage-click",category:"profile",label:e,"de-label":e,[e]:t,section:"profile",subsection:o}),!0))({submitData:t,source:o})};
2
2
  //# sourceMappingURL=subs-de-inputs.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subs-de-inputs.cjs.production.min.js","sources":["../src/interfaces/index.ts","../src/components/DEDisclosure/utils/checkCookie.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/utils/checkConsentCookieForAllowTargeting.ts","../src/services/getAttributes.ts","../src/services/ingest.ts","../src/components/DESelect/Dropdown.tsx","../src/components/DESelect/index.tsx","../src/components/DEDisclosure/utils/getConfig.ts","../src/components/DEDisclosure/index.tsx","../src/components/DEDisclosure/hooks/useOnetrustAlertBoxClosedPromise.ts","../src/components/DEDisclosure/utils/hydrateLinks.tsx","../src/constants/IngestDataTypes.ts","../src/utils/push.ts","../src/utils/isAnonymousWebview.ts","../src/services/sendToGA.ts"],"sourcesContent":["export type AttributeValue = {\n name: string;\n date_created: Number;\n last_modified_date: Number;\n archived: boolean;\n order: number;\n};\n\nexport const CollectionBehaviors = {\n COLLECT: 'COLLECT',\n DO_NOT_COLLECT: 'DO_NOT_COLLECT',\n} as const;\n\nexport type Attribute = {\n name: string;\n approved_for_use?: boolean;\n collection_behavior?: (typeof CollectionBehaviors)[keyof typeof CollectionBehaviors];\n datatype: string;\n explicit: boolean;\n multiple_value: boolean;\n last_modified_date: Number;\n date_created: Number;\n values: AttributeValue[] | Readonly<AttributeValue[]>;\n};\n\nexport const AttributesState = {\n SUCCESS: '100',\n} as const;\n\nexport const IngestType = {\n EXPLICIT: 'explicit',\n IMPLICIT: 'implicit',\n} as const;\n\nexport const IngestResponseState = {\n SUCCESS: '100',\n SYSTEM_ERROR: '101',\n INVALID_TYPE: '102',\n INVALID_IDENTIFIER: '103',\n INVALID_DATA: '104',\n INVALID_ATTRIBUTE_DEFINITION: '105',\n INVALID_META_DEFINITION: '106',\n UNAUTHENTICATED: '107',\n MISMATCHED_IDENTIFIER: '108',\n DISABLED_ATTRIBUTE_DEFINITION: '109',\n DO_NOT_COLLECT: '110',\n} as const;\n","import { getCookie } from '@washingtonpost/subs-sdk';\n\nconst COOKIE = 'OptanonAlertBoxClosed';\n\nexport const checkCookie = () => {\n const value = getCookie(COOKIE) || '';\n // Wed May 15 2024 06:29:23 GMT-0500 (Central Daylight Time)\n // \"Invalid date\" is 12 characters long\n return value.length > 12;\n};\n","import { WPGeo, getCookie } from '@washingtonpost/subs-sdk';\nimport { checkConsentCookieForAllowTargeting } from './checkConsentCookieForAllowTargeting';\nimport { checkCookie } from '../components/DEDisclosure/utils/checkCookie';\n\n/**\n * Checks privacy cookies to decide if we can send up 1pd\n * If US, checks that wp_usp exists\n * Else If OptAnonConsent cookie exists, checks the value of targeting cookies consent\n * Else If EEA, always returns true\n * Else, returns false\n * @returns {boolean}\n */\nexport const hasRequiredPrivacyCookies = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const { intl_region, country_code: countryCode } = WPGeo();\n\n if (countryCode === 'US') {\n return !!getCookie('wp_usp');\n }\n\n const gdprAllowTargarting = checkConsentCookieForAllowTargeting();\n if (typeof gdprAllowTargarting === 'boolean' && checkCookie()) {\n return gdprAllowTargarting;\n }\n\n // Downstream systems\n if (intl_region === 'EEA') {\n return true;\n }\n\n return false;\n};\n","import { getCookie } from '@washingtonpost/subs-sdk';\n\nconst COOKIE = 'OptanonConsent';\n\n/**\n * Checks the users OptanonConsent cookie to determine if the user has allowed targeting.\n * Returns true or false if the flag is found in the cookie, null otherwise.\n * @returns {boolean | null}\n */\nexport const checkConsentCookieForAllowTargeting = () => {\n const value = getCookie(COOKIE) || '';\n return value.includes('C0004%3A1')\n ? true\n : value.includes('C0004%3A0')\n ? false\n : null;\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n} from '@washingtonpost/subs-sdk';\nimport { Attribute } from '../interfaces';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nconst attributesCache: Record<string, any> = {};\nexport const getAttributes: GetAttributesType = async ({\n fieldName,\n}: {\n fieldName: string;\n}) => {\n if (attributesCache[fieldName]) {\n return attributesCache[fieldName];\n }\n\n const fieldNames = [fieldName];\n\n try {\n const url = new URL(`${base}/attributes`);\n url.searchParams.set('attributes', fieldNames.join(','));\n\n const data = await fetch(url.toString(), {\n credentials: 'include',\n headers: JSON_HEADERS,\n });\n const json = await data.json();\n\n if (data.ok && json.status === ResponseStatus.SUCCESS) {\n const attributes = json.attributes || [];\n attributesCache[fieldName] = attributes;\n return attributes;\n } else {\n return [];\n }\n } catch (e) {\n console.debug(e);\n return [];\n }\n};\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\n","import {\n ENDPOINTS,\n JSON_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport type { ResponseStatusType } from '@washingtonpost/subs-sdk';\nimport { IngestResponseState, IngestType } from '../interfaces';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nexport const ingest: IngestType = async ({\n submitData: { fieldName, value },\n source,\n}) => {\n const url = `${base}/ingest`;\n\n const wapo_login_id = getCookie('wapo_login_id');\n\n const jucid = localStorage.getItem('uuid');\n const ga = getCookie('_ga');\n\n const payload = {\n jucid,\n ga,\n type: IngestType.EXPLICIT,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n [fieldName]: [value],\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n source: string;\n}) => Promise<{\n status: ResponseStatusType;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n} | null>;\n","import React, { useEffect, useState } from 'react';\nimport { Icon, Select, styled, theme } from '@washingtonpost/wpds-ui-kit';\nimport { useWindowSize } from '@washingtonpost/subs-hooks';\nimport { ChevronDown } from '@washingtonpost/wpds-assets';\n\ninterface IDropdownProps {\n id: string;\n label: string;\n values: Array<string>;\n required?: boolean;\n defaultValue?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n}\n\nconst StyledMobileSelect = styled('select', {\n padding: '12px 16px 12px 6px',\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n backgroundColor: '$secondary',\n color: '$primary',\n fontFamily: '$meta',\n fontSize: '$100',\n fontWeight: '$light',\n lineHeight: '$125',\n paddingBlockRight: '$125',\n textOverflow: 'ellipsis',\n position: 'relative',\n borderColor: 'transparent',\n borderRightWidth: '10px',\n borderRightColor: 'transparent',\n appearance: 'none',\n '-webkit-appearance': 'none',\n '&:disabled': {\n backgroundColor: theme.colors.disabled,\n borderColor: theme.colors.disabled,\n color: theme.colors.onDisabled,\n cursor: 'not-allowed',\n },\n});\n\nconst StyledSelectWrapper = styled('div', {\n width: '100%',\n maxWidth: '380px',\n borderRadius: '$012',\n borderColor: '$subtle',\n borderStyle: 'solid',\n borderWidth: '1px',\n backgroundColor: '$secondary',\n position: 'relative',\n});\n\nconst StyledMobileOption = styled('option', {\n fontFamily: 'inherit',\n fontSize: 'inherit',\n color: 'inherit',\n});\n\n/**\n * Dropdown component. Uses wpds-ui-kit on desktop and native select on mobile.\n * @param {IDropdownProps} props The props.\n * @returns {React.ReactElement} The dropdown.\n */\nexport const Dropdown = ({\n id,\n label,\n values,\n required = false,\n defaultValue,\n onChange = () => {},\n disabled = false,\n}: IDropdownProps) => {\n const [answer, setAnswer] = useState<string>();\n const { isMobileSize } = useWindowSize();\n\n useEffect(() => {\n if (answer) onChange(answer);\n }, [answer]);\n\n const disabledProp = disabled ? { disabled: true } : {};\n\n // helps maintain state between WPDS and native dropdowns\n const defaultValueProp = answer\n ? { defaultValue: answer }\n : defaultValue\n ? { defaultValue }\n : {};\n\n const defaultValuePropMobile = (value: string) => {\n if (answer) {\n return value === answer ? { selected: true } : {};\n }\n return value === defaultValue ? { selected: true } : {};\n };\n\n return isMobileSize ? (\n <StyledSelectWrapper>\n <StyledMobileSelect\n id=\"\"\n required={required}\n onChange={(e) => setAnswer(e.target.value)}\n {...disabledProp}\n >\n <label>{label}</label>\n <StyledMobileOption\n value=\"\"\n disabled\n selected\n style={{ color: '#666666' }}\n >\n {label}\n </StyledMobileOption>\n {values.map((value) => (\n <StyledMobileOption\n value={value}\n key={value}\n {...defaultValuePropMobile(value)}\n >\n {value}\n </StyledMobileOption>\n ))}\n </StyledMobileSelect>\n <Icon\n label=\"\"\n size=\"100\"\n fill={theme.colors.gray80}\n style={{\n pointerEvents: 'none',\n position: 'absolute',\n right: '10px',\n top: '50%',\n transform: 'translateY(-50%)',\n }}\n >\n <ChevronDown style={{ position: 'absolute', right: '10px' }} />\n </Icon>\n </StyledSelectWrapper>\n ) : (\n <Select.Root\n onValueChange={(e) => setAnswer(e)}\n required={required}\n {...defaultValueProp}\n {...disabledProp}\n >\n <Select.Trigger data-test-id={`${id}-select-trigger`}>\n <Select.Label>{label}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n <Select.Content\n css={{ zIndex: theme.zIndices.page }}\n data-test-id={`${id}-select-content`}\n >\n {values.map((value) => (\n <Select.Item value={value} key={value}>\n {value}\n </Select.Item>\n ))}\n </Select.Content>\n </Select.Root>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { Select, styled } from '@washingtonpost/wpds-ui-kit';\nimport { ENDPOINTS, ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';\nimport { Attribute, AttributeValue } from '../../interfaces';\nimport { Dropdown } from './Dropdown';\n\ninterface DESelectProps {\n source: string;\n fieldName: string;\n label?: string;\n dataDictionaryConfig?: Attribute | Readonly<Attribute>;\n defaultValue?: string;\n disabled?: boolean;\n submit: boolean;\n onChange?: ({ value }: { value: string }) => void;\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n valuesFilter?: (value: AttributeValue) => boolean;\n selectProps?: {\n root?: any;\n trigger?: any;\n label?: any;\n value?: any;\n content?: any;\n item?: any;\n };\n children?: React.ReactNode;\n}\n\nconst scriptSrc = `${ENDPOINTS.base}/de-utils/twpdeu.min.js`;\n\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n defaultValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState('');\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n const config = await window?.__twpdeu?.getFieldConfigs({ fieldName });\n if (config) {\n setConfig(config[0]);\n } else {\n console.error('unable to get config', fieldName);\n }\n } catch (e) {\n console.warn('unable to get config', fieldName, e);\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && !(children || config)) {\n fetchConfig();\n }\n }, [scriptStatus]);\n\n useEffect(() => {\n const submitSelected = async () => {\n try {\n const result = await window?.__twpdeu?.push({\n submitData: { fieldName, value: selected },\n source,\n });\n\n const isError =\n result === true\n ? false\n : result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n } catch (e) {\n onFinished({\n isFinished: false,\n isError: true,\n });\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && submit && selected) {\n submitSelected();\n }\n }, [scriptStatus, submit]);\n\n const defaultValueProp = defaultValue && config ? { defaultValue } : {};\n\n const isLoading = !(children || config);\n\n const disabledProp = disabled || isLoading ? { disabled: true } : {};\n\n // sort and filter out archived values\n // Note: config.values may be readonly\n const values = config\n ? [...config.values]\n .sort((a, b) => a.order - b.order)\n .filter((value) => value.archived !== true)\n .filter(valuesFilter)\n : [];\n\n return (\n <SelectWrapper>\n {children && (\n <Select.Root\n onValueChange={(e) => {\n setSelected(e);\n onChange({ value: e });\n }}\n {...defaultValueProp}\n {...disabledProp}\n >\n {children}\n </Select.Root>\n )}\n {!children && !config && (\n <Dropdown\n id={'loading'}\n label={'Loading...'}\n values={[]}\n disabled={true}\n />\n )}\n {!children && config && (\n <Dropdown\n id={config.name}\n label={label || config.name}\n onChange={(e) => {\n setSelected(e);\n onChange({ value: e });\n }}\n values={values.map((value) => value.name)}\n defaultValue={defaultValue}\n disabled={disabled}\n />\n )}\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled('div', {\n boxSizing: 'border-box',\n display: 'flex',\n marginBottom: '$100',\n flexDirection: 'column',\n '& button': {\n padding: '1px 6px',\n },\n '& *': { boxSizing: 'border-box' },\n});\n","import { ENDPOINTS, WPGeo } from '@washingtonpost/subs-sdk';\nimport {\n DisclosureConfig,\n DisclosureConfigValue,\n} from '../../../interfaces/disclosure';\n\nconst configSrc = `${\n ENDPOINTS.base === 'https://subscribe.washingtonpost.com'\n ? 'https://www.washingtonpost.com/subscribe'\n : ENDPOINTS.base\n}/config/de/disclosure.json`;\n\nexport const getConfig = async () => {\n let myConfig: DisclosureConfigValue | undefined = undefined;\n\n // step 1: fetch config\n const response = await fetch(configSrc);\n const remoteConfig: DisclosureConfig = await response.json();\n\n // step 2: figure out which part of the config to use\n\n // if country- or region-specific config found, use that\n const { country_code, intl_region } = WPGeo();\n Object.keys(remoteConfig).forEach((configKey) => {\n if (\n country_code &&\n configKey.split('|').includes(country_code.toLowerCase())\n ) {\n myConfig = remoteConfig[configKey];\n } else if (intl_region === 'EEA' && configKey === 'eea') {\n myConfig = remoteConfig[configKey];\n }\n });\n\n // TODO: Check for billing country also\n\n // else if no country-specific config, use the default config\n if (typeof myConfig === 'undefined' && remoteConfig['_']) {\n myConfig = remoteConfig['_'];\n }\n\n return myConfig;\n};\n","import React, { useState, useEffect, ReactEventHandler } from 'react';\nimport { DisclosureConfigValue } from '../../interfaces/disclosure';\nimport { getConfig } from './utils/getConfig';\nimport { hydrateLinks } from './utils/hydrateLinks';\nimport { useOneTrustAlertBoxClosed } from './hooks/useOnetrustAlertBoxClosedPromise';\n\ninterface DisclosureProps {\n /** callback function to be called when the disclosure is finished loading */\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n\n onPrivacyPolicyClick?: ReactEventHandler<HTMLAnchorElement>;\n\n /** ability to turn off cookiestore listener, primarily for testing purposes */\n allowCookieStore?: boolean;\n}\n\nexport const DEDisclosure: React.FC<DisclosureProps> = ({\n onFinished = () => {},\n allowCookieStore = true,\n onPrivacyPolicyClick = (_e) => {},\n}) => {\n const [disclosure, setDisclosure] = useState<string[] | null>(null);\n const [disclosureRendering, setDisclosureRendering] =\n useState<JSX.Element | null>(null);\n const [myConfig, setMyConfig] = useState<DisclosureConfigValue>();\n const { alertBoxClosed } = useOneTrustAlertBoxClosed({ allowCookieStore });\n\n useEffect(() => {\n (async () => {\n const config = await getConfig();\n setMyConfig(config);\n\n if (!config) {\n console.error('No config found');\n }\n })();\n }, []);\n\n useEffect(() => {\n if (myConfig) {\n // step 3: set disclosure based on config\n\n // if config says to check onetrust, check onetrust\n if ('checkBannerStatus' in myConfig && myConfig.checkBannerStatus) {\n // check if onetrust is closed\n // if it is, show the after banner disclosure\n // if it is not, show the before banner disclosure\n if (alertBoxClosed) {\n setDisclosure(myConfig.disclosure_afterbanner);\n } else {\n setDisclosure(myConfig.disclosure_beforebanner);\n }\n } else if ('disclosure' in myConfig) {\n setDisclosure(myConfig.disclosure);\n } else {\n console.error('Invalid config');\n }\n }\n }, [myConfig, alertBoxClosed]);\n\n useEffect(() => {\n if (disclosure && Array.isArray(disclosure)) {\n setDisclosureRendering(\n disclosure.reduce((prev, current) => (\n <>\n {prev}\n <p>{hydrateLinks(current, onPrivacyPolicyClick)}</p>\n </>\n ), <></>)\n );\n\n // Is it ok to fire `onFinished` if still waiting for onetrust to load on the page?\n onFinished({\n isFinished: true,\n isError: false,\n });\n }\n }, [disclosure]);\n\n return disclosure === null ? (\n <div data-test-id=\"de-disclosure-loading\"></div>\n ) : (\n <div data-test-id=\"de-disclosure\">{disclosureRendering}</div>\n );\n};\n","import { useState, useEffect } from 'react';\nimport {\n listenToCookieStore as listenToCookieStoreUtil,\n ICookieStore,\n} from '@washingtonpost/subs-sdk';\nimport { checkCookie } from '../utils/checkCookie';\n\nconst COOKIE = 'OptanonAlertBoxClosed';\n\ninterface TCData {\n eventStatus: 'tcloaded' | 'cmpuishown' | 'useractioncomplete';\n listenerId: number;\n [key: string]: any;\n}\n\ntype TCFAPIAddListener = (\n command: 'addEventListener',\n version: number,\n callback: (tcData: TCData, success: boolean) => void\n) => void;\n\ntype TCFAPIRmListener = (\n command: 'removeEventListener',\n version: number,\n callback: (success: boolean) => void,\n listenerId: number\n) => void;\n\ntype TCFAPIPing = (\n command: 'ping',\n version: number,\n callback: (pingReturn: any, success: boolean) => void\n) => void;\n\ndeclare global {\n interface Window {\n cookieStore?: ICookieStore;\n __tcfapi?: TCFAPIAddListener & TCFAPIRmListener & TCFAPIPing;\n }\n}\n\nexport const useOneTrustAlertBoxClosed = ({\n allowCookieStore,\n}: {\n allowCookieStore: boolean;\n}) => {\n const [alertBoxClosed, setAlertBoxClosed] = useState<boolean | undefined>();\n\n const [listenToCookieStore, setListenToCookieStore] = useState(false);\n const [listenToTcfApi, setListenToTcfApi] = useState(false);\n\n useEffect(() => {\n if (checkCookie()) {\n setAlertBoxClosed(true);\n return;\n }\n\n if (!window.__tcfapi) {\n console.warn('warning: __tcfapi not found');\n }\n\n if (window?.cookieStore && allowCookieStore) {\n setListenToCookieStore(true);\n } else if (window.__tcfapi) {\n setListenToTcfApi(true);\n } else {\n console.warn('warning: neither cookieStore nor __tcfapi found');\n }\n }, []);\n\n useEffect(() => {\n let cleanupFn: (() => void) | null = () => {};\n if (listenToCookieStore && window.cookieStore) {\n cleanupFn = listenToCookieStoreUtil(COOKIE, () => {\n if (checkCookie()) {\n setAlertBoxClosed(true);\n } else {\n setAlertBoxClosed(false);\n }\n });\n }\n return cleanupFn || (() => {});\n }, [listenToCookieStore]);\n\n useEffect(() => {\n let listenerId: number;\n if (listenToTcfApi && window.__tcfapi) {\n const callback = (_tcData: TCData, success: boolean) => {\n if (success) {\n listenerId = _tcData.listenerId;\n\n // tcData.eventStatus can be:\n // tcloaded means user has made a choice and we’re ready to check it\n // cmpuishown means the banner is shown\n // useractioncomplete means the user has interacted with the banner\n\n // but actually if the result for any of these is true, we just use the value of the cookie\n if (checkCookie()) {\n setAlertBoxClosed(true);\n }\n }\n };\n\n window.__tcfapi('addEventListener', 2, callback);\n }\n\n // cleanup fn\n return () => {\n if (window.__tcfapi && listenerId)\n window.__tcfapi(\n 'removeEventListener',\n 2,\n (success) => {\n console.debug(success);\n },\n listenerId\n );\n };\n }, [listenToTcfApi]);\n\n return { alertBoxClosed, listenToCookieStore, listenToTcfApi };\n};\n","import React from 'react';\n\ntype hydrateLinksType = (\n str: string,\n onLinkClick: (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => void\n) => string | JSX.Element;\n\nexport const hydrateLinks: hydrateLinksType = (str, onLinkClick = () => {}) => {\n const array = str.split(/({{PRIVACY_POLICY}})/g);\n const chunks = array.map((str, i) => {\n if (str === '{{PRIVACY_POLICY}}') {\n return (\n <a\n key={`privacy-link-${i}`}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n style={{ color: 'inherit' }}\n className=\"underline\"\n href=\"https://www.washingtonpost.com/privacy-policy/\"\n onClick={(e) => onLinkClick(e)}\n >\n Privacy Policy\n </a>\n );\n }\n return str;\n });\n\n const toReturn = chunks.reduce(\n (prev, current) => (\n <>\n {prev}\n {current}\n </>\n ),\n <></>\n );\n\n return toReturn;\n};\n","export const FirstPartyIngestDataTypes = {\n JOB_LEVEL: 'profile_job_level',\n JOB_INDUSTRY: 'profile_job_industry',\n PERSONAL_GOALS: 'personal_goals',\n HOBBIES: 'hobbies',\n PROFESSIONAL_GOALS: 'professional_goals',\n INDUSTRY: 'industry',\n NEWS_LOCATION: 'news_location',\n NY_PERSONAL_GOALS: 'new_year_personal_goals',\n NY_HOBBIES: 'new_year_hobbies',\n NY_PROFESSIONAL_GOALS: 'new_year_professional_goals',\n NY_INDUSTRY: 'new_year_industry',\n NY_NEWS_LOCATION: 'new_year_news_location',\n} as const;","import type { ResponseStatusType } from '@washingtonpost/subs-sdk';\nimport {\n CollectionBehaviors,\n IngestType,\n} from '../interfaces';\nimport type { IngestResponseState } from '../interfaces';\nimport { getAttributes } from '../services/getAttributes';\nimport { sendToGA } from '../services/sendToGA';\nimport { hasRequiredPrivacyCookies } from './hasRequiredPrivacyCookies';\nimport { ingest } from '../services/ingest';\nimport { isAnonymousWebview } from './isAnonymousWebview';\n\ntype PushType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n source: string;\n}) => Promise<\n | {\n status: ResponseStatusType;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n }\n | null\n | true\n>;\n\n\nexport const push: PushType = async ({ submitData, source }) => {\n if (!hasRequiredPrivacyCookies()) {\n throw new Error('does not satisfy cookie check');\n }\n\n if (isAnonymousWebview()) {\n throw new Error('does not satisfy cookie check');\n }\n\n const { fieldName } = submitData;\n\n const attributeInfo = await getAttributes({\n fieldName,\n });\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n throw new Error('do not collect');\n }\n\n const type =\n attributeInfo[0] && attributeInfo[0].explicit === true\n ? IngestType.EXPLICIT\n : IngestType.IMPLICIT;\n\n if (!attributeInfo[0] && __DEV__) {\n console.warn(`no attribute info found for ${fieldName}, assuming implicit`);\n }\n\n if (type === IngestType.EXPLICIT) {\n return ingest({ submitData, source });\n } else {\n return sendToGA({ submitData, source });\n }\n};\n","import { getCookie, isLoggedIn } from '@washingtonpost/subs-sdk';\n\nexport const isAnonymousWebview = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const wp_wv = getCookie('wp_wv');\n\n return !!(wp_wv && !isLoggedIn());\n};\n","const sendGAEvent = (props: {\n event: string;\n category: string;\n action: string;\n label: string;\n 'de-label': string;\n [key: string]: undefined | string | string[];\n}): void => {\n if (typeof window === 'undefined') {\n if (__DEV__) console.warn('NO WINDOW');\n return;\n }\n // Initialize dataLayer if needed\n window.dataLayer = window.dataLayer || [];\n\n const eventData: Record<string, any> = {\n ...props,\n };\n window.dataLayer.push(eventData);\n};\n\nexport const sendToGA: SendToGaType = async ({\n submitData: { fieldName, value },\n source,\n}) => {\n sendGAEvent({\n event: 'site-onpage-click',\n action: 'site-onpage-click',\n category: 'profile',\n\n label: fieldName,\n 'de-label': fieldName,\n [fieldName]: value,\n\n section: 'profile',\n subsection: source,\n });\n\n return true;\n};\n\ntype SendToGaType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n source: string;\n}) => Promise<true>;\n"],"names":["CollectionBehaviors","COLLECT","DO_NOT_COLLECT","IngestType","EXPLICIT","IMPLICIT","checkCookie","getCookie","length","hasRequiredPrivacyCookies","window","intl_region","country_code","countryCode","WPGeo","gdprAllowTargarting","checkConsentCookieForAllowTargeting","value","includes","base","ENDPOINTS","attributesCache","getAttributes","async","fieldName","fieldNames","url","URL","searchParams","set","join","data","fetch","toString","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","SUCCESS","attributes","e","console","debug","StyledMobileSelect","styled","padding","display","justifyContent","width","backgroundColor","color","fontFamily","fontSize","fontWeight","lineHeight","paddingBlockRight","textOverflow","position","borderColor","borderRightWidth","borderRightColor","appearance","theme","colors","disabled","onDisabled","cursor","StyledSelectWrapper","maxWidth","borderRadius","borderStyle","borderWidth","StyledMobileOption","Dropdown","id","label","values","required","defaultValue","onChange","answer","setAnswer","useState","isMobileSize","useWindowSize","useEffect","disabledProp","defaultValueProp","defaultValuePropMobile","selected","React","createElement","target","style","map","key","Icon","size","fill","gray80","pointerEvents","right","top","transform","ChevronDown","Select","Root","onValueChange","Trigger","Label","Value","Content","css","zIndex","zIndices","page","Item","scriptSrc","SelectWrapper","boxSizing","marginBottom","flexDirection","configSrc","DEDisclosure","onFinished","allowCookieStore","onPrivacyPolicyClick","_e","disclosure","setDisclosure","disclosureRendering","setDisclosureRendering","myConfig","setMyConfig","alertBoxClosed","useOneTrustAlertBoxClosed","setAlertBoxClosed","listenToCookieStore","setListenToCookieStore","listenToTcfApi","setListenToTcfApi","_window","__tcfapi","warn","cookieStore","cleanupFn","listenToCookieStoreUtil","listenerId","callback","_tcData","success","config","response","remoteConfig","Object","keys","forEach","configKey","split","toLowerCase","getConfig","error","checkBannerStatus","disclosure_afterbanner","disclosure_beforebanner","Array","isArray","reduce","prev","current","Fragment","hydrateLinks","str","onLinkClick","i","rel","className","href","onClick","isFinished","isError","DESelect","source","dataDictionaryConfig","submit","valuesFilter","children","setConfig","setSelected","scriptStatus","useScript","ScriptStatus","READY","__twpdeu","getFieldConfigs","fetchConfig","_window2","result","push","submitData","submitSelected","sort","a","b","order","filter","archived","name","JOB_LEVEL","JOB_INDUSTRY","PERSONAL_GOALS","HOBBIES","PROFESSIONAL_GOALS","INDUSTRY","NEWS_LOCATION","NY_PERSONAL_GOALS","NY_HOBBIES","NY_PROFESSIONAL_GOALS","NY_INDUSTRY","NY_NEWS_LOCATION","SYSTEM_ERROR","INVALID_TYPE","INVALID_IDENTIFIER","INVALID_DATA","INVALID_ATTRIBUTE_DEFINITION","INVALID_META_DEFINITION","UNAUTHENTICATED","MISMATCHED_IDENTIFIER","DISABLED_ATTRIBUTE_DEFINITION","Error","isLoggedIn","attributeInfo","collection_behavior","explicit","wapo_login_id","payload","jucid","localStorage","getItem","ga","type","metadata","method","body","JSON","stringify","ingest","props","dataLayer","eventData","sendGAEvent","event","action","category","section","subsection","sendToGA"],"mappings":"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"}
1
+ {"version":3,"file":"subs-de-inputs.cjs.production.min.js","sources":["../src/interfaces/index.ts","../src/components/DEDisclosure/utils/checkAlertBoxClosedCookie.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/utils/checkConsentCookieForAllowTargeting.ts","../src/services/getAttributes.ts","../src/services/ingest.ts","../src/components/DESelect/Dropdown.tsx","../src/components/DESelect/index.tsx","../src/components/DEDisclosure/utils/getConfig.ts","../src/components/DEDisclosure/utils/hydrateLinks.tsx","../src/components/DEDisclosure/utils/checkOptAnonConsentCookie.ts","../src/components/DEDisclosure/DisclosureWithBannerStatus.tsx","../src/components/DEDisclosure/hooks/useOnetrust.ts","../src/components/DEDisclosure/DisclosureWithoutBannerStatus.tsx","../src/components/DEDisclosure/index.tsx","../src/constants/IngestDataTypes.ts","../src/utils/push.ts","../src/utils/isAnonymousWebview.ts","../src/services/sendToGA.ts"],"sourcesContent":["export type AttributeValue = {\n name: string;\n date_created: Number;\n last_modified_date: Number;\n archived: boolean;\n order: number;\n};\n\nexport const CollectionBehaviors = {\n COLLECT: 'COLLECT',\n DO_NOT_COLLECT: 'DO_NOT_COLLECT',\n} as const;\n\nexport type Attribute = {\n name: string;\n approved_for_use?: boolean;\n collection_behavior?: (typeof CollectionBehaviors)[keyof typeof CollectionBehaviors];\n datatype: string;\n explicit: boolean;\n multiple_value: boolean;\n last_modified_date: Number;\n date_created: Number;\n values: AttributeValue[] | Readonly<AttributeValue[]>;\n};\n\nexport const AttributesState = {\n SUCCESS: '100',\n} as const;\n\nexport const IngestType = {\n EXPLICIT: 'explicit',\n IMPLICIT: 'implicit',\n} as const;\n\nexport const IngestResponseState = {\n SUCCESS: '100',\n SYSTEM_ERROR: '101',\n INVALID_TYPE: '102',\n INVALID_IDENTIFIER: '103',\n INVALID_DATA: '104',\n INVALID_ATTRIBUTE_DEFINITION: '105',\n INVALID_META_DEFINITION: '106',\n UNAUTHENTICATED: '107',\n MISMATCHED_IDENTIFIER: '108',\n DISABLED_ATTRIBUTE_DEFINITION: '109',\n DO_NOT_COLLECT: '110',\n} as const;\n","import { getCookie } from '@washingtonpost/subs-sdk';\n\nconst COOKIE = 'OptanonAlertBoxClosed';\n\nexport const checkAlertBoxClosedCookie = () => {\n const value = getCookie(COOKIE) || '';\n // Wed May 15 2024 06:29:23 GMT-0500 (Central Daylight Time)\n // \"Invalid date\" is 12 characters long\n return value.length > 12;\n};\n","import { WPGeo, getCookie } from '@washingtonpost/subs-sdk';\nimport { checkConsentCookieForAllowTargeting } from './checkConsentCookieForAllowTargeting';\nimport { checkAlertBoxClosedCookie } from '../components/DEDisclosure/utils/checkAlertBoxClosedCookie';\n\n/**\n * Checks privacy cookies to decide if we can send up 1pd\n * If US, checks that wp_usp exists\n * Else If OptAnonConsent cookie exists, checks the value of targeting cookies consent\n * Else If EEA, always returns true\n * Else, returns false\n * @returns {boolean}\n */\nexport const hasRequiredPrivacyCookies = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const { intl_region, country_code: countryCode } = WPGeo();\n\n if (countryCode === 'US') {\n return !!getCookie('wp_usp');\n }\n\n const gdprAllowTargarting = checkConsentCookieForAllowTargeting();\n if (typeof gdprAllowTargarting === 'boolean' && checkAlertBoxClosedCookie()) {\n return gdprAllowTargarting;\n }\n\n // Downstream systems\n if (intl_region === 'EEA') {\n return true;\n }\n\n return false;\n};\n","import { getCookie } from '@washingtonpost/subs-sdk';\n\nconst COOKIE = 'OptanonConsent';\n\n/**\n * Checks the users OptanonConsent cookie to determine if the user has allowed targeting.\n * Returns true or false if the flag is found in the cookie, null otherwise.\n * @returns {boolean | null}\n */\nexport const checkConsentCookieForAllowTargeting = () => {\n const value = getCookie(COOKIE) || '';\n return value.includes('C0004%3A1')\n ? true\n : value.includes('C0004%3A0')\n ? false\n : null;\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n} from '@washingtonpost/subs-sdk';\nimport { Attribute } from '../interfaces';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nconst attributesCache: Record<string, any> = {};\nexport const getAttributes: GetAttributesType = async ({\n fieldName,\n}: {\n fieldName: string;\n}) => {\n if (attributesCache[fieldName]) {\n return attributesCache[fieldName];\n }\n\n const fieldNames = [fieldName];\n\n try {\n const url = new URL(`${base}/attributes`);\n url.searchParams.set('attributes', fieldNames.join(','));\n\n const data = await fetch(url.toString(), {\n credentials: 'include',\n headers: JSON_HEADERS,\n });\n const json = await data.json();\n\n if (data.ok && json.status === ResponseStatus.SUCCESS) {\n const attributes = json.attributes || [];\n attributesCache[fieldName] = attributes;\n return attributes;\n } else {\n return [];\n }\n } catch (e) {\n console.debug(e);\n return [];\n }\n};\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\n","import {\n ENDPOINTS,\n JSON_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport type { ResponseStatusType } from '@washingtonpost/subs-sdk';\nimport { IngestResponseState, IngestType } from '../interfaces';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nexport const ingest: IngestType = async ({\n submitData: { fieldName, value },\n source,\n}) => {\n const url = `${base}/ingest`;\n\n const wapo_login_id = getCookie('wapo_login_id');\n\n const jucid = localStorage.getItem('uuid');\n const ga = getCookie('_ga');\n\n const payload = {\n jucid,\n ga,\n type: IngestType.EXPLICIT,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n [fieldName]: [value],\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n source: string;\n}) => Promise<{\n status: ResponseStatusType;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n} | null>;\n","import React, { useEffect, useState } from 'react';\nimport { Icon, Select, styled, theme } from '@washingtonpost/wpds-ui-kit';\nimport { useWindowSize } from '@washingtonpost/subs-hooks';\nimport { ChevronDown } from '@washingtonpost/wpds-assets';\n\ninterface IDropdownProps {\n id: string;\n label: string;\n values: Array<string>;\n required?: boolean;\n defaultValue?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n}\n\nconst StyledMobileSelect = styled('select', {\n padding: '12px 16px 12px 6px',\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n backgroundColor: '$secondary',\n color: '$primary',\n fontFamily: '$meta',\n fontSize: '$100',\n fontWeight: '$light',\n lineHeight: '$125',\n paddingBlockRight: '$125',\n textOverflow: 'ellipsis',\n position: 'relative',\n borderColor: 'transparent',\n borderRightWidth: '10px',\n borderRightColor: 'transparent',\n appearance: 'none',\n '-webkit-appearance': 'none',\n '&:disabled': {\n backgroundColor: theme.colors.disabled,\n borderColor: theme.colors.disabled,\n color: theme.colors.onDisabled,\n cursor: 'not-allowed',\n },\n});\n\nconst StyledSelectWrapper = styled('div', {\n width: '100%',\n maxWidth: '380px',\n borderRadius: '$012',\n borderColor: '$subtle',\n borderStyle: 'solid',\n borderWidth: '1px',\n backgroundColor: '$secondary',\n position: 'relative',\n});\n\nconst StyledMobileOption = styled('option', {\n fontFamily: 'inherit',\n fontSize: 'inherit',\n color: 'inherit',\n});\n\n/**\n * Dropdown component. Uses wpds-ui-kit on desktop and native select on mobile.\n * @param {IDropdownProps} props The props.\n * @returns {React.ReactElement} The dropdown.\n */\nexport const Dropdown = ({\n id,\n label,\n values,\n required = false,\n defaultValue,\n onChange = () => {},\n disabled = false,\n}: IDropdownProps) => {\n const [answer, setAnswer] = useState<string>();\n const { isMobileSize } = useWindowSize();\n\n useEffect(() => {\n if (answer) onChange(answer);\n }, [answer]);\n\n const disabledProp = disabled ? { disabled: true } : {};\n\n // helps maintain state between WPDS and native dropdowns\n const defaultValueProp = answer\n ? { defaultValue: answer }\n : defaultValue\n ? { defaultValue }\n : {};\n\n const defaultValuePropMobile = (value: string) => {\n if (answer) {\n return value === answer ? { selected: true } : {};\n }\n return value === defaultValue ? { selected: true } : {};\n };\n\n return isMobileSize ? (\n <StyledSelectWrapper>\n <StyledMobileSelect\n id=\"\"\n required={required}\n onChange={(e) => setAnswer(e.target.value)}\n {...disabledProp}\n >\n <label>{label}</label>\n <StyledMobileOption\n value=\"\"\n disabled\n selected\n style={{ color: '#666666' }}\n >\n {label}\n </StyledMobileOption>\n {values.map((value) => (\n <StyledMobileOption\n value={value}\n key={value}\n {...defaultValuePropMobile(value)}\n >\n {value}\n </StyledMobileOption>\n ))}\n </StyledMobileSelect>\n <Icon\n label=\"\"\n size=\"100\"\n fill={theme.colors.gray80}\n style={{\n pointerEvents: 'none',\n position: 'absolute',\n right: '10px',\n top: '50%',\n transform: 'translateY(-50%)',\n }}\n >\n <ChevronDown style={{ position: 'absolute', right: '10px' }} />\n </Icon>\n </StyledSelectWrapper>\n ) : (\n <Select.Root\n onValueChange={(e) => setAnswer(e)}\n required={required}\n {...defaultValueProp}\n {...disabledProp}\n >\n <Select.Trigger data-test-id={`${id}-select-trigger`}>\n <Select.Label>{label}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n <Select.Content\n css={{ zIndex: theme.zIndices.page }}\n data-test-id={`${id}-select-content`}\n >\n {values.map((value) => (\n <Select.Item value={value} key={value}>\n {value}\n </Select.Item>\n ))}\n </Select.Content>\n </Select.Root>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { Select, styled } from '@washingtonpost/wpds-ui-kit';\nimport { ENDPOINTS, ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';\nimport { Attribute, AttributeValue } from '../../interfaces';\nimport { Dropdown } from './Dropdown';\n\ninterface DESelectProps {\n source: string;\n fieldName: string;\n label?: string;\n dataDictionaryConfig?: Attribute | Readonly<Attribute>;\n defaultValue?: string;\n disabled?: boolean;\n submit: boolean;\n onChange?: ({ value }: { value: string }) => void;\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n valuesFilter?: (value: AttributeValue) => boolean;\n selectProps?: {\n root?: any;\n trigger?: any;\n label?: any;\n value?: any;\n content?: any;\n item?: any;\n };\n children?: React.ReactNode;\n}\n\nconst scriptSrc = `${ENDPOINTS.base}/de-utils/twpdeu.min.js`;\n\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n defaultValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState('');\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n const config = await window?.__twpdeu?.getFieldConfigs({ fieldName });\n if (config) {\n setConfig(config[0]);\n } else {\n console.error('unable to get config', fieldName);\n }\n } catch (e) {\n console.warn('unable to get config', fieldName, e);\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && !(children || config)) {\n fetchConfig();\n }\n }, [scriptStatus]);\n\n useEffect(() => {\n const submitSelected = async () => {\n try {\n const result = await window?.__twpdeu?.push({\n submitData: { fieldName, value: selected },\n source,\n });\n\n const isError =\n result === true\n ? false\n : result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n } catch (e) {\n onFinished({\n isFinished: false,\n isError: true,\n });\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && submit && selected) {\n submitSelected();\n }\n }, [scriptStatus, submit]);\n\n const defaultValueProp = defaultValue && config ? { defaultValue } : {};\n\n const isLoading = !(children || config);\n\n const disabledProp = disabled || isLoading ? { disabled: true } : {};\n\n // sort and filter out archived values\n // Note: config.values may be readonly\n const values = config\n ? [...config.values]\n .sort((a, b) => a.order - b.order)\n .filter((value) => value.archived !== true)\n .filter(valuesFilter)\n : [];\n\n return (\n <SelectWrapper>\n {children && (\n <Select.Root\n onValueChange={(e) => {\n setSelected(e);\n onChange({ value: e });\n }}\n {...defaultValueProp}\n {...disabledProp}\n >\n {children}\n </Select.Root>\n )}\n {!children && !config && (\n <Dropdown\n id={'loading'}\n label={'Loading...'}\n values={[]}\n disabled={true}\n />\n )}\n {!children && config && (\n <Dropdown\n id={config.name}\n label={label || config.name}\n onChange={(e) => {\n setSelected(e);\n onChange({ value: e });\n }}\n values={values.map((value) => value.name)}\n defaultValue={defaultValue}\n disabled={disabled}\n />\n )}\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled('div', {\n boxSizing: 'border-box',\n display: 'flex',\n marginBottom: '$100',\n flexDirection: 'column',\n '& button': {\n padding: '1px 6px',\n },\n '& *': { boxSizing: 'border-box' },\n});\n","import { ENDPOINTS, WPGeo } from '@washingtonpost/subs-sdk';\nimport {\n DisclosureConfig,\n DisclosureConfigValue,\n} from '../../../interfaces/disclosure';\n\nconst configSrc = `${\n ENDPOINTS.base === 'https://subscribe.washingtonpost.com'\n ? 'https://www.washingtonpost.com/subscribe'\n : ENDPOINTS.base\n}/config/de/disclosure.json`;\n\nexport const getConfig = async () => {\n let myConfig: DisclosureConfigValue | undefined = undefined;\n\n // step 1: fetch config\n const response = await fetch(configSrc);\n const remoteConfig: DisclosureConfig = await response.json();\n\n // step 2: figure out which part of the config to use\n\n // if country- or region-specific config found, use that\n const { country_code, intl_region } = WPGeo();\n Object.keys(remoteConfig).forEach((configKey) => {\n if (\n country_code &&\n configKey.split('|').includes(country_code.toLowerCase())\n ) {\n myConfig = remoteConfig[configKey];\n } else if (intl_region === 'EEA' && configKey === 'eea') {\n myConfig = remoteConfig[configKey];\n }\n });\n\n // TODO: Check for billing country also\n\n // else if no country-specific config, use the default config\n if (typeof myConfig === 'undefined' && remoteConfig['_']) {\n myConfig = remoteConfig['_'];\n }\n\n return myConfig;\n};\n","import React from 'react';\n\ntype hydrateLinksType = (\n str: string,\n onLinkClick: (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => void\n) => string | JSX.Element;\n\nexport const hydrateLinks: hydrateLinksType = (str, onLinkClick = () => {}) => {\n const array = str.split(/({{PRIVACY_POLICY}})/g);\n const chunks = array.map((str, i) => {\n if (str === '{{PRIVACY_POLICY}}') {\n return (\n <a\n key={`privacy-link-${i}`}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n style={{ color: 'inherit' }}\n className=\"underline\"\n href=\"https://www.washingtonpost.com/privacy-policy/\"\n onClick={(e) => onLinkClick(e)}\n >\n Privacy Policy\n </a>\n );\n }\n return str;\n });\n\n const toReturn = chunks.reduce(\n (prev, current) => (\n <>\n {prev}\n {current}\n </>\n ),\n <></>\n );\n\n return toReturn;\n};\n","import { getCookie } from '@washingtonpost/subs-sdk';\n\nconst COOKIE = 'OptanonConsent';\n\nexport const checkOptanonConsentCookie = () => {\n const value = getCookie(COOKIE) || '';\n return value.length > 12;\n};\n","import React, { useState, useEffect, ReactEventHandler } from 'react';\nimport { DisclosureConfigValue } from '../../interfaces/disclosure';\nimport { hydrateLinks } from './utils/hydrateLinks';\nimport { useOnetrust } from './hooks/useOnetrust';\n\ninterface DEDisclosureWithBannerStatusProps {\n config: DisclosureConfigValue;\n allowCookieStore?: boolean;\n onFinished: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n onPrivacyPolicyClick?: ReactEventHandler<HTMLAnchorElement>;\n}\n\nexport const DEDisclosureWithBannerStatus: React.FC<\n DEDisclosureWithBannerStatusProps\n> = ({\n config,\n onFinished,\n allowCookieStore = true,\n onPrivacyPolicyClick = () => {},\n}) => {\n const [disclosure, setDisclosure] = useState<string[] | null>(null);\n const [disclosureRendering, setDisclosureRendering] =\n useState<JSX.Element | null>(null);\n\n const { alertBoxClosed, consentCookieExists } = useOnetrust({\n allowCookieStore,\n });\n\n useEffect(() => {\n if (config) {\n // step 3: set disclosure based on config\n\n if (alertBoxClosed) {\n setDisclosure(config.disclosure_afterbanner);\n } else {\n setDisclosure(config.disclosure_beforebanner);\n }\n }\n }, [alertBoxClosed]);\n\n useEffect(() => {\n if (disclosure && Array.isArray(disclosure)) {\n setDisclosureRendering(\n disclosure.reduce((prev, current) => {\n return (\n <>\n {prev}\n <p>{hydrateLinks(current, onPrivacyPolicyClick)}</p>\n </>\n );\n }, <></>)\n );\n }\n }, [disclosure]);\n\n useEffect(() => {\n if (disclosureRendering && consentCookieExists) {\n onFinished({ isFinished: true, isError: false });\n }\n }, [disclosureRendering, consentCookieExists]);\n\n return disclosureRendering;\n};\n","import { useState, useEffect } from 'react';\nimport {\n listenToCookieStore as listenToCookieStoreUtil,\n ICookieStore,\n} from '@washingtonpost/subs-sdk';\nimport { checkAlertBoxClosedCookie } from '../utils/checkAlertBoxClosedCookie';\nimport { checkOptanonConsentCookie } from '../utils/checkOptAnonConsentCookie';\n\nconst CONSENT_COOKIE = 'OptanonConsent';\n\nconst ALERT_BOX_COOKIE = 'OptanonAlertBoxClosed';\n\ninterface TCData {\n eventStatus: 'tcloaded' | 'cmpuishown' | 'useractioncomplete';\n listenerId: number;\n [key: string]: any;\n}\n\ntype TCFAPIAddListener = (\n command: 'addEventListener',\n version: number,\n callback: (tcData: TCData, success: boolean) => void\n) => void;\n\ntype TCFAPIRmListener = (\n command: 'removeEventListener',\n version: number,\n callback: (success: boolean) => void,\n listenerId: number\n) => void;\n\ntype TCFAPIPing = (\n command: 'ping',\n version: number,\n callback: (pingReturn: any, success: boolean) => void\n) => void;\n\ndeclare global {\n interface Window {\n cookieStore?: ICookieStore;\n __tcfapi?: TCFAPIAddListener & TCFAPIRmListener & TCFAPIPing;\n }\n}\n\nexport const useOnetrust = ({\n allowCookieStore,\n}: {\n allowCookieStore: boolean;\n}) => {\n const [consentCookieExists, setConsentCookieExists] = useState<\n boolean | undefined\n >();\n const [alertBoxClosed, setAlertBoxClosed] = useState<boolean | undefined>();\n\n const [listenToCookieStore, setListenToCookieStore] = useState(false);\n const [listenToTcfApi, setListenToTcfApi] = useState(false);\n\n useEffect(() => {\n if (checkOptanonConsentCookie()) {\n setConsentCookieExists(true);\n }\n\n if (checkAlertBoxClosedCookie()) {\n setAlertBoxClosed(true);\n return;\n }\n\n if (!window.__tcfapi) {\n console.warn('warning: __tcfapi not found');\n }\n\n if (window?.cookieStore && allowCookieStore) {\n setListenToCookieStore(true);\n } else if (window.__tcfapi) {\n setListenToTcfApi(true);\n } else {\n console.warn('warning: neither cookieStore nor __tcfapi found');\n }\n }, []);\n\n useEffect(() => {\n let cleanupFns: ((() => void) | null)[] = [];\n if (listenToCookieStore && window.cookieStore) {\n const cleanupFn = listenToCookieStoreUtil(CONSENT_COOKIE, () => {\n if (checkOptanonConsentCookie()) {\n setConsentCookieExists(true);\n }\n });\n cleanupFns.push(cleanupFn);\n\n const cleanupFn2 = listenToCookieStoreUtil(ALERT_BOX_COOKIE, () => {\n if (checkAlertBoxClosedCookie()) {\n setAlertBoxClosed(true);\n } else {\n setAlertBoxClosed(false);\n }\n });\n cleanupFns.push(cleanupFn2);\n }\n return () => {\n cleanupFns.forEach((fn) => fn && fn());\n };\n }, [listenToCookieStore]);\n\n useEffect(() => {\n let listenerId: number;\n if (listenToTcfApi && window.__tcfapi) {\n const callback = (_tcData: TCData, success: boolean) => {\n if (success) {\n listenerId = _tcData.listenerId;\n\n if (checkOptanonConsentCookie()) {\n setConsentCookieExists(true);\n }\n\n // tcData.eventStatus can be:\n // tcloaded means user has made a choice and we’re ready to check it\n // cmpuishown means the banner is shown\n // useractioncomplete means the user has interacted with the banner\n\n // but actually if the result for any of these is true, we just use the value of the cookie\n if (checkAlertBoxClosedCookie()) {\n setAlertBoxClosed(true);\n }\n }\n };\n\n window.__tcfapi('addEventListener', 2, callback);\n }\n\n // cleanup fn\n return () => {\n if (window.__tcfapi && listenerId)\n window.__tcfapi(\n 'removeEventListener',\n 2,\n (success) => {\n console.debug(success);\n },\n listenerId\n );\n };\n }, [listenToTcfApi]);\n\n return {\n consentCookieExists,\n alertBoxClosed,\n listenToCookieStore,\n listenToTcfApi,\n };\n};\n","import React, { useState, useEffect, ReactEventHandler } from 'react';\nimport { DisclosureConfigValue } from '../../interfaces/disclosure';\nimport { hydrateLinks } from './utils/hydrateLinks';\n\ninterface DEDisclosureWithoutBannerStatusProps {\n config: DisclosureConfigValue;\n onFinished: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n onPrivacyPolicyClick?: ReactEventHandler<HTMLAnchorElement>;\n}\n\nexport const DEDisclosureWithoutBannerStatus: React.FC<\n DEDisclosureWithoutBannerStatusProps\n> = ({ config, onFinished, onPrivacyPolicyClick = () => {} }) => {\n const [disclosure, setDisclosure] = useState<string[] | null>(null);\n const [disclosureRendering, setDisclosureRendering] =\n useState<JSX.Element | null>(null);\n\n useEffect(() => {\n if (config) {\n setDisclosure(config.disclosure);\n }\n }, [config]);\n\n useEffect(() => {\n if (disclosure && Array.isArray(disclosure)) {\n setDisclosureRendering(\n disclosure.reduce((prev, current) => {\n return (\n <>\n {prev}\n <p>{hydrateLinks(current, onPrivacyPolicyClick)}</p>\n </>\n );\n }, <></>)\n );\n }\n }, [disclosure]);\n\n useEffect(() => {\n if (disclosureRendering) {\n onFinished({ isFinished: true, isError: false });\n }\n }, [disclosureRendering]);\n\n return disclosureRendering;\n};\n","import React, { useState, useEffect, ReactEventHandler } from 'react';\nimport { DisclosureConfigValue } from '../../interfaces/disclosure';\nimport { getConfig } from './utils/getConfig';\nimport { DEDisclosureWithBannerStatus } from './DisclosureWithBannerStatus';\nimport { DEDisclosureWithoutBannerStatus } from './DisclosureWithoutBannerStatus';\n\ninterface DisclosureProps {\n /** callback function to be called when the disclosure is finished loading */\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n\n onPrivacyPolicyClick?: ReactEventHandler<HTMLAnchorElement>;\n\n /** ability to turn off cookiestore listener, primarily for testing purposes */\n allowCookieStore?: boolean;\n}\n\nexport const DEDisclosure: React.FC<DisclosureProps> = ({\n onFinished = () => {},\n allowCookieStore = true,\n onPrivacyPolicyClick = (_e) => {},\n}) => {\n const [disclosureRendering, setDisclosureRendering] =\n useState<JSX.Element | null>(null);\n const [myConfig, setMyConfig] = useState<DisclosureConfigValue>();\n // const { alertBoxClosed } = useOneTrustAlertBoxClosed({ allowCookieStore });\n\n useEffect(() => {\n (async () => {\n const config = await getConfig();\n setMyConfig(config);\n\n if (!config) {\n console.error('No config found');\n }\n })();\n }, []);\n\n useEffect(() => {\n if (myConfig) {\n // step 3: set disclosure based on config\n\n // if config says to check onetrust, check onetrust\n if ('checkBannerStatus' in myConfig && myConfig.checkBannerStatus) {\n // check if onetrust is closed\n // if it is, show the after banner disclosure\n // if it is not, show the before banner disclosure\n setDisclosureRendering(\n <DEDisclosureWithBannerStatus\n config={myConfig}\n allowCookieStore={allowCookieStore}\n onFinished={onFinished}\n onPrivacyPolicyClick={onPrivacyPolicyClick}\n />\n );\n } else if ('disclosure' in myConfig) {\n setDisclosureRendering(\n <DEDisclosureWithoutBannerStatus\n config={myConfig}\n onFinished={onFinished}\n onPrivacyPolicyClick={onPrivacyPolicyClick}\n />\n );\n } else {\n console.error('Invalid config');\n }\n }\n }, [myConfig]);\n\n if (disclosureRendering) {\n return <div data-test-id=\"de-disclosure\">{disclosureRendering}</div>;\n }\n\n return <div data-test-id=\"de-disclosure-loading\"></div>;\n};\n","export const FirstPartyIngestDataTypes = {\n JOB_LEVEL: 'profile_job_level',\n JOB_INDUSTRY: 'profile_job_industry',\n PERSONAL_GOALS: 'personal_goals',\n HOBBIES: 'hobbies',\n PROFESSIONAL_GOALS: 'professional_goals',\n INDUSTRY: 'industry',\n NEWS_LOCATION: 'news_location',\n NY_PERSONAL_GOALS: 'new_year_personal_goals',\n NY_HOBBIES: 'new_year_hobbies',\n NY_PROFESSIONAL_GOALS: 'new_year_professional_goals',\n NY_INDUSTRY: 'new_year_industry',\n NY_NEWS_LOCATION: 'new_year_news_location',\n} as const;","import type { ResponseStatusType } from '@washingtonpost/subs-sdk';\nimport {\n CollectionBehaviors,\n IngestType,\n} from '../interfaces';\nimport type { IngestResponseState } from '../interfaces';\nimport { getAttributes } from '../services/getAttributes';\nimport { sendToGA } from '../services/sendToGA';\nimport { hasRequiredPrivacyCookies } from './hasRequiredPrivacyCookies';\nimport { ingest } from '../services/ingest';\nimport { isAnonymousWebview } from './isAnonymousWebview';\n\ntype PushType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n source: string;\n}) => Promise<\n | {\n status: ResponseStatusType;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n }\n | null\n | true\n>;\n\n\nexport const push: PushType = async ({ submitData, source }) => {\n if (!hasRequiredPrivacyCookies()) {\n throw new Error('does not satisfy cookie check');\n }\n\n if (isAnonymousWebview()) {\n throw new Error('does not satisfy cookie check');\n }\n\n const { fieldName } = submitData;\n\n const attributeInfo = await getAttributes({\n fieldName,\n });\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n throw new Error('do not collect');\n }\n\n const type =\n attributeInfo[0] && attributeInfo[0].explicit === true\n ? IngestType.EXPLICIT\n : IngestType.IMPLICIT;\n\n if (!attributeInfo[0] && __DEV__) {\n console.warn(`no attribute info found for ${fieldName}, assuming implicit`);\n }\n\n if (type === IngestType.EXPLICIT) {\n return ingest({ submitData, source });\n } else {\n return sendToGA({ submitData, source });\n }\n};\n","import { getCookie, isLoggedIn } from '@washingtonpost/subs-sdk';\n\nexport const isAnonymousWebview = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const wp_wv = getCookie('wp_wv');\n\n return !!(wp_wv && !isLoggedIn());\n};\n","const sendGAEvent = (props: {\n event: string;\n category: string;\n action: string;\n label: string;\n 'de-label': string;\n [key: string]: undefined | string | string[];\n}): void => {\n if (typeof window === 'undefined') {\n if (__DEV__) console.warn('NO WINDOW');\n return;\n }\n // Initialize dataLayer if needed\n window.dataLayer = window.dataLayer || [];\n\n const eventData: Record<string, any> = {\n ...props,\n };\n window.dataLayer.push(eventData);\n};\n\nexport const sendToGA: SendToGaType = async ({\n submitData: { fieldName, value },\n source,\n}) => {\n sendGAEvent({\n event: 'site-onpage-click',\n action: 'site-onpage-click',\n category: 'profile',\n\n label: fieldName,\n 'de-label': fieldName,\n [fieldName]: value,\n\n section: 'profile',\n subsection: source,\n });\n\n return true;\n};\n\ntype SendToGaType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n source: string;\n}) => Promise<true>;\n"],"names":["CollectionBehaviors","COLLECT","DO_NOT_COLLECT","IngestType","EXPLICIT","IMPLICIT","checkAlertBoxClosedCookie","getCookie","length","hasRequiredPrivacyCookies","window","intl_region","country_code","countryCode","WPGeo","gdprAllowTargarting","checkConsentCookieForAllowTargeting","value","includes","base","ENDPOINTS","attributesCache","getAttributes","async","fieldName","fieldNames","url","URL","searchParams","set","join","data","fetch","toString","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","SUCCESS","attributes","e","console","debug","StyledMobileSelect","styled","padding","display","justifyContent","width","backgroundColor","color","fontFamily","fontSize","fontWeight","lineHeight","paddingBlockRight","textOverflow","position","borderColor","borderRightWidth","borderRightColor","appearance","theme","colors","disabled","onDisabled","cursor","StyledSelectWrapper","maxWidth","borderRadius","borderStyle","borderWidth","StyledMobileOption","Dropdown","id","label","values","required","defaultValue","onChange","answer","setAnswer","useState","isMobileSize","useWindowSize","useEffect","disabledProp","defaultValueProp","defaultValuePropMobile","selected","React","createElement","target","style","map","key","Icon","size","fill","gray80","pointerEvents","right","top","transform","ChevronDown","Select","Root","onValueChange","Trigger","Label","Value","Content","css","zIndex","zIndices","page","Item","scriptSrc","SelectWrapper","boxSizing","marginBottom","flexDirection","configSrc","hydrateLinks","str","onLinkClick","split","i","rel","className","href","onClick","reduce","prev","current","Fragment","checkOptanonConsentCookie","DEDisclosureWithBannerStatus","config","onFinished","allowCookieStore","onPrivacyPolicyClick","disclosure","setDisclosure","disclosureRendering","setDisclosureRendering","alertBoxClosed","consentCookieExists","useOnetrust","setConsentCookieExists","setAlertBoxClosed","listenToCookieStore","setListenToCookieStore","listenToTcfApi","setListenToTcfApi","_window","__tcfapi","warn","cookieStore","cleanupFns","cleanupFn","listenToCookieStoreUtil","push","cleanupFn2","forEach","fn","listenerId","callback","_tcData","success","disclosure_afterbanner","disclosure_beforebanner","Array","isArray","isFinished","isError","DEDisclosureWithoutBannerStatus","DEDisclosure","_e","myConfig","setMyConfig","response","remoteConfig","Object","keys","configKey","toLowerCase","getConfig","error","checkBannerStatus","DESelect","source","dataDictionaryConfig","submit","valuesFilter","children","setConfig","setSelected","scriptStatus","useScript","ScriptStatus","READY","__twpdeu","getFieldConfigs","fetchConfig","_window2","result","submitData","submitSelected","sort","a","b","order","filter","archived","name","JOB_LEVEL","JOB_INDUSTRY","PERSONAL_GOALS","HOBBIES","PROFESSIONAL_GOALS","INDUSTRY","NEWS_LOCATION","NY_PERSONAL_GOALS","NY_HOBBIES","NY_PROFESSIONAL_GOALS","NY_INDUSTRY","NY_NEWS_LOCATION","SYSTEM_ERROR","INVALID_TYPE","INVALID_IDENTIFIER","INVALID_DATA","INVALID_ATTRIBUTE_DEFINITION","INVALID_META_DEFINITION","UNAUTHENTICATED","MISMATCHED_IDENTIFIER","DISABLED_ATTRIBUTE_DEFINITION","Error","isLoggedIn","attributeInfo","collection_behavior","explicit","wapo_login_id","payload","jucid","localStorage","getItem","ga","type","metadata","method","body","JSON","stringify","ingest","props","dataLayer","eventData","sendGAEvent","event","action","category","section","subsection","sendToGA"],"mappings":"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"}
@@ -41,7 +41,7 @@ const checkConsentCookieForAllowTargeting = () => {
41
41
  };
42
42
 
43
43
  const COOKIE$1 = 'OptanonAlertBoxClosed';
44
- const checkCookie = () => {
44
+ const checkAlertBoxClosedCookie = () => {
45
45
  const value = getCookie(COOKIE$1) || '';
46
46
  // Wed May 15 2024 06:29:23 GMT-0500 (Central Daylight Time)
47
47
  // "Invalid date" is 12 characters long
@@ -68,7 +68,7 @@ const hasRequiredPrivacyCookies = () => {
68
68
  return !!getCookie('wp_usp');
69
69
  }
70
70
  const gdprAllowTargarting = checkConsentCookieForAllowTargeting();
71
- if (typeof gdprAllowTargarting === 'boolean' && checkCookie()) {
71
+ if (typeof gdprAllowTargarting === 'boolean' && checkAlertBoxClosedCookie()) {
72
72
  return gdprAllowTargarting;
73
73
  }
74
74
  // Downstream systems
@@ -519,16 +519,27 @@ const hydrateLinks = (str, onLinkClick = () => {}) => {
519
519
  return toReturn;
520
520
  };
521
521
 
522
- const COOKIE = 'OptanonAlertBoxClosed';
523
- const useOneTrustAlertBoxClosed = ({
522
+ const COOKIE = 'OptanonConsent';
523
+ const checkOptanonConsentCookie = () => {
524
+ const value = getCookie(COOKIE) || '';
525
+ return value.length > 12;
526
+ };
527
+
528
+ const CONSENT_COOKIE = 'OptanonConsent';
529
+ const ALERT_BOX_COOKIE = 'OptanonAlertBoxClosed';
530
+ const useOnetrust = ({
524
531
  allowCookieStore
525
532
  }) => {
533
+ const [consentCookieExists, setConsentCookieExists] = useState();
526
534
  const [alertBoxClosed, setAlertBoxClosed] = useState();
527
535
  const [listenToCookieStore$1, setListenToCookieStore] = useState(false);
528
536
  const [listenToTcfApi, setListenToTcfApi] = useState(false);
529
537
  useEffect(() => {
530
538
  var _window;
531
- if (checkCookie()) {
539
+ if (checkOptanonConsentCookie()) {
540
+ setConsentCookieExists(true);
541
+ }
542
+ if (checkAlertBoxClosedCookie()) {
532
543
  setAlertBoxClosed(true);
533
544
  return;
534
545
  }
@@ -544,17 +555,26 @@ const useOneTrustAlertBoxClosed = ({
544
555
  }
545
556
  }, []);
546
557
  useEffect(() => {
547
- let cleanupFn = () => {};
558
+ let cleanupFns = [];
548
559
  if (listenToCookieStore$1 && window.cookieStore) {
549
- cleanupFn = listenToCookieStore(COOKIE, () => {
550
- if (checkCookie()) {
560
+ const cleanupFn = listenToCookieStore(CONSENT_COOKIE, () => {
561
+ if (checkOptanonConsentCookie()) {
562
+ setConsentCookieExists(true);
563
+ }
564
+ });
565
+ cleanupFns.push(cleanupFn);
566
+ const cleanupFn2 = listenToCookieStore(ALERT_BOX_COOKIE, () => {
567
+ if (checkAlertBoxClosedCookie()) {
551
568
  setAlertBoxClosed(true);
552
569
  } else {
553
570
  setAlertBoxClosed(false);
554
571
  }
555
572
  });
573
+ cleanupFns.push(cleanupFn2);
556
574
  }
557
- return cleanupFn || (() => {});
575
+ return () => {
576
+ cleanupFns.forEach(fn => fn && fn());
577
+ };
558
578
  }, [listenToCookieStore$1]);
559
579
  useEffect(() => {
560
580
  let listenerId;
@@ -562,12 +582,15 @@ const useOneTrustAlertBoxClosed = ({
562
582
  const callback = (_tcData, success) => {
563
583
  if (success) {
564
584
  listenerId = _tcData.listenerId;
585
+ if (checkOptanonConsentCookie()) {
586
+ setConsentCookieExists(true);
587
+ }
565
588
  // tcData.eventStatus can be:
566
589
  // tcloaded means user has made a choice and we’re ready to check it
567
590
  // cmpuishown means the banner is shown
568
591
  // useractioncomplete means the user has interacted with the banner
569
592
  // but actually if the result for any of these is true, we just use the value of the cookie
570
- if (checkCookie()) {
593
+ if (checkAlertBoxClosedCookie()) {
571
594
  setAlertBoxClosed(true);
572
595
  }
573
596
  }
@@ -582,25 +605,93 @@ const useOneTrustAlertBoxClosed = ({
582
605
  };
583
606
  }, [listenToTcfApi]);
584
607
  return {
608
+ consentCookieExists,
585
609
  alertBoxClosed,
586
610
  listenToCookieStore: listenToCookieStore$1,
587
611
  listenToTcfApi
588
612
  };
589
613
  };
590
614
 
591
- const DEDisclosure = ({
592
- onFinished = () => {},
615
+ const DEDisclosureWithBannerStatus = ({
616
+ config,
617
+ onFinished,
593
618
  allowCookieStore = true,
594
- onPrivacyPolicyClick = _e => {}
619
+ onPrivacyPolicyClick = () => {}
595
620
  }) => {
596
621
  const [disclosure, setDisclosure] = useState(null);
597
622
  const [disclosureRendering, setDisclosureRendering] = useState(null);
598
- const [myConfig, setMyConfig] = useState();
599
623
  const {
600
- alertBoxClosed
601
- } = useOneTrustAlertBoxClosed({
624
+ alertBoxClosed,
625
+ consentCookieExists
626
+ } = useOnetrust({
602
627
  allowCookieStore
603
628
  });
629
+ useEffect(() => {
630
+ if (config) {
631
+ // step 3: set disclosure based on config
632
+ if (alertBoxClosed) {
633
+ setDisclosure(config.disclosure_afterbanner);
634
+ } else {
635
+ setDisclosure(config.disclosure_beforebanner);
636
+ }
637
+ }
638
+ }, [alertBoxClosed]);
639
+ useEffect(() => {
640
+ if (disclosure && Array.isArray(disclosure)) {
641
+ setDisclosureRendering(disclosure.reduce((prev, current) => {
642
+ return React.createElement(React.Fragment, null, prev, React.createElement("p", null, hydrateLinks(current, onPrivacyPolicyClick)));
643
+ }, React.createElement(React.Fragment, null)));
644
+ }
645
+ }, [disclosure]);
646
+ useEffect(() => {
647
+ if (disclosureRendering && consentCookieExists) {
648
+ onFinished({
649
+ isFinished: true,
650
+ isError: false
651
+ });
652
+ }
653
+ }, [disclosureRendering, consentCookieExists]);
654
+ return disclosureRendering;
655
+ };
656
+
657
+ const DEDisclosureWithoutBannerStatus = ({
658
+ config,
659
+ onFinished,
660
+ onPrivacyPolicyClick = () => {}
661
+ }) => {
662
+ const [disclosure, setDisclosure] = useState(null);
663
+ const [disclosureRendering, setDisclosureRendering] = useState(null);
664
+ useEffect(() => {
665
+ if (config) {
666
+ setDisclosure(config.disclosure);
667
+ }
668
+ }, [config]);
669
+ useEffect(() => {
670
+ if (disclosure && Array.isArray(disclosure)) {
671
+ setDisclosureRendering(disclosure.reduce((prev, current) => {
672
+ return React.createElement(React.Fragment, null, prev, React.createElement("p", null, hydrateLinks(current, onPrivacyPolicyClick)));
673
+ }, React.createElement(React.Fragment, null)));
674
+ }
675
+ }, [disclosure]);
676
+ useEffect(() => {
677
+ if (disclosureRendering) {
678
+ onFinished({
679
+ isFinished: true,
680
+ isError: false
681
+ });
682
+ }
683
+ }, [disclosureRendering]);
684
+ return disclosureRendering;
685
+ };
686
+
687
+ const DEDisclosure = ({
688
+ onFinished = () => {},
689
+ allowCookieStore = true,
690
+ onPrivacyPolicyClick = _e => {}
691
+ }) => {
692
+ const [disclosureRendering, setDisclosureRendering] = useState(null);
693
+ const [myConfig, setMyConfig] = useState();
694
+ // const { alertBoxClosed } = useOneTrustAlertBoxClosed({ allowCookieStore });
604
695
  useEffect(() => {
605
696
  (async () => {
606
697
  const config = await getConfig();
@@ -618,33 +709,31 @@ const DEDisclosure = ({
618
709
  // check if onetrust is closed
619
710
  // if it is, show the after banner disclosure
620
711
  // if it is not, show the before banner disclosure
621
- if (alertBoxClosed) {
622
- setDisclosure(myConfig.disclosure_afterbanner);
623
- } else {
624
- setDisclosure(myConfig.disclosure_beforebanner);
625
- }
712
+ setDisclosureRendering(React.createElement(DEDisclosureWithBannerStatus, {
713
+ config: myConfig,
714
+ allowCookieStore: allowCookieStore,
715
+ onFinished: onFinished,
716
+ onPrivacyPolicyClick: onPrivacyPolicyClick
717
+ }));
626
718
  } else if ('disclosure' in myConfig) {
627
- setDisclosure(myConfig.disclosure);
719
+ setDisclosureRendering(React.createElement(DEDisclosureWithoutBannerStatus, {
720
+ config: myConfig,
721
+ onFinished: onFinished,
722
+ onPrivacyPolicyClick: onPrivacyPolicyClick
723
+ }));
628
724
  } else {
629
725
  console.error('Invalid config');
630
726
  }
631
727
  }
632
- }, [myConfig, alertBoxClosed]);
633
- useEffect(() => {
634
- if (disclosure && Array.isArray(disclosure)) {
635
- setDisclosureRendering(disclosure.reduce((prev, current) => React.createElement(React.Fragment, null, prev, React.createElement("p", null, hydrateLinks(current, onPrivacyPolicyClick))), React.createElement(React.Fragment, null)));
636
- // Is it ok to fire `onFinished` if still waiting for onetrust to load on the page?
637
- onFinished({
638
- isFinished: true,
639
- isError: false
640
- });
641
- }
642
- }, [disclosure]);
643
- return disclosure === null ? React.createElement("div", {
728
+ }, [myConfig]);
729
+ if (disclosureRendering) {
730
+ return React.createElement("div", {
731
+ "data-test-id": "de-disclosure"
732
+ }, disclosureRendering);
733
+ }
734
+ return React.createElement("div", {
644
735
  "data-test-id": "de-disclosure-loading"
645
- }) : React.createElement("div", {
646
- "data-test-id": "de-disclosure"
647
- }, disclosureRendering);
736
+ });
648
737
  };
649
738
 
650
739
  const FirstPartyIngestDataTypes = {