@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 +42 -141
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +38 -140
- package/dist/index.js.map +1 -1
- package/package.json +14 -22
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
Object.
|
|
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
|
|
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,
|
|
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,
|
|
266
|
-
|
|
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
|
-
},
|
|
277
|
-
|
|
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
|
|
286
|
-
fileName: _jsxFileName$5,
|
|
287
|
-
lineNumber: 119,
|
|
288
|
-
columnNumber: 11
|
|
289
|
-
}, void 0))
|
|
279
|
+
}, value))
|
|
290
280
|
]
|
|
291
|
-
},
|
|
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,
|
|
292
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_washingtonpost_wpds_assets.ChevronDown, { style: {
|
|
307
293
|
position: "absolute",
|
|
308
294
|
right: "10px"
|
|
309
|
-
} }
|
|
310
|
-
|
|
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,
|
|
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,
|
|
330
|
-
|
|
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,
|
|
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
|
|
349
|
-
|
|
350
|
-
|
|
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,
|
|
419
|
-
children && /* @__PURE__ */ (0,
|
|
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
|
-
},
|
|
428
|
-
|
|
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
|
-
},
|
|
438
|
-
|
|
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
|
-
}
|
|
454
|
-
|
|
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,
|
|
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}
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
}
|
|
637
|
-
|
|
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
|
-
}
|
|
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,
|
|
561
|
+
if (disclosureRendering) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
653
562
|
"data-test-id": "de-disclosure",
|
|
654
563
|
children: disclosureRendering
|
|
655
|
-
}
|
|
656
|
-
|
|
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
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,IAAa,sBAAsB;CACjC,SAAS;CACT,gBAAgB;CACjB;AAcD,IAAa,kBAAkB,EAC7B,SAAS,OACV;AAGD,IAAa,uBAAuB;CAClC,SAAS;CACT,cAAc;CACd,wBAAwB;CACxB,8BAA8B;CAC/B;AAED,IAAa,aAAa;CACxB,UAAU;CACV,UAAU;CACX;AAED,IAAa,sBAAsB;CACjC,SAAS;CACT,cAAc;CACd,cAAc;CACd,oBAAoB;CACpB,cAAc;CACd,8BAA8B;CAC9B,yBAAyB;CACzB,iBAAiB;CACjB,uBAAuB;CACvB,+BAA+B;CAC/B,gBAAgB;CACjB;;;ACtDD,IAAM,WAAS;;;;;;AAOf,IAAa,4CAA4C;CACvD,MAAM,SAAA,GAAA,yBAAA,WAAkB,SAAO,IAAI;AACnC,QAAO,MAAM,SAAS,YAAY,GAC9B,OACA,MAAM,SAAS,YAAY,GACzB,QACA;;;;ACbR,IAAM,WAAS;AAEf,IAAa,kCAAkC;AAI7C,UAAA,GAAA,yBAAA,WAHwB,SAAO,IAAI,IAGtB,SAAS;;;;;;;;;;;;ACIxB,IAAa,kCAAkC;AAC7C,KAAI,OAAO,WAAW,YACpB,QAAO;CAGT,MAAM,EAAE,aAAa,cAAc,iBAAA,GAAA,yBAAA,QAAuB;AAE1D,KAAI,gBAAgB,KAClB,QAAO,CAAC,EAAA,GAAA,yBAAA,WAAW,SAAS;AAG9B,KAAI,OAAO,aAAa,cAAc;EACpC,MAAM,sBAAsB,qCAAqC;AACjE,MACE,OAAO,wBAAwB,aAC/B,2BAA2B,CAE3B,QAAO;AAKT,MAAI,gBAAgB,SAAS,OAAO,aAAa,aAC/C,QAAO;;AAIX,QAAO;;;;AChCT,IAAM,SAAO,GAAG,yBAAA,UAAU,KAAK;AAQ/B,IAAM,kBAAuC,EAAE;AAC/C,IAAa,gBAAmC,OAAO,EACrD,gBAGI;AACJ,KAAI,gBAAgB,WAClB,QAAO,gBAAgB;CAGzB,MAAM,aAAa,CAAC,UAAU;AAE9B,KAAI;EACF,MAAM,MAAM,IAAI,IAAI,GAAG,OAAK,aAAa;AACzC,MAAI,aAAa,IAAI,cAAc,WAAW,KAAK,IAAI,CAAC;EAExD,MAAM,OAAO,MAAM,MAAM,IAAI,UAAU,EAAE;GACvC,aAAa;GACb,SAAS,yBAAA;GACV,CAAC;EACF,MAAM,OAAO,MAAM,KAAK,MAAM;AAE9B,MAAI,KAAK,MAAM,KAAK,WAAW,yBAAA,eAAe,SAAS;GACrD,MAAM,aAAa,KAAK,cAAc,EAAE;AACxC,mBAAgB,aAAa;AAC7B,UAAO;;AAET,SAAO,EAAE;UACF,GAAG;AACV,UAAQ,MAAM,EAAE;AAChB,SAAO,EAAE;;;;;AC7Cb,IAAM,eAAe,UAOT;AACV,KAAI,OAAO,WAAW,YAEpB;AAGF,QAAO,YAAY,OAAO,aAAa,EAAE;CAEzC,MAAM,YAAiC,EACrC,GAAG,OACJ;AACD,QAAO,UAAU,KAAK,UAAU;;AAclC,IAAa,WAAyB,OAAO,EAC3C,YAAY,EAAE,WAAW,SACzB,aACI;AACJ,aAAY;EACV,OAAO;EACP,QAAQ;EACR,UAAU;EAEV,OAAO;EACP,YAAY;GACX,YAAY;EAEb,SAAS;EACT,YAAY;EACb,CAAC;AAEF,QAAO;;;;ACzCT,IAAM,OAAO,GAAG,yBAAA,UAAU,KAAK;AAE/B,IAAa,SAAqB,OAAO,EACvC,YAAY,EAAE,WAAW,SACzB,aACI;CACJ,MAAM,MAAM,GAAG,KAAK;CAEpB,MAAM,iBAAA,GAAA,yBAAA,WAA0B,gBAAgB;CAKhD,MAAM,UAAU;EACd,OAJY,aAAa,QAAQ,OAIjC;EACA,KAAA,GAAA,yBAAA,WAJmB,MAInB;EACA,MAAM,WAAW;EACjB;EACA,MAAM,GACH,YAAY,CAAC,MAAM,EACrB;EACD,UAAU,EAAE,QAAQ;EACrB;AAED,KAAI;AAUF,SAAO,OAFY,MAPI,MAAM,KAAK;GAChC,QAAQ;GACR,aAAa;GACb,SAAS,yBAAA;GACT,MAAM,KAAK,UAAU,QAAQ;GAC9B,CAAC,EAE0B,MAAM;UAG3B,GAAG;AACV,UAAQ,MAAM,EAAE;AAChB,SAAO;;;;;AC3CX,IAAa,2BAA2B;AACtC,KAAI,OAAO,WAAW,YACpB,QAAO;AAKT,QAAO,CAAC,GAAA,GAAA,yBAAA,WAFgB,QAEd,IAAS,EAAA,GAAA,yBAAA,aAAa;;;;ACkBlC,IAAa,OAAiB,OAAO,EAAE,YAAY,aAAa;AAC9D,KAAI,CAAC,2BAA2B,CAC9B,OAAM,IAAI,MAAM,gCAAgC;AAGlD,KAAI,oBAAoB,CACtB,OAAM,IAAI,MAAM,gCAAgC;CAGlD,MAAM,EAAE,cAAc;CAEtB,MAAM,gBAAgB,MAAM,cAAc,EACxC,WACD,CAAC;AAEF,KACE,cAAc,MACd,cAAc,GAAG,SAAS,aAC1B,cAAc,GAAG,wBAAwB,oBAAoB,eAE7D,OAAM,IAAI,MAAM,iBAAiB;CAGnC,MAAM,OACJ,cAAc,MAAM,cAAc,GAAG,aAAa,OAC9C,WAAW,WACX,WAAW;AAEjB,KAAI,CAAC,cAAc,MAAA;AAInB,KAAI,SAAS,WAAW,SACtB,QAAO,OAAO;EAAE;EAAY;EAAQ,CAAC;AAEvC,QAAO,SAAS;EAAE;EAAY;EAAQ,CAAC;;;;AC9CzC,IAAM,sBAAA,GAAA,4BAAA,QAA4B,UAAU;CAC1C,SAAS;CACT,SAAS;CACT,gBAAgB;CAChB,OAAO;CACP,iBAAiB;CACjB,OAAO;CACP,YAAY;CACZ,UAAU;CACV,YAAY;CACZ,YAAY;CACZ,mBAAmB;CACnB,cAAc;CACd,UAAU;CACV,aAAa;CACb,kBAAkB;CAClB,kBAAkB;CAClB,YAAY;CACZ,sBAAsB;CACtB,cAAc;EACZ,iBAAiB,4BAAA,MAAM,OAAO;EAC9B,aAAa,4BAAA,MAAM,OAAO;EAC1B,OAAO,4BAAA,MAAM,OAAO;EACpB,QAAQ;EACT;CACF,CAAC;AAEF,IAAM,uBAAA,GAAA,4BAAA,QAA6B,OAAO;CACxC,OAAO;CACP,UAAU;CACV,cAAc;CACd,aAAa;CACb,aAAa;CACb,aAAa;CACb,iBAAiB;CACjB,UAAU;CACX,CAAC;AAEF,IAAM,sBAAA,GAAA,4BAAA,QAA4B,UAAU;CAC1C,YAAY;CACZ,UAAU;CACV,OAAO;CACR,CAAC;;;;;;AAOF,IAAa,YAAY,EACvB,IACA,OACA,QACA,WAAW,OACX,eACA,iBAAiB,IACjB,WAAW,OACX,6BACoB;CACpB,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,WAA+B;CAC9C,MAAM,EAAE,kBAAA,GAAA,2BAAA,gBAAgC;AAExC,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,OAAQ,UAAS,OAAO;IAC3B,CAAC,OAAO,CAAC;CAEZ,MAAM,eAAe,WAAW,EAAE,UAAU,MAAM,GAAG,EAAE;CAEvD,MAAM,sBAAsB,iBAAiB;CAG7C,MAAM,mBAAmB,SACrB,EAAE,cAAc,QAAQ,GACxB,sBACE,EAAE,cAAc,qBAAqB,GACrC,EAAE;CAER,MAAM,0BAA0B,UAAkB;AAChD,MAAI,OACF,QAAO,UAAU,SAAS,EAAE,UAAU,MAAM,GAAG,EAAE;AAEnD,SAAO,UAAU,sBAAsB,EAAE,UAAU,MAAM,GAAG,EAAE;;AAGhE,QAAO,eACL,iBAAA,GAAA,kBAAA,MAAC,qBAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,MAAC,oBAAD;EACE,IAAG;EACO;EACV,WAAW,MAAM,UAAU,EAAE,OAAO,MAAM;EAC1C,GAAI;YAJN;GAME,iBAAA,GAAA,kBAAA,KAAC,SAAD,EAAA,UAAQ,OAAc,CAAA;GACtB,iBAAA,GAAA,kBAAA,KAAC,oBAAD;IACE,OAAM;IACN,UAAA;IACA,UAAA;IACA,OAAO,EAAE,OAAO,WAAW;cAE1B;IACkB,CAAA;GACpB,OAAO,KAAK,UACX,iBAAA,GAAA,kBAAA,KAAC,oBAAD;IACS;IAEP,GAAI,uBAAuB,MAAM;cAEhC;IACkB,EAJd,MAIc,CACrB;GACiB;KACrB,iBAAA,GAAA,kBAAA,KAAC,4BAAA,MAAD;EACE,OAAM;EACN,MAAK;EACL,MAAM,4BAAA,MAAM,OAAO;EACnB,OAAO;GACL,eAAe;GACf,UAAU;GACV,OAAO;GACP,KAAK;GACL,WAAW;GACZ;YAED,iBAAA,GAAA,kBAAA,KAAC,4BAAA,aAAD,EAAa,OAAO;GAAE,UAAU;GAAY,OAAO;GAAQ,EAAI,CAAA;EAC1D,CAAA,CACa,EAAA,CAAA,GAEtB,iBAAA,GAAA,kBAAA,MAAC,4BAAA,OAAO,MAAR;EACE,gBAAgB,MAAM,UAAU,EAAE;EACxB;EACV,GAAI;EACJ,GAAI;YAJN,CAME,iBAAA,GAAA,kBAAA,MAAC,4BAAA,OAAO,SAAR;GAAgB,gBAAc,GAAG,GAAG;aAApC,CACE,iBAAA,GAAA,kBAAA,KAAC,4BAAA,OAAO,OAAR,EAAA,UAAe,OAAqB,CAAA,EACpC,iBAAA,GAAA,kBAAA,KAAC,4BAAA,OAAO,OAAR,EAAgB,CAAA,CACD;MACjB,iBAAA,GAAA,kBAAA,KAAC,4BAAA,OAAO,SAAR;GACE,KAAK,EAAE,QAAQ,4BAAA,MAAM,SAAS,MAAM;GACpC,gBAAc,GAAG,GAAG;aAEnB,OAAO,KAAK,UACX,iBAAA,GAAA,kBAAA,KAAC,4BAAA,OAAO,MAAR;IAAoB;cACjB;IACW,EAFkB,MAElB,CACd;GACa,CAAA,CACL;;;;;AC9HlB,IAAM,YAAY,GAAG,yBAAA,UAAU,KAAK;AAEpC,IAAM,iBAAA,GAAA,4BAAA,QAAuB,OAAO;CAClC,WAAW;CACX,SAAS;CACT,cAAc;CACd,eAAe;CACf,YAAY,EACV,SAAS,WACV;CACD,OAAO,EAAE,WAAW,cAAc;CACnC,CAAC;AAEF,IAAa,YAAqC,EAChD,QACA,WACA,OACA,sBACA,eACA,UACA,QACA,iBAAiB,IACjB,mBAAmB,IACnB,qBAAqB,MACrB,UACA,6BACI;CACJ,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,UAAsB,qBAAqB;CAE1D,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,UACf,CAAC,iBAAiB,yBAAyB,yBAAyB,GACrE;CAED,MAAM,gBAAA,GAAA,2BAAA,WAAyB,UAAU;AAEzC,EAAA,GAAA,MAAA,iBAAgB;EACd,MAAM,cAAc,YAAY;AAC9B,OAAI;IAEF,MAAM,SAAS,MAAM,QAAQ,UAAU,gBAAgB,EACrD,WACD,CAAC;AACF,QAAI,OACF,WAAU,OAAO,GAAG;QAEpB,SAAQ,MAAM,wBAAwB,UAAU;YAE3C,GAAG;AACV,YAAQ,KAAK,wBAAwB,WAAW,EAAE;;;AAItD,MAAI,iBAAiB,2BAAA,aAAa,SAAS,EAAE,YAAY,QACvD,cAAa;IAEd,CAAC,aAAa,CAAC;AAElB,EAAA,GAAA,MAAA,iBAAgB;EACd,MAAM,iBAAiB,YAAY;AACjC,OAAI;IACF,MAAM,SAAS,MAAM,QAAQ,UAAU,KAAK;KAC1C,YAAY;MAAE;MAAW,OAAO;MAAU;KAC1C;KACD,CAAC;AASF,eAAW;KACT,YAAY;KACZ,SARA,WAAW,OACP,QACA,SACE,OAAO,WAAW,yBAAA,eAAe,UACjC;KAKP,CAAC;YAEK,GAAG;AACV,eAAW;KACT,YAAY;KACZ,SAAS;KACV,CAAC;;;AAIN,MAAI,iBAAiB,2BAAA,aAAa,SAAS,UAAU,SACnD,iBAAgB;IAEjB,CAAC,cAAc,OAAO,CAAC;CAE1B,MAAM,mBACJ,iBAAiB,SAAS,EAAE,cAAc,eAAe,GAAG,EAAE;CAIhE,MAAM,eAAe,YAAY,EAFb,YAAY,UAEa,EAAE,UAAU,MAAM,GAAG,EAAE;CAIpE,MAAM,SAAS,SACX,CAAC,GAAG,OAAO,OAAO,CACf,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,CACjC,QAAQ,UAAU,MAAM,aAAa,KAAK,CAC1C,OAAO,aAAa,GACvB,EAAE;AAEN,QACE,iBAAA,GAAA,kBAAA,MAAC,eAAD,EAAA,UAAA;EACG,YACC,iBAAA,GAAA,kBAAA,KAAC,4BAAA,OAAO,MAAR;GACE,gBAAgB,MAAM;AACpB,gBAAY,EAAE;AACd,aAAS,EAAE,OAAO,GAAG,CAAC;;GAExB,GAAI;GACJ,GAAI;GAEH;GACW,CAAA;EAEf,CAAC,YAAY,CAAC,UACb,iBAAA,GAAA,kBAAA,KAAC,UAAD;GACE,IAAI;GACJ,OAAO;GACP,QAAQ,EAAE;GACV,UAAU;GACV,CAAA;EAEH,CAAC,YAAY,UACZ,iBAAA,GAAA,kBAAA,KAAC,UAAD;GACE,IAAI,OAAO;GACX,OAAO,SAAS,OAAO;GACvB,WAAW,MAAM;AACf,gBAAY,EAAE;AACd,aAAS,EAAE,OAAO,GAAG,CAAC;;GAExB,QAAQ,OAAO,KAAK,UAAU,MAAM,KAAK;GAC1B;GACL;GACc;GACxB,CAAA;EAEU,EAAA,CAAA;;;;AC7KpB,IAAM,YAAY,GAChB,yBAAA,UAAU,SAAS,yCACf,6CACA,yBAAA,UAAU,KACf;AAED,IAAa,YAAY,YAAY;CACnC,IAAI;CAIJ,MAAM,eAAiC,OAAM,MADtB,MAAM,UAAU,EACe,MAAM;CAK5D,MAAM,EAAE,cAAc,iBAAA,GAAA,yBAAA,QAAuB;AAC7C,QAAO,KAAK,aAAa,CAAC,SAAS,cAAc;AAC/C,MACE,gBACA,UAAU,MAAM,IAAI,CAAC,SAAS,aAAa,aAAa,CAAC,CAEzD,YAAW,aAAa;WACf,gBAAgB,SAAS,cAAc,MAChD,YAAW,aAAa;GAE1B;AAKF,KAAI,OAAO,aAAa,eAAe,aAAa,EAClD,YAAW,aAAa;AAG1B,QAAO;;;;AClCT,IAAa,gBAAkC,KAAK,oBAAoB,OAAO;AA+B7E,QA9Bc,IAAI,MAAM,wBACT,CAAM,KAAK,OAAO,MAAM;AACrC,MAAI,UAAU,qBACZ,QACE,iBAAA,GAAA,kBAAA,KAAC,KAAD;GAEE,KAAI;GACJ,QAAO;GACP,OAAO,EAAE,OAAO,WAAW;GAC3B,WAAU;GACV,MAAK;GACL,UAAU,MAAM,YAAY,EAAE;aAC/B;GAEG,EATG,gBAAgB,IASnB;AAGR,SAAO;GAGQ,CAAO,QACrB,MAAM,YACL,iBAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA,CACG,MACA,QACA,EAAA,CAAA,EAEL,iBAAA,GAAA,kBAAA,KAAA,kBAAA,UAAA,EAAK,CAAA,CAGA;;;;ACpCT,IAAM,SAAS;AAEf,IAAa,kCAAkC;AAE7C,UAAA,GAAA,yBAAA,WADwB,OAAO,IAAI,IACtB,SAAS;;;;ACAxB,IAAM,iBAAiB;AAEvB,IAAM,mBAAmB;AAkCzB,IAAa,eAAe,EAC1B,uBAGI;CACJ,MAAM,CAAC,qBAAqB,2BAAA,GAAA,MAAA,WAEzB;CACH,MAAM,CAAC,gBAAgB,sBAAA,GAAA,MAAA,WAAoD;CAE3E,MAAM,CAAC,qBAAqB,2BAAA,GAAA,MAAA,UAAmC,MAAM;CACrE,MAAM,CAAC,gBAAgB,sBAAA,GAAA,MAAA,UAA8B,MAAM;AAE3D,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,2BAA2B,CAC7B,wBAAuB,KAAK;AAG9B,MAAI,2BAA2B,EAAE;AAC/B,qBAAkB,KAAK;AACvB;;AAGF,MAAI,CAAC,OAAO,SACV,SAAQ,KAAK,8BAA8B;AAG7C,MAAI,QAAQ,eAAe,iBACzB,wBAAuB,KAAK;WACnB,OAAO,SAChB,mBAAkB,KAAK;MAEvB,SAAQ,KAAK,kDAAkD;IAEhE,EAAE,CAAC;AAEN,EAAA,GAAA,MAAA,iBAAgB;EACd,MAAM,aAAsC,EAAE;AAC9C,MAAI,uBAAuB,OAAO,aAAa;GAC7C,MAAM,aAAA,GAAA,yBAAA,qBAAoC,sBAAsB;AAC9D,QAAI,2BAA2B,CAC7B,wBAAuB,KAAK;KAE9B;AACF,cAAW,KAAK,UAAU;GAE1B,MAAM,cAAA,GAAA,yBAAA,qBAAqC,wBAAwB;AACjE,QAAI,2BAA2B,CAC7B,mBAAkB,KAAK;QAEvB,mBAAkB,MAAM;KAE1B;AACF,cAAW,KAAK,WAAW;;AAE7B,eAAa;AACX,cAAW,SAAS,OAAO,MAAM,IAAI,CAAC;;IAEvC,CAAC,oBAAoB,CAAC;AAEzB,EAAA,GAAA,MAAA,iBAAgB;EACd,IAAI;AACJ,MAAI,kBAAkB,OAAO,UAAU;GACrC,MAAM,YAAY,SAAiB,YAAqB;AACtD,QAAI,SAAS;AACX,kBAAa,QAAQ;AAErB,SAAI,2BAA2B,CAC7B,wBAAuB,KAAK;AAS9B,SAAI,2BAA2B,CAC7B,mBAAkB,KAAK;;;AAK7B,UAAO,SAAS,oBAAoB,GAAG,SAAS;;AAIlD,eAAa;AACX,OAAI,OAAO,YAAY,WACrB,QAAO,SACL,uBACA,IACC,YAAY;AACX,YAAQ,MAAM,QAAQ;MAExB,WACD;;IAEJ,CAAC,eAAe,CAAC;AAEpB,QAAO;EACL;EACA;EACA;EACA;EACD;;;;AChIH,IAAa,gCAER,EACH,QACA,YACA,mBAAmB,MACnB,6BAA6B,SACzB;CACJ,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,UAA2C,KAAK;CACnE,MAAM,CAAC,qBAAqB,2BAAA,GAAA,MAAA,UACG,KAAK;CAEpC,MAAM,EAAE,gBAAgB,wBAAwB,YAAY,EAC1D,kBACD,CAAC;AAEF,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,OAGF,KAAI,eACF,eAAc,OAAO,uBAAuB;MAE5C,eAAc,OAAO,wBAAwB;IAGhD,CAAC,eAAe,CAAC;AAEpB,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,cAAc,MAAM,QAAQ,WAAW,CACzC,wBACE,WAAW,QACR,MAAM,YACL,iBAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA,CACG,MACD,iBAAA,GAAA,kBAAA,KAAC,KAAD,EAAA,UAAI,aAAa,SAAS,qBAAqB,EAAK,CAAA,CACnD,EAAA,CAAA,EAEL,iBAAA,GAAA,kBAAA,KAAA,kBAAA,UAAA,EAAK,CAAA,CACN,CACF;IAEF,CAAC,WAAW,CAAC;AAEhB,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,uBAAuB,oBACzB,YAAW;GAAE,YAAY;GAAM,SAAS;GAAO,CAAC;IAEjD,CAAC,qBAAqB,oBAAoB,CAAC;AAE9C,QAAO;;;;ACpDT,IAAa,mCAER,EAAE,QAAQ,YAAY,6BAA6B,SAAS;CAC/D,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,UAA2C,KAAK;CACnE,MAAM,CAAC,qBAAqB,2BAAA,GAAA,MAAA,UACG,KAAK;AAEpC,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,OACF,eAAc,OAAO,WAAW;IAEjC,CAAC,OAAO,CAAC;AAEZ,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,cAAc,MAAM,QAAQ,WAAW,CACzC,wBACE,WAAW,QACR,MAAM,YACL,iBAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA,CACG,MACD,iBAAA,GAAA,kBAAA,KAAC,KAAD,EAAA,UAAI,aAAa,SAAS,qBAAqB,EAAK,CAAA,CACnD,EAAA,CAAA,EAEL,iBAAA,GAAA,kBAAA,KAAA,kBAAA,UAAA,EAAK,CAAA,CACN,CACF;IAEF,CAAC,WAAW,CAAC;AAEhB,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,oBACF,YAAW;GAAE,YAAY;GAAM,SAAS;GAAO,CAAC;IAEjD,CAAC,oBAAoB,CAAC;AAEzB,QAAO;;;;AC7BT,IAAa,gBAA2C,EACtD,mBAAmB,IACnB,mBAAmB,MACnB,6BAA6B,SACzB;CACJ,MAAM,CAAC,qBAAqB,2BAAA,GAAA,MAAA,UACG,KAAK;CACpC,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,WAAgD;AAGjE,EAAA,GAAA,MAAA,iBAAgB;AACd,GAAC,YAAY;GACX,MAAM,SAAS,MAAM,WAAW;AAChC,eAAY,OAAO;AAEnB,OAAI,CAAC,OACH,SAAQ,MAAM,kBAAkB;MAEhC;IACH,EAAE,CAAC;AAEN,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,SAIF,KAAI,uBAAuB,YAAY,SAAS,kBAI9C,wBACE,iBAAA,GAAA,kBAAA,KAAC,8BAAD;GACE,QAAQ;GACU;GACN;GACU;GACtB,CAAA,CACH;WACQ,gBAAgB,SACzB,wBACE,iBAAA,GAAA,kBAAA,KAAC,iCAAD;GACE,QAAQ;GACI;GACU;GACtB,CAAA,CACH;MAED,SAAQ,MAAM,iBAAiB;IAGlC,CAAC,SAAS,CAAC;AAEd,KAAI,oBACF,QAAO,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,gBAAa;YAAiB;EAA0B,CAAA;AAGtE,QAAO,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,gBAAa,yBAA8B,CAAA;;;;AC/EzD,IAAa,4BAA4B;CACvC,WAAW;CACX,cAAc;CACd,WAAW;CACX,gBAAgB;CAChB,SAAS;CACT,oBAAoB;CACpB,UAAU;CACV,eAAe;CACf,mBAAmB;CACnB,YAAY;CACZ,uBAAuB;CACvB,aAAa;CACb,kBAAkB;CAClB,UAAU;CACV,WAAW;CACX,qBAAqB;CACtB"}
|
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,
|
|
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__ */
|
|
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__ */
|
|
242
|
-
|
|
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
|
-
},
|
|
253
|
-
|
|
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
|
|
262
|
-
fileName: _jsxFileName$5,
|
|
263
|
-
lineNumber: 119,
|
|
264
|
-
columnNumber: 11
|
|
265
|
-
}, void 0))
|
|
252
|
+
}, value))
|
|
266
253
|
]
|
|
267
|
-
},
|
|
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__ */
|
|
265
|
+
children: /* @__PURE__ */ jsx(ChevronDown, { style: {
|
|
283
266
|
position: "absolute",
|
|
284
267
|
right: "10px"
|
|
285
|
-
} }
|
|
286
|
-
|
|
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__ */
|
|
274
|
+
children: [/* @__PURE__ */ jsxs(Select.Trigger, {
|
|
304
275
|
"data-test-id": `${id}-select-trigger`,
|
|
305
|
-
children: [/* @__PURE__ */
|
|
306
|
-
|
|
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__ */
|
|
280
|
+
children: values.map((value) => /* @__PURE__ */ jsx(Select.Item, {
|
|
322
281
|
value,
|
|
323
282
|
children: value
|
|
324
|
-
}, value
|
|
325
|
-
|
|
326
|
-
|
|
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__ */
|
|
395
|
-
children && /* @__PURE__ */
|
|
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
|
-
},
|
|
404
|
-
|
|
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
|
-
},
|
|
414
|
-
|
|
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
|
-
}
|
|
430
|
-
|
|
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__ */
|
|
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}
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
-
}
|
|
613
|
-
|
|
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
|
-
}
|
|
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__ */
|
|
534
|
+
if (disclosureRendering) return /* @__PURE__ */ jsx("div", {
|
|
629
535
|
"data-test-id": "de-disclosure",
|
|
630
536
|
children: disclosureRendering
|
|
631
|
-
}
|
|
632
|
-
|
|
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.
|
|
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
|
+
}
|