@washingtonpost/subs-de-inputs 0.2.3-canary.0 → 0.3.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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,34 @@
1
+ # Change Log
2
+
3
+ All notable changes to this project will be documented in this file. See
4
+ [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
+
6
+ **[0.3.0 - 2024-05-06]**:
7
+ * Uses the native `<select />` element in smaller viewport sizes for better UX
8
+
9
+ **[0.2.2 - 2024-05-03]**:
10
+ * use `window.__twpdeu.push()` for submitting
11
+ * Better loading state when fetching config over the wire
12
+ * Prevent extra calls to `ingest` API if user changes value after clicking submit
13
+ * Fix `ingest()` function to send the right format (again)
14
+
15
+ **[0.2.1 - 2024-05-02]**:
16
+ * Revert "ESM build only"
17
+ * `ingest()` function throws error if `submitData.value` is not an array (required by BE)
18
+
19
+ **[0.2.0 - 2024-05-01]**:
20
+ * Adds `ingest()` function
21
+ * ESM build only
22
+ * Babel config to target recent browsers only
23
+
24
+ **[0.1.1 - 2024-04-30]**:
25
+ * Fix build by removing unused file
26
+
27
+ **[0.1.0 - 2024-04-25]**:
28
+ * Add initial `<DESelect />` component
29
+
30
+ **[0.0.2 - 2024-04-24]**:
31
+ * Fix build error
32
+
33
+ **[0.0.1 - 2024-04-09]**:
34
+ * Initial setup
@@ -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 {};
@@ -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
@@ -91,27 +85,18 @@ const ingest = async _ref2 => {
91
85
  type = IngestType.IMPLICIT,
92
86
  source
93
87
  } = _ref2;
94
- const debug = window.location.search.includes(DEBUG_FLAG);
95
- if (debug) {
96
- console.debug('ingest()');
97
- }
98
88
  const url = `${base}/ingest`;
99
89
  const wapo_login_id = subsSdk.getCookie('wapo_login_id');
100
90
  if (!hasRequiredPrivacyCookies()) {
101
- if (debug) console.debug('ingest() > hasRequiredPrivacyCookies falsy');
102
91
  throw new Error('does not satisfy cookie check');
103
92
  }
104
93
  let attributeInfo = attributesCache[fieldName];
105
94
  if (!attributeInfo) {
106
- if (debug) console.debug('ingest() > fetch attribute info');
107
95
  attributeInfo = await getAttributes({
108
96
  fieldName
109
97
  });
110
- } else {
111
- if (debug) console.debug('ingest() > use cached attribute info');
112
98
  }
113
99
  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
100
  throw new Error('do not collect');
116
101
  }
117
102
  const jucid = localStorage.getItem('uuid');
@@ -143,6 +128,139 @@ const ingest = async _ref2 => {
143
128
  }
144
129
  };
145
130
 
131
+ const StyledMobileSelect = /*#__PURE__*/wpdsUiKit.styled('select', {
132
+ padding: '12px 16px 12px 6px',
133
+ display: 'flex',
134
+ justifyContent: 'space-between',
135
+ width: '100%',
136
+ backgroundColor: '$secondary',
137
+ color: '$primary',
138
+ fontFamily: '$meta',
139
+ fontSize: '$100',
140
+ fontWeight: '$light',
141
+ lineHeight: '$125',
142
+ paddingBlockRight: '$125',
143
+ textOverflow: 'ellipsis',
144
+ position: 'relative',
145
+ borderColor: 'transparent',
146
+ borderRightWidth: '10px',
147
+ borderRightColor: 'transparent',
148
+ appearance: 'none',
149
+ '-webkit-appearance': 'none',
150
+ '&:disabled': {
151
+ backgroundColor: wpdsUiKit.theme.colors.disabled,
152
+ borderColor: wpdsUiKit.theme.colors.disabled,
153
+ color: wpdsUiKit.theme.colors.onDisabled,
154
+ cursor: 'not-allowed'
155
+ }
156
+ });
157
+ const StyledSelectWrapper = /*#__PURE__*/wpdsUiKit.styled('div', {
158
+ width: '100%',
159
+ maxWidth: '380px',
160
+ borderRadius: '$012',
161
+ borderColor: '$subtle',
162
+ borderStyle: 'solid',
163
+ borderWidth: '1px',
164
+ backgroundColor: '$secondary',
165
+ position: 'relative'
166
+ });
167
+ const StyledMobileOption = /*#__PURE__*/wpdsUiKit.styled('option', {
168
+ fontFamily: 'inherit',
169
+ fontSize: 'inherit',
170
+ color: 'inherit'
171
+ });
172
+ /**
173
+ * Dropdown component. Uses wpds-ui-kit on desktop and native select on mobile.
174
+ * @param {IDropdownProps} props The props.
175
+ * @returns {React.ReactElement} The dropdown.
176
+ */
177
+ const Dropdown = _ref => {
178
+ let {
179
+ id,
180
+ label,
181
+ values,
182
+ required = false,
183
+ defaultValue,
184
+ onChange = () => {},
185
+ disabled = false
186
+ } = _ref;
187
+ const [answer, setAnswer] = React.useState();
188
+ const {
189
+ isMobileSize
190
+ } = subsHooks.useWindowSize();
191
+ React.useEffect(() => {
192
+ if (answer) onChange(answer);
193
+ }, [answer]);
194
+ const disabledProp = disabled ? {
195
+ disabled: true
196
+ } : {};
197
+ // helps maintain state between WPDS and native dropdowns
198
+ const defaultValueProp = answer ? {
199
+ defaultValue: answer
200
+ } : defaultValue ? {
201
+ defaultValue
202
+ } : {};
203
+ const defaultValuePropMobile = value => {
204
+ if (answer) {
205
+ return value === answer ? {
206
+ selected: true
207
+ } : {};
208
+ }
209
+ return value === defaultValue ? {
210
+ selected: true
211
+ } : {};
212
+ };
213
+ return isMobileSize ? React__default.createElement(StyledSelectWrapper, null, React__default.createElement(StyledMobileSelect, {
214
+ id: "",
215
+ required: required,
216
+ onChange: e => setAnswer(e.target.value),
217
+ placeholder: label,
218
+ ...disabledProp
219
+ }, React__default.createElement("label", null, label), React__default.createElement(StyledMobileOption, {
220
+ value: "",
221
+ disabled: true,
222
+ selected: true,
223
+ style: {
224
+ color: '#666666'
225
+ }
226
+ }, label), values.map(value => React__default.createElement(StyledMobileOption, {
227
+ value: value,
228
+ key: value,
229
+ ...defaultValuePropMobile(value)
230
+ }, value))), React__default.createElement(wpdsUiKit.Icon, {
231
+ label: "",
232
+ size: "100",
233
+ fill: wpdsUiKit.theme.colors['gray80'],
234
+ style: {
235
+ pointerEvents: 'none',
236
+ position: 'absolute',
237
+ right: '10px',
238
+ top: '50%',
239
+ transform: 'translateY(-50%)'
240
+ }
241
+ }, React__default.createElement(wpdsAssets.ChevronDown, {
242
+ style: {
243
+ position: 'absolute',
244
+ right: '10px'
245
+ }
246
+ }))) : React__default.createElement(wpdsUiKit.Select.Root, {
247
+ onValueChange: e => setAnswer(e),
248
+ required: required,
249
+ ...defaultValueProp,
250
+ ...disabledProp
251
+ }, React__default.createElement(wpdsUiKit.Select.Trigger, {
252
+ "data-test-id": `${id}-select-trigger`
253
+ }, React__default.createElement(wpdsUiKit.Select.Label, null, label), React__default.createElement(wpdsUiKit.Select.Value, null)), React__default.createElement(wpdsUiKit.Select.Content, {
254
+ css: {
255
+ zIndex: wpdsUiKit.theme.zIndices.page
256
+ },
257
+ "data-test-id": `${id}-select-content`
258
+ }, values.map(value => React__default.createElement(wpdsUiKit.Select.Item, {
259
+ value: value,
260
+ key: value
261
+ }, value))));
262
+ };
263
+
146
264
  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
265
  const DESelect = _ref => {
148
266
  let {
@@ -219,28 +337,33 @@ const DESelect = _ref => {
219
337
  } : {};
220
338
  // sort and filter out archived values
221
339
  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, {
340
+ return React__default.createElement(SelectWrapper, null, children && React__default.createElement(wpdsUiKit.Select.Root, {
223
341
  onValueChange: e => {
342
+ setSelected(e);
224
343
  onChange({
225
344
  value: e
226
345
  });
227
- setSelected(e);
228
346
  },
229
347
  ...defaultValueProp,
230
348
  ...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
349
+ }, children), !children && !config && React__default.createElement(Dropdown, {
350
+ id: 'loading',
351
+ label: 'Loading...',
352
+ values: [],
353
+ disabled: true
354
+ }), !children && config && React__default.createElement(Dropdown, {
355
+ id: config.name,
356
+ label: label || config.name,
357
+ onChange: e => {
358
+ setSelected(e);
359
+ onChange({
360
+ value: e
361
+ });
238
362
  },
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))))));
363
+ values: values.map(value => value.name),
364
+ defaultValue: defaultValue,
365
+ disabled: disabled
366
+ }));
244
367
  };
245
368
  const SelectWrapper = /*#__PURE__*/wpdsUiKit.styled('div', {
246
369
  boxSizing: 'border-box',
@@ -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/dataEnrichment.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 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 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\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 if (!hasRequiredPrivacyCookies()) {\n throw new Error('does not satisfy cookie check');\n }\n\n let attributeInfo = attributesCache[fieldName];\n if (!attributeInfo) {\n attributeInfo = await getAttributes({ fieldName });\n }\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n throw new Error('do not collect');\n }\n\n const 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 = 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","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","StyledMobileSelect","styled","padding","display","justifyContent","width","backgroundColor","color","fontFamily","fontSize","fontWeight","lineHeight","paddingBlockRight","textOverflow","position","borderColor","borderRightWidth","borderRightColor","appearance","theme","colors","disabled","onDisabled","cursor","StyledSelectWrapper","maxWidth","borderRadius","borderStyle","borderWidth","StyledMobileOption","Dropdown","id","label","values","required","defaultValue","onChange","answer","setAnswer","useState","isMobileSize","useWindowSize","useEffect","disabledProp","defaultValueProp","defaultValuePropMobile","selected","React","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","warn","ScriptStatus","READY","submitSelected","_window2","result","push","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"),l=require("@washingtonpost/wpds-assets");const r={COLLECT:"COLLECT",DO_NOT_COLLECT:"DO_NOT_COLLECT"},n={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=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"}}),E=i.styled("div",{width:"100%",maxWidth:"380px",borderRadius:"$012",borderColor:"$subtle",borderStyle:"solid",borderWidth:"1px",backgroundColor:"$secondary",position:"relative"}),g=i.styled("option",{fontFamily:"inherit",fontSize:"inherit",color:"inherit"}),h=e=>{let{id:t,label:r,values:n,required:d=!1,defaultValue:c,onChange:u=(()=>{}),disabled:p=!1}=e;const[h,m]=o.useState(),{isMobileSize:S}=s.useWindowSize();o.useEffect(()=>{h&&u(h)},[h]);const I=p?{disabled:!0}:{},f=h?{defaultValue:h}:c?{defaultValue:c}:{},C=e=>h?e===h?{selected:!0}:{}:e===c?{selected:!0}:{};return S?a.createElement(E,null,a.createElement(b,{id:"",required:d,onChange:e=>m(e.target.value),placeholder:r,...I},a.createElement("label",null,r),a.createElement(g,{value:"",disabled:!0,selected:!0,style:{color:"#666666"}},r),n.map(e=>a.createElement(g,{value:e,key:e,...C(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(l.ChevronDown,{style:{position:"absolute",right:"10px"}}))):a.createElement(i.Select.Root,{onValueChange:e=>m(e),required:d,...f,...I},a.createElement(i.Select.Trigger,{"data-test-id":t+"-select-trigger"},a.createElement(i.Select.Label,null,r),a.createElement(i.Select.Value,null)),a.createElement(i.Select.Content,{css:{zIndex:i.theme.zIndices.page},"data-test-id":t+"-select-content"},n.map(e=>a.createElement(i.Select.Item,{value:e,key:e},e))))},m=("https://subscribe.washingtonpost.com/static"===t.ENDPOINTS.staticAssets?"https://www.washingtonpost.com/subscribe/static/":t.ENDPOINTS.staticAssets)+"/de-utils/twpdeu.min.js",S=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=r,exports.DESelect=e=>{let{source:l,fieldName:r,label:d,dataDictionaryConfig:c,defaultValue:u,disabled:p,submit:b,onChange:E=(()=>{}),onFinished:g=(()=>{}),valuesFilter:I=(()=>!0),children:f}=e;const[C,w]=o.useState(c),[y,T]=o.useState(""),v=s.useScript(m);o.useEffect(()=>{v!==s.ScriptStatus.READY||f||C||(async()=>{try{var e;const t=await(null===(e=window)||void 0===e||null===(e=e.__twpdeu)||void 0===e?void 0:e.getFieldConfigs({fieldName:r}));t?w(t[0]):console.error("unable to get config",r)}catch(e){console.warn("unable to get config",r,e)}})()},[v]),o.useEffect(()=>{v===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:r,value:y},type:null!=C&&C.explicit?n.EXPLICIT:n.IMPLICIT,source:l}));g({isFinished:!0,isError:!o||o.status!==t.ResponseStatus.SUCCESS})}catch(e){g({isFinished:!1,isError:!0})}})()},[v,b]);const _=u&&C?{defaultValue:u}:{},N=p||!f&&!C?{disabled:!0}:{},D=C?C.values.sort((e,t)=>e.order-t.order).filter(e=>!0!==e.archived).filter(I):[];return a.createElement(S,null,f&&a.createElement(i.Select.Root,{onValueChange:e=>{T(e),E({value:e})},..._,...N},f),!f&&!C&&a.createElement(h,{id:"loading",label:"Loading...",values:[],disabled:!0}),!f&&C&&a.createElement(h,{id:C.name,label:d||C.name,onChange:e=>{T(e),E({value:e})},values:D.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=n,exports.getAttributes=p,exports.hasRequiredPrivacyCookies=d,exports.ingest=async e=>{let{submitData:{fieldName:o,value:a},type:i=n.IMPLICIT,source:s}=e;const l=c+"/ingest",b=t.getCookie("wapo_login_id");if(!d())throw new Error("does not satisfy cookie check");let E=u[o];if(E||(E=await p({fieldName:o})),E[0]&&E[0].name===o&&E[0].collection_behavior===r.DO_NOT_COLLECT)throw new Error("do not collect");const g={jucid:localStorage.getItem("uuid"),ga:t.getCookie("_ga"),type:i,wapo_login_id:b,data:{[o]:[a]},metadata:{source:s}};try{const e=await fetch(l,{method:"POST",credentials:"include",headers:t.JSON_HEADERS,body:JSON.stringify(g)});return await e.json()}catch(e){return console.debug(e),null}};
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/dataEnrichment.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 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 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\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 if (!hasRequiredPrivacyCookies()) {\n throw new Error('does not satisfy cookie check');\n }\n\n let attributeInfo = attributesCache[fieldName];\n if (!attributeInfo) {\n attributeInfo = await getAttributes({ fieldName });\n }\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n throw new Error('do not collect');\n }\n\n const 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 = 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","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","_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,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
@@ -84,27 +78,18 @@ const ingest = async _ref2 => {
84
78
  type = IngestType.IMPLICIT,
85
79
  source
86
80
  } = _ref2;
87
- const debug = window.location.search.includes(DEBUG_FLAG);
88
- if (debug) {
89
- console.debug('ingest()');
90
- }
91
81
  const url = `${base}/ingest`;
92
82
  const wapo_login_id = getCookie('wapo_login_id');
93
83
  if (!hasRequiredPrivacyCookies()) {
94
- if (debug) console.debug('ingest() > hasRequiredPrivacyCookies falsy');
95
84
  throw new Error('does not satisfy cookie check');
96
85
  }
97
86
  let attributeInfo = attributesCache[fieldName];
98
87
  if (!attributeInfo) {
99
- if (debug) console.debug('ingest() > fetch attribute info');
100
88
  attributeInfo = await getAttributes({
101
89
  fieldName
102
90
  });
103
- } else {
104
- if (debug) console.debug('ingest() > use cached attribute info');
105
91
  }
106
92
  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
93
  throw new Error('do not collect');
109
94
  }
110
95
  const jucid = localStorage.getItem('uuid');
@@ -136,6 +121,139 @@ const ingest = async _ref2 => {
136
121
  }
137
122
  };
138
123
 
124
+ const StyledMobileSelect = /*#__PURE__*/styled('select', {
125
+ padding: '12px 16px 12px 6px',
126
+ display: 'flex',
127
+ justifyContent: 'space-between',
128
+ width: '100%',
129
+ backgroundColor: '$secondary',
130
+ color: '$primary',
131
+ fontFamily: '$meta',
132
+ fontSize: '$100',
133
+ fontWeight: '$light',
134
+ lineHeight: '$125',
135
+ paddingBlockRight: '$125',
136
+ textOverflow: 'ellipsis',
137
+ position: 'relative',
138
+ borderColor: 'transparent',
139
+ borderRightWidth: '10px',
140
+ borderRightColor: 'transparent',
141
+ appearance: 'none',
142
+ '-webkit-appearance': 'none',
143
+ '&:disabled': {
144
+ backgroundColor: theme.colors.disabled,
145
+ borderColor: theme.colors.disabled,
146
+ color: theme.colors.onDisabled,
147
+ cursor: 'not-allowed'
148
+ }
149
+ });
150
+ const StyledSelectWrapper = /*#__PURE__*/styled('div', {
151
+ width: '100%',
152
+ maxWidth: '380px',
153
+ borderRadius: '$012',
154
+ borderColor: '$subtle',
155
+ borderStyle: 'solid',
156
+ borderWidth: '1px',
157
+ backgroundColor: '$secondary',
158
+ position: 'relative'
159
+ });
160
+ const StyledMobileOption = /*#__PURE__*/styled('option', {
161
+ fontFamily: 'inherit',
162
+ fontSize: 'inherit',
163
+ color: 'inherit'
164
+ });
165
+ /**
166
+ * Dropdown component. Uses wpds-ui-kit on desktop and native select on mobile.
167
+ * @param {IDropdownProps} props The props.
168
+ * @returns {React.ReactElement} The dropdown.
169
+ */
170
+ const Dropdown = _ref => {
171
+ let {
172
+ id,
173
+ label,
174
+ values,
175
+ required = false,
176
+ defaultValue,
177
+ onChange = () => {},
178
+ disabled = false
179
+ } = _ref;
180
+ const [answer, setAnswer] = useState();
181
+ const {
182
+ isMobileSize
183
+ } = useWindowSize();
184
+ useEffect(() => {
185
+ if (answer) onChange(answer);
186
+ }, [answer]);
187
+ const disabledProp = disabled ? {
188
+ disabled: true
189
+ } : {};
190
+ // helps maintain state between WPDS and native dropdowns
191
+ const defaultValueProp = answer ? {
192
+ defaultValue: answer
193
+ } : defaultValue ? {
194
+ defaultValue
195
+ } : {};
196
+ const defaultValuePropMobile = value => {
197
+ if (answer) {
198
+ return value === answer ? {
199
+ selected: true
200
+ } : {};
201
+ }
202
+ return value === defaultValue ? {
203
+ selected: true
204
+ } : {};
205
+ };
206
+ return isMobileSize ? React.createElement(StyledSelectWrapper, null, React.createElement(StyledMobileSelect, {
207
+ id: "",
208
+ required: required,
209
+ onChange: e => setAnswer(e.target.value),
210
+ placeholder: label,
211
+ ...disabledProp
212
+ }, React.createElement("label", null, label), React.createElement(StyledMobileOption, {
213
+ value: "",
214
+ disabled: true,
215
+ selected: true,
216
+ style: {
217
+ color: '#666666'
218
+ }
219
+ }, label), values.map(value => React.createElement(StyledMobileOption, {
220
+ value: value,
221
+ key: value,
222
+ ...defaultValuePropMobile(value)
223
+ }, value))), React.createElement(Icon, {
224
+ label: "",
225
+ size: "100",
226
+ fill: theme.colors['gray80'],
227
+ style: {
228
+ pointerEvents: 'none',
229
+ position: 'absolute',
230
+ right: '10px',
231
+ top: '50%',
232
+ transform: 'translateY(-50%)'
233
+ }
234
+ }, React.createElement(ChevronDown, {
235
+ style: {
236
+ position: 'absolute',
237
+ right: '10px'
238
+ }
239
+ }))) : React.createElement(Select.Root, {
240
+ onValueChange: e => setAnswer(e),
241
+ required: required,
242
+ ...defaultValueProp,
243
+ ...disabledProp
244
+ }, React.createElement(Select.Trigger, {
245
+ "data-test-id": `${id}-select-trigger`
246
+ }, React.createElement(Select.Label, null, label), React.createElement(Select.Value, null)), React.createElement(Select.Content, {
247
+ css: {
248
+ zIndex: theme.zIndices.page
249
+ },
250
+ "data-test-id": `${id}-select-content`
251
+ }, values.map(value => React.createElement(Select.Item, {
252
+ value: value,
253
+ key: value
254
+ }, value))));
255
+ };
256
+
139
257
  const scriptSrc = `${ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static' ? 'https://www.washingtonpost.com/subscribe/static/' : ENDPOINTS.staticAssets}/de-utils/twpdeu.min.js`;
140
258
  const DESelect = _ref => {
141
259
  let {
@@ -212,28 +330,33 @@ const DESelect = _ref => {
212
330
  } : {};
213
331
  // sort and filter out archived values
214
332
  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, {
333
+ return React.createElement(SelectWrapper, null, children && React.createElement(Select.Root, {
216
334
  onValueChange: e => {
335
+ setSelected(e);
217
336
  onChange({
218
337
  value: e
219
338
  });
220
- setSelected(e);
221
339
  },
222
340
  ...defaultValueProp,
223
341
  ...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
342
+ }, children), !children && !config && React.createElement(Dropdown, {
343
+ id: 'loading',
344
+ label: 'Loading...',
345
+ values: [],
346
+ disabled: true
347
+ }), !children && config && React.createElement(Dropdown, {
348
+ id: config.name,
349
+ label: label || config.name,
350
+ onChange: e => {
351
+ setSelected(e);
352
+ onChange({
353
+ value: e
354
+ });
231
355
  },
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))))));
356
+ values: values.map(value => value.name),
357
+ defaultValue: defaultValue,
358
+ disabled: disabled
359
+ }));
237
360
  };
238
361
  const SelectWrapper = /*#__PURE__*/styled('div', {
239
362
  boxSizing: 'border-box',
@@ -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":";;;;;MAQaA,mBAAmB,GAAG;EACjCC,OAAO,EAAE,SAAS;EAClBC,cAAc,EAAE;;MAeLC,eAAe,GAAG;EAC7BC,OAAO,EAAE;;MAGEC,UAAU,GAAG;EACxBC,QAAQ,EAAE,UAAU;EACpBC,QAAQ,EAAE;;MAGCC,mBAAmB,GAAG;EACjCJ,OAAO,EAAE,KAAK;EACdK,YAAY,EAAE,KAAK;EACnBC,YAAY,EAAE,KAAK;EACnBC,kBAAkB,EAAE,KAAK;EACzBC,YAAY,EAAE,KAAK;EACnBC,4BAA4B,EAAE,KAAK;EACnCC,uBAAuB,EAAE,KAAK;EAC9BC,eAAe,EAAE,KAAK;EACtBC,qBAAqB,EAAE,KAAK;EAC5BC,6BAA6B,EAAE,KAAK;EACpCf,cAAc,EAAE;;;MC3CLgB,yBAAyB,GAAGA;;EACvC,IAAI,OAAOC,MAAM,KAAK,WAAW,EAAE;IACjC,OAAO,KAAK;;EAGd,MAAMC,MAAM,GAAGC,SAAS,CAAC,QAAQ,CAAC;EAElC,MAAMC,WAAW,IAAAC,MAAA,GAAGC,KAAK,EAAE,cAAAD,MAAA,uBAAPA,MAAA,CAASE,YAAY;EAEzC,OAAO,CAAC,EAAEL,MAAM,IAAIE,WAAW,KAAK,IAAI,CAAC;AAC3C,CAAC;;ACED,MAAMI,UAAU,GAAG,YAAY;AAE/B,MAAMC,IAAI,MAAMC,SAAS,CAACD,YAAY;AAEtC,MAAME,eAAe,GAAwB,EAAE;AAC/C,MAAaC,aAAa,GAAsB,MAAAC,IAAA;MAAO;IACrDC;GAGD,GAAAD,IAAA;EACC,MAAME,KAAK,GAAGd,MAAM,CAACe,QAAQ,CAACC,MAAM,CAACC,QAAQ,CAACV,UAAU,CAAC;EAEzD,IAAIO,KAAK,EAAE;IACTI,OAAO,CAACJ,KAAK,CAAC,iBAAiB,CAAC;;EAGlC,IAAIJ,eAAe,CAACG,SAAS,CAAC,EAAE;IAC9B,IAAIC,KAAK,EAAEI,OAAO,CAACJ,KAAK,CAAC,sCAAsC,CAAC;IAChE,OAAOJ,eAAe,CAACG,SAAS,CAAC;;EAGnC,MAAMM,UAAU,GAAG,CAACN,SAAS,CAAC;EAE9B,IAAI;IACF,MAAMO,GAAG,GAAG,IAAIC,GAAG,IAAIb,iBAAiB,CAAC;IACzCY,GAAG,CAACE,YAAY,CAACC,GAAG,CAAC,YAAY,EAAEJ,UAAU,CAACK,IAAI,CAAC,GAAG,CAAC,CAAC;IAExD,IAAIV,KAAK,EAAEI,OAAO,CAACJ,KAAK,sBAAsBM,GAAG,CAACK,QAAQ,IAAI,CAAC;IAE/D,MAAMC,IAAI,GAAG,MAAMC,KAAK,CAACP,GAAG,CAACK,QAAQ,EAAE,EAAE;MACvCG,WAAW,EAAE,SAAS;MACtBC,OAAO,EAAEC;KACV,CAAC;IACF,MAAMC,IAAI,GAAG,MAAML,IAAI,CAACK,IAAI,EAAE;IAE9B,IAAIL,IAAI,CAACM,EAAE,IAAID,IAAI,CAACE,MAAM,KAAKC,cAAc,CAACjD,OAAO,EAAE;MACrD,MAAMkD,UAAU,GAAGJ,IAAI,CAACI,UAAU,IAAI,EAAE;MACxCzB,eAAe,CAACG,SAAS,CAAC,GAAGsB,UAAU;MACvC,OAAOA,UAAU;KAClB,MAAM;MACL,OAAO,EAAE;;GAEZ,CAAC,OAAOC,CAAC,EAAE;IACVlB,OAAO,CAACJ,KAAK,CAACsB,CAAC,CAAC;IAChB,OAAO,EAAE;;AAEb,CAAC;AAQD,MAAaC,MAAM,GAAe,MAAAC,KAAA;MAAO;IACvCC,UAAU,EAAE;MAAE1B,SAAS;MAAE2B;KAAO;IAChCC,IAAI,GAAGvD,UAAU,CAACE,QAAQ;IAC1BsD;GACD,GAAAJ,KAAA;EACC,MAAMxB,KAAK,GAAGd,MAAM,CAACe,QAAQ,CAACC,MAAM,CAACC,QAAQ,CAACV,UAAU,CAAC;EAEzD,IAAIO,KAAK,EAAE;IACTI,OAAO,CAACJ,KAAK,CAAC,UAAU,CAAC;;EAG3B,MAAMM,GAAG,MAAMZ,aAAa;EAE5B,MAAMmC,aAAa,GAAGzC,SAAS,CAAC,eAAe,CAAC;EAEhD,IAAI,CAACH,yBAAyB,EAAE,EAAE;IAChC,IAAIe,KAAK,EAAEI,OAAO,CAACJ,KAAK,CAAC,4CAA4C,CAAC;IACtE,MAAM,IAAI8B,KAAK,CAAC,+BAA+B,CAAC;;EAGlD,IAAIC,aAAa,GAAGnC,eAAe,CAACG,SAAS,CAAC;EAC9C,IAAI,CAACgC,aAAa,EAAE;IAClB,IAAI/B,KAAK,EAAEI,OAAO,CAACJ,KAAK,CAAC,iCAAiC,CAAC;IAC3D+B,aAAa,GAAG,MAAMlC,aAAa,CAAC;MAAEE;KAAW,CAAC;GACnD,MAAM;IACL,IAAIC,KAAK,EAAEI,OAAO,CAACJ,KAAK,CAAC,sCAAsC,CAAC;;EAGlE,IACE+B,aAAa,CAAC,CAAC,CAAC,IAChBA,aAAa,CAAC,CAAC,CAAC,CAACC,IAAI,KAAKjC,SAAS,IACnCgC,aAAa,CAAC,CAAC,CAAC,CAACE,mBAAmB,KAAKlE,mBAAmB,CAACE,cAAc,EAC3E;IACA,IAAI+B,KAAK,EAAEI,OAAO,CAACJ,KAAK,CAAC,2BAA2B,CAAC;IACrD,MAAM,IAAI8B,KAAK,CAAC,gBAAgB,CAAC;;EAGnC,MAAMI,KAAK,GAAGC,YAAY,CAACC,OAAO,CAAC,MAAM,CAAC;EAC1C,MAAMC,EAAE,GAAGjD,SAAS,CAAC,KAAK,CAAC;EAE3B,MAAMkD,OAAO,GAAG;IACdJ,KAAK;IACLG,EAAE;IACFV,IAAI;IACJE,aAAa;IACbjB,IAAI,EAAE;MACJ,CAACb,SAAS,GAAG,CAAC2B,KAAK;KACpB;IACDa,QAAQ,EAAE;MAAEX;;GACb;EAED,IAAI;IACF,MAAMY,QAAQ,GAAG,MAAM3B,KAAK,CAACP,GAAG,EAAE;MAChCmC,MAAM,EAAE,MAAM;MACd3B,WAAW,EAAE,SAAS;MACtBC,OAAO,EAAEC,YAAY;MACrB0B,IAAI,EAAEC,IAAI,CAACC,SAAS,CAACN,OAAO;KAC7B,CAAC;IAEF,MAAMrB,IAAI,GAAG,MAAMuB,QAAQ,CAACvB,IAAI,EAAE;IAElC,OAAOA,IAAI;GACZ,CAAC,OAAOK,CAAC,EAAE;IACVlB,OAAO,CAACJ,KAAK,CAACsB,CAAC,CAAC;IAChB,OAAO,IAAI;;AAEf,CAAC;;ACpGD,MAAMuB,SAAS,MACblD,SAAS,CAACmD,YAAY,KAAK,6CAA6C,GACpE,kDAAkD,GAClDnD,SAAS,CAACmD,qCACS;AAEzB,MAAaC,QAAQ,GAA4BjD,IAAA;MAAC;IAChD8B,MAAM;IACN7B,SAAS;IACTiD,KAAK;IACLC,oBAAoB;IACpBC,YAAY;IACZC,QAAQ;IACRC,MAAM;IACNC,QAAQ,GAAGA,QAAQ;IACnBC,UAAU,GAAGA,QAAQ;IACrBC,YAAY,GAAGA,MAAM,IAAI;IACzBC;GACD,GAAA1D,IAAA;EACC,MAAM,CAAC2D,MAAM,EAAEC,SAAS,CAAC,GAAGC,QAAQ,CAACV,oBAAoB,CAAC;EAE1D,MAAM,CAACW,QAAQ,EAAEC,WAAW,CAAC,GAAGF,QAAQ,CAAC,EAAE,CAAC;EAE5C,MAAMG,YAAY,GAAGC,SAAS,CAAClB,SAAS,CAAC;EAEzCmB,SAAS,CAAC;IACR,MAAMC,WAAW,GAAG;MAClB,IAAI;QAAA,IAAAC,OAAA;QACF,MAAMT,MAAM,GAAG,QAAAS,OAAA,GAAMhF,MAAM,cAAAgF,OAAA,gBAAAA,OAAA,GAANA,OAAA,CAAQC,QAAQ,cAAAD,OAAA,uBAAhBA,OAAA,CAAkBE,eAAe,CAAC;UAAErE;SAAW,CAAC;QACrE,IAAI0D,MAAM,EAAE;UACVC,SAAS,CAACD,MAAM,CAAC,CAAC,CAAC,CAAC;SACrB,MAAM;UACLrD,OAAO,CAACiE,KAAK,CAAC,sBAAsB,EAAEtE,SAAS,CAAC;;OAEnD,CAAC,OAAOuB,CAAC,EAAE;QACVlB,OAAO,CAACkE,IAAI,CAAC,sBAAsB,EAAEvE,SAAS,EAAEuB,CAAC,CAAC;;KAErD;IAED,IAAIwC,YAAY,KAAKS,YAAY,CAACC,KAAK,IAAI,EAAEhB,QAAQ,IAAIC,MAAM,CAAC,EAAE;MAChEQ,WAAW,EAAE;;GAEhB,EAAE,CAACH,YAAY,CAAC,CAAC;EAElBE,SAAS,CAAC;IACR,MAAMS,cAAc,GAAG;MACrB,IAAI;QAAA,IAAAC,QAAA;;QAGF,MAAMC,MAAM,GAAG,QAAAD,QAAA,GAAMxF,MAAM,cAAAwF,QAAA,gBAAAA,QAAA,GAANA,QAAA,CAAQP,QAAQ,cAAAO,QAAA,uBAAhBA,QAAA,CAAkBE,IAAI,CAAC;UAC1CnD,UAAU,EAAE;YAAE1B,SAAS;YAAE2B,KAAK,EAAEkC;WAAU;UAC1CjC,IAAI,EAAE8B,MAAM,aAANA,MAAM,eAANA,MAAM,CAAEoB,QAAQ,GAAGzG,UAAU,CAACC,QAAQ,GAAGD,UAAU,CAACE,QAAQ;UAClEsD;SACD,CAAC;QAEF,MAAMkD,OAAO,GAAGH,MAAM,GAClBA,MAAM,CAACxD,MAAM,KAAKC,cAAc,CAACjD,OAAO,GACxC,IAAI;QAERmF,UAAU,CAAC;UACTyB,UAAU,EAAE,IAAI;UAChBD;SACD,CAAC;OACH,CAAC,OAAOxD,CAAC,EAAE;QACVgC,UAAU,CAAC;UACTyB,UAAU,EAAE,KAAK;UACjBD,OAAO,EAAE;SACV,CAAC;;KAEL;IAED,IAAIhB,YAAY,KAAKS,YAAY,CAACC,KAAK,IAAIpB,MAAM,IAAIQ,QAAQ,EAAE;MAC7Da,cAAc,EAAE;;GAEnB,EAAE,CAACX,YAAY,EAAEV,MAAM,CAAC,CAAC;EAE1B,MAAM4B,gBAAgB,GAAG9B,YAAY,IAAIO,MAAM,GAAG;IAAEP;GAAc,GAAG,EAAE;EAEvE,MAAM+B,SAAS,GAAG,EAAEzB,QAAQ,IAAIC,MAAM,CAAC;EAEvC,MAAMyB,YAAY,GAAG/B,QAAQ,IAAI8B,SAAS,GAAG;IAAE9B,QAAQ,EAAE;GAAM,GAAG,EAAE;;EAGpE,MAAMgC,MAAM,GAAG1B,MAAM,GACjBA,MAAM,CAAC0B,MAAM,CACVC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACE,KAAK,GAAGD,CAAC,CAACC,KAAK,CAAC,CACjCC,MAAM,CAAE9D,KAAK,IAAKA,KAAK,CAAC+D,QAAQ,KAAK,IAAI,CAAC,CAC1CD,MAAM,CAACjC,YAAY,CAAC,GACvB,EAAE;EAEN,OACEmC,oBAACC,aAAa,QACZD,oBAACE,MAAM,CAACC,IAAI;IACVC,aAAa,EAAGxE,CAAS;MACvB+B,QAAQ,CAAC;QAAE3B,KAAK,EAAEJ;OAAG,CAAC;MACtBuC,WAAW,CAACvC,CAAC,CAAC;KACf;OACG0D,gBAAgB;OAChBE;KAEH1B,QAAQ,GAAGA,QAAQ,GAAG,IAAI,EAC1B,CAACA,QAAQ,IAAI,CAACC,MAAM,IACnBiC,0CACEA,oBAACE,MAAM,CAACG,OAAO;;KACbL,oBAACE,MAAM,CAACI,KAAK,QAAEhD,KAAK,IAAI,YAAY,CAAgB,EACpD0C,oBAACE,MAAM,CAACK,KAAK,OAAG,CACD,CAEpB,EACA,CAACzC,QAAQ,IAAIC,MAAM,IAClBiC,0CACEA,oBAACE,MAAM,CAACG,OAAO;uBAAkBtC,MAAM,CAACzB;KACtC0D,oBAACE,MAAM,CAACI,KAAK,QAAEhD,KAAK,IAAIS,MAAM,CAACzB,IAAI,CAAgB,EACnD0D,oBAACE,MAAM,CAACK,KAAK,OAAG,CACD,EACjBP,oBAACE,MAAM,CAACM,OAAO;IACbC,GAAG,EAAE;MAAEC,MAAM,EAAEC,KAAK,CAACC,QAAQ,CAACC;KAAM;uBACnB9C,MAAM,CAACzB;KAEvBmD,MAAM,CAACqB,GAAG,CAAE9E,KAAK,IAChBgE,oBAACE,MAAM,CAACa,IAAI;IAAC/E,KAAK,EAAEA,KAAK,CAACM,IAAI;IAAE0E,GAAG,EAAEhF,KAAK,CAACM;KACxCN,KAAK,CAACM,IAAI,CAEd,CAAC,CACa,CAEpB,CACW,CACA;AAEpB,CAAC;AAED,MAAM2D,aAAa,gBAAGgB,MAAM,CAAC,KAAK,EAAE;EAClCC,SAAS,EAAE,YAAY;EACvBC,OAAO,EAAE,MAAM;EACfC,YAAY,EAAE,MAAM;EACpBC,aAAa,EAAE,QAAQ;EACvB,UAAU,EAAE;IACVC,OAAO,EAAE;GACV;EACD,KAAK,EAAE;IAAEJ,SAAS,EAAE;;CACrB,CAAC;;;;"}
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/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 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 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\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 if (!hasRequiredPrivacyCookies()) {\n throw new Error('does not satisfy cookie check');\n }\n\n let attributeInfo = attributesCache[fieldName];\n if (!attributeInfo) {\n attributeInfo = await getAttributes({ fieldName });\n }\n\n if (\n attributeInfo[0] &&\n attributeInfo[0].name === fieldName &&\n attributeInfo[0].collection_behavior === CollectionBehaviors.DO_NOT_COLLECT\n ) {\n throw new Error('do not collect');\n }\n\n const 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 = 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","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","StyledMobileSelect","styled","padding","display","justifyContent","width","backgroundColor","color","fontFamily","fontSize","fontWeight","lineHeight","paddingBlockRight","textOverflow","position","borderColor","borderRightWidth","borderRightColor","appearance","theme","colors","disabled","onDisabled","cursor","StyledSelectWrapper","maxWidth","borderRadius","borderStyle","borderWidth","StyledMobileOption","Dropdown","id","label","values","required","defaultValue","onChange","answer","setAnswer","useState","isMobileSize","useWindowSize","useEffect","disabledProp","defaultValueProp","defaultValuePropMobile","selected","React","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","warn","ScriptStatus","READY","submitSelected","_window2","result","push","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.0",
3
3
  "license": "UNLICENSED",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -36,7 +36,7 @@
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",