@washingtonpost/subs-de-inputs 0.2.3-canary.0 → 0.3.1-canary.0

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.
@@ -0,0 +1,16 @@
1
+ interface IDropdownProps {
2
+ id: string;
3
+ label: string;
4
+ values: Array<string>;
5
+ required?: boolean;
6
+ defaultValue?: string;
7
+ onChange?: (value: string) => void;
8
+ disabled?: boolean;
9
+ }
10
+ /**
11
+ * Dropdown component. Uses wpds-ui-kit on desktop and native select on mobile.
12
+ * @param {IDropdownProps} props The props.
13
+ * @returns {React.ReactElement} The dropdown.
14
+ */
15
+ export declare const Dropdown: ({ id, label, values, required, defaultValue, onChange, disabled, }: IDropdownProps) => JSX.Element;
16
+ export {};
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './interfaces/index';
2
2
  export * from './interfaces/twpdeu';
3
3
  export * from './utils/hasRequiredPrivacyCookies';
4
- export * from './services/dataEnrichment';
4
+ export * from './services/getAttributes';
5
+ export * from './services/push';
5
6
  export * from './components/DESelect';
@@ -1,7 +1,8 @@
1
- import { getAttributes, ingest } from '../services/dataEnrichment';
1
+ import { getAttributes } from '../services/getAttributes';
2
+ import { push } from '../services/push';
2
3
  export declare type TWPDEU = {
3
4
  getFieldConfigs: typeof getAttributes;
4
- push: typeof ingest;
5
+ push: typeof push;
5
6
  version?: string;
6
7
  };
7
8
  declare global {
@@ -0,0 +1,6 @@
1
+ import { Attribute } from '../interfaces';
2
+ export declare const getAttributes: GetAttributesType;
3
+ declare type GetAttributesType = ({ fieldName, }: {
4
+ fieldName: string;
5
+ }) => Promise<Attribute[]>;
6
+ export {};
@@ -1,9 +1,5 @@
1
1
  import { ResponseStatus } from '@washingtonpost/subs-sdk';
2
- import { Attribute, IngestResponseState, IngestType } from '../interfaces';
3
- export declare const getAttributes: GetAttributesType;
4
- declare type GetAttributesType = ({ fieldName, }: {
5
- fieldName: string;
6
- }) => Promise<Attribute[]>;
2
+ import { IngestResponseState, IngestType } from '../interfaces';
7
3
  export declare const ingest: IngestType;
8
4
  declare type IngestType = ({ submitData: { fieldName, value }, source, }: {
9
5
  submitData: {
@@ -0,0 +1,15 @@
1
+ import { IngestResponseState, IngestType } from '../interfaces';
2
+ import { ResponseStatus } from '@washingtonpost/subs-sdk';
3
+ export declare const push: PushType;
4
+ declare type PushType = ({ submitData: { fieldName, value }, source, }: {
5
+ submitData: {
6
+ fieldName: string;
7
+ value: string;
8
+ };
9
+ type?: (typeof IngestType)[keyof typeof IngestType];
10
+ source: string;
11
+ }) => Promise<{
12
+ status: ResponseStatus;
13
+ state: (typeof IngestResponseState)[keyof typeof IngestResponseState];
14
+ } | null | true>;
15
+ export {};
@@ -0,0 +1,19 @@
1
+ import { IngestType } from '../interfaces';
2
+ export interface ISendGAEvent {
3
+ event: string;
4
+ category: string;
5
+ action: string;
6
+ label: string;
7
+ 'de-label': string;
8
+ [key: string]: undefined | string | string[];
9
+ }
10
+ export declare const sendToGA: SendToGaType;
11
+ declare type SendToGaType = ({ submitData: { fieldName, value }, source, }: {
12
+ submitData: {
13
+ fieldName: string;
14
+ value: string;
15
+ };
16
+ type?: (typeof IngestType)[keyof typeof IngestType];
17
+ source: string;
18
+ }) => Promise<true>;
19
+ export {};
@@ -9,6 +9,7 @@ var React = require('react');
9
9
  var React__default = _interopDefault(React);
10
10
  var wpdsUiKit = require('@washingtonpost/wpds-ui-kit');
11
11
  var subsHooks = require('@washingtonpost/subs-hooks');
12
+ var wpdsAssets = require('@washingtonpost/wpds-assets');
12
13
 
13
14
  const CollectionBehaviors = {
14
15
  COLLECT: 'COLLECT',
@@ -45,26 +46,19 @@ const hasRequiredPrivacyCookies = () => {
45
46
  return !!(wp_usp && countryCode === 'US');
46
47
  };
47
48
 
48
- const DEBUG_FLAG = 'f_de_debug';
49
49
  const base = `${subsSdk.ENDPOINTS.base}/de/v1`;
50
50
  const attributesCache = {};
51
51
  const getAttributes = async _ref => {
52
52
  let {
53
53
  fieldName
54
54
  } = _ref;
55
- const debug = window.location.search.includes(DEBUG_FLAG);
56
- if (debug) {
57
- console.debug('getAttributes()');
58
- }
59
55
  if (attributesCache[fieldName]) {
60
- if (debug) console.debug('getAttributes() > return cached info');
61
56
  return attributesCache[fieldName];
62
57
  }
63
58
  const fieldNames = [fieldName];
64
59
  try {
65
60
  const url = new URL(`${base}/attributes`);
66
61
  url.searchParams.set('attributes', fieldNames.join(','));
67
- if (debug) console.debug(`getAttributes() > ${url.toString()}`);
68
62
  const data = await fetch(url.toString(), {
69
63
  credentials: 'include',
70
64
  headers: subsSdk.JSON_HEADERS
@@ -82,7 +76,42 @@ const getAttributes = async _ref => {
82
76
  return [];
83
77
  }
84
78
  };
85
- const ingest = async _ref2 => {
79
+
80
+ const sendGAEvent = props => {
81
+ if (typeof window === 'undefined') {
82
+ if (process.env.NODE_ENV !== "production") console.warn('NO WINDOW');
83
+ return;
84
+ }
85
+ // Initialize dataLayer if needed
86
+ window.dataLayer = window.dataLayer || [];
87
+ const eventData = {
88
+ ...props
89
+ };
90
+ window.dataLayer.push(eventData);
91
+ };
92
+ const sendToGA = async _ref => {
93
+ let {
94
+ submitData: {
95
+ fieldName,
96
+ value
97
+ },
98
+ source
99
+ } = _ref;
100
+ sendGAEvent({
101
+ event: 'site-onpage-click',
102
+ action: 'site-onpage-click',
103
+ category: 'profile',
104
+ label: fieldName,
105
+ 'de-label': fieldName,
106
+ [fieldName]: value,
107
+ section: 'profile',
108
+ subsection: source
109
+ });
110
+ return true;
111
+ };
112
+
113
+ const base$1 = `${subsSdk.ENDPOINTS.base}/de/v1`;
114
+ const ingest = async _ref => {
86
115
  let {
87
116
  submitData: {
88
117
  fieldName,
@@ -90,30 +119,9 @@ const ingest = async _ref2 => {
90
119
  },
91
120
  type = IngestType.IMPLICIT,
92
121
  source
93
- } = _ref2;
94
- const debug = window.location.search.includes(DEBUG_FLAG);
95
- if (debug) {
96
- console.debug('ingest()');
97
- }
98
- const url = `${base}/ingest`;
122
+ } = _ref;
123
+ const url = `${base$1}/ingest`;
99
124
  const wapo_login_id = subsSdk.getCookie('wapo_login_id');
100
- if (!hasRequiredPrivacyCookies()) {
101
- if (debug) console.debug('ingest() > hasRequiredPrivacyCookies falsy');
102
- throw new Error('does not satisfy cookie check');
103
- }
104
- let attributeInfo = attributesCache[fieldName];
105
- if (!attributeInfo) {
106
- if (debug) console.debug('ingest() > fetch attribute info');
107
- attributeInfo = await getAttributes({
108
- fieldName
109
- });
110
- } else {
111
- if (debug) console.debug('ingest() > use cached attribute info');
112
- }
113
- if (attributeInfo[0] && attributeInfo[0].name === fieldName && attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT) {
114
- if (debug) console.debug('ingest() > do not collect');
115
- throw new Error('do not collect');
116
- }
117
125
  const jucid = localStorage.getItem('uuid');
118
126
  const ga = subsSdk.getCookie('_ga');
119
127
  const payload = {
@@ -143,6 +151,171 @@ const ingest = async _ref2 => {
143
151
  }
144
152
  };
145
153
 
154
+ const push = async _ref => {
155
+ let {
156
+ submitData,
157
+ type = IngestType.IMPLICIT,
158
+ source
159
+ } = _ref;
160
+ if (!hasRequiredPrivacyCookies()) {
161
+ throw new Error('does not satisfy cookie check');
162
+ }
163
+ const attributeInfo = await getAttributes({
164
+ fieldName: submitData.fieldName
165
+ });
166
+ if (attributeInfo[0] && attributeInfo[0].name === submitData.fieldName && attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT) {
167
+ throw new Error('do not collect');
168
+ }
169
+ if (type === IngestType.EXPLICIT) {
170
+ return ingest({
171
+ submitData,
172
+ type,
173
+ source
174
+ });
175
+ } else {
176
+ // One reason we wanted to send everything through GA is to honor region/consent status
177
+ // GA will send to ingest so you don’t need to send separately
178
+ return sendToGA({
179
+ submitData,
180
+ type,
181
+ source
182
+ });
183
+ }
184
+ };
185
+
186
+ const StyledMobileSelect = /*#__PURE__*/wpdsUiKit.styled('select', {
187
+ padding: '12px 16px 12px 6px',
188
+ display: 'flex',
189
+ justifyContent: 'space-between',
190
+ width: '100%',
191
+ backgroundColor: '$secondary',
192
+ color: '$primary',
193
+ fontFamily: '$meta',
194
+ fontSize: '$100',
195
+ fontWeight: '$light',
196
+ lineHeight: '$125',
197
+ paddingBlockRight: '$125',
198
+ textOverflow: 'ellipsis',
199
+ position: 'relative',
200
+ borderColor: 'transparent',
201
+ borderRightWidth: '10px',
202
+ borderRightColor: 'transparent',
203
+ appearance: 'none',
204
+ '-webkit-appearance': 'none',
205
+ '&:disabled': {
206
+ backgroundColor: wpdsUiKit.theme.colors.disabled,
207
+ borderColor: wpdsUiKit.theme.colors.disabled,
208
+ color: wpdsUiKit.theme.colors.onDisabled,
209
+ cursor: 'not-allowed'
210
+ }
211
+ });
212
+ const StyledSelectWrapper = /*#__PURE__*/wpdsUiKit.styled('div', {
213
+ width: '100%',
214
+ maxWidth: '380px',
215
+ borderRadius: '$012',
216
+ borderColor: '$subtle',
217
+ borderStyle: 'solid',
218
+ borderWidth: '1px',
219
+ backgroundColor: '$secondary',
220
+ position: 'relative'
221
+ });
222
+ const StyledMobileOption = /*#__PURE__*/wpdsUiKit.styled('option', {
223
+ fontFamily: 'inherit',
224
+ fontSize: 'inherit',
225
+ color: 'inherit'
226
+ });
227
+ /**
228
+ * Dropdown component. Uses wpds-ui-kit on desktop and native select on mobile.
229
+ * @param {IDropdownProps} props The props.
230
+ * @returns {React.ReactElement} The dropdown.
231
+ */
232
+ const Dropdown = _ref => {
233
+ let {
234
+ id,
235
+ label,
236
+ values,
237
+ required = false,
238
+ defaultValue,
239
+ onChange = () => {},
240
+ disabled = false
241
+ } = _ref;
242
+ const [answer, setAnswer] = React.useState();
243
+ const {
244
+ isMobileSize
245
+ } = subsHooks.useWindowSize();
246
+ React.useEffect(() => {
247
+ if (answer) onChange(answer);
248
+ }, [answer]);
249
+ const disabledProp = disabled ? {
250
+ disabled: true
251
+ } : {};
252
+ // helps maintain state between WPDS and native dropdowns
253
+ const defaultValueProp = answer ? {
254
+ defaultValue: answer
255
+ } : defaultValue ? {
256
+ defaultValue
257
+ } : {};
258
+ const defaultValuePropMobile = value => {
259
+ if (answer) {
260
+ return value === answer ? {
261
+ selected: true
262
+ } : {};
263
+ }
264
+ return value === defaultValue ? {
265
+ selected: true
266
+ } : {};
267
+ };
268
+ return isMobileSize ? React__default.createElement(StyledSelectWrapper, null, React__default.createElement(StyledMobileSelect, {
269
+ id: "",
270
+ required: required,
271
+ onChange: e => setAnswer(e.target.value),
272
+ placeholder: label,
273
+ ...disabledProp
274
+ }, React__default.createElement("label", null, label), React__default.createElement(StyledMobileOption, {
275
+ value: "",
276
+ disabled: true,
277
+ selected: true,
278
+ style: {
279
+ color: '#666666'
280
+ }
281
+ }, label), values.map(value => React__default.createElement(StyledMobileOption, {
282
+ value: value,
283
+ key: value,
284
+ ...defaultValuePropMobile(value)
285
+ }, value))), React__default.createElement(wpdsUiKit.Icon, {
286
+ label: "",
287
+ size: "100",
288
+ fill: wpdsUiKit.theme.colors['gray80'],
289
+ style: {
290
+ pointerEvents: 'none',
291
+ position: 'absolute',
292
+ right: '10px',
293
+ top: '50%',
294
+ transform: 'translateY(-50%)'
295
+ }
296
+ }, React__default.createElement(wpdsAssets.ChevronDown, {
297
+ style: {
298
+ position: 'absolute',
299
+ right: '10px'
300
+ }
301
+ }))) : React__default.createElement(wpdsUiKit.Select.Root, {
302
+ onValueChange: e => setAnswer(e),
303
+ required: required,
304
+ ...defaultValueProp,
305
+ ...disabledProp
306
+ }, React__default.createElement(wpdsUiKit.Select.Trigger, {
307
+ "data-test-id": `${id}-select-trigger`
308
+ }, React__default.createElement(wpdsUiKit.Select.Label, null, label), React__default.createElement(wpdsUiKit.Select.Value, null)), React__default.createElement(wpdsUiKit.Select.Content, {
309
+ css: {
310
+ zIndex: wpdsUiKit.theme.zIndices.page
311
+ },
312
+ "data-test-id": `${id}-select-content`
313
+ }, values.map(value => React__default.createElement(wpdsUiKit.Select.Item, {
314
+ value: value,
315
+ key: value
316
+ }, value))));
317
+ };
318
+
146
319
  const scriptSrc = `${subsSdk.ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static' ? 'https://www.washingtonpost.com/subscribe/static/' : subsSdk.ENDPOINTS.staticAssets}/de-utils/twpdeu.min.js`;
147
320
  const DESelect = _ref => {
148
321
  let {
@@ -194,7 +367,7 @@ const DESelect = _ref => {
194
367
  type: config !== null && config !== void 0 && config.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,
195
368
  source
196
369
  }));
197
- const isError = result ? result.status !== subsSdk.ResponseStatus.SUCCESS : true;
370
+ const isError = result === true ? false : result ? result.status !== subsSdk.ResponseStatus.SUCCESS : true;
198
371
  onFinished({
199
372
  isFinished: true,
200
373
  isError
@@ -219,28 +392,33 @@ const DESelect = _ref => {
219
392
  } : {};
220
393
  // sort and filter out archived values
221
394
  const values = config ? config.values.sort((a, b) => a.order - b.order).filter(value => value.archived !== true).filter(valuesFilter) : [];
222
- return React__default.createElement(SelectWrapper, null, React__default.createElement(wpdsUiKit.Select.Root, {
395
+ return React__default.createElement(SelectWrapper, null, children && React__default.createElement(wpdsUiKit.Select.Root, {
223
396
  onValueChange: e => {
397
+ setSelected(e);
224
398
  onChange({
225
399
  value: e
226
400
  });
227
- setSelected(e);
228
401
  },
229
402
  ...defaultValueProp,
230
403
  ...disabledProp
231
- }, children ? children : null, !children && !config && React__default.createElement(React__default.Fragment, null, React__default.createElement(wpdsUiKit.Select.Trigger, {
232
- "data-test-id": `select-trigger-loading`
233
- }, React__default.createElement(wpdsUiKit.Select.Label, null, label || 'loading...'), React__default.createElement(wpdsUiKit.Select.Value, null))), !children && config && React__default.createElement(React__default.Fragment, null, React__default.createElement(wpdsUiKit.Select.Trigger, {
234
- "data-test-id": `${config.name}-select-trigger`
235
- }, React__default.createElement(wpdsUiKit.Select.Label, null, label || config.name), React__default.createElement(wpdsUiKit.Select.Value, null)), React__default.createElement(wpdsUiKit.Select.Content, {
236
- css: {
237
- zIndex: wpdsUiKit.theme.zIndices.page
404
+ }, children), !children && !config && React__default.createElement(Dropdown, {
405
+ id: 'loading',
406
+ label: 'Loading...',
407
+ values: [],
408
+ disabled: true
409
+ }), !children && config && React__default.createElement(Dropdown, {
410
+ id: config.name,
411
+ label: label || config.name,
412
+ onChange: e => {
413
+ setSelected(e);
414
+ onChange({
415
+ value: e
416
+ });
238
417
  },
239
- "data-test-id": `${config.name}-select-content`
240
- }, values.map(value => React__default.createElement(wpdsUiKit.Select.Item, {
241
- value: value.name,
242
- key: value.name
243
- }, value.name))))));
418
+ values: values.map(value => value.name),
419
+ defaultValue: defaultValue,
420
+ disabled: disabled
421
+ }));
244
422
  };
245
423
  const SelectWrapper = /*#__PURE__*/wpdsUiKit.styled('div', {
246
424
  boxSizing: 'border-box',
@@ -262,5 +440,5 @@ exports.IngestResponseState = IngestResponseState;
262
440
  exports.IngestType = IngestType;
263
441
  exports.getAttributes = getAttributes;
264
442
  exports.hasRequiredPrivacyCookies = hasRequiredPrivacyCookies;
265
- exports.ingest = ingest;
443
+ exports.push = push;
266
444
  //# sourceMappingURL=subs-de-inputs.cjs.development.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subs-de-inputs.cjs.development.js","sources":["../src/interfaces/index.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/dataEnrichment.ts","../src/components/DESelect/index.tsx"],"sourcesContent":["export type AttributeValue = {\n name: string;\n date_created: Number;\n last_modified_date: Number;\n archived: boolean;\n order: number;\n};\n\nexport const CollectionBehaviors = {\n COLLECT: 'COLLECT',\n DO_NOT_COLLECT: 'DO_NOT_COLLECT',\n} as const;\n\nexport type Attribute = {\n name: string;\n approved_for_use?: boolean;\n collection_behavior?: (typeof CollectionBehaviors)[keyof typeof CollectionBehaviors];\n datatype: 'string';\n explicit: boolean;\n multiple_value: boolean;\n last_modified_date: Number;\n date_created: Number;\n values: Array<AttributeValue>;\n};\n\nexport const AttributesState = {\n SUCCESS: '100',\n} as const;\n\nexport const IngestType = {\n EXPLICIT: 'explicit',\n IMPLICIT: 'implicit',\n} as const;\n\nexport const IngestResponseState = {\n SUCCESS: '100',\n SYSTEM_ERROR: '101',\n INVALID_TYPE: '102',\n INVALID_IDENTIFIER: '103',\n INVALID_DATA: '104',\n INVALID_ATTRIBUTE_DEFINITION: '105',\n INVALID_META_DEFINITION: '106',\n UNAUTHENTICATED: '107',\n MISMATCHED_IDENTIFIER: '108',\n DISABLED_ATTRIBUTE_DEFINITION: '109',\n DO_NOT_COLLECT: '110',\n} as const;\n","import { WPGeo, getCookie } from '@washingtonpost/subs-sdk';\n\nexport const hasRequiredPrivacyCookies = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const wp_usp = getCookie('wp_usp');\n\n const countryCode = WPGeo()?.country_code;\n\n return !!(wp_usp && countryCode === 'US');\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport {\n Attribute,\n CollectionBehaviors,\n IngestResponseState,\n IngestType,\n} from '../interfaces';\nimport { hasRequiredPrivacyCookies } from '../utils/hasRequiredPrivacyCookies';\n\nconst DEBUG_FLAG = 'f_de_debug';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nconst attributesCache: Record<string, any> = {};\nexport const getAttributes: GetAttributesType = async ({\n fieldName,\n}: {\n fieldName: string;\n}) => {\n const debug = window.location.search.includes(DEBUG_FLAG);\n\n if (debug) {\n console.debug('getAttributes()');\n }\n\n if (attributesCache[fieldName]) {\n if (debug) console.debug('getAttributes() > return cached info');\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 if (debug) console.debug(`getAttributes() > ${url.toString()}`);\n\n const data = await fetch(url.toString(), {\n credentials: 'include',\n headers: JSON_HEADERS,\n });\n const json = await data.json();\n\n if (data.ok && json.status === ResponseStatus.SUCCESS) {\n const attributes = json.attributes || [];\n attributesCache[fieldName] = attributes;\n return attributes;\n } else {\n return [];\n }\n } catch (e) {\n console.debug(e);\n return [];\n }\n};\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\n\nexport const ingest: IngestType = async ({\n submitData: { fieldName, value },\n type = IngestType.IMPLICIT,\n source,\n}) => {\n const debug = window.location.search.includes(DEBUG_FLAG);\n\n if (debug) {\n console.debug('ingest()');\n }\n\n const url = `${base}/ingest`;\n\n const wapo_login_id = getCookie('wapo_login_id');\n\n if (!hasRequiredPrivacyCookies()) {\n if (debug) console.debug('ingest() > hasRequiredPrivacyCookies falsy');\n throw new Error('does not satisfy cookie check');\n }\n\n let attributeInfo = attributesCache[fieldName];\n if (!attributeInfo) {\n if (debug) console.debug('ingest() > fetch attribute info');\n attributeInfo = await getAttributes({ fieldName });\n } else {\n if (debug) console.debug('ingest() > use cached attribute info');\n }\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n if (debug) console.debug('ingest() > do not collect');\n throw new Error('do not collect');\n }\n\n const jucid = localStorage.getItem('uuid');\n const ga = getCookie('_ga');\n\n const payload = {\n jucid,\n ga,\n type,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n [fieldName]: [value],\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<{\n status: ResponseStatus;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n} | null>;\n","import React, { useState, useEffect } from 'react';\nimport { Select, styled, theme } from '@washingtonpost/wpds-ui-kit';\nimport { Attribute, AttributeValue, IngestType } from '../../interfaces';\nimport { ENDPOINTS, ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';\n\ninterface DESelectProps {\n source: string;\n fieldName: string;\n label?: string;\n dataDictionaryConfig?: Attribute;\n defaultValue?: string;\n disabled?: boolean;\n submit: boolean;\n onChange?: ({ value }: { value: string }) => void;\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n valuesFilter?: (value: AttributeValue) => boolean;\n selectProps?: {\n root?: any;\n trigger?: any;\n label?: any;\n value?: any;\n content?: any;\n item?: any;\n };\n children?: React.ReactNode;\n}\n\nconst scriptSrc = `${\n ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static'\n ? 'https://www.washingtonpost.com/subscribe/static/'\n : ENDPOINTS.staticAssets\n}/de-utils/twpdeu.min.js`;\n\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n defaultValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState('');\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n const config = await window?.__twpdeu?.getFieldConfigs({ fieldName });\n if (config) {\n setConfig(config[0]);\n } else {\n console.error('unable to get config', fieldName);\n }\n } catch (e) {\n console.warn('unable to get config', fieldName, e);\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && !(children || config)) {\n fetchConfig();\n }\n }, [scriptStatus]);\n\n useEffect(() => {\n const submitSelected = async () => {\n try {\n // TODO: Log to GA?\n\n const result = await window?.__twpdeu?.push({\n submitData: { fieldName, value: selected },\n type: config?.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,\n source,\n });\n\n const isError = result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n } catch (e) {\n onFinished({\n isFinished: false,\n isError: true,\n });\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && submit && selected) {\n submitSelected();\n }\n }, [scriptStatus, submit]);\n\n const defaultValueProp = defaultValue && config ? { defaultValue } : {};\n\n const isLoading = !(children || config);\n\n const disabledProp = disabled || isLoading ? { disabled: true } : {};\n\n // sort and filter out archived values\n 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 <Select.Root\n onValueChange={(e: string) => {\n onChange({ value: e });\n setSelected(e);\n }}\n {...defaultValueProp}\n {...disabledProp}\n >\n {children ? children : null}\n {!children && !config && (\n <>\n <Select.Trigger data-test-id={`select-trigger-loading`}>\n <Select.Label>{label || 'loading...'}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n </>\n )}\n {!children && config && (\n <>\n <Select.Trigger data-test-id={`${config.name}-select-trigger`}>\n <Select.Label>{label || config.name}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n <Select.Content\n css={{ zIndex: theme.zIndices.page }}\n data-test-id={`${config.name}-select-content`}\n >\n {values.map((value) => (\n <Select.Item value={value.name} key={value.name}>\n {value.name}\n </Select.Item>\n ))}\n </Select.Content>\n </>\n )}\n </Select.Root>\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled('div', {\n boxSizing: 'border-box',\n display: 'flex',\n marginBottom: '$100',\n flexDirection: 'column',\n '& button': {\n padding: '1px 6px',\n },\n '& *': { boxSizing: 'border-box' },\n});\n"],"names":["CollectionBehaviors","COLLECT","DO_NOT_COLLECT","AttributesState","SUCCESS","IngestType","EXPLICIT","IMPLICIT","IngestResponseState","SYSTEM_ERROR","INVALID_TYPE","INVALID_IDENTIFIER","INVALID_DATA","INVALID_ATTRIBUTE_DEFINITION","INVALID_META_DEFINITION","UNAUTHENTICATED","MISMATCHED_IDENTIFIER","DISABLED_ATTRIBUTE_DEFINITION","hasRequiredPrivacyCookies","window","wp_usp","getCookie","countryCode","_WPGeo","WPGeo","country_code","DEBUG_FLAG","base","ENDPOINTS","attributesCache","getAttributes","_ref","fieldName","debug","location","search","includes","console","fieldNames","url","URL","searchParams","set","join","toString","data","fetch","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","attributes","e","ingest","_ref2","submitData","value","type","source","wapo_login_id","Error","attributeInfo","name","collection_behavior","jucid","localStorage","getItem","ga","payload","metadata","response","method","body","JSON","stringify","scriptSrc","staticAssets","DESelect","label","dataDictionaryConfig","defaultValue","disabled","submit","onChange","onFinished","valuesFilter","children","config","setConfig","useState","selected","setSelected","scriptStatus","useScript","useEffect","fetchConfig","_window","__twpdeu","getFieldConfigs","error","warn","ScriptStatus","READY","submitSelected","_window2","result","push","explicit","isError","isFinished","defaultValueProp","isLoading","disabledProp","values","sort","a","b","order","filter","archived","React","SelectWrapper","Select","Root","onValueChange","Trigger","Label","Value","Content","css","zIndex","theme","zIndices","page","map","Item","key","styled","boxSizing","display","marginBottom","flexDirection","padding"],"mappings":"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"}
1
+ {"version":3,"file":"subs-de-inputs.cjs.development.js","sources":["../src/interfaces/index.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/getAttributes.ts","../src/services/sendToGA.ts","../src/services/ingest.ts","../src/services/push.ts","../src/components/DESelect/Dropdown.tsx","../src/components/DESelect/index.tsx"],"sourcesContent":["export type AttributeValue = {\n name: string;\n date_created: Number;\n last_modified_date: Number;\n archived: boolean;\n order: number;\n};\n\nexport const CollectionBehaviors = {\n COLLECT: 'COLLECT',\n DO_NOT_COLLECT: 'DO_NOT_COLLECT',\n} as const;\n\nexport type Attribute = {\n name: string;\n approved_for_use?: boolean;\n collection_behavior?: (typeof CollectionBehaviors)[keyof typeof CollectionBehaviors];\n datatype: 'string';\n explicit: boolean;\n multiple_value: boolean;\n last_modified_date: Number;\n date_created: Number;\n values: Array<AttributeValue>;\n};\n\nexport const AttributesState = {\n SUCCESS: '100',\n} as const;\n\nexport const IngestType = {\n EXPLICIT: 'explicit',\n IMPLICIT: 'implicit',\n} as const;\n\nexport const IngestResponseState = {\n SUCCESS: '100',\n SYSTEM_ERROR: '101',\n INVALID_TYPE: '102',\n INVALID_IDENTIFIER: '103',\n INVALID_DATA: '104',\n INVALID_ATTRIBUTE_DEFINITION: '105',\n INVALID_META_DEFINITION: '106',\n UNAUTHENTICATED: '107',\n MISMATCHED_IDENTIFIER: '108',\n DISABLED_ATTRIBUTE_DEFINITION: '109',\n DO_NOT_COLLECT: '110',\n} as const;\n","import { WPGeo, getCookie } from '@washingtonpost/subs-sdk';\n\nexport const hasRequiredPrivacyCookies = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const wp_usp = getCookie('wp_usp');\n\n const countryCode = WPGeo()?.country_code;\n\n return !!(wp_usp && countryCode === 'US');\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n} from '@washingtonpost/subs-sdk';\nimport { Attribute } from '../interfaces';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nconst attributesCache: Record<string, any> = {};\nexport const getAttributes: GetAttributesType = async ({\n fieldName,\n}: {\n fieldName: string;\n}) => {\n if (attributesCache[fieldName]) {\n return attributesCache[fieldName];\n }\n\n const fieldNames = [fieldName];\n\n try {\n const url = new URL(`${base}/attributes`);\n url.searchParams.set('attributes', fieldNames.join(','));\n\n const data = await fetch(url.toString(), {\n credentials: 'include',\n headers: JSON_HEADERS,\n });\n const json = await data.json();\n\n if (data.ok && json.status === ResponseStatus.SUCCESS) {\n const attributes = json.attributes || [];\n attributesCache[fieldName] = attributes;\n return attributes;\n } else {\n return [];\n }\n } catch (e) {\n console.debug(e);\n return [];\n }\n};\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\n","import { IngestType } from '../interfaces';\n\nexport interface ISendGAEvent {\n event: string;\n category: string;\n action: string;\n label: string;\n 'de-label': string;\n [key: string]: undefined | string | string[];\n}\n\nconst sendGAEvent = (props: ISendGAEvent): void => {\n if (typeof window === 'undefined') {\n if (__DEV__) console.warn('NO WINDOW');\n return;\n }\n // Initialize dataLayer if needed\n window.dataLayer = window.dataLayer || [];\n\n const eventData: Record<string, any> = {\n ...props,\n };\n window.dataLayer.push(eventData);\n};\n\nexport const sendToGA: SendToGaType = async ({\n submitData: { fieldName, value },\n source,\n}) => {\n sendGAEvent({\n event: 'site-onpage-click',\n action: 'site-onpage-click',\n category: 'profile',\n\n label: fieldName,\n 'de-label': fieldName,\n [fieldName]: value,\n\n section: 'profile',\n subsection: source,\n });\n\n return true;\n};\n\ntype SendToGaType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<true>;\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport {\n IngestResponseState,\n IngestType,\n} from '../interfaces';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nexport const ingest: IngestType = async ({\n submitData: { fieldName, value },\n type = IngestType.IMPLICIT,\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,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n [fieldName]: [value],\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<{\n status: ResponseStatus;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n} | null>;\n","import {\n CollectionBehaviors,\n IngestResponseState,\n IngestType,\n} from '../interfaces';\nimport { getAttributes } from './getAttributes';\nimport { sendToGA } from './sendToGA';\nimport { hasRequiredPrivacyCookies } from '../utils/hasRequiredPrivacyCookies';\nimport { ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { ingest } from './ingest';\n\nexport const push: PushType = async ({\n submitData,\n type = IngestType.IMPLICIT,\n source,\n}) => {\n if (!hasRequiredPrivacyCookies()) {\n throw new Error('does not satisfy cookie check');\n }\n\n const attributeInfo = await getAttributes({\n fieldName: submitData.fieldName,\n });\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === submitData.fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n throw new Error('do not collect');\n }\n\n if (type === IngestType.EXPLICIT) {\n return ingest({ submitData, type, source });\n } else {\n // One reason we wanted to send everything through GA is to honor region/consent status\n // GA will send to ingest so you don’t need to send separately\n return sendToGA({ submitData, type, source });\n }\n};\n\ntype PushType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<\n | {\n status: ResponseStatus;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n }\n | null\n | true\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 defaultValue?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n}\n\nconst StyledMobileSelect = styled('select', {\n padding: '12px 16px 12px 6px',\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n backgroundColor: '$secondary',\n color: '$primary',\n fontFamily: '$meta',\n fontSize: '$100',\n fontWeight: '$light',\n lineHeight: '$125',\n paddingBlockRight: '$125',\n textOverflow: 'ellipsis',\n position: 'relative',\n borderColor: 'transparent',\n borderRightWidth: '10px',\n borderRightColor: 'transparent',\n appearance: 'none',\n '-webkit-appearance': 'none',\n '&:disabled': {\n backgroundColor: theme.colors.disabled,\n borderColor: theme.colors.disabled,\n color: theme.colors.onDisabled,\n cursor: 'not-allowed',\n },\n});\n\nconst StyledSelectWrapper = styled('div', {\n width: '100%',\n maxWidth: '380px',\n borderRadius: '$012',\n borderColor: '$subtle',\n borderStyle: 'solid',\n borderWidth: '1px',\n backgroundColor: '$secondary',\n position: 'relative',\n});\n\nconst StyledMobileOption = styled('option', {\n fontFamily: 'inherit',\n fontSize: 'inherit',\n color: 'inherit',\n});\n\n/**\n * Dropdown component. Uses wpds-ui-kit on desktop and native select on mobile.\n * @param {IDropdownProps} props The props.\n * @returns {React.ReactElement} The dropdown.\n */\nexport const Dropdown = ({\n id,\n label,\n values,\n required = false,\n defaultValue,\n onChange = () => {},\n disabled = false,\n}: IDropdownProps) => {\n const [answer, setAnswer] = useState<string>();\n const { isMobileSize } = useWindowSize();\n\n useEffect(() => {\n if (answer) onChange(answer);\n }, [answer]);\n\n const disabledProp = disabled ? { disabled: true } : {};\n\n // helps maintain state between WPDS and native dropdowns\n const defaultValueProp = answer\n ? { defaultValue: answer }\n : defaultValue\n ? { defaultValue }\n : {};\n\n const defaultValuePropMobile = (value: string) => {\n if (answer) {\n return value === answer ? { selected: true } : {};\n }\n return value === defaultValue ? { selected: true } : {};\n };\n\n return isMobileSize ? (\n <StyledSelectWrapper>\n <StyledMobileSelect\n id=\"\"\n required={required}\n onChange={(e) => setAnswer(e.target.value)}\n placeholder={label}\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 { Attribute, AttributeValue, IngestType } from '../../interfaces';\nimport { ENDPOINTS, ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';\nimport { Dropdown } from './Dropdown';\n\ninterface DESelectProps {\n source: string;\n fieldName: string;\n label?: string;\n dataDictionaryConfig?: Attribute;\n defaultValue?: string;\n disabled?: boolean;\n submit: boolean;\n onChange?: ({ value }: { value: string }) => void;\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n valuesFilter?: (value: AttributeValue) => boolean;\n selectProps?: {\n root?: any;\n trigger?: any;\n label?: any;\n value?: any;\n content?: any;\n item?: any;\n };\n children?: React.ReactNode;\n}\n\nconst scriptSrc = `${\n ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static'\n ? 'https://www.washingtonpost.com/subscribe/static/'\n : ENDPOINTS.staticAssets\n}/de-utils/twpdeu.min.js`;\n\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n defaultValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState('');\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n const config = await window?.__twpdeu?.getFieldConfigs({ fieldName });\n if (config) {\n setConfig(config[0]);\n } else {\n console.error('unable to get config', fieldName);\n }\n } catch (e) {\n console.warn('unable to get config', fieldName, e);\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && !(children || config)) {\n fetchConfig();\n }\n }, [scriptStatus]);\n\n useEffect(() => {\n const submitSelected = async () => {\n try {\n // TODO: Log to GA?\n\n const result = await window?.__twpdeu?.push({\n submitData: { fieldName, value: selected },\n type: config?.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,\n source,\n });\n\n const isError =\n result === true\n ? false\n : result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n } catch (e) {\n onFinished({\n isFinished: false,\n isError: true,\n });\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && submit && selected) {\n submitSelected();\n }\n }, [scriptStatus, submit]);\n\n const defaultValueProp = defaultValue && config ? { defaultValue } : {};\n\n const isLoading = !(children || config);\n\n const disabledProp = disabled || isLoading ? { disabled: true } : {};\n\n // sort and filter out archived values\n const values = config\n ? config.values\n .sort((a, b) => a.order - b.order)\n .filter((value) => value.archived !== true)\n .filter(valuesFilter)\n : [];\n\n return (\n <SelectWrapper>\n {children && (\n <Select.Root\n onValueChange={(e) => {\n setSelected(e);\n onChange({ value: e });\n }}\n {...defaultValueProp}\n {...disabledProp}\n >\n {children}\n </Select.Root>\n )}\n {!children && !config && (\n <Dropdown\n id={'loading'}\n label={'Loading...'}\n values={[]}\n disabled={true}\n />\n )}\n {!children && config && (\n <Dropdown\n id={config.name}\n label={label || config.name}\n onChange={(e) => {\n setSelected(e);\n onChange({ value: e });\n }}\n values={values.map((value) => value.name)}\n defaultValue={defaultValue}\n disabled={disabled}\n />\n )}\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled('div', {\n boxSizing: 'border-box',\n display: 'flex',\n marginBottom: '$100',\n flexDirection: 'column',\n '& button': {\n padding: '1px 6px',\n },\n '& *': { boxSizing: 'border-box' },\n});\n"],"names":["CollectionBehaviors","COLLECT","DO_NOT_COLLECT","AttributesState","SUCCESS","IngestType","EXPLICIT","IMPLICIT","IngestResponseState","SYSTEM_ERROR","INVALID_TYPE","INVALID_IDENTIFIER","INVALID_DATA","INVALID_ATTRIBUTE_DEFINITION","INVALID_META_DEFINITION","UNAUTHENTICATED","MISMATCHED_IDENTIFIER","DISABLED_ATTRIBUTE_DEFINITION","hasRequiredPrivacyCookies","window","wp_usp","getCookie","countryCode","_WPGeo","WPGeo","country_code","base","ENDPOINTS","attributesCache","getAttributes","_ref","fieldName","fieldNames","url","URL","searchParams","set","join","data","fetch","toString","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","attributes","e","console","debug","sendGAEvent","props","process","env","NODE_ENV","warn","dataLayer","eventData","push","sendToGA","submitData","value","source","event","action","category","label","section","subsection","ingest","type","wapo_login_id","jucid","localStorage","getItem","ga","payload","metadata","response","method","body","JSON","stringify","Error","attributeInfo","name","collection_behavior","StyledMobileSelect","styled","padding","display","justifyContent","width","backgroundColor","color","fontFamily","fontSize","fontWeight","lineHeight","paddingBlockRight","textOverflow","position","borderColor","borderRightWidth","borderRightColor","appearance","theme","colors","disabled","onDisabled","cursor","StyledSelectWrapper","maxWidth","borderRadius","borderStyle","borderWidth","StyledMobileOption","Dropdown","id","values","required","defaultValue","onChange","answer","setAnswer","useState","isMobileSize","useWindowSize","useEffect","disabledProp","defaultValueProp","defaultValuePropMobile","selected","React","target","placeholder","style","map","key","Icon","size","fill","pointerEvents","right","top","transform","ChevronDown","Select","Root","onValueChange","Trigger","Label","Value","Content","css","zIndex","zIndices","page","Item","scriptSrc","staticAssets","DESelect","dataDictionaryConfig","submit","onFinished","valuesFilter","children","config","setConfig","setSelected","scriptStatus","useScript","fetchConfig","_window","__twpdeu","getFieldConfigs","error","ScriptStatus","READY","submitSelected","_window2","result","explicit","isError","isFinished","isLoading","sort","a","b","order","filter","archived","SelectWrapper","boxSizing","marginBottom","flexDirection"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("@washingtonpost/subs-sdk"),o=require("react"),s=(e=o)&&"object"==typeof e&&"default"in e?e.default:e,n=require("@washingtonpost/wpds-ui-kit"),i=require("@washingtonpost/subs-hooks");const a={COLLECT:"COLLECT",DO_NOT_COLLECT:"DO_NOT_COLLECT"},r={EXPLICIT:"explicit",IMPLICIT:"implicit"},l=()=>{var e;if("undefined"==typeof window)return!1;const o=t.getCookie("wp_usp"),s=null===(e=t.WPGeo())||void 0===e?void 0:e.country_code;return!(!o||"US"!==s)},c=t.ENDPOINTS.base+"/de/v1",u={},d=async e=>{let{fieldName:o}=e;const s=window.location.search.includes("f_de_debug");if(s&&console.debug("getAttributes()"),u[o])return s&&console.debug("getAttributes() > return cached info"),u[o];const n=[o];try{const e=new URL(c+"/attributes");e.searchParams.set("attributes",n.join(",")),s&&console.debug("getAttributes() > "+e.toString());const i=await fetch(e.toString(),{credentials:"include",headers:t.JSON_HEADERS}),a=await i.json();if(i.ok&&a.status===t.ResponseStatus.SUCCESS){const e=a.attributes||[];return u[o]=e,e}return[]}catch(e){return console.debug(e),[]}},g=("https://subscribe.washingtonpost.com/static"===t.ENDPOINTS.staticAssets?"https://www.washingtonpost.com/subscribe/static/":t.ENDPOINTS.staticAssets)+"/de-utils/twpdeu.min.js",E=n.styled("div",{boxSizing:"border-box",display:"flex",marginBottom:"$100",flexDirection:"column","& button":{padding:"1px 6px"},"& *":{boxSizing:"border-box"}});exports.AttributesState={SUCCESS:"100"},exports.CollectionBehaviors=a,exports.DESelect=e=>{let{source:a,fieldName:l,label:c,dataDictionaryConfig:u,defaultValue:d,disabled:I,submit:S,onChange:b=(()=>{}),onFinished:p=(()=>{}),valuesFilter:m=(()=>!0),children:f}=e;const[T,h]=o.useState(u),[_,w]=o.useState(""),C=i.useScript(g);o.useEffect(()=>{C!==i.ScriptStatus.READY||f||T||(async()=>{try{var e;const t=await(null===(e=window)||void 0===e||null===(e=e.__twpdeu)||void 0===e?void 0:e.getFieldConfigs({fieldName:l}));t?h(t[0]):console.error("unable to get config",l)}catch(e){console.warn("unable to get config",l,e)}})()},[C]),o.useEffect(()=>{C===i.ScriptStatus.READY&&S&&_&&(async()=>{try{var e;const o=await(null===(e=window)||void 0===e||null===(e=e.__twpdeu)||void 0===e?void 0:e.push({submitData:{fieldName:l,value:_},type:null!=T&&T.explicit?r.EXPLICIT:r.IMPLICIT,source:a}));p({isFinished:!0,isError:!o||o.status!==t.ResponseStatus.SUCCESS})}catch(e){p({isFinished:!1,isError:!0})}})()},[C,S]);const N=d&&T?{defaultValue:d}:{},D=I||!f&&!T?{disabled:!0}:{},v=T?T.values.sort((e,t)=>e.order-t.order).filter(e=>!0!==e.archived).filter(m):[];return s.createElement(E,null,s.createElement(n.Select.Root,{onValueChange:e=>{b({value:e}),w(e)},...N,...D},f||null,!f&&!T&&s.createElement(s.Fragment,null,s.createElement(n.Select.Trigger,{"data-test-id":"select-trigger-loading"},s.createElement(n.Select.Label,null,c||"loading..."),s.createElement(n.Select.Value,null))),!f&&T&&s.createElement(s.Fragment,null,s.createElement(n.Select.Trigger,{"data-test-id":T.name+"-select-trigger"},s.createElement(n.Select.Label,null,c||T.name),s.createElement(n.Select.Value,null)),s.createElement(n.Select.Content,{css:{zIndex:n.theme.zIndices.page},"data-test-id":T.name+"-select-content"},v.map(e=>s.createElement(n.Select.Item,{value:e.name,key:e.name},e.name))))))},exports.IngestResponseState={SUCCESS:"100",SYSTEM_ERROR:"101",INVALID_TYPE:"102",INVALID_IDENTIFIER:"103",INVALID_DATA:"104",INVALID_ATTRIBUTE_DEFINITION:"105",INVALID_META_DEFINITION:"106",UNAUTHENTICATED:"107",MISMATCHED_IDENTIFIER:"108",DISABLED_ATTRIBUTE_DEFINITION:"109",DO_NOT_COLLECT:"110"},exports.IngestType=r,exports.getAttributes=d,exports.hasRequiredPrivacyCookies=l,exports.ingest=async e=>{let{submitData:{fieldName:o,value:s},type:n=r.IMPLICIT,source:i}=e;const g=window.location.search.includes("f_de_debug");g&&console.debug("ingest()");const E=c+"/ingest",I=t.getCookie("wapo_login_id");if(!l())throw g&&console.debug("ingest() > hasRequiredPrivacyCookies falsy"),new Error("does not satisfy cookie check");let S=u[o];if(S?g&&console.debug("ingest() > use cached attribute info"):(g&&console.debug("ingest() > fetch attribute info"),S=await d({fieldName:o})),S[0]&&S[0].name===o&&S[0].collection_behavior===a.DO_NOT_COLLECT)throw g&&console.debug("ingest() > do not collect"),new Error("do not collect");const b={jucid:localStorage.getItem("uuid"),ga:t.getCookie("_ga"),type:n,wapo_login_id:I,data:{[o]:[s]},metadata:{source:i}};try{const e=await fetch(E,{method:"POST",credentials:"include",headers:t.JSON_HEADERS,body:JSON.stringify(b)});return await e.json()}catch(e){return console.debug(e),null}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("@washingtonpost/subs-sdk"),o=require("react"),a=(e=o)&&"object"==typeof e&&"default"in e?e.default:e,i=require("@washingtonpost/wpds-ui-kit"),s=require("@washingtonpost/subs-hooks"),r=require("@washingtonpost/wpds-assets");const n={COLLECT:"COLLECT",DO_NOT_COLLECT:"DO_NOT_COLLECT"},l={EXPLICIT:"explicit",IMPLICIT:"implicit"},d=()=>{var e;if("undefined"==typeof window)return!1;const o=t.getCookie("wp_usp"),a=null===(e=t.WPGeo())||void 0===e?void 0:e.country_code;return!(!o||"US"!==a)},c=t.ENDPOINTS.base+"/de/v1",u={},p=async e=>{let{fieldName:o}=e;if(u[o])return u[o];const a=[o];try{const e=new URL(c+"/attributes");e.searchParams.set("attributes",a.join(","));const i=await fetch(e.toString(),{credentials:"include",headers:t.JSON_HEADERS}),s=await i.json();if(i.ok&&s.status===t.ResponseStatus.SUCCESS){const e=s.attributes||[];return u[o]=e,e}return[]}catch(e){return console.debug(e),[]}},b=t.ENDPOINTS.base+"/de/v1",E=i.styled("select",{padding:"12px 16px 12px 6px",display:"flex",justifyContent:"space-between",width:"100%",backgroundColor:"$secondary",color:"$primary",fontFamily:"$meta",fontSize:"$100",fontWeight:"$light",lineHeight:"$125",paddingBlockRight:"$125",textOverflow:"ellipsis",position:"relative",borderColor:"transparent",borderRightWidth:"10px",borderRightColor:"transparent",appearance:"none","-webkit-appearance":"none","&:disabled":{backgroundColor:i.theme.colors.disabled,borderColor:i.theme.colors.disabled,color:i.theme.colors.onDisabled,cursor:"not-allowed"}}),g=i.styled("div",{width:"100%",maxWidth:"380px",borderRadius:"$012",borderColor:"$subtle",borderStyle:"solid",borderWidth:"1px",backgroundColor:"$secondary",position:"relative"}),m=i.styled("option",{fontFamily:"inherit",fontSize:"inherit",color:"inherit"}),h=e=>{let{id:t,label:n,values:l,required:d=!1,defaultValue:c,onChange:u=(()=>{}),disabled:p=!1}=e;const[b,h]=o.useState(),{isMobileSize:I}=s.useWindowSize();o.useEffect(()=>{b&&u(b)},[b]);const f=p?{disabled:!0}:{},S=b?{defaultValue:b}:c?{defaultValue:c}:{},w=e=>b?e===b?{selected:!0}:{}:e===c?{selected:!0}:{};return I?a.createElement(g,null,a.createElement(E,{id:"",required:d,onChange:e=>h(e.target.value),placeholder:n,...f},a.createElement("label",null,n),a.createElement(m,{value:"",disabled:!0,selected:!0,style:{color:"#666666"}},n),l.map(e=>a.createElement(m,{value:e,key:e,...w(e)},e))),a.createElement(i.Icon,{label:"",size:"100",fill:i.theme.colors.gray80,style:{pointerEvents:"none",position:"absolute",right:"10px",top:"50%",transform:"translateY(-50%)"}},a.createElement(r.ChevronDown,{style:{position:"absolute",right:"10px"}}))):a.createElement(i.Select.Root,{onValueChange:e=>h(e),required:d,...S,...f},a.createElement(i.Select.Trigger,{"data-test-id":t+"-select-trigger"},a.createElement(i.Select.Label,null,n),a.createElement(i.Select.Value,null)),a.createElement(i.Select.Content,{css:{zIndex:i.theme.zIndices.page},"data-test-id":t+"-select-content"},l.map(e=>a.createElement(i.Select.Item,{value:e,key:e},e))))},I=("https://subscribe.washingtonpost.com/static"===t.ENDPOINTS.staticAssets?"https://www.washingtonpost.com/subscribe/static/":t.ENDPOINTS.staticAssets)+"/de-utils/twpdeu.min.js",f=i.styled("div",{boxSizing:"border-box",display:"flex",marginBottom:"$100",flexDirection:"column","& button":{padding:"1px 6px"},"& *":{boxSizing:"border-box"}});exports.AttributesState={SUCCESS:"100"},exports.CollectionBehaviors=n,exports.DESelect=e=>{let{source:r,fieldName:n,label:d,dataDictionaryConfig:c,defaultValue:u,disabled:p,submit:b,onChange:E=(()=>{}),onFinished:g=(()=>{}),valuesFilter:m=(()=>!0),children:S}=e;const[w,C]=o.useState(c),[y,v]=o.useState(""),N=s.useScript(I);o.useEffect(()=>{N!==s.ScriptStatus.READY||S||w||(async()=>{try{var e;const t=await(null===(e=window)||void 0===e||null===(e=e.__twpdeu)||void 0===e?void 0:e.getFieldConfigs({fieldName:n}));t?C(t[0]):console.error("unable to get config",n)}catch(e){console.warn("unable to get config",n,e)}})()},[N]),o.useEffect(()=>{N===s.ScriptStatus.READY&&b&&y&&(async()=>{try{var e;const o=await(null===(e=window)||void 0===e||null===(e=e.__twpdeu)||void 0===e?void 0:e.push({submitData:{fieldName:n,value:y},type:null!=w&&w.explicit?l.EXPLICIT:l.IMPLICIT,source:r}));g({isFinished:!0,isError:!0!==o&&(!o||o.status!==t.ResponseStatus.SUCCESS)})}catch(e){g({isFinished:!1,isError:!0})}})()},[N,b]);const T=u&&w?{defaultValue:u}:{},D=p||!S&&!w?{disabled:!0}:{},_=w?w.values.sort((e,t)=>e.order-t.order).filter(e=>!0!==e.archived).filter(m):[];return a.createElement(f,null,S&&a.createElement(i.Select.Root,{onValueChange:e=>{v(e),E({value:e})},...T,...D},S),!S&&!w&&a.createElement(h,{id:"loading",label:"Loading...",values:[],disabled:!0}),!S&&w&&a.createElement(h,{id:w.name,label:d||w.name,onChange:e=>{v(e),E({value:e})},values:_.map(e=>e.name),defaultValue:u,disabled:p}))},exports.IngestResponseState={SUCCESS:"100",SYSTEM_ERROR:"101",INVALID_TYPE:"102",INVALID_IDENTIFIER:"103",INVALID_DATA:"104",INVALID_ATTRIBUTE_DEFINITION:"105",INVALID_META_DEFINITION:"106",UNAUTHENTICATED:"107",MISMATCHED_IDENTIFIER:"108",DISABLED_ATTRIBUTE_DEFINITION:"109",DO_NOT_COLLECT:"110"},exports.IngestType=l,exports.getAttributes=p,exports.hasRequiredPrivacyCookies=d,exports.push=async e=>{let{submitData:o,type:a=l.IMPLICIT,source:i}=e;if(!d())throw new Error("does not satisfy cookie check");const s=await p({fieldName:o.fieldName});if(s[0]&&s[0].name===o.fieldName&&s[0].collection_behavior===n.DO_NOT_COLLECT)throw new Error("do not collect");return a===l.EXPLICIT?(async e=>{let{submitData:{fieldName:o,value:a},type:i=l.IMPLICIT,source:s}=e;const r=b+"/ingest",n=t.getCookie("wapo_login_id"),d={jucid:localStorage.getItem("uuid"),ga:t.getCookie("_ga"),type:i,wapo_login_id:n,data:{[o]:[a]},metadata:{source:s}};try{const e=await fetch(r,{method:"POST",credentials:"include",headers:t.JSON_HEADERS,body:JSON.stringify(d)});return await e.json()}catch(e){return console.debug(e),null}})({submitData:o,type:a,source:i}):(async e=>{let{submitData:{fieldName:t,value:o},source:a}=e;return(e=>{if("undefined"==typeof window)return void("production"!==process.env.NODE_ENV&&console.warn("NO WINDOW"));window.dataLayer=window.dataLayer||[];const t={...e};window.dataLayer.push(t)})({event:"site-onpage-click",action:"site-onpage-click",category:"profile",label:t,"de-label":t,[t]:o,section:"profile",subsection:a}),!0})({submitData:o,type:a,source:i})};
2
2
  //# sourceMappingURL=subs-de-inputs.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subs-de-inputs.cjs.production.min.js","sources":["../src/interfaces/index.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/dataEnrichment.ts","../src/components/DESelect/index.tsx"],"sourcesContent":["export type AttributeValue = {\n name: string;\n date_created: Number;\n last_modified_date: Number;\n archived: boolean;\n order: number;\n};\n\nexport const CollectionBehaviors = {\n COLLECT: 'COLLECT',\n DO_NOT_COLLECT: 'DO_NOT_COLLECT',\n} as const;\n\nexport type Attribute = {\n name: string;\n approved_for_use?: boolean;\n collection_behavior?: (typeof CollectionBehaviors)[keyof typeof CollectionBehaviors];\n datatype: 'string';\n explicit: boolean;\n multiple_value: boolean;\n last_modified_date: Number;\n date_created: Number;\n values: Array<AttributeValue>;\n};\n\nexport const AttributesState = {\n SUCCESS: '100',\n} as const;\n\nexport const IngestType = {\n EXPLICIT: 'explicit',\n IMPLICIT: 'implicit',\n} as const;\n\nexport const IngestResponseState = {\n SUCCESS: '100',\n SYSTEM_ERROR: '101',\n INVALID_TYPE: '102',\n INVALID_IDENTIFIER: '103',\n INVALID_DATA: '104',\n INVALID_ATTRIBUTE_DEFINITION: '105',\n INVALID_META_DEFINITION: '106',\n UNAUTHENTICATED: '107',\n MISMATCHED_IDENTIFIER: '108',\n DISABLED_ATTRIBUTE_DEFINITION: '109',\n DO_NOT_COLLECT: '110',\n} as const;\n","import { WPGeo, getCookie } from '@washingtonpost/subs-sdk';\n\nexport const hasRequiredPrivacyCookies = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const wp_usp = getCookie('wp_usp');\n\n const countryCode = WPGeo()?.country_code;\n\n return !!(wp_usp && countryCode === 'US');\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport {\n Attribute,\n CollectionBehaviors,\n IngestResponseState,\n IngestType,\n} from '../interfaces';\nimport { hasRequiredPrivacyCookies } from '../utils/hasRequiredPrivacyCookies';\n\nconst DEBUG_FLAG = 'f_de_debug';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nconst attributesCache: Record<string, any> = {};\nexport const getAttributes: GetAttributesType = async ({\n fieldName,\n}: {\n fieldName: string;\n}) => {\n const debug = window.location.search.includes(DEBUG_FLAG);\n\n if (debug) {\n console.debug('getAttributes()');\n }\n\n if (attributesCache[fieldName]) {\n if (debug) console.debug('getAttributes() > return cached info');\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 if (debug) console.debug(`getAttributes() > ${url.toString()}`);\n\n const data = await fetch(url.toString(), {\n credentials: 'include',\n headers: JSON_HEADERS,\n });\n const json = await data.json();\n\n if (data.ok && json.status === ResponseStatus.SUCCESS) {\n const attributes = json.attributes || [];\n attributesCache[fieldName] = attributes;\n return attributes;\n } else {\n return [];\n }\n } catch (e) {\n console.debug(e);\n return [];\n }\n};\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\n\nexport const ingest: IngestType = async ({\n submitData: { fieldName, value },\n type = IngestType.IMPLICIT,\n source,\n}) => {\n const debug = window.location.search.includes(DEBUG_FLAG);\n\n if (debug) {\n console.debug('ingest()');\n }\n\n const url = `${base}/ingest`;\n\n const wapo_login_id = getCookie('wapo_login_id');\n\n if (!hasRequiredPrivacyCookies()) {\n if (debug) console.debug('ingest() > hasRequiredPrivacyCookies falsy');\n throw new Error('does not satisfy cookie check');\n }\n\n let attributeInfo = attributesCache[fieldName];\n if (!attributeInfo) {\n if (debug) console.debug('ingest() > fetch attribute info');\n attributeInfo = await getAttributes({ fieldName });\n } else {\n if (debug) console.debug('ingest() > use cached attribute info');\n }\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n if (debug) console.debug('ingest() > do not collect');\n throw new Error('do not collect');\n }\n\n const jucid = localStorage.getItem('uuid');\n const ga = getCookie('_ga');\n\n const payload = {\n jucid,\n ga,\n type,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n [fieldName]: [value],\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<{\n status: ResponseStatus;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n} | null>;\n","import React, { useState, useEffect } from 'react';\nimport { Select, styled, theme } from '@washingtonpost/wpds-ui-kit';\nimport { Attribute, AttributeValue, IngestType } from '../../interfaces';\nimport { ENDPOINTS, ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';\n\ninterface DESelectProps {\n source: string;\n fieldName: string;\n label?: string;\n dataDictionaryConfig?: Attribute;\n defaultValue?: string;\n disabled?: boolean;\n submit: boolean;\n onChange?: ({ value }: { value: string }) => void;\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n valuesFilter?: (value: AttributeValue) => boolean;\n selectProps?: {\n root?: any;\n trigger?: any;\n label?: any;\n value?: any;\n content?: any;\n item?: any;\n };\n children?: React.ReactNode;\n}\n\nconst scriptSrc = `${\n ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static'\n ? 'https://www.washingtonpost.com/subscribe/static/'\n : ENDPOINTS.staticAssets\n}/de-utils/twpdeu.min.js`;\n\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n defaultValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState('');\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n const config = await window?.__twpdeu?.getFieldConfigs({ fieldName });\n if (config) {\n setConfig(config[0]);\n } else {\n console.error('unable to get config', fieldName);\n }\n } catch (e) {\n console.warn('unable to get config', fieldName, e);\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && !(children || config)) {\n fetchConfig();\n }\n }, [scriptStatus]);\n\n useEffect(() => {\n const submitSelected = async () => {\n try {\n // TODO: Log to GA?\n\n const result = await window?.__twpdeu?.push({\n submitData: { fieldName, value: selected },\n type: config?.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,\n source,\n });\n\n const isError = result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n } catch (e) {\n onFinished({\n isFinished: false,\n isError: true,\n });\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && submit && selected) {\n submitSelected();\n }\n }, [scriptStatus, submit]);\n\n const defaultValueProp = defaultValue && config ? { defaultValue } : {};\n\n const isLoading = !(children || config);\n\n const disabledProp = disabled || isLoading ? { disabled: true } : {};\n\n // sort and filter out archived values\n 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 <Select.Root\n onValueChange={(e: string) => {\n onChange({ value: e });\n setSelected(e);\n }}\n {...defaultValueProp}\n {...disabledProp}\n >\n {children ? children : null}\n {!children && !config && (\n <>\n <Select.Trigger data-test-id={`select-trigger-loading`}>\n <Select.Label>{label || 'loading...'}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n </>\n )}\n {!children && config && (\n <>\n <Select.Trigger data-test-id={`${config.name}-select-trigger`}>\n <Select.Label>{label || config.name}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n <Select.Content\n css={{ zIndex: theme.zIndices.page }}\n data-test-id={`${config.name}-select-content`}\n >\n {values.map((value) => (\n <Select.Item value={value.name} key={value.name}>\n {value.name}\n </Select.Item>\n ))}\n </Select.Content>\n </>\n )}\n </Select.Root>\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled('div', {\n boxSizing: 'border-box',\n display: 'flex',\n marginBottom: '$100',\n flexDirection: 'column',\n '& button': {\n padding: '1px 6px',\n },\n '& *': { boxSizing: 'border-box' },\n});\n"],"names":["CollectionBehaviors","COLLECT","DO_NOT_COLLECT","IngestType","EXPLICIT","IMPLICIT","hasRequiredPrivacyCookies","window","wp_usp","getCookie","countryCode","_WPGeo","WPGeo","country_code","base","ENDPOINTS","attributesCache","getAttributes","async","fieldName","_ref","debug","location","search","includes","console","fieldNames","url","URL","searchParams","set","join","toString","data","fetch","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","SUCCESS","attributes","e","scriptSrc","staticAssets","SelectWrapper","styled","boxSizing","display","marginBottom","flexDirection","& button","padding","& *","source","label","dataDictionaryConfig","defaultValue","disabled","submit","onChange","onFinished","valuesFilter","children","config","setConfig","useState","selected","setSelected","scriptStatus","useScript","useEffect","ScriptStatus","READY","_window","__twpdeu","getFieldConfigs","error","warn","fetchConfig","_window2","result","push","submitData","value","type","explicit","isFinished","isError","submitSelected","defaultValueProp","disabledProp","values","sort","a","b","order","filter","archived","React","Select","Root","onValueChange","Trigger","Label","Value","name","Content","css","zIndex","theme","zIndices","page","map","Item","key","SYSTEM_ERROR","INVALID_TYPE","INVALID_IDENTIFIER","INVALID_DATA","INVALID_ATTRIBUTE_DEFINITION","INVALID_META_DEFINITION","UNAUTHENTICATED","MISMATCHED_IDENTIFIER","DISABLED_ATTRIBUTE_DEFINITION","_ref2","wapo_login_id","Error","attributeInfo","collection_behavior","payload","jucid","localStorage","getItem","ga","[object Object]","metadata","response","method","body","JSON","stringify"],"mappings":"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"}
1
+ {"version":3,"file":"subs-de-inputs.cjs.production.min.js","sources":["../src/interfaces/index.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/getAttributes.ts","../src/services/ingest.ts","../src/components/DESelect/Dropdown.tsx","../src/components/DESelect/index.tsx","../src/services/push.ts","../src/services/sendToGA.ts"],"sourcesContent":["export type AttributeValue = {\n name: string;\n date_created: Number;\n last_modified_date: Number;\n archived: boolean;\n order: number;\n};\n\nexport const CollectionBehaviors = {\n COLLECT: 'COLLECT',\n DO_NOT_COLLECT: 'DO_NOT_COLLECT',\n} as const;\n\nexport type Attribute = {\n name: string;\n approved_for_use?: boolean;\n collection_behavior?: (typeof CollectionBehaviors)[keyof typeof CollectionBehaviors];\n datatype: 'string';\n explicit: boolean;\n multiple_value: boolean;\n last_modified_date: Number;\n date_created: Number;\n values: Array<AttributeValue>;\n};\n\nexport const AttributesState = {\n SUCCESS: '100',\n} as const;\n\nexport const IngestType = {\n EXPLICIT: 'explicit',\n IMPLICIT: 'implicit',\n} as const;\n\nexport const IngestResponseState = {\n SUCCESS: '100',\n SYSTEM_ERROR: '101',\n INVALID_TYPE: '102',\n INVALID_IDENTIFIER: '103',\n INVALID_DATA: '104',\n INVALID_ATTRIBUTE_DEFINITION: '105',\n INVALID_META_DEFINITION: '106',\n UNAUTHENTICATED: '107',\n MISMATCHED_IDENTIFIER: '108',\n DISABLED_ATTRIBUTE_DEFINITION: '109',\n DO_NOT_COLLECT: '110',\n} as const;\n","import { WPGeo, getCookie } from '@washingtonpost/subs-sdk';\n\nexport const hasRequiredPrivacyCookies = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const wp_usp = getCookie('wp_usp');\n\n const countryCode = WPGeo()?.country_code;\n\n return !!(wp_usp && countryCode === 'US');\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n} from '@washingtonpost/subs-sdk';\nimport { Attribute } from '../interfaces';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nconst attributesCache: Record<string, any> = {};\nexport const getAttributes: GetAttributesType = async ({\n fieldName,\n}: {\n fieldName: string;\n}) => {\n if (attributesCache[fieldName]) {\n return attributesCache[fieldName];\n }\n\n const fieldNames = [fieldName];\n\n try {\n const url = new URL(`${base}/attributes`);\n url.searchParams.set('attributes', fieldNames.join(','));\n\n const data = await fetch(url.toString(), {\n credentials: 'include',\n headers: JSON_HEADERS,\n });\n const json = await data.json();\n\n if (data.ok && json.status === ResponseStatus.SUCCESS) {\n const attributes = json.attributes || [];\n attributesCache[fieldName] = attributes;\n return attributes;\n } else {\n return [];\n }\n } catch (e) {\n console.debug(e);\n return [];\n }\n};\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport {\n IngestResponseState,\n IngestType,\n} from '../interfaces';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nexport const ingest: IngestType = async ({\n submitData: { fieldName, value },\n type = IngestType.IMPLICIT,\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,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n [fieldName]: [value],\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<{\n status: ResponseStatus;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n} | null>;\n","import React, { useEffect, useState } from 'react';\nimport { Icon, Select, styled, theme } from '@washingtonpost/wpds-ui-kit';\nimport { useWindowSize } from '@washingtonpost/subs-hooks';\nimport { ChevronDown } from '@washingtonpost/wpds-assets';\n\ninterface IDropdownProps {\n id: string;\n label: string;\n values: Array<string>;\n required?: boolean;\n defaultValue?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n}\n\nconst StyledMobileSelect = styled('select', {\n padding: '12px 16px 12px 6px',\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n backgroundColor: '$secondary',\n color: '$primary',\n fontFamily: '$meta',\n fontSize: '$100',\n fontWeight: '$light',\n lineHeight: '$125',\n paddingBlockRight: '$125',\n textOverflow: 'ellipsis',\n position: 'relative',\n borderColor: 'transparent',\n borderRightWidth: '10px',\n borderRightColor: 'transparent',\n appearance: 'none',\n '-webkit-appearance': 'none',\n '&:disabled': {\n backgroundColor: theme.colors.disabled,\n borderColor: theme.colors.disabled,\n color: theme.colors.onDisabled,\n cursor: 'not-allowed',\n },\n});\n\nconst StyledSelectWrapper = styled('div', {\n width: '100%',\n maxWidth: '380px',\n borderRadius: '$012',\n borderColor: '$subtle',\n borderStyle: 'solid',\n borderWidth: '1px',\n backgroundColor: '$secondary',\n position: 'relative',\n});\n\nconst StyledMobileOption = styled('option', {\n fontFamily: 'inherit',\n fontSize: 'inherit',\n color: 'inherit',\n});\n\n/**\n * Dropdown component. Uses wpds-ui-kit on desktop and native select on mobile.\n * @param {IDropdownProps} props The props.\n * @returns {React.ReactElement} The dropdown.\n */\nexport const Dropdown = ({\n id,\n label,\n values,\n required = false,\n defaultValue,\n onChange = () => {},\n disabled = false,\n}: IDropdownProps) => {\n const [answer, setAnswer] = useState<string>();\n const { isMobileSize } = useWindowSize();\n\n useEffect(() => {\n if (answer) onChange(answer);\n }, [answer]);\n\n const disabledProp = disabled ? { disabled: true } : {};\n\n // helps maintain state between WPDS and native dropdowns\n const defaultValueProp = answer\n ? { defaultValue: answer }\n : defaultValue\n ? { defaultValue }\n : {};\n\n const defaultValuePropMobile = (value: string) => {\n if (answer) {\n return value === answer ? { selected: true } : {};\n }\n return value === defaultValue ? { selected: true } : {};\n };\n\n return isMobileSize ? (\n <StyledSelectWrapper>\n <StyledMobileSelect\n id=\"\"\n required={required}\n onChange={(e) => setAnswer(e.target.value)}\n placeholder={label}\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 { Attribute, AttributeValue, IngestType } from '../../interfaces';\nimport { ENDPOINTS, ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';\nimport { Dropdown } from './Dropdown';\n\ninterface DESelectProps {\n source: string;\n fieldName: string;\n label?: string;\n dataDictionaryConfig?: Attribute;\n defaultValue?: string;\n disabled?: boolean;\n submit: boolean;\n onChange?: ({ value }: { value: string }) => void;\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n valuesFilter?: (value: AttributeValue) => boolean;\n selectProps?: {\n root?: any;\n trigger?: any;\n label?: any;\n value?: any;\n content?: any;\n item?: any;\n };\n children?: React.ReactNode;\n}\n\nconst scriptSrc = `${\n ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static'\n ? 'https://www.washingtonpost.com/subscribe/static/'\n : ENDPOINTS.staticAssets\n}/de-utils/twpdeu.min.js`;\n\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n defaultValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState('');\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n const config = await window?.__twpdeu?.getFieldConfigs({ fieldName });\n if (config) {\n setConfig(config[0]);\n } else {\n console.error('unable to get config', fieldName);\n }\n } catch (e) {\n console.warn('unable to get config', fieldName, e);\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && !(children || config)) {\n fetchConfig();\n }\n }, [scriptStatus]);\n\n useEffect(() => {\n const submitSelected = async () => {\n try {\n // TODO: Log to GA?\n\n const result = await window?.__twpdeu?.push({\n submitData: { fieldName, value: selected },\n type: config?.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,\n source,\n });\n\n const isError =\n result === true\n ? false\n : result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n } catch (e) {\n onFinished({\n isFinished: false,\n isError: true,\n });\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && submit && selected) {\n submitSelected();\n }\n }, [scriptStatus, submit]);\n\n const defaultValueProp = defaultValue && config ? { defaultValue } : {};\n\n const isLoading = !(children || config);\n\n const disabledProp = disabled || isLoading ? { disabled: true } : {};\n\n // sort and filter out archived values\n const values = config\n ? config.values\n .sort((a, b) => a.order - b.order)\n .filter((value) => value.archived !== true)\n .filter(valuesFilter)\n : [];\n\n return (\n <SelectWrapper>\n {children && (\n <Select.Root\n onValueChange={(e) => {\n setSelected(e);\n onChange({ value: e });\n }}\n {...defaultValueProp}\n {...disabledProp}\n >\n {children}\n </Select.Root>\n )}\n {!children && !config && (\n <Dropdown\n id={'loading'}\n label={'Loading...'}\n values={[]}\n disabled={true}\n />\n )}\n {!children && config && (\n <Dropdown\n id={config.name}\n label={label || config.name}\n onChange={(e) => {\n setSelected(e);\n onChange({ value: e });\n }}\n values={values.map((value) => value.name)}\n defaultValue={defaultValue}\n disabled={disabled}\n />\n )}\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled('div', {\n boxSizing: 'border-box',\n display: 'flex',\n marginBottom: '$100',\n flexDirection: 'column',\n '& button': {\n padding: '1px 6px',\n },\n '& *': { boxSizing: 'border-box' },\n});\n","import {\n CollectionBehaviors,\n IngestResponseState,\n IngestType,\n} from '../interfaces';\nimport { getAttributes } from './getAttributes';\nimport { sendToGA } from './sendToGA';\nimport { hasRequiredPrivacyCookies } from '../utils/hasRequiredPrivacyCookies';\nimport { ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { ingest } from './ingest';\n\nexport const push: PushType = async ({\n submitData,\n type = IngestType.IMPLICIT,\n source,\n}) => {\n if (!hasRequiredPrivacyCookies()) {\n throw new Error('does not satisfy cookie check');\n }\n\n const attributeInfo = await getAttributes({\n fieldName: submitData.fieldName,\n });\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === submitData.fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n throw new Error('do not collect');\n }\n\n if (type === IngestType.EXPLICIT) {\n return ingest({ submitData, type, source });\n } else {\n // One reason we wanted to send everything through GA is to honor region/consent status\n // GA will send to ingest so you don’t need to send separately\n return sendToGA({ submitData, type, source });\n }\n};\n\ntype PushType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<\n | {\n status: ResponseStatus;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n }\n | null\n | true\n>;\n","import { IngestType } from '../interfaces';\n\nexport interface ISendGAEvent {\n event: string;\n category: string;\n action: string;\n label: string;\n 'de-label': string;\n [key: string]: undefined | string | string[];\n}\n\nconst sendGAEvent = (props: ISendGAEvent): void => {\n if (typeof window === 'undefined') {\n if (__DEV__) console.warn('NO WINDOW');\n return;\n }\n // Initialize dataLayer if needed\n window.dataLayer = window.dataLayer || [];\n\n const eventData: Record<string, any> = {\n ...props,\n };\n window.dataLayer.push(eventData);\n};\n\nexport const sendToGA: SendToGaType = async ({\n submitData: { fieldName, value },\n source,\n}) => {\n sendGAEvent({\n event: 'site-onpage-click',\n action: 'site-onpage-click',\n category: 'profile',\n\n label: fieldName,\n 'de-label': fieldName,\n [fieldName]: value,\n\n section: 'profile',\n subsection: source,\n });\n\n return true;\n};\n\ntype SendToGaType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<true>;\n"],"names":["CollectionBehaviors","COLLECT","DO_NOT_COLLECT","IngestType","EXPLICIT","IMPLICIT","hasRequiredPrivacyCookies","window","wp_usp","getCookie","countryCode","_WPGeo","WPGeo","country_code","base","ENDPOINTS","attributesCache","getAttributes","async","fieldName","_ref","fieldNames","url","URL","searchParams","set","join","data","fetch","toString","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","SUCCESS","attributes","e","console","debug","StyledMobileSelect","styled","padding","display","justifyContent","width","backgroundColor","color","fontFamily","fontSize","fontWeight","lineHeight","paddingBlockRight","textOverflow","position","borderColor","borderRightWidth","borderRightColor","appearance","-webkit-appearance","&:disabled","theme","colors","disabled","onDisabled","cursor","StyledSelectWrapper","maxWidth","borderRadius","borderStyle","borderWidth","StyledMobileOption","Dropdown","id","label","values","required","defaultValue","onChange","answer","setAnswer","useState","isMobileSize","useWindowSize","useEffect","disabledProp","defaultValueProp","defaultValuePropMobile","value","selected","React","target","placeholder","style","map","key","Icon","size","fill","pointerEvents","right","top","transform","ChevronDown","Select","Root","onValueChange","Trigger","Label","Value","Content","css","zIndex","zIndices","page","Item","scriptSrc","staticAssets","SelectWrapper","boxSizing","marginBottom","flexDirection","& button","& *","source","dataDictionaryConfig","submit","onFinished","valuesFilter","children","config","setConfig","setSelected","scriptStatus","useScript","ScriptStatus","READY","_window","__twpdeu","getFieldConfigs","error","warn","fetchConfig","_window2","result","push","submitData","type","explicit","isFinished","isError","submitSelected","sort","a","b","order","filter","archived","name","SYSTEM_ERROR","INVALID_TYPE","INVALID_IDENTIFIER","INVALID_DATA","INVALID_ATTRIBUTE_DEFINITION","INVALID_META_DEFINITION","UNAUTHENTICATED","MISMATCHED_IDENTIFIER","DISABLED_ATTRIBUTE_DEFINITION","Error","attributeInfo","collection_behavior","wapo_login_id","payload","jucid","localStorage","getItem","ga","[object Object]","metadata","response","method","body","JSON","stringify","ingest","props","process","env","NODE_ENV","dataLayer","eventData","sendGAEvent","event","action","category","de-label","section","subsection","sendToGA"],"mappings":"0TAQaA,EAAsB,CACjCC,QAAS,UACTC,eAAgB,kBAmBLC,EAAa,CACxBC,SAAU,WACVC,SAAU,YC7BCC,EAA4BA,WACvC,GAAsB,oBAAXC,OACT,OAAO,EAGT,MAAMC,EAASC,YAAU,UAEnBC,UAAWC,EAAGC,qBAAOD,SAAPA,EAASE,aAE7B,SAAUL,GAA0B,OAAhBE,ICJhBI,EAAUC,YAAUD,cAEpBE,EAAuC,GAChCC,EAAmCC,MAAAA,QAAOC,UACrDA,GAGDC,EACC,GAAIJ,EAAgBG,GAClB,OAAOH,EAAgBG,GAGzB,MAAME,EAAa,CAACF,GAEpB,IACE,MAAMG,EAAM,IAAIC,IAAOT,iBACvBQ,EAAIE,aAAaC,IAAI,aAAcJ,EAAWK,KAAK,MAEnD,MAAMC,QAAaC,MAAMN,EAAIO,WAAY,CACvCC,YAAa,UACbC,QAASC,iBAELC,QAAaN,EAAKM,OAExB,GAAIN,EAAKO,IAAMD,EAAKE,SAAWC,iBAAeC,QAAS,CACrD,MAAMC,EAAaL,EAAKK,YAAc,GAEtC,OADAtB,EAAgBG,GAAamB,EACtBA,EAEP,MAAO,GAET,MAAOC,GAEP,OADAC,QAAQC,MAAMF,GACP,KC7BLzB,EAAUC,YAAUD,cCIpB4B,EAAqBC,SAAO,SAAU,CAC1CC,QAAS,qBACTC,QAAS,OACTC,eAAgB,gBAChBC,MAAO,OACPC,gBAAiB,aACjBC,MAAO,WACPC,WAAY,QACZC,SAAU,OACVC,WAAY,SACZC,WAAY,OACZC,kBAAmB,OACnBC,aAAc,WACdC,SAAU,WACVC,YAAa,cACbC,iBAAkB,OAClBC,iBAAkB,cAClBC,WAAY,OACZC,qBAAsB,OACtBC,aAAc,CACZd,gBAAiBe,QAAMC,OAAOC,SAC9BR,YAAaM,QAAMC,OAAOC,SAC1BhB,MAAOc,QAAMC,OAAOE,WACpBC,OAAQ,iBAINC,EAAsBzB,SAAO,MAAO,CACxCI,MAAO,OACPsB,SAAU,QACVC,aAAc,OACdb,YAAa,UACbc,YAAa,QACbC,YAAa,MACbxB,gBAAiB,aACjBQ,SAAU,aAGNiB,EAAqB9B,SAAO,SAAU,CAC1CO,WAAY,UACZC,SAAU,UACVF,MAAO,YAQIyB,EAAWtD,QAACuD,GACvBA,EAAEC,MACFA,EAAKC,OACLA,EAAMC,SACNA,GAAW,EAAKC,aAChBA,EAAYC,SACZA,EAAWA,SAAQf,SACnBA,GAAW,GACI7C,EACf,MAAO6D,EAAQC,GAAaC,cACtBC,aAAEA,GAAiBC,kBAEzBC,YAAU,KACJL,GAAQD,EAASC,IACpB,CAACA,IAEJ,MAAMM,EAAetB,EAAW,CAAEA,UAAU,GAAS,GAG/CuB,EAAmBP,EACrB,CAAEF,aAAcE,GAChBF,EACA,CAAEA,aAAAA,GACF,GAEEU,EAA0BC,GAC1BT,EACKS,IAAUT,EAAS,CAAEU,UAAU,GAAS,GAE1CD,IAAUX,EAAe,CAAEY,UAAU,GAAS,GAGvD,OAAOP,EACLQ,gBAACxB,OACCwB,gBAAClD,GACCiC,GAAG,GACHG,SAAUA,EACVE,SAAWzC,GAAM2C,EAAU3C,EAAEsD,OAAOH,OACpCI,YAAalB,KACTW,GAEJK,6BAAQhB,GACRgB,gBAACnB,GACCiB,MAAM,GACNzB,YACA0B,YACAI,MAAO,CAAE9C,MAAO,YAEf2B,GAEFC,EAAOmB,IAAKN,GACXE,gBAACnB,GACCiB,MAAOA,EACPO,IAAKP,KACDD,EAAuBC,IAE1BA,KAIPE,gBAACM,QACCtB,MAAM,GACNuB,KAAK,MACLC,KAAMrC,QAAMC,OAAe,OAC3B+B,MAAO,CACLM,cAAe,OACf7C,SAAU,WACV8C,MAAO,OACPC,IAAK,MACLC,UAAW,qBAGbZ,gBAACa,eAAYV,MAAO,CAAEvC,SAAU,WAAY8C,MAAO,YAIvDV,gBAACc,SAAOC,MACNC,cAAgBrE,GAAM2C,EAAU3C,GAChCuC,SAAUA,KACNU,KACAD,GAEJK,gBAACc,SAAOG,wBAAyBlC,qBAC/BiB,gBAACc,SAAOI,WAAOlC,GACfgB,gBAACc,SAAOK,aAEVnB,gBAACc,SAAOM,SACNC,IAAK,CAAEC,OAAQnD,QAAMoD,SAASC,qBACbzC,qBAEhBE,EAAOmB,IAAKN,GACXE,gBAACc,SAAOW,MAAK3B,MAAOA,EAAOO,IAAKP,GAC7BA,OCzHP4B,GACuB,gDAA3BvG,YAAUwG,aACN,mDACAxG,YAAUwG,wCAiIVC,EAAgB7E,SAAO,MAAO,CAClC8E,UAAW,aACX5E,QAAS,OACT6E,aAAc,OACdC,cAAe,SACfC,WAAY,CACVhF,QAAS,WAEXiF,MAAO,CAAEJ,UAAW,wCLtJS,CAC7BpF,QAAS,sDKesCjB,QAAC0G,OAChDA,EAAM3G,UACNA,EAASyD,MACTA,EAAKmD,qBACLA,EAAoBhD,aACpBA,EAAYd,SACZA,EAAQ+D,OACRA,EAAMhD,SACNA,EAAWA,SAAQiD,WACnBA,EAAaA,SAAQC,aACrBA,EAAeA,MAAM,GAAIC,SACzBA,GACD/G,EACC,MAAOgH,EAAQC,GAAalD,WAAS4C,IAE9BpC,EAAU2C,GAAenD,WAAS,IAEnCoD,EAAeC,YAAUlB,GAE/BhC,YAAU,KAcJiD,IAAiBE,eAAaC,OAAWP,GAAYC,GAbrClH,WAClB,IAAI,IAAAyH,EACF,MAAMP,gBAASO,EAAMpI,kBAAMoI,WAAAA,EAANA,EAAQC,oBAAQD,SAAhBA,EAAkBE,gBAAgB,CAAE1H,UAAAA,KACrDiH,EACFC,EAAUD,EAAO,IAEjB5F,QAAQsG,MAAM,uBAAwB3H,GAExC,MAAOoB,GACPC,QAAQuG,KAAK,uBAAwB5H,EAAWoB,KAKlDyG,IAED,CAACT,IAEJjD,YAAU,KA8BJiD,IAAiBE,eAAaC,OAASV,GAAUrC,GA7B9BzE,WACrB,IAAI,IAAA+H,EAGF,MAAMC,gBAASD,EAAM1I,kBAAM0I,WAAAA,EAANA,EAAQL,oBAAQK,SAAhBA,EAAkBE,KAAK,CAC1CC,WAAY,CAAEjI,UAAAA,EAAWuE,MAAOC,GAChC0D,KAAMjB,MAAAA,GAAAA,EAAQkB,SAAWnJ,EAAWC,SAAWD,EAAWE,SAC1DyH,OAAAA,KAUFG,EAAW,CACTsB,YAAY,EACZC,SARW,IAAXN,KAEIA,GACAA,EAAO/G,SAAWC,iBAAeC,WAOvC,MAAOE,GACP0F,EAAW,CACTsB,YAAY,EACZC,SAAS,MAMbC,IAED,CAAClB,EAAcP,IAElB,MAAMxC,EAAmBT,GAAgBqD,EAAS,CAAErD,aAAAA,GAAiB,GAI/DQ,EAAetB,IAFDkE,IAAYC,EAEa,CAAEnE,UAAU,GAAS,GAG5DY,EAASuD,EACXA,EAAOvD,OACJ6E,KAAK,CAACC,EAAGC,IAAMD,EAAEE,MAAQD,EAAEC,OAC3BC,OAAQpE,IAA6B,IAAnBA,EAAMqE,UACxBD,OAAO5B,GACV,GAEJ,OACEtC,gBAAC4B,OACEW,GACCvC,gBAACc,SAAOC,MACNC,cAAgBrE,IACd+F,EAAY/F,GACZyC,EAAS,CAAEU,MAAOnD,QAEhBiD,KACAD,GAEH4C,IAGHA,IAAaC,GACbxC,gBAAClB,GACCC,GAAI,UACJC,MAAO,aACPC,OAAQ,GACRZ,UAAU,KAGZkE,GAAYC,GACZxC,gBAAClB,GACCC,GAAIyD,EAAO4B,KACXpF,MAAOA,GAASwD,EAAO4B,KACvBhF,SAAWzC,IACT+F,EAAY/F,GACZyC,EAAS,CAAEU,MAAOnD,KAEpBsC,OAAQA,EAAOmB,IAAKN,GAAUA,EAAMsE,MACpCjF,aAAcA,EACdd,SAAUA,kCL9He,CACjC5B,QAAS,MACT4H,aAAc,MACdC,aAAc,MACdC,mBAAoB,MACpBC,aAAc,MACdC,6BAA8B,MAC9BC,wBAAyB,MACzBC,gBAAiB,MACjBC,sBAAuB,MACvBC,8BAA+B,MAC/BvK,eAAgB,qGMlCYgB,MAAAA,QAAOkI,WACnCA,EAAUC,KACVA,EAAOlJ,EAAWE,SAAQyH,OAC1BA,GACD1G,EACC,IAAKd,IACH,MAAM,IAAIoK,MAAM,iCAGlB,MAAMC,QAAsB1J,EAAc,CACxCE,UAAWiI,EAAWjI,YAGxB,GACEwJ,EAAc,IACdA,EAAc,GAAGX,OAASZ,EAAWjI,WACrCwJ,EAAc,GAAGC,sBAAwB5K,EAAoBE,eAE7D,MAAM,IAAIwK,MAAM,kBAGlB,OAAIrB,IAASlJ,EAAWC,SHnBQc,OAAAA,QAChCkI,YAAYjI,UAAEA,EAASuE,MAAEA,GAAO2D,KAChCA,EAAOlJ,EAAWE,SAAQyH,OAC1BA,GACD1G,EACC,MAAME,EAASR,YAET+J,EAAgBpK,YAAU,iBAK1BqK,EAAU,CACdC,MAJYC,aAAaC,QAAQ,QAKjCC,GAJSzK,YAAU,OAKnB4I,KAAAA,EACAwB,cAAAA,EACAlJ,KAAM,CACJwJ,CAAChK,GAAY,CAACuE,IAEhB0F,SAAU,CAAEtD,OAAAA,IAGd,IACE,MAAMuD,QAAiBzJ,MAAMN,EAAK,CAChCgK,OAAQ,OACRxJ,YAAa,UACbC,QAASC,eACTuJ,KAAMC,KAAKC,UAAUX,KAKvB,aAFmBO,EAASpJ,OAG5B,MAAOM,GAEP,OADAC,QAAQC,MAAMF,GACP,OGhBAmJ,CAAO,CAAEtC,WAAAA,EAAYC,KAAAA,EAAMvB,OAAAA,ICRA5G,OAAAA,QACpCkI,YAAYjI,UAAEA,EAASuE,MAAEA,GAAOoC,OAChCA,GACD1G,EAcC,MA/BmBuK,CAAAA,IACnB,GAAsB,oBAAXpL,OAET,2BADAqL,QAAAC,IAAAC,UAAatJ,QAAQuG,KAAK,cAI5BxI,OAAOwL,UAAYxL,OAAOwL,WAAa,GAEvC,MAAMC,EAAiC,IAClCL,GAELpL,OAAOwL,UAAU5C,KAAK6C,IAOtBC,CAAY,CACVC,MAAO,oBACPC,OAAQ,oBACRC,SAAU,UAEVxH,MAAOzD,EACPkL,WAAYlL,EACZgK,CAAChK,GAAYuE,EAEb4G,QAAS,UACTC,WAAYzE,KAGP,GDLE0E,CAAS,CAAEpD,WAAAA,EAAYC,KAAAA,EAAMvB,OAAAA"}
@@ -1,7 +1,8 @@
1
1
  import { getCookie, WPGeo, JSON_HEADERS, ResponseStatus, ENDPOINTS } from '@washingtonpost/subs-sdk';
2
2
  import React, { useState, useEffect } from 'react';
3
- import { Select, theme, styled } from '@washingtonpost/wpds-ui-kit';
4
- import { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';
3
+ import { Icon, theme, Select, styled } from '@washingtonpost/wpds-ui-kit';
4
+ import { useWindowSize, useScript, ScriptStatus } from '@washingtonpost/subs-hooks';
5
+ import { ChevronDown } from '@washingtonpost/wpds-assets';
5
6
 
6
7
  const CollectionBehaviors = {
7
8
  COLLECT: 'COLLECT',
@@ -38,26 +39,19 @@ const hasRequiredPrivacyCookies = () => {
38
39
  return !!(wp_usp && countryCode === 'US');
39
40
  };
40
41
 
41
- const DEBUG_FLAG = 'f_de_debug';
42
42
  const base = `${ENDPOINTS.base}/de/v1`;
43
43
  const attributesCache = {};
44
44
  const getAttributes = async _ref => {
45
45
  let {
46
46
  fieldName
47
47
  } = _ref;
48
- const debug = window.location.search.includes(DEBUG_FLAG);
49
- if (debug) {
50
- console.debug('getAttributes()');
51
- }
52
48
  if (attributesCache[fieldName]) {
53
- if (debug) console.debug('getAttributes() > return cached info');
54
49
  return attributesCache[fieldName];
55
50
  }
56
51
  const fieldNames = [fieldName];
57
52
  try {
58
53
  const url = new URL(`${base}/attributes`);
59
54
  url.searchParams.set('attributes', fieldNames.join(','));
60
- if (debug) console.debug(`getAttributes() > ${url.toString()}`);
61
55
  const data = await fetch(url.toString(), {
62
56
  credentials: 'include',
63
57
  headers: JSON_HEADERS
@@ -75,7 +69,42 @@ const getAttributes = async _ref => {
75
69
  return [];
76
70
  }
77
71
  };
78
- const ingest = async _ref2 => {
72
+
73
+ const sendGAEvent = props => {
74
+ if (typeof window === 'undefined') {
75
+ if (process.env.NODE_ENV !== "production") console.warn('NO WINDOW');
76
+ return;
77
+ }
78
+ // Initialize dataLayer if needed
79
+ window.dataLayer = window.dataLayer || [];
80
+ const eventData = {
81
+ ...props
82
+ };
83
+ window.dataLayer.push(eventData);
84
+ };
85
+ const sendToGA = async _ref => {
86
+ let {
87
+ submitData: {
88
+ fieldName,
89
+ value
90
+ },
91
+ source
92
+ } = _ref;
93
+ sendGAEvent({
94
+ event: 'site-onpage-click',
95
+ action: 'site-onpage-click',
96
+ category: 'profile',
97
+ label: fieldName,
98
+ 'de-label': fieldName,
99
+ [fieldName]: value,
100
+ section: 'profile',
101
+ subsection: source
102
+ });
103
+ return true;
104
+ };
105
+
106
+ const base$1 = `${ENDPOINTS.base}/de/v1`;
107
+ const ingest = async _ref => {
79
108
  let {
80
109
  submitData: {
81
110
  fieldName,
@@ -83,30 +112,9 @@ const ingest = async _ref2 => {
83
112
  },
84
113
  type = IngestType.IMPLICIT,
85
114
  source
86
- } = _ref2;
87
- const debug = window.location.search.includes(DEBUG_FLAG);
88
- if (debug) {
89
- console.debug('ingest()');
90
- }
91
- const url = `${base}/ingest`;
115
+ } = _ref;
116
+ const url = `${base$1}/ingest`;
92
117
  const wapo_login_id = getCookie('wapo_login_id');
93
- if (!hasRequiredPrivacyCookies()) {
94
- if (debug) console.debug('ingest() > hasRequiredPrivacyCookies falsy');
95
- throw new Error('does not satisfy cookie check');
96
- }
97
- let attributeInfo = attributesCache[fieldName];
98
- if (!attributeInfo) {
99
- if (debug) console.debug('ingest() > fetch attribute info');
100
- attributeInfo = await getAttributes({
101
- fieldName
102
- });
103
- } else {
104
- if (debug) console.debug('ingest() > use cached attribute info');
105
- }
106
- if (attributeInfo[0] && attributeInfo[0].name === fieldName && attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT) {
107
- if (debug) console.debug('ingest() > do not collect');
108
- throw new Error('do not collect');
109
- }
110
118
  const jucid = localStorage.getItem('uuid');
111
119
  const ga = getCookie('_ga');
112
120
  const payload = {
@@ -136,6 +144,171 @@ const ingest = async _ref2 => {
136
144
  }
137
145
  };
138
146
 
147
+ const push = async _ref => {
148
+ let {
149
+ submitData,
150
+ type = IngestType.IMPLICIT,
151
+ source
152
+ } = _ref;
153
+ if (!hasRequiredPrivacyCookies()) {
154
+ throw new Error('does not satisfy cookie check');
155
+ }
156
+ const attributeInfo = await getAttributes({
157
+ fieldName: submitData.fieldName
158
+ });
159
+ if (attributeInfo[0] && attributeInfo[0].name === submitData.fieldName && attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT) {
160
+ throw new Error('do not collect');
161
+ }
162
+ if (type === IngestType.EXPLICIT) {
163
+ return ingest({
164
+ submitData,
165
+ type,
166
+ source
167
+ });
168
+ } else {
169
+ // One reason we wanted to send everything through GA is to honor region/consent status
170
+ // GA will send to ingest so you don’t need to send separately
171
+ return sendToGA({
172
+ submitData,
173
+ type,
174
+ source
175
+ });
176
+ }
177
+ };
178
+
179
+ const StyledMobileSelect = /*#__PURE__*/styled('select', {
180
+ padding: '12px 16px 12px 6px',
181
+ display: 'flex',
182
+ justifyContent: 'space-between',
183
+ width: '100%',
184
+ backgroundColor: '$secondary',
185
+ color: '$primary',
186
+ fontFamily: '$meta',
187
+ fontSize: '$100',
188
+ fontWeight: '$light',
189
+ lineHeight: '$125',
190
+ paddingBlockRight: '$125',
191
+ textOverflow: 'ellipsis',
192
+ position: 'relative',
193
+ borderColor: 'transparent',
194
+ borderRightWidth: '10px',
195
+ borderRightColor: 'transparent',
196
+ appearance: 'none',
197
+ '-webkit-appearance': 'none',
198
+ '&:disabled': {
199
+ backgroundColor: theme.colors.disabled,
200
+ borderColor: theme.colors.disabled,
201
+ color: theme.colors.onDisabled,
202
+ cursor: 'not-allowed'
203
+ }
204
+ });
205
+ const StyledSelectWrapper = /*#__PURE__*/styled('div', {
206
+ width: '100%',
207
+ maxWidth: '380px',
208
+ borderRadius: '$012',
209
+ borderColor: '$subtle',
210
+ borderStyle: 'solid',
211
+ borderWidth: '1px',
212
+ backgroundColor: '$secondary',
213
+ position: 'relative'
214
+ });
215
+ const StyledMobileOption = /*#__PURE__*/styled('option', {
216
+ fontFamily: 'inherit',
217
+ fontSize: 'inherit',
218
+ color: 'inherit'
219
+ });
220
+ /**
221
+ * Dropdown component. Uses wpds-ui-kit on desktop and native select on mobile.
222
+ * @param {IDropdownProps} props The props.
223
+ * @returns {React.ReactElement} The dropdown.
224
+ */
225
+ const Dropdown = _ref => {
226
+ let {
227
+ id,
228
+ label,
229
+ values,
230
+ required = false,
231
+ defaultValue,
232
+ onChange = () => {},
233
+ disabled = false
234
+ } = _ref;
235
+ const [answer, setAnswer] = useState();
236
+ const {
237
+ isMobileSize
238
+ } = useWindowSize();
239
+ useEffect(() => {
240
+ if (answer) onChange(answer);
241
+ }, [answer]);
242
+ const disabledProp = disabled ? {
243
+ disabled: true
244
+ } : {};
245
+ // helps maintain state between WPDS and native dropdowns
246
+ const defaultValueProp = answer ? {
247
+ defaultValue: answer
248
+ } : defaultValue ? {
249
+ defaultValue
250
+ } : {};
251
+ const defaultValuePropMobile = value => {
252
+ if (answer) {
253
+ return value === answer ? {
254
+ selected: true
255
+ } : {};
256
+ }
257
+ return value === defaultValue ? {
258
+ selected: true
259
+ } : {};
260
+ };
261
+ return isMobileSize ? React.createElement(StyledSelectWrapper, null, React.createElement(StyledMobileSelect, {
262
+ id: "",
263
+ required: required,
264
+ onChange: e => setAnswer(e.target.value),
265
+ placeholder: label,
266
+ ...disabledProp
267
+ }, React.createElement("label", null, label), React.createElement(StyledMobileOption, {
268
+ value: "",
269
+ disabled: true,
270
+ selected: true,
271
+ style: {
272
+ color: '#666666'
273
+ }
274
+ }, label), values.map(value => React.createElement(StyledMobileOption, {
275
+ value: value,
276
+ key: value,
277
+ ...defaultValuePropMobile(value)
278
+ }, value))), React.createElement(Icon, {
279
+ label: "",
280
+ size: "100",
281
+ fill: theme.colors['gray80'],
282
+ style: {
283
+ pointerEvents: 'none',
284
+ position: 'absolute',
285
+ right: '10px',
286
+ top: '50%',
287
+ transform: 'translateY(-50%)'
288
+ }
289
+ }, React.createElement(ChevronDown, {
290
+ style: {
291
+ position: 'absolute',
292
+ right: '10px'
293
+ }
294
+ }))) : React.createElement(Select.Root, {
295
+ onValueChange: e => setAnswer(e),
296
+ required: required,
297
+ ...defaultValueProp,
298
+ ...disabledProp
299
+ }, React.createElement(Select.Trigger, {
300
+ "data-test-id": `${id}-select-trigger`
301
+ }, React.createElement(Select.Label, null, label), React.createElement(Select.Value, null)), React.createElement(Select.Content, {
302
+ css: {
303
+ zIndex: theme.zIndices.page
304
+ },
305
+ "data-test-id": `${id}-select-content`
306
+ }, values.map(value => React.createElement(Select.Item, {
307
+ value: value,
308
+ key: value
309
+ }, value))));
310
+ };
311
+
139
312
  const scriptSrc = `${ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static' ? 'https://www.washingtonpost.com/subscribe/static/' : ENDPOINTS.staticAssets}/de-utils/twpdeu.min.js`;
140
313
  const DESelect = _ref => {
141
314
  let {
@@ -187,7 +360,7 @@ const DESelect = _ref => {
187
360
  type: config !== null && config !== void 0 && config.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,
188
361
  source
189
362
  }));
190
- const isError = result ? result.status !== ResponseStatus.SUCCESS : true;
363
+ const isError = result === true ? false : result ? result.status !== ResponseStatus.SUCCESS : true;
191
364
  onFinished({
192
365
  isFinished: true,
193
366
  isError
@@ -212,28 +385,33 @@ const DESelect = _ref => {
212
385
  } : {};
213
386
  // sort and filter out archived values
214
387
  const values = config ? config.values.sort((a, b) => a.order - b.order).filter(value => value.archived !== true).filter(valuesFilter) : [];
215
- return React.createElement(SelectWrapper, null, React.createElement(Select.Root, {
388
+ return React.createElement(SelectWrapper, null, children && React.createElement(Select.Root, {
216
389
  onValueChange: e => {
390
+ setSelected(e);
217
391
  onChange({
218
392
  value: e
219
393
  });
220
- setSelected(e);
221
394
  },
222
395
  ...defaultValueProp,
223
396
  ...disabledProp
224
- }, children ? children : null, !children && !config && React.createElement(React.Fragment, null, React.createElement(Select.Trigger, {
225
- "data-test-id": `select-trigger-loading`
226
- }, React.createElement(Select.Label, null, label || 'loading...'), React.createElement(Select.Value, null))), !children && config && React.createElement(React.Fragment, null, React.createElement(Select.Trigger, {
227
- "data-test-id": `${config.name}-select-trigger`
228
- }, React.createElement(Select.Label, null, label || config.name), React.createElement(Select.Value, null)), React.createElement(Select.Content, {
229
- css: {
230
- zIndex: theme.zIndices.page
397
+ }, children), !children && !config && React.createElement(Dropdown, {
398
+ id: 'loading',
399
+ label: 'Loading...',
400
+ values: [],
401
+ disabled: true
402
+ }), !children && config && React.createElement(Dropdown, {
403
+ id: config.name,
404
+ label: label || config.name,
405
+ onChange: e => {
406
+ setSelected(e);
407
+ onChange({
408
+ value: e
409
+ });
231
410
  },
232
- "data-test-id": `${config.name}-select-content`
233
- }, values.map(value => React.createElement(Select.Item, {
234
- value: value.name,
235
- key: value.name
236
- }, value.name))))));
411
+ values: values.map(value => value.name),
412
+ defaultValue: defaultValue,
413
+ disabled: disabled
414
+ }));
237
415
  };
238
416
  const SelectWrapper = /*#__PURE__*/styled('div', {
239
417
  boxSizing: 'border-box',
@@ -248,5 +426,5 @@ const SelectWrapper = /*#__PURE__*/styled('div', {
248
426
  }
249
427
  });
250
428
 
251
- export { AttributesState, CollectionBehaviors, DESelect, IngestResponseState, IngestType, getAttributes, hasRequiredPrivacyCookies, ingest };
429
+ export { AttributesState, CollectionBehaviors, DESelect, IngestResponseState, IngestType, getAttributes, hasRequiredPrivacyCookies, push };
252
430
  //# sourceMappingURL=subs-de-inputs.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subs-de-inputs.esm.js","sources":["../src/interfaces/index.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/dataEnrichment.ts","../src/components/DESelect/index.tsx"],"sourcesContent":["export type AttributeValue = {\n name: string;\n date_created: Number;\n last_modified_date: Number;\n archived: boolean;\n order: number;\n};\n\nexport const CollectionBehaviors = {\n COLLECT: 'COLLECT',\n DO_NOT_COLLECT: 'DO_NOT_COLLECT',\n} as const;\n\nexport type Attribute = {\n name: string;\n approved_for_use?: boolean;\n collection_behavior?: (typeof CollectionBehaviors)[keyof typeof CollectionBehaviors];\n datatype: 'string';\n explicit: boolean;\n multiple_value: boolean;\n last_modified_date: Number;\n date_created: Number;\n values: Array<AttributeValue>;\n};\n\nexport const AttributesState = {\n SUCCESS: '100',\n} as const;\n\nexport const IngestType = {\n EXPLICIT: 'explicit',\n IMPLICIT: 'implicit',\n} as const;\n\nexport const IngestResponseState = {\n SUCCESS: '100',\n SYSTEM_ERROR: '101',\n INVALID_TYPE: '102',\n INVALID_IDENTIFIER: '103',\n INVALID_DATA: '104',\n INVALID_ATTRIBUTE_DEFINITION: '105',\n INVALID_META_DEFINITION: '106',\n UNAUTHENTICATED: '107',\n MISMATCHED_IDENTIFIER: '108',\n DISABLED_ATTRIBUTE_DEFINITION: '109',\n DO_NOT_COLLECT: '110',\n} as const;\n","import { WPGeo, getCookie } from '@washingtonpost/subs-sdk';\n\nexport const hasRequiredPrivacyCookies = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const wp_usp = getCookie('wp_usp');\n\n const countryCode = WPGeo()?.country_code;\n\n return !!(wp_usp && countryCode === 'US');\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport {\n Attribute,\n CollectionBehaviors,\n IngestResponseState,\n IngestType,\n} from '../interfaces';\nimport { hasRequiredPrivacyCookies } from '../utils/hasRequiredPrivacyCookies';\n\nconst DEBUG_FLAG = 'f_de_debug';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nconst attributesCache: Record<string, any> = {};\nexport const getAttributes: GetAttributesType = async ({\n fieldName,\n}: {\n fieldName: string;\n}) => {\n const debug = window.location.search.includes(DEBUG_FLAG);\n\n if (debug) {\n console.debug('getAttributes()');\n }\n\n if (attributesCache[fieldName]) {\n if (debug) console.debug('getAttributes() > return cached info');\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 if (debug) console.debug(`getAttributes() > ${url.toString()}`);\n\n const data = await fetch(url.toString(), {\n credentials: 'include',\n headers: JSON_HEADERS,\n });\n const json = await data.json();\n\n if (data.ok && json.status === ResponseStatus.SUCCESS) {\n const attributes = json.attributes || [];\n attributesCache[fieldName] = attributes;\n return attributes;\n } else {\n return [];\n }\n } catch (e) {\n console.debug(e);\n return [];\n }\n};\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\n\nexport const ingest: IngestType = async ({\n submitData: { fieldName, value },\n type = IngestType.IMPLICIT,\n source,\n}) => {\n const debug = window.location.search.includes(DEBUG_FLAG);\n\n if (debug) {\n console.debug('ingest()');\n }\n\n const url = `${base}/ingest`;\n\n const wapo_login_id = getCookie('wapo_login_id');\n\n if (!hasRequiredPrivacyCookies()) {\n if (debug) console.debug('ingest() > hasRequiredPrivacyCookies falsy');\n throw new Error('does not satisfy cookie check');\n }\n\n let attributeInfo = attributesCache[fieldName];\n if (!attributeInfo) {\n if (debug) console.debug('ingest() > fetch attribute info');\n attributeInfo = await getAttributes({ fieldName });\n } else {\n if (debug) console.debug('ingest() > use cached attribute info');\n }\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n if (debug) console.debug('ingest() > do not collect');\n throw new Error('do not collect');\n }\n\n const jucid = localStorage.getItem('uuid');\n const ga = getCookie('_ga');\n\n const payload = {\n jucid,\n ga,\n type,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n [fieldName]: [value],\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<{\n status: ResponseStatus;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n} | null>;\n","import React, { useState, useEffect } from 'react';\nimport { Select, styled, theme } from '@washingtonpost/wpds-ui-kit';\nimport { Attribute, AttributeValue, IngestType } from '../../interfaces';\nimport { ENDPOINTS, ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';\n\ninterface DESelectProps {\n source: string;\n fieldName: string;\n label?: string;\n dataDictionaryConfig?: Attribute;\n defaultValue?: string;\n disabled?: boolean;\n submit: boolean;\n onChange?: ({ value }: { value: string }) => void;\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n valuesFilter?: (value: AttributeValue) => boolean;\n selectProps?: {\n root?: any;\n trigger?: any;\n label?: any;\n value?: any;\n content?: any;\n item?: any;\n };\n children?: React.ReactNode;\n}\n\nconst scriptSrc = `${\n ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static'\n ? 'https://www.washingtonpost.com/subscribe/static/'\n : ENDPOINTS.staticAssets\n}/de-utils/twpdeu.min.js`;\n\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n defaultValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState('');\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n const config = await window?.__twpdeu?.getFieldConfigs({ fieldName });\n if (config) {\n setConfig(config[0]);\n } else {\n console.error('unable to get config', fieldName);\n }\n } catch (e) {\n console.warn('unable to get config', fieldName, e);\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && !(children || config)) {\n fetchConfig();\n }\n }, [scriptStatus]);\n\n useEffect(() => {\n const submitSelected = async () => {\n try {\n // TODO: Log to GA?\n\n const result = await window?.__twpdeu?.push({\n submitData: { fieldName, value: selected },\n type: config?.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,\n source,\n });\n\n const isError = result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n } catch (e) {\n onFinished({\n isFinished: false,\n isError: true,\n });\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && submit && selected) {\n submitSelected();\n }\n }, [scriptStatus, submit]);\n\n const defaultValueProp = defaultValue && config ? { defaultValue } : {};\n\n const isLoading = !(children || config);\n\n const disabledProp = disabled || isLoading ? { disabled: true } : {};\n\n // sort and filter out archived values\n 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 <Select.Root\n onValueChange={(e: string) => {\n onChange({ value: e });\n setSelected(e);\n }}\n {...defaultValueProp}\n {...disabledProp}\n >\n {children ? children : null}\n {!children && !config && (\n <>\n <Select.Trigger data-test-id={`select-trigger-loading`}>\n <Select.Label>{label || 'loading...'}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n </>\n )}\n {!children && config && (\n <>\n <Select.Trigger data-test-id={`${config.name}-select-trigger`}>\n <Select.Label>{label || config.name}</Select.Label>\n <Select.Value />\n </Select.Trigger>\n <Select.Content\n css={{ zIndex: theme.zIndices.page }}\n data-test-id={`${config.name}-select-content`}\n >\n {values.map((value) => (\n <Select.Item value={value.name} key={value.name}>\n {value.name}\n </Select.Item>\n ))}\n </Select.Content>\n </>\n )}\n </Select.Root>\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled('div', {\n boxSizing: 'border-box',\n display: 'flex',\n marginBottom: '$100',\n flexDirection: 'column',\n '& button': {\n padding: '1px 6px',\n },\n '& *': { boxSizing: 'border-box' },\n});\n"],"names":["CollectionBehaviors","COLLECT","DO_NOT_COLLECT","AttributesState","SUCCESS","IngestType","EXPLICIT","IMPLICIT","IngestResponseState","SYSTEM_ERROR","INVALID_TYPE","INVALID_IDENTIFIER","INVALID_DATA","INVALID_ATTRIBUTE_DEFINITION","INVALID_META_DEFINITION","UNAUTHENTICATED","MISMATCHED_IDENTIFIER","DISABLED_ATTRIBUTE_DEFINITION","hasRequiredPrivacyCookies","window","wp_usp","getCookie","countryCode","_WPGeo","WPGeo","country_code","DEBUG_FLAG","base","ENDPOINTS","attributesCache","getAttributes","_ref","fieldName","debug","location","search","includes","console","fieldNames","url","URL","searchParams","set","join","toString","data","fetch","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","attributes","e","ingest","_ref2","submitData","value","type","source","wapo_login_id","Error","attributeInfo","name","collection_behavior","jucid","localStorage","getItem","ga","payload","metadata","response","method","body","JSON","stringify","scriptSrc","staticAssets","DESelect","label","dataDictionaryConfig","defaultValue","disabled","submit","onChange","onFinished","valuesFilter","children","config","setConfig","useState","selected","setSelected","scriptStatus","useScript","useEffect","fetchConfig","_window","__twpdeu","getFieldConfigs","error","warn","ScriptStatus","READY","submitSelected","_window2","result","push","explicit","isError","isFinished","defaultValueProp","isLoading","disabledProp","values","sort","a","b","order","filter","archived","React","SelectWrapper","Select","Root","onValueChange","Trigger","Label","Value","Content","css","zIndex","theme","zIndices","page","map","Item","key","styled","boxSizing","display","marginBottom","flexDirection","padding"],"mappings":"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"}
1
+ {"version":3,"file":"subs-de-inputs.esm.js","sources":["../src/interfaces/index.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/getAttributes.ts","../src/services/sendToGA.ts","../src/services/ingest.ts","../src/services/push.ts","../src/components/DESelect/Dropdown.tsx","../src/components/DESelect/index.tsx"],"sourcesContent":["export type AttributeValue = {\n name: string;\n date_created: Number;\n last_modified_date: Number;\n archived: boolean;\n order: number;\n};\n\nexport const CollectionBehaviors = {\n COLLECT: 'COLLECT',\n DO_NOT_COLLECT: 'DO_NOT_COLLECT',\n} as const;\n\nexport type Attribute = {\n name: string;\n approved_for_use?: boolean;\n collection_behavior?: (typeof CollectionBehaviors)[keyof typeof CollectionBehaviors];\n datatype: 'string';\n explicit: boolean;\n multiple_value: boolean;\n last_modified_date: Number;\n date_created: Number;\n values: Array<AttributeValue>;\n};\n\nexport const AttributesState = {\n SUCCESS: '100',\n} as const;\n\nexport const IngestType = {\n EXPLICIT: 'explicit',\n IMPLICIT: 'implicit',\n} as const;\n\nexport const IngestResponseState = {\n SUCCESS: '100',\n SYSTEM_ERROR: '101',\n INVALID_TYPE: '102',\n INVALID_IDENTIFIER: '103',\n INVALID_DATA: '104',\n INVALID_ATTRIBUTE_DEFINITION: '105',\n INVALID_META_DEFINITION: '106',\n UNAUTHENTICATED: '107',\n MISMATCHED_IDENTIFIER: '108',\n DISABLED_ATTRIBUTE_DEFINITION: '109',\n DO_NOT_COLLECT: '110',\n} as const;\n","import { WPGeo, getCookie } from '@washingtonpost/subs-sdk';\n\nexport const hasRequiredPrivacyCookies = () => {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const wp_usp = getCookie('wp_usp');\n\n const countryCode = WPGeo()?.country_code;\n\n return !!(wp_usp && countryCode === 'US');\n};\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n} from '@washingtonpost/subs-sdk';\nimport { Attribute } from '../interfaces';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nconst attributesCache: Record<string, any> = {};\nexport const getAttributes: GetAttributesType = async ({\n fieldName,\n}: {\n fieldName: string;\n}) => {\n if (attributesCache[fieldName]) {\n return attributesCache[fieldName];\n }\n\n const fieldNames = [fieldName];\n\n try {\n const url = new URL(`${base}/attributes`);\n url.searchParams.set('attributes', fieldNames.join(','));\n\n const data = await fetch(url.toString(), {\n credentials: 'include',\n headers: JSON_HEADERS,\n });\n const json = await data.json();\n\n if (data.ok && json.status === ResponseStatus.SUCCESS) {\n const attributes = json.attributes || [];\n attributesCache[fieldName] = attributes;\n return attributes;\n } else {\n return [];\n }\n } catch (e) {\n console.debug(e);\n return [];\n }\n};\n\ntype GetAttributesType = ({\n fieldName,\n}: {\n fieldName: string;\n}) => Promise<Attribute[]>;\n","import { IngestType } from '../interfaces';\n\nexport interface ISendGAEvent {\n event: string;\n category: string;\n action: string;\n label: string;\n 'de-label': string;\n [key: string]: undefined | string | string[];\n}\n\nconst sendGAEvent = (props: ISendGAEvent): void => {\n if (typeof window === 'undefined') {\n if (__DEV__) console.warn('NO WINDOW');\n return;\n }\n // Initialize dataLayer if needed\n window.dataLayer = window.dataLayer || [];\n\n const eventData: Record<string, any> = {\n ...props,\n };\n window.dataLayer.push(eventData);\n};\n\nexport const sendToGA: SendToGaType = async ({\n submitData: { fieldName, value },\n source,\n}) => {\n sendGAEvent({\n event: 'site-onpage-click',\n action: 'site-onpage-click',\n category: 'profile',\n\n label: fieldName,\n 'de-label': fieldName,\n [fieldName]: value,\n\n section: 'profile',\n subsection: source,\n });\n\n return true;\n};\n\ntype SendToGaType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<true>;\n","import {\n ENDPOINTS,\n ResponseStatus,\n JSON_HEADERS,\n getCookie,\n} from '@washingtonpost/subs-sdk';\nimport {\n IngestResponseState,\n IngestType,\n} from '../interfaces';\n\nconst base = `${ENDPOINTS.base}/de/v1`;\n\nexport const ingest: IngestType = async ({\n submitData: { fieldName, value },\n type = IngestType.IMPLICIT,\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,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n [fieldName]: [value],\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<{\n status: ResponseStatus;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n} | null>;\n","import {\n CollectionBehaviors,\n IngestResponseState,\n IngestType,\n} from '../interfaces';\nimport { getAttributes } from './getAttributes';\nimport { sendToGA } from './sendToGA';\nimport { hasRequiredPrivacyCookies } from '../utils/hasRequiredPrivacyCookies';\nimport { ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { ingest } from './ingest';\n\nexport const push: PushType = async ({\n submitData,\n type = IngestType.IMPLICIT,\n source,\n}) => {\n if (!hasRequiredPrivacyCookies()) {\n throw new Error('does not satisfy cookie check');\n }\n\n const attributeInfo = await getAttributes({\n fieldName: submitData.fieldName,\n });\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === submitData.fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n throw new Error('do not collect');\n }\n\n if (type === IngestType.EXPLICIT) {\n return ingest({ submitData, type, source });\n } else {\n // One reason we wanted to send everything through GA is to honor region/consent status\n // GA will send to ingest so you don’t need to send separately\n return sendToGA({ submitData, type, source });\n }\n};\n\ntype PushType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n type?: (typeof IngestType)[keyof typeof IngestType];\n source: string;\n}) => Promise<\n | {\n status: ResponseStatus;\n state: (typeof IngestResponseState)[keyof typeof IngestResponseState];\n }\n | null\n | true\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 defaultValue?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n}\n\nconst StyledMobileSelect = styled('select', {\n padding: '12px 16px 12px 6px',\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n backgroundColor: '$secondary',\n color: '$primary',\n fontFamily: '$meta',\n fontSize: '$100',\n fontWeight: '$light',\n lineHeight: '$125',\n paddingBlockRight: '$125',\n textOverflow: 'ellipsis',\n position: 'relative',\n borderColor: 'transparent',\n borderRightWidth: '10px',\n borderRightColor: 'transparent',\n appearance: 'none',\n '-webkit-appearance': 'none',\n '&:disabled': {\n backgroundColor: theme.colors.disabled,\n borderColor: theme.colors.disabled,\n color: theme.colors.onDisabled,\n cursor: 'not-allowed',\n },\n});\n\nconst StyledSelectWrapper = styled('div', {\n width: '100%',\n maxWidth: '380px',\n borderRadius: '$012',\n borderColor: '$subtle',\n borderStyle: 'solid',\n borderWidth: '1px',\n backgroundColor: '$secondary',\n position: 'relative',\n});\n\nconst StyledMobileOption = styled('option', {\n fontFamily: 'inherit',\n fontSize: 'inherit',\n color: 'inherit',\n});\n\n/**\n * Dropdown component. Uses wpds-ui-kit on desktop and native select on mobile.\n * @param {IDropdownProps} props The props.\n * @returns {React.ReactElement} The dropdown.\n */\nexport const Dropdown = ({\n id,\n label,\n values,\n required = false,\n defaultValue,\n onChange = () => {},\n disabled = false,\n}: IDropdownProps) => {\n const [answer, setAnswer] = useState<string>();\n const { isMobileSize } = useWindowSize();\n\n useEffect(() => {\n if (answer) onChange(answer);\n }, [answer]);\n\n const disabledProp = disabled ? { disabled: true } : {};\n\n // helps maintain state between WPDS and native dropdowns\n const defaultValueProp = answer\n ? { defaultValue: answer }\n : defaultValue\n ? { defaultValue }\n : {};\n\n const defaultValuePropMobile = (value: string) => {\n if (answer) {\n return value === answer ? { selected: true } : {};\n }\n return value === defaultValue ? { selected: true } : {};\n };\n\n return isMobileSize ? (\n <StyledSelectWrapper>\n <StyledMobileSelect\n id=\"\"\n required={required}\n onChange={(e) => setAnswer(e.target.value)}\n placeholder={label}\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 { Attribute, AttributeValue, IngestType } from '../../interfaces';\nimport { ENDPOINTS, ResponseStatus } from '@washingtonpost/subs-sdk';\nimport { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';\nimport { Dropdown } from './Dropdown';\n\ninterface DESelectProps {\n source: string;\n fieldName: string;\n label?: string;\n dataDictionaryConfig?: Attribute;\n defaultValue?: string;\n disabled?: boolean;\n submit: boolean;\n onChange?: ({ value }: { value: string }) => void;\n onFinished?: ({\n isFinished,\n isError,\n }: {\n isFinished: boolean;\n isError: boolean;\n }) => void;\n valuesFilter?: (value: AttributeValue) => boolean;\n selectProps?: {\n root?: any;\n trigger?: any;\n label?: any;\n value?: any;\n content?: any;\n item?: any;\n };\n children?: React.ReactNode;\n}\n\nconst scriptSrc = `${\n ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static'\n ? 'https://www.washingtonpost.com/subscribe/static/'\n : ENDPOINTS.staticAssets\n}/de-utils/twpdeu.min.js`;\n\nexport const DESelect: React.FC<DESelectProps> = ({\n source,\n fieldName,\n label,\n dataDictionaryConfig,\n defaultValue,\n disabled,\n submit,\n onChange = () => {},\n onFinished = () => {},\n valuesFilter = () => true,\n children,\n}) => {\n const [config, setConfig] = useState(dataDictionaryConfig);\n\n const [selected, setSelected] = useState('');\n\n const scriptStatus = useScript(scriptSrc);\n\n useEffect(() => {\n const fetchConfig = async () => {\n try {\n const config = await window?.__twpdeu?.getFieldConfigs({ fieldName });\n if (config) {\n setConfig(config[0]);\n } else {\n console.error('unable to get config', fieldName);\n }\n } catch (e) {\n console.warn('unable to get config', fieldName, e);\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && !(children || config)) {\n fetchConfig();\n }\n }, [scriptStatus]);\n\n useEffect(() => {\n const submitSelected = async () => {\n try {\n // TODO: Log to GA?\n\n const result = await window?.__twpdeu?.push({\n submitData: { fieldName, value: selected },\n type: config?.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,\n source,\n });\n\n const isError =\n result === true\n ? false\n : result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n } catch (e) {\n onFinished({\n isFinished: false,\n isError: true,\n });\n }\n };\n\n if (scriptStatus === ScriptStatus.READY && submit && selected) {\n submitSelected();\n }\n }, [scriptStatus, submit]);\n\n const defaultValueProp = defaultValue && config ? { defaultValue } : {};\n\n const isLoading = !(children || config);\n\n const disabledProp = disabled || isLoading ? { disabled: true } : {};\n\n // sort and filter out archived values\n const values = config\n ? config.values\n .sort((a, b) => a.order - b.order)\n .filter((value) => value.archived !== true)\n .filter(valuesFilter)\n : [];\n\n return (\n <SelectWrapper>\n {children && (\n <Select.Root\n onValueChange={(e) => {\n setSelected(e);\n onChange({ value: e });\n }}\n {...defaultValueProp}\n {...disabledProp}\n >\n {children}\n </Select.Root>\n )}\n {!children && !config && (\n <Dropdown\n id={'loading'}\n label={'Loading...'}\n values={[]}\n disabled={true}\n />\n )}\n {!children && config && (\n <Dropdown\n id={config.name}\n label={label || config.name}\n onChange={(e) => {\n setSelected(e);\n onChange({ value: e });\n }}\n values={values.map((value) => value.name)}\n defaultValue={defaultValue}\n disabled={disabled}\n />\n )}\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled('div', {\n boxSizing: 'border-box',\n display: 'flex',\n marginBottom: '$100',\n flexDirection: 'column',\n '& button': {\n padding: '1px 6px',\n },\n '& *': { boxSizing: 'border-box' },\n});\n"],"names":["CollectionBehaviors","COLLECT","DO_NOT_COLLECT","AttributesState","SUCCESS","IngestType","EXPLICIT","IMPLICIT","IngestResponseState","SYSTEM_ERROR","INVALID_TYPE","INVALID_IDENTIFIER","INVALID_DATA","INVALID_ATTRIBUTE_DEFINITION","INVALID_META_DEFINITION","UNAUTHENTICATED","MISMATCHED_IDENTIFIER","DISABLED_ATTRIBUTE_DEFINITION","hasRequiredPrivacyCookies","window","wp_usp","getCookie","countryCode","_WPGeo","WPGeo","country_code","base","ENDPOINTS","attributesCache","getAttributes","_ref","fieldName","fieldNames","url","URL","searchParams","set","join","data","fetch","toString","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","attributes","e","console","debug","sendGAEvent","props","process","env","NODE_ENV","warn","dataLayer","eventData","push","sendToGA","submitData","value","source","event","action","category","label","section","subsection","ingest","type","wapo_login_id","jucid","localStorage","getItem","ga","payload","metadata","response","method","body","JSON","stringify","Error","attributeInfo","name","collection_behavior","StyledMobileSelect","styled","padding","display","justifyContent","width","backgroundColor","color","fontFamily","fontSize","fontWeight","lineHeight","paddingBlockRight","textOverflow","position","borderColor","borderRightWidth","borderRightColor","appearance","theme","colors","disabled","onDisabled","cursor","StyledSelectWrapper","maxWidth","borderRadius","borderStyle","borderWidth","StyledMobileOption","Dropdown","id","values","required","defaultValue","onChange","answer","setAnswer","useState","isMobileSize","useWindowSize","useEffect","disabledProp","defaultValueProp","defaultValuePropMobile","selected","React","target","placeholder","style","map","key","Icon","size","fill","pointerEvents","right","top","transform","ChevronDown","Select","Root","onValueChange","Trigger","Label","Value","Content","css","zIndex","zIndices","page","Item","scriptSrc","staticAssets","DESelect","dataDictionaryConfig","submit","onFinished","valuesFilter","children","config","setConfig","setSelected","scriptStatus","useScript","fetchConfig","_window","__twpdeu","getFieldConfigs","error","ScriptStatus","READY","submitSelected","_window2","result","explicit","isError","isFinished","isLoading","sort","a","b","order","filter","archived","SelectWrapper","boxSizing","marginBottom","flexDirection"],"mappings":"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"}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.2.3-canary.0",
2
+ "version": "0.3.1-canary.0",
3
3
  "license": "UNLICENSED",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -36,13 +36,13 @@
36
36
  "name": "de-inputs: utils",
37
37
  "path": "dist/subs-de-inputs.esm.js",
38
38
  "import": "{ getAttributes, ingest }",
39
- "limit": "1 KB"
39
+ "limit": "1.5 KB"
40
40
  },
41
41
  {
42
42
  "name": "de-inputs: DESelect",
43
43
  "path": "dist/subs-de-inputs.esm.js",
44
44
  "import": "{ DESelect }",
45
- "limit": "2 KB"
45
+ "limit": "2.5 KB"
46
46
  }
47
47
  ],
48
48
  "devDependencies": {