@washingtonpost/subs-de-inputs 1.11.0 → 1.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,4 +1,7 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
2
5
  //#region \0rolldown/runtime.js
3
6
  var __create = Object.create;
4
7
  var __defProp = Object.defineProperty;
@@ -27,7 +30,7 @@ react = __toESM(react);
27
30
  let _washingtonpost_wpds_ui_kit = require("@washingtonpost/wpds-ui-kit");
28
31
  let _washingtonpost_subs_hooks = require("@washingtonpost/subs-hooks");
29
32
  let _washingtonpost_wpds_assets = require("@washingtonpost/wpds-assets");
30
- let react_jsx_dev_runtime = require("react/jsx-dev-runtime");
33
+ let react_jsx_runtime = require("react/jsx-runtime");
31
34
  //#region src/interfaces/index.ts
32
35
  var CollectionBehaviors = {
33
36
  COLLECT: "COLLECT",
@@ -196,7 +199,6 @@ var push = async ({ submitData, source }) => {
196
199
  };
197
200
  //#endregion
198
201
  //#region src/components/DESelect/Dropdown.tsx
199
- var _jsxFileName$5 = "/var/jenkins/workspace/Subs-FE-Components_production/packages/de-inputs/src/components/DESelect/Dropdown.tsx";
200
202
  var StyledMobileSelect = (0, _washingtonpost_wpds_ui_kit.styled)("select", {
201
203
  padding: "12px 16px 12px 6px",
202
204
  display: "flex",
@@ -256,43 +258,27 @@ var Dropdown = ({ id, label, values, required = false, existingValue, onChange =
256
258
  if (answer) return value === answer ? { selected: true } : {};
257
259
  return value === presetDropdownValue ? { selected: true } : {};
258
260
  };
259
- return isMobileSize ? /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(StyledSelectWrapper, { children: [/* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(StyledMobileSelect, {
261
+ return isMobileSize ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(StyledSelectWrapper, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(StyledMobileSelect, {
260
262
  id: "",
261
263
  required,
262
264
  onChange: (e) => setAnswer(e.target.value),
263
265
  ...disabledProp,
264
266
  children: [
265
- /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)("label", { children: label }, void 0, false, {
266
- fileName: _jsxFileName$5,
267
- lineNumber: 109,
268
- columnNumber: 9
269
- }, void 0),
270
- /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(StyledMobileOption, {
267
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", { children: label }),
268
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StyledMobileOption, {
271
269
  value: "",
272
270
  disabled: true,
273
271
  selected: true,
274
272
  style: { color: "#666666" },
275
273
  children: label
276
- }, void 0, false, {
277
- fileName: _jsxFileName$5,
278
- lineNumber: 110,
279
- columnNumber: 9
280
- }, void 0),
281
- values.map((value) => /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(StyledMobileOption, {
274
+ }),
275
+ values.map((value) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StyledMobileOption, {
282
276
  value,
283
277
  ...defaultValuePropMobile(value),
284
278
  children: value
285
- }, value, false, {
286
- fileName: _jsxFileName$5,
287
- lineNumber: 119,
288
- columnNumber: 11
289
- }, void 0))
279
+ }, value))
290
280
  ]
291
- }, void 0, true, {
292
- fileName: _jsxFileName$5,
293
- lineNumber: 103,
294
- columnNumber: 7
295
- }, void 0), /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(_washingtonpost_wpds_ui_kit.Icon, {
281
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_washingtonpost_wpds_ui_kit.Icon, {
296
282
  label: "",
297
283
  size: "100",
298
284
  fill: _washingtonpost_wpds_ui_kit.theme.colors.gray80,
@@ -303,67 +289,30 @@ var Dropdown = ({ id, label, values, required = false, existingValue, onChange =
303
289
  top: "50%",
304
290
  transform: "translateY(-50%)"
305
291
  },
306
- children: /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(_washingtonpost_wpds_assets.ChevronDown, { style: {
292
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_washingtonpost_wpds_assets.ChevronDown, { style: {
307
293
  position: "absolute",
308
294
  right: "10px"
309
- } }, void 0, false, {
310
- fileName: _jsxFileName$5,
311
- lineNumber: 140,
312
- columnNumber: 9
313
- }, void 0)
314
- }, void 0, false, {
315
- fileName: _jsxFileName$5,
316
- lineNumber: 128,
317
- columnNumber: 7
318
- }, void 0)] }, void 0, true, {
319
- fileName: _jsxFileName$5,
320
- lineNumber: 102,
321
- columnNumber: 5
322
- }, void 0) : /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(_washingtonpost_wpds_ui_kit.Select.Root, {
295
+ } })
296
+ })] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_washingtonpost_wpds_ui_kit.Select.Root, {
323
297
  onValueChange: (e) => setAnswer(e),
324
298
  required,
325
299
  ...defaultValueProp,
326
300
  ...disabledProp,
327
- children: [/* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(_washingtonpost_wpds_ui_kit.Select.Trigger, {
301
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_washingtonpost_wpds_ui_kit.Select.Trigger, {
328
302
  "data-test-id": `${id}-select-trigger`,
329
- children: [/* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(_washingtonpost_wpds_ui_kit.Select.Label, { children: label }, void 0, false, {
330
- fileName: _jsxFileName$5,
331
- lineNumber: 151,
332
- columnNumber: 9
333
- }, void 0), /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(_washingtonpost_wpds_ui_kit.Select.Value, {}, void 0, false, {
334
- fileName: _jsxFileName$5,
335
- lineNumber: 152,
336
- columnNumber: 9
337
- }, void 0)]
338
- }, void 0, true, {
339
- fileName: _jsxFileName$5,
340
- lineNumber: 150,
341
- columnNumber: 7
342
- }, void 0), /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(_washingtonpost_wpds_ui_kit.Select.Content, {
303
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_washingtonpost_wpds_ui_kit.Select.Label, { children: label }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_washingtonpost_wpds_ui_kit.Select.Value, {})]
304
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_washingtonpost_wpds_ui_kit.Select.Content, {
343
305
  css: { zIndex: _washingtonpost_wpds_ui_kit.theme.zIndices.page },
344
306
  "data-test-id": `${id}-select-content`,
345
- children: values.map((value) => /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(_washingtonpost_wpds_ui_kit.Select.Item, {
307
+ children: values.map((value) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_washingtonpost_wpds_ui_kit.Select.Item, {
346
308
  value,
347
309
  children: value
348
- }, value, false, {
349
- fileName: _jsxFileName$5,
350
- lineNumber: 159,
351
- columnNumber: 11
352
- }, void 0))
353
- }, void 0, false, {
354
- fileName: _jsxFileName$5,
355
- lineNumber: 154,
356
- columnNumber: 7
357
- }, void 0)]
358
- }, void 0, true, {
359
- fileName: _jsxFileName$5,
360
- lineNumber: 144,
361
- columnNumber: 5
362
- }, void 0);
310
+ }, value))
311
+ })]
312
+ });
363
313
  };
364
314
  //#endregion
365
315
  //#region src/components/DESelect/index.tsx
366
- var _jsxFileName$4 = "/var/jenkins/workspace/Subs-FE-Components_production/packages/de-inputs/src/components/DESelect/index.tsx";
367
316
  var scriptSrc = `${_washingtonpost_subs_sdk.ENDPOINTS.base}/de-utils/twpdeu.min.js`;
368
317
  var SelectWrapper = (0, _washingtonpost_wpds_ui_kit.styled)("div", {
369
318
  boxSizing: "border-box",
@@ -415,8 +364,8 @@ var DESelect = ({ source, fieldName, label, dataDictionaryConfig, existingValue,
415
364
  const defaultValueProp = existingValue && config ? { defaultValue: existingValue } : {};
416
365
  const disabledProp = disabled || !(children || config) ? { disabled: true } : {};
417
366
  const values = config ? [...config.values].sort((a, b) => a.order - b.order).filter((value) => value.archived !== true).filter(valuesFilter) : [];
418
- return /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(SelectWrapper, { children: [
419
- children && /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(_washingtonpost_wpds_ui_kit.Select.Root, {
367
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(SelectWrapper, { children: [
368
+ children && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_washingtonpost_wpds_ui_kit.Select.Root, {
420
369
  onValueChange: (e) => {
421
370
  setSelected(e);
422
371
  onChange({ value: e });
@@ -424,22 +373,14 @@ var DESelect = ({ source, fieldName, label, dataDictionaryConfig, existingValue,
424
373
  ...defaultValueProp,
425
374
  ...disabledProp,
426
375
  children
427
- }, void 0, false, {
428
- fileName: _jsxFileName$4,
429
- lineNumber: 147,
430
- columnNumber: 9
431
- }, void 0),
432
- !children && !config && /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(Dropdown, {
376
+ }),
377
+ !children && !config && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Dropdown, {
433
378
  id: "loading",
434
379
  label: "Loading...",
435
380
  values: [],
436
381
  disabled: true
437
- }, void 0, false, {
438
- fileName: _jsxFileName$4,
439
- lineNumber: 159,
440
- columnNumber: 9
441
- }, void 0),
442
- !children && config && /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(Dropdown, {
382
+ }),
383
+ !children && config && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Dropdown, {
443
384
  id: config.name,
444
385
  label: label || config.name,
445
386
  onChange: (e) => {
@@ -450,16 +391,8 @@ var DESelect = ({ source, fieldName, label, dataDictionaryConfig, existingValue,
450
391
  existingValue,
451
392
  disabled,
452
393
  valueSelectedByDefault
453
- }, void 0, false, {
454
- fileName: _jsxFileName$4,
455
- lineNumber: 167,
456
- columnNumber: 9
457
- }, void 0)
458
- ] }, void 0, true, {
459
- fileName: _jsxFileName$4,
460
- lineNumber: 145,
461
- columnNumber: 5
462
- }, void 0);
394
+ })
395
+ ] });
463
396
  };
464
397
  //#endregion
465
398
  //#region src/components/DEDisclosure/utils/getConfig.ts
@@ -477,10 +410,9 @@ var getConfig = async () => {
477
410
  };
478
411
  //#endregion
479
412
  //#region src/components/DEDisclosure/utils/hydrateLinks.tsx
480
- var _jsxFileName$3 = "/var/jenkins/workspace/Subs-FE-Components_production/packages/de-inputs/src/components/DEDisclosure/utils/hydrateLinks.tsx";
481
413
  var hydrateLinks = (str, onLinkClick = () => {}) => {
482
414
  return str.split(/({{PRIVACY_POLICY}})/g).map((chunk, i) => {
483
- if (chunk === "{{PRIVACY_POLICY}}") return /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)("a", {
415
+ if (chunk === "{{PRIVACY_POLICY}}") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
484
416
  rel: "noopener noreferrer",
485
417
  target: "_blank",
486
418
  style: { color: "inherit" },
@@ -488,13 +420,9 @@ var hydrateLinks = (str, onLinkClick = () => {}) => {
488
420
  href: "https://www.washingtonpost.com/privacy-policy/",
489
421
  onClick: (e) => onLinkClick(e),
490
422
  children: "Privacy Policy"
491
- }, `privacy-link-${i}`, false, {
492
- fileName: _jsxFileName$3,
493
- lineNumber: 13,
494
- columnNumber: 9
495
- }, void 0);
423
+ }, `privacy-link-${i}`);
496
424
  return chunk;
497
- }).reduce((prev, current) => /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(react_jsx_dev_runtime.Fragment, { children: [prev, current] }, void 0, true), /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(react_jsx_dev_runtime.Fragment, {}, void 0, false));
425
+ }).reduce((prev, current) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [prev, current] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, {}));
498
426
  };
499
427
  //#endregion
500
428
  //#region src/components/DEDisclosure/utils/checkOptAnonConsentCookie.ts
@@ -566,7 +494,6 @@ var useOnetrust = ({ allowCookieStore }) => {
566
494
  };
567
495
  //#endregion
568
496
  //#region src/components/DEDisclosure/DisclosureWithBannerStatus.tsx
569
- var _jsxFileName$2 = "/var/jenkins/workspace/Subs-FE-Components_production/packages/de-inputs/src/components/DEDisclosure/DisclosureWithBannerStatus.tsx";
570
497
  var DEDisclosureWithBannerStatus = ({ config, onFinished, allowCookieStore = true, onPrivacyPolicyClick = () => {} }) => {
571
498
  const [disclosure, setDisclosure] = (0, react.useState)(null);
572
499
  const [disclosureRendering, setDisclosureRendering] = (0, react.useState)(null);
@@ -576,11 +503,7 @@ var DEDisclosureWithBannerStatus = ({ config, onFinished, allowCookieStore = tru
576
503
  else setDisclosure(config.disclosure_beforebanner);
577
504
  }, [alertBoxClosed]);
578
505
  (0, react.useEffect)(() => {
579
- if (disclosure && Array.isArray(disclosure)) setDisclosureRendering(disclosure.reduce((prev, current) => /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(react_jsx_dev_runtime.Fragment, { children: [prev, /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)("p", { children: hydrateLinks(current, onPrivacyPolicyClick) }, void 0, false, {
580
- fileName: _jsxFileName$2,
581
- lineNumber: 55,
582
- columnNumber: 15
583
- }, void 0)] }, void 0, true), /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(react_jsx_dev_runtime.Fragment, {}, void 0, false)));
506
+ if (disclosure && Array.isArray(disclosure)) setDisclosureRendering(disclosure.reduce((prev, current) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [prev, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: hydrateLinks(current, onPrivacyPolicyClick) })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, {})));
584
507
  }, [disclosure]);
585
508
  (0, react.useEffect)(() => {
586
509
  if (disclosureRendering && consentCookieExists) onFinished({
@@ -592,7 +515,6 @@ var DEDisclosureWithBannerStatus = ({ config, onFinished, allowCookieStore = tru
592
515
  };
593
516
  //#endregion
594
517
  //#region src/components/DEDisclosure/DisclosureWithoutBannerStatus.tsx
595
- var _jsxFileName$1 = "/var/jenkins/workspace/Subs-FE-Components_production/packages/de-inputs/src/components/DEDisclosure/DisclosureWithoutBannerStatus.tsx";
596
518
  var DEDisclosureWithoutBannerStatus = ({ config, onFinished, onPrivacyPolicyClick = () => {} }) => {
597
519
  const [disclosure, setDisclosure] = (0, react.useState)(null);
598
520
  const [disclosureRendering, setDisclosureRendering] = (0, react.useState)(null);
@@ -600,11 +522,7 @@ var DEDisclosureWithoutBannerStatus = ({ config, onFinished, onPrivacyPolicyClic
600
522
  if (config) setDisclosure(config.disclosure);
601
523
  }, [config]);
602
524
  (0, react.useEffect)(() => {
603
- if (disclosure && Array.isArray(disclosure)) setDisclosureRendering(disclosure.reduce((prev, current) => /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(react_jsx_dev_runtime.Fragment, { children: [prev, /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)("p", { children: hydrateLinks(current, onPrivacyPolicyClick) }, void 0, false, {
604
- fileName: _jsxFileName$1,
605
- lineNumber: 38,
606
- columnNumber: 15
607
- }, void 0)] }, void 0, true), /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(react_jsx_dev_runtime.Fragment, {}, void 0, false)));
525
+ if (disclosure && Array.isArray(disclosure)) setDisclosureRendering(disclosure.reduce((prev, current) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [prev, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: hydrateLinks(current, onPrivacyPolicyClick) })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, {})));
608
526
  }, [disclosure]);
609
527
  (0, react.useEffect)(() => {
610
528
  if (disclosureRendering) onFinished({
@@ -616,7 +534,6 @@ var DEDisclosureWithoutBannerStatus = ({ config, onFinished, onPrivacyPolicyClic
616
534
  };
617
535
  //#endregion
618
536
  //#region src/components/DEDisclosure/index.tsx
619
- var _jsxFileName = "/var/jenkins/workspace/Subs-FE-Components_production/packages/de-inputs/src/components/DEDisclosure/index.tsx";
620
537
  var DEDisclosure = ({ onFinished = () => {}, allowCookieStore = true, onPrivacyPolicyClick = () => {} }) => {
621
538
  const [disclosureRendering, setDisclosureRendering] = (0, react.useState)(null);
622
539
  const [myConfig, setMyConfig] = (0, react.useState)();
@@ -628,40 +545,24 @@ var DEDisclosure = ({ onFinished = () => {}, allowCookieStore = true, onPrivacyP
628
545
  })();
629
546
  }, []);
630
547
  (0, react.useEffect)(() => {
631
- if (myConfig) if ("checkBannerStatus" in myConfig && myConfig.checkBannerStatus) setDisclosureRendering(/* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(DEDisclosureWithBannerStatus, {
548
+ if (myConfig) if ("checkBannerStatus" in myConfig && myConfig.checkBannerStatus) setDisclosureRendering(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DEDisclosureWithBannerStatus, {
632
549
  config: myConfig,
633
550
  allowCookieStore,
634
551
  onFinished,
635
552
  onPrivacyPolicyClick
636
- }, void 0, false, {
637
- fileName: _jsxFileName,
638
- lineNumber: 55,
639
- columnNumber: 11
640
- }, void 0));
641
- else if ("disclosure" in myConfig) setDisclosureRendering(/* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)(DEDisclosureWithoutBannerStatus, {
553
+ }));
554
+ else if ("disclosure" in myConfig) setDisclosureRendering(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DEDisclosureWithoutBannerStatus, {
642
555
  config: myConfig,
643
556
  onFinished,
644
557
  onPrivacyPolicyClick
645
- }, void 0, false, {
646
- fileName: _jsxFileName,
647
- lineNumber: 64,
648
- columnNumber: 11
649
- }, void 0));
558
+ }));
650
559
  else console.error("Invalid config");
651
560
  }, [myConfig]);
652
- if (disclosureRendering) return /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)("div", {
561
+ if (disclosureRendering) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
653
562
  "data-test-id": "de-disclosure",
654
563
  children: disclosureRendering
655
- }, void 0, false, {
656
- fileName: _jsxFileName,
657
- lineNumber: 77,
658
- columnNumber: 12
659
- }, void 0);
660
- return /* @__PURE__ */ (0, react_jsx_dev_runtime.jsxDEV)("div", { "data-test-id": "de-disclosure-loading" }, void 0, false, {
661
- fileName: _jsxFileName,
662
- lineNumber: 80,
663
- columnNumber: 10
664
- }, void 0);
564
+ });
565
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { "data-test-id": "de-disclosure-loading" });
665
566
  };
666
567
  //#endregion
667
568
  //#region src/constants/IngestDataTypes.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/interfaces/index.ts","../src/utils/checkConsentCookieForAllowTargeting.ts","../src/components/DEDisclosure/utils/checkAlertBoxClosedCookie.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/getAttributes.ts","../src/services/sendToGA.ts","../src/services/ingest.ts","../src/utils/isAnonymousWebview.ts","../src/utils/push.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/hooks/useOnetrust.ts","../src/components/DEDisclosure/DisclosureWithBannerStatus.tsx","../src/components/DEDisclosure/DisclosureWithoutBannerStatus.tsx","../src/components/DEDisclosure/index.tsx","../src/constants/IngestDataTypes.ts"],"sourcesContent":["import type { ResponseStatusType } from '@washingtonpost/subs-sdk';\n\nexport 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\n// https://github.com/WashPost/subs-be-user-data-enrichment/blob/8e8f8460c59adbe9c83b50f368bff1d3300bfd6b/src/main/java/washpost/paywall/userdataenrichment/model/ResponseState.java#L19\nexport const DeleteAttributeState = {\n SUCCESS: '150',\n SYSTEM_ERROR: '151',\n INVALID_ATTRIBUTE_NAME: '152',\n INVALID_ATTRIBUTE_NOT_EXISTS: '153',\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\nexport interface IProfileResponse {\n status: ResponseStatusType;\n state: (typeof AttributesState)[keyof typeof AttributesState];\n attributes: {\n [key: string]: {\n attribute_name: string;\n value: string | null;\n date_created: number;\n last_modified_date: number;\n };\n };\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 { 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 if (window.pageType === 'onboarding') {\n const gdprAllowTargarting = checkConsentCookieForAllowTargeting();\n if (\n typeof gdprAllowTargarting === 'boolean' &&\n checkAlertBoxClosedCookie()\n ) {\n return gdprAllowTargarting;\n }\n\n // Downstream systems\n // Checking for window.pageType === 'onboarding' to avoid being true on graphics articles etc for now -- MNI-710\n if (intl_region === 'EEA' && window.pageType === 'onboarding') {\n return true;\n }\n }\n\n return false;\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n DEFAULT_HEADERS,\n} from '@washingtonpost/subs-sdk';\nimport type { Attribute } from '../interfaces';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\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: DEFAULT_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 }\n return [];\n } catch (e) {\n console.debug(e);\n return [];\n }\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\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\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","import {\n ENDPOINTS,\n DEFAULT_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport type { ResponseStatusType } from '@washingtonpost/subs-sdk';\nimport { type 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: DEFAULT_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 { 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","import type { ResponseStatusType } from '@washingtonpost/subs-sdk';\nimport { CollectionBehaviors, IngestType } 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\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 }\n return sendToGA({ submitData, source });\n};\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 existingValue?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n valueSelectedByDefault?: string;\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 existingValue,\n onChange = () => {},\n disabled = false,\n valueSelectedByDefault,\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 const presetDropdownValue = existingValue || valueSelectedByDefault;\n\n // helps maintain state between WPDS and native dropdowns\n const defaultValueProp = answer\n ? { defaultValue: answer }\n : presetDropdownValue\n ? { defaultValue: presetDropdownValue }\n : {};\n\n const defaultValuePropMobile = (value: string) => {\n if (answer) {\n return value === answer ? { selected: true } : {};\n }\n return value === presetDropdownValue ? { 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 type { 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 existingValue?: 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 valueSelectedByDefault?: string;\n defaultValue?: never;\n}\n\nconst scriptSrc = `${ENDPOINTS.base}/de-utils/twpdeu.min.js`;\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\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n existingValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n valueSelectedByDefault,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState(\n !existingValue && valueSelectedByDefault ? valueSelectedByDefault : ''\n );\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const config = await window?.__twpdeu?.getFieldConfigs({\n fieldName,\n });\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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\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 =\n existingValue && config ? { defaultValue: existingValue } : {};\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 existingValue={existingValue}\n disabled={disabled}\n valueSelectedByDefault={valueSelectedByDefault}\n />\n )}\n </SelectWrapper>\n );\n};\n","import { ENDPOINTS, WPGeo } from '@washingtonpost/subs-sdk';\nimport type {\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;\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((chunk, i) => {\n if (chunk === '{{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 chunk;\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 { useState, useEffect } from 'react';\nimport type { ICookieStore } from '@washingtonpost/subs-sdk';\nimport { listenToCookieStore as listenToCookieStoreUtil } 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 const 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 type { ReactEventHandler } from 'react';\nimport React, { useState, useEffect } from 'react';\nimport type { 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(\n (prev, current) => (\n <>\n {prev}\n <p>{hydrateLinks(current, onPrivacyPolicyClick)}</p>\n </>\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 type { ReactEventHandler } from 'react';\nimport React, { useState, useEffect } from 'react';\nimport type { 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(\n (prev, current) => (\n <>\n {prev}\n <p>{hydrateLinks(current, onPrivacyPolicyClick)}</p>\n </>\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 type { ReactEventHandler } from 'react';\nimport React, { useState, useEffect } from 'react';\nimport type { 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 = () => {},\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 JOB_TITLE: 'profile_job_title',\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 EDU_ROLE: 'profile_edu_role',\n EDU_MAJOR: 'profile_edu_major',\n EDU_GRADUATION_YEAR: 'profile_edu_graduation_year',\n} as const;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/interfaces/index.ts","../src/utils/checkConsentCookieForAllowTargeting.ts","../src/components/DEDisclosure/utils/checkAlertBoxClosedCookie.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/getAttributes.ts","../src/services/sendToGA.ts","../src/services/ingest.ts","../src/utils/isAnonymousWebview.ts","../src/utils/push.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/hooks/useOnetrust.ts","../src/components/DEDisclosure/DisclosureWithBannerStatus.tsx","../src/components/DEDisclosure/DisclosureWithoutBannerStatus.tsx","../src/components/DEDisclosure/index.tsx","../src/constants/IngestDataTypes.ts"],"sourcesContent":["import type { ResponseStatusType } from '@washingtonpost/subs-sdk';\n\nexport 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\n// https://github.com/WashPost/subs-be-user-data-enrichment/blob/8e8f8460c59adbe9c83b50f368bff1d3300bfd6b/src/main/java/washpost/paywall/userdataenrichment/model/ResponseState.java#L19\nexport const DeleteAttributeState = {\n SUCCESS: '150',\n SYSTEM_ERROR: '151',\n INVALID_ATTRIBUTE_NAME: '152',\n INVALID_ATTRIBUTE_NOT_EXISTS: '153',\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\nexport interface IProfileResponse {\n status: ResponseStatusType;\n state: (typeof AttributesState)[keyof typeof AttributesState];\n attributes: {\n [key: string]: {\n attribute_name: string;\n value: string | null;\n date_created: number;\n last_modified_date: number;\n };\n };\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 { 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 if (window.pageType === 'onboarding') {\n const gdprAllowTargarting = checkConsentCookieForAllowTargeting();\n if (\n typeof gdprAllowTargarting === 'boolean' &&\n checkAlertBoxClosedCookie()\n ) {\n return gdprAllowTargarting;\n }\n\n // Downstream systems\n // Checking for window.pageType === 'onboarding' to avoid being true on graphics articles etc for now -- MNI-710\n if (intl_region === 'EEA' && window.pageType === 'onboarding') {\n return true;\n }\n }\n\n return false;\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n DEFAULT_HEADERS,\n} from '@washingtonpost/subs-sdk';\nimport type { Attribute } from '../interfaces';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\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: DEFAULT_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 }\n return [];\n } catch (e) {\n console.debug(e);\n return [];\n }\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\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\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","import {\n ENDPOINTS,\n DEFAULT_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport type { ResponseStatusType } from '@washingtonpost/subs-sdk';\nimport { type 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: DEFAULT_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 { 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","import type { ResponseStatusType } from '@washingtonpost/subs-sdk';\nimport { CollectionBehaviors, IngestType } 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\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 }\n return sendToGA({ submitData, source });\n};\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 existingValue?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n valueSelectedByDefault?: string;\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 existingValue,\n onChange = () => {},\n disabled = false,\n valueSelectedByDefault,\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 const presetDropdownValue = existingValue || valueSelectedByDefault;\n\n // helps maintain state between WPDS and native dropdowns\n const defaultValueProp = answer\n ? { defaultValue: answer }\n : presetDropdownValue\n ? { defaultValue: presetDropdownValue }\n : {};\n\n const defaultValuePropMobile = (value: string) => {\n if (answer) {\n return value === answer ? { selected: true } : {};\n }\n return value === presetDropdownValue ? { 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 type { 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 existingValue?: 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 valueSelectedByDefault?: string;\n defaultValue?: never;\n}\n\nconst scriptSrc = `${ENDPOINTS.base}/de-utils/twpdeu.min.js`;\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\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n existingValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n valueSelectedByDefault,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState(\n !existingValue && valueSelectedByDefault ? valueSelectedByDefault : ''\n );\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const config = await window?.__twpdeu?.getFieldConfigs({\n fieldName,\n });\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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\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 =\n existingValue && config ? { defaultValue: existingValue } : {};\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 existingValue={existingValue}\n disabled={disabled}\n valueSelectedByDefault={valueSelectedByDefault}\n />\n )}\n </SelectWrapper>\n );\n};\n","import { ENDPOINTS, WPGeo } from '@washingtonpost/subs-sdk';\nimport type {\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;\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((chunk, i) => {\n if (chunk === '{{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 chunk;\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 { useState, useEffect } from 'react';\nimport type { ICookieStore } from '@washingtonpost/subs-sdk';\nimport { listenToCookieStore as listenToCookieStoreUtil } 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 const 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 type { ReactEventHandler } from 'react';\nimport React, { useState, useEffect } from 'react';\nimport type { 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(\n (prev, current) => (\n <>\n {prev}\n <p>{hydrateLinks(current, onPrivacyPolicyClick)}</p>\n </>\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 type { ReactEventHandler } from 'react';\nimport React, { useState, useEffect } from 'react';\nimport type { 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(\n (prev, current) => (\n <>\n {prev}\n <p>{hydrateLinks(current, onPrivacyPolicyClick)}</p>\n </>\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 type { ReactEventHandler } from 'react';\nimport React, { useState, useEffect } from 'react';\nimport type { 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 = () => {},\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 JOB_TITLE: 'profile_job_title',\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 EDU_ROLE: 'profile_edu_role',\n EDU_MAJOR: 'profile_edu_major',\n EDU_GRADUATION_YEAR: 'profile_edu_graduation_year',\n} as const;\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import { useEffect, useState } from "react";
3
3
  import { Icon, Select, styled, theme } from "@washingtonpost/wpds-ui-kit";
4
4
  import { ScriptStatus, useScript, useWindowSize } from "@washingtonpost/subs-hooks";
5
5
  import { ChevronDown } from "@washingtonpost/wpds-assets";
6
- import { Fragment, jsxDEV } from "react/jsx-dev-runtime";
6
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
7
  //#region src/interfaces/index.ts
8
8
  var CollectionBehaviors = {
9
9
  COLLECT: "COLLECT",
@@ -172,7 +172,6 @@ var push = async ({ submitData, source }) => {
172
172
  };
173
173
  //#endregion
174
174
  //#region src/components/DESelect/Dropdown.tsx
175
- var _jsxFileName$5 = "/var/jenkins/workspace/Subs-FE-Components_production/packages/de-inputs/src/components/DESelect/Dropdown.tsx";
176
175
  var StyledMobileSelect = styled("select", {
177
176
  padding: "12px 16px 12px 6px",
178
177
  display: "flex",
@@ -232,43 +231,27 @@ var Dropdown = ({ id, label, values, required = false, existingValue, onChange =
232
231
  if (answer) return value === answer ? { selected: true } : {};
233
232
  return value === presetDropdownValue ? { selected: true } : {};
234
233
  };
235
- return isMobileSize ? /* @__PURE__ */ jsxDEV(StyledSelectWrapper, { children: [/* @__PURE__ */ jsxDEV(StyledMobileSelect, {
234
+ return isMobileSize ? /* @__PURE__ */ jsxs(StyledSelectWrapper, { children: [/* @__PURE__ */ jsxs(StyledMobileSelect, {
236
235
  id: "",
237
236
  required,
238
237
  onChange: (e) => setAnswer(e.target.value),
239
238
  ...disabledProp,
240
239
  children: [
241
- /* @__PURE__ */ jsxDEV("label", { children: label }, void 0, false, {
242
- fileName: _jsxFileName$5,
243
- lineNumber: 109,
244
- columnNumber: 9
245
- }, void 0),
246
- /* @__PURE__ */ jsxDEV(StyledMobileOption, {
240
+ /* @__PURE__ */ jsx("label", { children: label }),
241
+ /* @__PURE__ */ jsx(StyledMobileOption, {
247
242
  value: "",
248
243
  disabled: true,
249
244
  selected: true,
250
245
  style: { color: "#666666" },
251
246
  children: label
252
- }, void 0, false, {
253
- fileName: _jsxFileName$5,
254
- lineNumber: 110,
255
- columnNumber: 9
256
- }, void 0),
257
- values.map((value) => /* @__PURE__ */ jsxDEV(StyledMobileOption, {
247
+ }),
248
+ values.map((value) => /* @__PURE__ */ jsx(StyledMobileOption, {
258
249
  value,
259
250
  ...defaultValuePropMobile(value),
260
251
  children: value
261
- }, value, false, {
262
- fileName: _jsxFileName$5,
263
- lineNumber: 119,
264
- columnNumber: 11
265
- }, void 0))
252
+ }, value))
266
253
  ]
267
- }, void 0, true, {
268
- fileName: _jsxFileName$5,
269
- lineNumber: 103,
270
- columnNumber: 7
271
- }, void 0), /* @__PURE__ */ jsxDEV(Icon, {
254
+ }), /* @__PURE__ */ jsx(Icon, {
272
255
  label: "",
273
256
  size: "100",
274
257
  fill: theme.colors.gray80,
@@ -279,67 +262,30 @@ var Dropdown = ({ id, label, values, required = false, existingValue, onChange =
279
262
  top: "50%",
280
263
  transform: "translateY(-50%)"
281
264
  },
282
- children: /* @__PURE__ */ jsxDEV(ChevronDown, { style: {
265
+ children: /* @__PURE__ */ jsx(ChevronDown, { style: {
283
266
  position: "absolute",
284
267
  right: "10px"
285
- } }, void 0, false, {
286
- fileName: _jsxFileName$5,
287
- lineNumber: 140,
288
- columnNumber: 9
289
- }, void 0)
290
- }, void 0, false, {
291
- fileName: _jsxFileName$5,
292
- lineNumber: 128,
293
- columnNumber: 7
294
- }, void 0)] }, void 0, true, {
295
- fileName: _jsxFileName$5,
296
- lineNumber: 102,
297
- columnNumber: 5
298
- }, void 0) : /* @__PURE__ */ jsxDEV(Select.Root, {
268
+ } })
269
+ })] }) : /* @__PURE__ */ jsxs(Select.Root, {
299
270
  onValueChange: (e) => setAnswer(e),
300
271
  required,
301
272
  ...defaultValueProp,
302
273
  ...disabledProp,
303
- children: [/* @__PURE__ */ jsxDEV(Select.Trigger, {
274
+ children: [/* @__PURE__ */ jsxs(Select.Trigger, {
304
275
  "data-test-id": `${id}-select-trigger`,
305
- children: [/* @__PURE__ */ jsxDEV(Select.Label, { children: label }, void 0, false, {
306
- fileName: _jsxFileName$5,
307
- lineNumber: 151,
308
- columnNumber: 9
309
- }, void 0), /* @__PURE__ */ jsxDEV(Select.Value, {}, void 0, false, {
310
- fileName: _jsxFileName$5,
311
- lineNumber: 152,
312
- columnNumber: 9
313
- }, void 0)]
314
- }, void 0, true, {
315
- fileName: _jsxFileName$5,
316
- lineNumber: 150,
317
- columnNumber: 7
318
- }, void 0), /* @__PURE__ */ jsxDEV(Select.Content, {
276
+ children: [/* @__PURE__ */ jsx(Select.Label, { children: label }), /* @__PURE__ */ jsx(Select.Value, {})]
277
+ }), /* @__PURE__ */ jsx(Select.Content, {
319
278
  css: { zIndex: theme.zIndices.page },
320
279
  "data-test-id": `${id}-select-content`,
321
- children: values.map((value) => /* @__PURE__ */ jsxDEV(Select.Item, {
280
+ children: values.map((value) => /* @__PURE__ */ jsx(Select.Item, {
322
281
  value,
323
282
  children: value
324
- }, value, false, {
325
- fileName: _jsxFileName$5,
326
- lineNumber: 159,
327
- columnNumber: 11
328
- }, void 0))
329
- }, void 0, false, {
330
- fileName: _jsxFileName$5,
331
- lineNumber: 154,
332
- columnNumber: 7
333
- }, void 0)]
334
- }, void 0, true, {
335
- fileName: _jsxFileName$5,
336
- lineNumber: 144,
337
- columnNumber: 5
338
- }, void 0);
283
+ }, value))
284
+ })]
285
+ });
339
286
  };
340
287
  //#endregion
341
288
  //#region src/components/DESelect/index.tsx
342
- var _jsxFileName$4 = "/var/jenkins/workspace/Subs-FE-Components_production/packages/de-inputs/src/components/DESelect/index.tsx";
343
289
  var scriptSrc = `${ENDPOINTS.base}/de-utils/twpdeu.min.js`;
344
290
  var SelectWrapper = styled("div", {
345
291
  boxSizing: "border-box",
@@ -391,8 +337,8 @@ var DESelect = ({ source, fieldName, label, dataDictionaryConfig, existingValue,
391
337
  const defaultValueProp = existingValue && config ? { defaultValue: existingValue } : {};
392
338
  const disabledProp = disabled || !(children || config) ? { disabled: true } : {};
393
339
  const values = config ? [...config.values].sort((a, b) => a.order - b.order).filter((value) => value.archived !== true).filter(valuesFilter) : [];
394
- return /* @__PURE__ */ jsxDEV(SelectWrapper, { children: [
395
- children && /* @__PURE__ */ jsxDEV(Select.Root, {
340
+ return /* @__PURE__ */ jsxs(SelectWrapper, { children: [
341
+ children && /* @__PURE__ */ jsx(Select.Root, {
396
342
  onValueChange: (e) => {
397
343
  setSelected(e);
398
344
  onChange({ value: e });
@@ -400,22 +346,14 @@ var DESelect = ({ source, fieldName, label, dataDictionaryConfig, existingValue,
400
346
  ...defaultValueProp,
401
347
  ...disabledProp,
402
348
  children
403
- }, void 0, false, {
404
- fileName: _jsxFileName$4,
405
- lineNumber: 147,
406
- columnNumber: 9
407
- }, void 0),
408
- !children && !config && /* @__PURE__ */ jsxDEV(Dropdown, {
349
+ }),
350
+ !children && !config && /* @__PURE__ */ jsx(Dropdown, {
409
351
  id: "loading",
410
352
  label: "Loading...",
411
353
  values: [],
412
354
  disabled: true
413
- }, void 0, false, {
414
- fileName: _jsxFileName$4,
415
- lineNumber: 159,
416
- columnNumber: 9
417
- }, void 0),
418
- !children && config && /* @__PURE__ */ jsxDEV(Dropdown, {
355
+ }),
356
+ !children && config && /* @__PURE__ */ jsx(Dropdown, {
419
357
  id: config.name,
420
358
  label: label || config.name,
421
359
  onChange: (e) => {
@@ -426,16 +364,8 @@ var DESelect = ({ source, fieldName, label, dataDictionaryConfig, existingValue,
426
364
  existingValue,
427
365
  disabled,
428
366
  valueSelectedByDefault
429
- }, void 0, false, {
430
- fileName: _jsxFileName$4,
431
- lineNumber: 167,
432
- columnNumber: 9
433
- }, void 0)
434
- ] }, void 0, true, {
435
- fileName: _jsxFileName$4,
436
- lineNumber: 145,
437
- columnNumber: 5
438
- }, void 0);
367
+ })
368
+ ] });
439
369
  };
440
370
  //#endregion
441
371
  //#region src/components/DEDisclosure/utils/getConfig.ts
@@ -453,10 +383,9 @@ var getConfig = async () => {
453
383
  };
454
384
  //#endregion
455
385
  //#region src/components/DEDisclosure/utils/hydrateLinks.tsx
456
- var _jsxFileName$3 = "/var/jenkins/workspace/Subs-FE-Components_production/packages/de-inputs/src/components/DEDisclosure/utils/hydrateLinks.tsx";
457
386
  var hydrateLinks = (str, onLinkClick = () => {}) => {
458
387
  return str.split(/({{PRIVACY_POLICY}})/g).map((chunk, i) => {
459
- if (chunk === "{{PRIVACY_POLICY}}") return /* @__PURE__ */ jsxDEV("a", {
388
+ if (chunk === "{{PRIVACY_POLICY}}") return /* @__PURE__ */ jsx("a", {
460
389
  rel: "noopener noreferrer",
461
390
  target: "_blank",
462
391
  style: { color: "inherit" },
@@ -464,13 +393,9 @@ var hydrateLinks = (str, onLinkClick = () => {}) => {
464
393
  href: "https://www.washingtonpost.com/privacy-policy/",
465
394
  onClick: (e) => onLinkClick(e),
466
395
  children: "Privacy Policy"
467
- }, `privacy-link-${i}`, false, {
468
- fileName: _jsxFileName$3,
469
- lineNumber: 13,
470
- columnNumber: 9
471
- }, void 0);
396
+ }, `privacy-link-${i}`);
472
397
  return chunk;
473
- }).reduce((prev, current) => /* @__PURE__ */ jsxDEV(Fragment, { children: [prev, current] }, void 0, true), /* @__PURE__ */ jsxDEV(Fragment, {}, void 0, false));
398
+ }).reduce((prev, current) => /* @__PURE__ */ jsxs(Fragment, { children: [prev, current] }), /* @__PURE__ */ jsx(Fragment, {}));
474
399
  };
475
400
  //#endregion
476
401
  //#region src/components/DEDisclosure/utils/checkOptAnonConsentCookie.ts
@@ -542,7 +467,6 @@ var useOnetrust = ({ allowCookieStore }) => {
542
467
  };
543
468
  //#endregion
544
469
  //#region src/components/DEDisclosure/DisclosureWithBannerStatus.tsx
545
- var _jsxFileName$2 = "/var/jenkins/workspace/Subs-FE-Components_production/packages/de-inputs/src/components/DEDisclosure/DisclosureWithBannerStatus.tsx";
546
470
  var DEDisclosureWithBannerStatus = ({ config, onFinished, allowCookieStore = true, onPrivacyPolicyClick = () => {} }) => {
547
471
  const [disclosure, setDisclosure] = useState(null);
548
472
  const [disclosureRendering, setDisclosureRendering] = useState(null);
@@ -552,11 +476,7 @@ var DEDisclosureWithBannerStatus = ({ config, onFinished, allowCookieStore = tru
552
476
  else setDisclosure(config.disclosure_beforebanner);
553
477
  }, [alertBoxClosed]);
554
478
  useEffect(() => {
555
- if (disclosure && Array.isArray(disclosure)) setDisclosureRendering(disclosure.reduce((prev, current) => /* @__PURE__ */ jsxDEV(Fragment, { children: [prev, /* @__PURE__ */ jsxDEV("p", { children: hydrateLinks(current, onPrivacyPolicyClick) }, void 0, false, {
556
- fileName: _jsxFileName$2,
557
- lineNumber: 55,
558
- columnNumber: 15
559
- }, void 0)] }, void 0, true), /* @__PURE__ */ jsxDEV(Fragment, {}, void 0, false)));
479
+ if (disclosure && Array.isArray(disclosure)) setDisclosureRendering(disclosure.reduce((prev, current) => /* @__PURE__ */ jsxs(Fragment, { children: [prev, /* @__PURE__ */ jsx("p", { children: hydrateLinks(current, onPrivacyPolicyClick) })] }), /* @__PURE__ */ jsx(Fragment, {})));
560
480
  }, [disclosure]);
561
481
  useEffect(() => {
562
482
  if (disclosureRendering && consentCookieExists) onFinished({
@@ -568,7 +488,6 @@ var DEDisclosureWithBannerStatus = ({ config, onFinished, allowCookieStore = tru
568
488
  };
569
489
  //#endregion
570
490
  //#region src/components/DEDisclosure/DisclosureWithoutBannerStatus.tsx
571
- var _jsxFileName$1 = "/var/jenkins/workspace/Subs-FE-Components_production/packages/de-inputs/src/components/DEDisclosure/DisclosureWithoutBannerStatus.tsx";
572
491
  var DEDisclosureWithoutBannerStatus = ({ config, onFinished, onPrivacyPolicyClick = () => {} }) => {
573
492
  const [disclosure, setDisclosure] = useState(null);
574
493
  const [disclosureRendering, setDisclosureRendering] = useState(null);
@@ -576,11 +495,7 @@ var DEDisclosureWithoutBannerStatus = ({ config, onFinished, onPrivacyPolicyClic
576
495
  if (config) setDisclosure(config.disclosure);
577
496
  }, [config]);
578
497
  useEffect(() => {
579
- if (disclosure && Array.isArray(disclosure)) setDisclosureRendering(disclosure.reduce((prev, current) => /* @__PURE__ */ jsxDEV(Fragment, { children: [prev, /* @__PURE__ */ jsxDEV("p", { children: hydrateLinks(current, onPrivacyPolicyClick) }, void 0, false, {
580
- fileName: _jsxFileName$1,
581
- lineNumber: 38,
582
- columnNumber: 15
583
- }, void 0)] }, void 0, true), /* @__PURE__ */ jsxDEV(Fragment, {}, void 0, false)));
498
+ if (disclosure && Array.isArray(disclosure)) setDisclosureRendering(disclosure.reduce((prev, current) => /* @__PURE__ */ jsxs(Fragment, { children: [prev, /* @__PURE__ */ jsx("p", { children: hydrateLinks(current, onPrivacyPolicyClick) })] }), /* @__PURE__ */ jsx(Fragment, {})));
584
499
  }, [disclosure]);
585
500
  useEffect(() => {
586
501
  if (disclosureRendering) onFinished({
@@ -592,7 +507,6 @@ var DEDisclosureWithoutBannerStatus = ({ config, onFinished, onPrivacyPolicyClic
592
507
  };
593
508
  //#endregion
594
509
  //#region src/components/DEDisclosure/index.tsx
595
- var _jsxFileName = "/var/jenkins/workspace/Subs-FE-Components_production/packages/de-inputs/src/components/DEDisclosure/index.tsx";
596
510
  var DEDisclosure = ({ onFinished = () => {}, allowCookieStore = true, onPrivacyPolicyClick = () => {} }) => {
597
511
  const [disclosureRendering, setDisclosureRendering] = useState(null);
598
512
  const [myConfig, setMyConfig] = useState();
@@ -604,40 +518,24 @@ var DEDisclosure = ({ onFinished = () => {}, allowCookieStore = true, onPrivacyP
604
518
  })();
605
519
  }, []);
606
520
  useEffect(() => {
607
- if (myConfig) if ("checkBannerStatus" in myConfig && myConfig.checkBannerStatus) setDisclosureRendering(/* @__PURE__ */ jsxDEV(DEDisclosureWithBannerStatus, {
521
+ if (myConfig) if ("checkBannerStatus" in myConfig && myConfig.checkBannerStatus) setDisclosureRendering(/* @__PURE__ */ jsx(DEDisclosureWithBannerStatus, {
608
522
  config: myConfig,
609
523
  allowCookieStore,
610
524
  onFinished,
611
525
  onPrivacyPolicyClick
612
- }, void 0, false, {
613
- fileName: _jsxFileName,
614
- lineNumber: 55,
615
- columnNumber: 11
616
- }, void 0));
617
- else if ("disclosure" in myConfig) setDisclosureRendering(/* @__PURE__ */ jsxDEV(DEDisclosureWithoutBannerStatus, {
526
+ }));
527
+ else if ("disclosure" in myConfig) setDisclosureRendering(/* @__PURE__ */ jsx(DEDisclosureWithoutBannerStatus, {
618
528
  config: myConfig,
619
529
  onFinished,
620
530
  onPrivacyPolicyClick
621
- }, void 0, false, {
622
- fileName: _jsxFileName,
623
- lineNumber: 64,
624
- columnNumber: 11
625
- }, void 0));
531
+ }));
626
532
  else console.error("Invalid config");
627
533
  }, [myConfig]);
628
- if (disclosureRendering) return /* @__PURE__ */ jsxDEV("div", {
534
+ if (disclosureRendering) return /* @__PURE__ */ jsx("div", {
629
535
  "data-test-id": "de-disclosure",
630
536
  children: disclosureRendering
631
- }, void 0, false, {
632
- fileName: _jsxFileName,
633
- lineNumber: 77,
634
- columnNumber: 12
635
- }, void 0);
636
- return /* @__PURE__ */ jsxDEV("div", { "data-test-id": "de-disclosure-loading" }, void 0, false, {
637
- fileName: _jsxFileName,
638
- lineNumber: 80,
639
- columnNumber: 10
640
- }, void 0);
537
+ });
538
+ return /* @__PURE__ */ jsx("div", { "data-test-id": "de-disclosure-loading" });
641
539
  };
642
540
  //#endregion
643
541
  //#region src/constants/IngestDataTypes.ts
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/interfaces/index.ts","../src/utils/checkConsentCookieForAllowTargeting.ts","../src/components/DEDisclosure/utils/checkAlertBoxClosedCookie.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/getAttributes.ts","../src/services/sendToGA.ts","../src/services/ingest.ts","../src/utils/isAnonymousWebview.ts","../src/utils/push.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/hooks/useOnetrust.ts","../src/components/DEDisclosure/DisclosureWithBannerStatus.tsx","../src/components/DEDisclosure/DisclosureWithoutBannerStatus.tsx","../src/components/DEDisclosure/index.tsx","../src/constants/IngestDataTypes.ts"],"sourcesContent":["import type { ResponseStatusType } from '@washingtonpost/subs-sdk';\n\nexport 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\n// https://github.com/WashPost/subs-be-user-data-enrichment/blob/8e8f8460c59adbe9c83b50f368bff1d3300bfd6b/src/main/java/washpost/paywall/userdataenrichment/model/ResponseState.java#L19\nexport const DeleteAttributeState = {\n SUCCESS: '150',\n SYSTEM_ERROR: '151',\n INVALID_ATTRIBUTE_NAME: '152',\n INVALID_ATTRIBUTE_NOT_EXISTS: '153',\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\nexport interface IProfileResponse {\n status: ResponseStatusType;\n state: (typeof AttributesState)[keyof typeof AttributesState];\n attributes: {\n [key: string]: {\n attribute_name: string;\n value: string | null;\n date_created: number;\n last_modified_date: number;\n };\n };\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 { 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 if (window.pageType === 'onboarding') {\n const gdprAllowTargarting = checkConsentCookieForAllowTargeting();\n if (\n typeof gdprAllowTargarting === 'boolean' &&\n checkAlertBoxClosedCookie()\n ) {\n return gdprAllowTargarting;\n }\n\n // Downstream systems\n // Checking for window.pageType === 'onboarding' to avoid being true on graphics articles etc for now -- MNI-710\n if (intl_region === 'EEA' && window.pageType === 'onboarding') {\n return true;\n }\n }\n\n return false;\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n DEFAULT_HEADERS,\n} from '@washingtonpost/subs-sdk';\nimport type { Attribute } from '../interfaces';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\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: DEFAULT_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 }\n return [];\n } catch (e) {\n console.debug(e);\n return [];\n }\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\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\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","import {\n ENDPOINTS,\n DEFAULT_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport type { ResponseStatusType } from '@washingtonpost/subs-sdk';\nimport { type 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: DEFAULT_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 { 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","import type { ResponseStatusType } from '@washingtonpost/subs-sdk';\nimport { CollectionBehaviors, IngestType } 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\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 }\n return sendToGA({ submitData, source });\n};\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 existingValue?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n valueSelectedByDefault?: string;\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 existingValue,\n onChange = () => {},\n disabled = false,\n valueSelectedByDefault,\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 const presetDropdownValue = existingValue || valueSelectedByDefault;\n\n // helps maintain state between WPDS and native dropdowns\n const defaultValueProp = answer\n ? { defaultValue: answer }\n : presetDropdownValue\n ? { defaultValue: presetDropdownValue }\n : {};\n\n const defaultValuePropMobile = (value: string) => {\n if (answer) {\n return value === answer ? { selected: true } : {};\n }\n return value === presetDropdownValue ? { 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 type { 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 existingValue?: 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 valueSelectedByDefault?: string;\n defaultValue?: never;\n}\n\nconst scriptSrc = `${ENDPOINTS.base}/de-utils/twpdeu.min.js`;\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\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n existingValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n valueSelectedByDefault,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState(\n !existingValue && valueSelectedByDefault ? valueSelectedByDefault : ''\n );\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const config = await window?.__twpdeu?.getFieldConfigs({\n fieldName,\n });\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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\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 =\n existingValue && config ? { defaultValue: existingValue } : {};\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 existingValue={existingValue}\n disabled={disabled}\n valueSelectedByDefault={valueSelectedByDefault}\n />\n )}\n </SelectWrapper>\n );\n};\n","import { ENDPOINTS, WPGeo } from '@washingtonpost/subs-sdk';\nimport type {\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;\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((chunk, i) => {\n if (chunk === '{{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 chunk;\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 { useState, useEffect } from 'react';\nimport type { ICookieStore } from '@washingtonpost/subs-sdk';\nimport { listenToCookieStore as listenToCookieStoreUtil } 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 const 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 type { ReactEventHandler } from 'react';\nimport React, { useState, useEffect } from 'react';\nimport type { 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(\n (prev, current) => (\n <>\n {prev}\n <p>{hydrateLinks(current, onPrivacyPolicyClick)}</p>\n </>\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 type { ReactEventHandler } from 'react';\nimport React, { useState, useEffect } from 'react';\nimport type { 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(\n (prev, current) => (\n <>\n {prev}\n <p>{hydrateLinks(current, onPrivacyPolicyClick)}</p>\n </>\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 type { ReactEventHandler } from 'react';\nimport React, { useState, useEffect } from 'react';\nimport type { 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 = () => {},\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 JOB_TITLE: 'profile_job_title',\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 EDU_ROLE: 'profile_edu_role',\n EDU_MAJOR: 'profile_edu_major',\n EDU_GRADUATION_YEAR: 'profile_edu_graduation_year',\n} as const;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/interfaces/index.ts","../src/utils/checkConsentCookieForAllowTargeting.ts","../src/components/DEDisclosure/utils/checkAlertBoxClosedCookie.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/getAttributes.ts","../src/services/sendToGA.ts","../src/services/ingest.ts","../src/utils/isAnonymousWebview.ts","../src/utils/push.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/hooks/useOnetrust.ts","../src/components/DEDisclosure/DisclosureWithBannerStatus.tsx","../src/components/DEDisclosure/DisclosureWithoutBannerStatus.tsx","../src/components/DEDisclosure/index.tsx","../src/constants/IngestDataTypes.ts"],"sourcesContent":["import type { ResponseStatusType } from '@washingtonpost/subs-sdk';\n\nexport 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\n// https://github.com/WashPost/subs-be-user-data-enrichment/blob/8e8f8460c59adbe9c83b50f368bff1d3300bfd6b/src/main/java/washpost/paywall/userdataenrichment/model/ResponseState.java#L19\nexport const DeleteAttributeState = {\n SUCCESS: '150',\n SYSTEM_ERROR: '151',\n INVALID_ATTRIBUTE_NAME: '152',\n INVALID_ATTRIBUTE_NOT_EXISTS: '153',\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\nexport interface IProfileResponse {\n status: ResponseStatusType;\n state: (typeof AttributesState)[keyof typeof AttributesState];\n attributes: {\n [key: string]: {\n attribute_name: string;\n value: string | null;\n date_created: number;\n last_modified_date: number;\n };\n };\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 { 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 if (window.pageType === 'onboarding') {\n const gdprAllowTargarting = checkConsentCookieForAllowTargeting();\n if (\n typeof gdprAllowTargarting === 'boolean' &&\n checkAlertBoxClosedCookie()\n ) {\n return gdprAllowTargarting;\n }\n\n // Downstream systems\n // Checking for window.pageType === 'onboarding' to avoid being true on graphics articles etc for now -- MNI-710\n if (intl_region === 'EEA' && window.pageType === 'onboarding') {\n return true;\n }\n }\n\n return false;\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n DEFAULT_HEADERS,\n} from '@washingtonpost/subs-sdk';\nimport type { Attribute } from '../interfaces';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\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: DEFAULT_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 }\n return [];\n } catch (e) {\n console.debug(e);\n return [];\n }\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\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\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","import {\n ENDPOINTS,\n DEFAULT_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport type { ResponseStatusType } from '@washingtonpost/subs-sdk';\nimport { type 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: DEFAULT_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 { 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","import type { ResponseStatusType } from '@washingtonpost/subs-sdk';\nimport { CollectionBehaviors, IngestType } 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\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 }\n return sendToGA({ submitData, source });\n};\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 existingValue?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n valueSelectedByDefault?: string;\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 existingValue,\n onChange = () => {},\n disabled = false,\n valueSelectedByDefault,\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 const presetDropdownValue = existingValue || valueSelectedByDefault;\n\n // helps maintain state between WPDS and native dropdowns\n const defaultValueProp = answer\n ? { defaultValue: answer }\n : presetDropdownValue\n ? { defaultValue: presetDropdownValue }\n : {};\n\n const defaultValuePropMobile = (value: string) => {\n if (answer) {\n return value === answer ? { selected: true } : {};\n }\n return value === presetDropdownValue ? { 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 type { 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 existingValue?: 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 valueSelectedByDefault?: string;\n defaultValue?: never;\n}\n\nconst scriptSrc = `${ENDPOINTS.base}/de-utils/twpdeu.min.js`;\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\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n existingValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n valueSelectedByDefault,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState(\n !existingValue && valueSelectedByDefault ? valueSelectedByDefault : ''\n );\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const config = await window?.__twpdeu?.getFieldConfigs({\n fieldName,\n });\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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\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 =\n existingValue && config ? { defaultValue: existingValue } : {};\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 existingValue={existingValue}\n disabled={disabled}\n valueSelectedByDefault={valueSelectedByDefault}\n />\n )}\n </SelectWrapper>\n );\n};\n","import { ENDPOINTS, WPGeo } from '@washingtonpost/subs-sdk';\nimport type {\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;\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((chunk, i) => {\n if (chunk === '{{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 chunk;\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 { useState, useEffect } from 'react';\nimport type { ICookieStore } from '@washingtonpost/subs-sdk';\nimport { listenToCookieStore as listenToCookieStoreUtil } 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 const 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 type { ReactEventHandler } from 'react';\nimport React, { useState, useEffect } from 'react';\nimport type { 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(\n (prev, current) => (\n <>\n {prev}\n <p>{hydrateLinks(current, onPrivacyPolicyClick)}</p>\n </>\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 type { ReactEventHandler } from 'react';\nimport React, { useState, useEffect } from 'react';\nimport type { 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(\n (prev, current) => (\n <>\n {prev}\n <p>{hydrateLinks(current, onPrivacyPolicyClick)}</p>\n </>\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 type { ReactEventHandler } from 'react';\nimport React, { useState, useEffect } from 'react';\nimport type { 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 = () => {},\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 JOB_TITLE: 'profile_job_title',\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 EDU_ROLE: 'profile_edu_role',\n EDU_MAJOR: 'profile_edu_major',\n EDU_GRADUATION_YEAR: 'profile_edu_graduation_year',\n} as const;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,36 +1,19 @@
1
1
  {
2
- "version": "1.11.0",
2
+ "version": "1.11.2",
3
3
  "license": "UNLICENSED",
4
4
  "main": "dist/index.cjs",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
- "exports": {
8
- ".": {
9
- "types": "./dist/index.d.ts",
10
- "import": "./dist/index.js",
11
- "require": "./dist/index.cjs"
12
- }
13
- },
14
7
  "files": [
15
8
  "dist",
16
9
  "README.md"
17
10
  ],
18
- "scripts": {
19
- "start": "vite build --watch",
20
- "build": "vite build",
21
- "test": "APP_ENV=test vitest run",
22
- "lint": "eslint src",
23
- "size": "NODE_OPTIONS=--openssl-legacy-provider size-limit",
24
- "analyze": "size-limit --why",
25
- "prettier-check": "prettier \"**/*.{js,jsx,tsx,ts}\" --list-different --write",
26
- "prepublishOnly": "npm run build && npm run size"
27
- },
28
11
  "peerDependencies": {
29
- "@washingtonpost/subs-hooks": "^1.10.0",
30
- "@washingtonpost/subs-sdk": "^2.13.0",
31
12
  "@washingtonpost/wpds-ui-kit": "^2.3.1",
32
13
  "react": ">=18.2.0",
33
- "react-dom": ">=18.2.0"
14
+ "react-dom": ">=18.2.0",
15
+ "@washingtonpost/subs-hooks": "^1.14.2",
16
+ "@washingtonpost/subs-sdk": "^2.18.1"
34
17
  },
35
18
  "name": "@washingtonpost/subs-de-inputs",
36
19
  "author": "Subs FE",
@@ -72,5 +55,14 @@
72
55
  ],
73
56
  "dependencies": {
74
57
  "@washingtonpost/wpds-assets": "^2.14.0"
58
+ },
59
+ "scripts": {
60
+ "start": "vite build --watch",
61
+ "build": "vite build",
62
+ "test": "APP_ENV=test vitest run",
63
+ "lint": "oxlint src e2e",
64
+ "size": "NODE_OPTIONS=--openssl-legacy-provider size-limit",
65
+ "analyze": "size-limit --why",
66
+ "prettier-check": "prettier \"**/*.{js,jsx,tsx,ts}\" --list-different --write"
75
67
  }
76
- }
68
+ }