@washingtonpost/subs-de-inputs 0.2.0-canary.1 → 0.2.1-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -37,4 +37,6 @@ export declare const IngestResponseState: {
37
37
  readonly INVALID_META_DEFINITION: "106";
38
38
  readonly UNAUTHENTICATED: "107";
39
39
  readonly MISMATCHED_IDENTIFIER: "108";
40
+ readonly DISABLED_ATTRIBUTE_DEFINITION: "109";
41
+ readonly DO_NOT_COLLECT: "110";
40
42
  };
@@ -8,8 +8,9 @@ export declare const ingest: IngestType;
8
8
  declare type IngestType = ({ submitData: { fieldName, value }, source, }: {
9
9
  submitData: {
10
10
  fieldName: string;
11
- value: string;
11
+ value: string[];
12
12
  };
13
+ type: (typeof IngestType)[keyof typeof IngestType];
13
14
  source: string;
14
15
  }) => Promise<{
15
16
  status: ResponseStatus;
@@ -8,6 +8,7 @@ var subsSdk = require('@washingtonpost/subs-sdk');
8
8
  var React = require('react');
9
9
  var React__default = _interopDefault(React);
10
10
  var wpdsUiKit = require('@washingtonpost/wpds-ui-kit');
11
+ var subsHooks = require('@washingtonpost/subs-hooks');
11
12
 
12
13
  const CollectionBehaviors = {
13
14
  COLLECT: 'COLLECT',
@@ -29,7 +30,9 @@ const IngestResponseState = {
29
30
  INVALID_ATTRIBUTE_DEFINITION: '105',
30
31
  INVALID_META_DEFINITION: '106',
31
32
  UNAUTHENTICATED: '107',
32
- MISMATCHED_IDENTIFIER: '108'
33
+ MISMATCHED_IDENTIFIER: '108',
34
+ DISABLED_ATTRIBUTE_DEFINITION: '109',
35
+ DO_NOT_COLLECT: '110'
33
36
  };
34
37
 
35
38
  const hasRequiredPrivacyCookies = () => {
@@ -78,6 +81,7 @@ const ingest = async _ref2 => {
78
81
  fieldName,
79
82
  value
80
83
  },
84
+ type,
81
85
  source
82
86
  } = _ref2;
83
87
  const url = `${base}/ingest`;
@@ -99,7 +103,7 @@ const ingest = async _ref2 => {
99
103
  const payload = {
100
104
  jucid,
101
105
  ga,
102
- type: IngestType.EXPLICIT,
106
+ type,
103
107
  wapo_login_id,
104
108
  data: {
105
109
  fieldName,
@@ -124,6 +128,7 @@ const ingest = async _ref2 => {
124
128
  }
125
129
  };
126
130
 
131
+ const scriptSrc = `${subsSdk.ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static' ? 'https://www.washingtonpost.com/subscribe/static/' : subsSdk.ENDPOINTS.staticAssets}/de-utils/twpdeu.min.js`;
127
132
  const DESelect = _ref => {
128
133
  let {
129
134
  source,
@@ -140,37 +145,38 @@ const DESelect = _ref => {
140
145
  } = _ref;
141
146
  const [config, setConfig] = React.useState(dataDictionaryConfig);
142
147
  const [selected, setSelected] = React.useState('');
148
+ const scriptStatus = subsHooks.useScript(scriptSrc);
143
149
  React.useEffect(() => {
144
- if (children) {
145
- if (process.env.NODE_ENV !== "production") {
146
- console.debug('childen props', children);
147
- }
148
- return;
149
- }
150
- if (!config) {
151
- (async () => {
152
- // TODO: Switch to window.__twpdeu.getFieldConfigs
153
- const config = await getAttributes({
150
+ const fetchConfig = async () => {
151
+ try {
152
+ var _window;
153
+ const config = await ((_window = window) === null || _window === void 0 || (_window = _window.__twpdeu) === null || _window === void 0 ? void 0 : _window.getFieldConfigs({
154
154
  fieldName
155
- });
156
- if (process.env.NODE_ENV !== "production") {
157
- console.debug('config from API', config);
155
+ }));
156
+ if (config) {
157
+ setConfig(config[0]);
158
+ } else {
159
+ console.error('unable to get config', fieldName);
158
160
  }
159
- setConfig(config[0]);
160
- })();
161
+ } catch (e) {
162
+ console.warn('unable to get config', fieldName, e);
163
+ }
164
+ };
165
+ if (scriptStatus === subsHooks.ScriptStatus.READY && !(children || config)) {
166
+ fetchConfig();
161
167
  }
162
- }, []);
168
+ }, [scriptStatus]);
163
169
  React.useEffect(() => {
164
- (async () => {
165
- if (submit && selected) {
170
+ const submitSelected = async () => {
171
+ try {
166
172
  // TODO: Switch to window.__twpdeu.push
167
173
  // TODO: Log to GA
168
- // TODO: Differentiate between explicit and implicit inputs?
169
174
  const result = await ingest({
170
175
  submitData: {
171
176
  fieldName,
172
- value: selected
177
+ value: [selected]
173
178
  },
179
+ type: config !== null && config !== void 0 && config.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,
174
180
  source
175
181
  });
176
182
  const isError = result ? result.status !== subsSdk.ResponseStatus.SUCCESS : true;
@@ -178,8 +184,16 @@ const DESelect = _ref => {
178
184
  isFinished: true,
179
185
  isError
180
186
  });
187
+ } catch (e) {
188
+ onFinished({
189
+ isFinished: false,
190
+ isError: true
191
+ });
181
192
  }
182
- })();
193
+ };
194
+ if (submit && selected) {
195
+ submitSelected();
196
+ }
183
197
  }, [submit, selected]);
184
198
  if (!(children || config)) {
185
199
  return React__default.createElement("span", null, "loading");
@@ -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} 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 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: IngestType.EXPLICIT,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n fieldName,\n value,\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n source: string;\n}) => Promise<{\n status: 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 } from '../../interfaces';\nimport { getAttributes, ingest } from '../../services/dataEnrichment';\nimport { ResponseStatus } from '@washingtonpost/subs-sdk';\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\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 useEffect(() => {\n if (children) {\n if (__DEV__) {\n console.debug('childen props', children);\n }\n return;\n }\n\n if (!config) {\n (async () => {\n // TODO: Switch to window.__twpdeu.getFieldConfigs\n const config = await getAttributes({ fieldName });\n if (__DEV__) {\n console.debug('config from API', config);\n }\n setConfig(config[0]);\n })();\n }\n }, []);\n\n useEffect(() => {\n (async () => {\n if (submit && selected) {\n // TODO: Switch to window.__twpdeu.push\n // TODO: Log to GA\n // TODO: Differentiate between explicit and implicit inputs?\n const result = await ingest({\n submitData: { fieldName, value: selected },\n source,\n });\n const isError = result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n }\n })();\n }, [submit, selected]);\n\n if (!(children || config)) {\n return <span>loading</span>;\n }\n\n const defaultValueProp = defaultValue ? { defaultValue } : {};\n\n const disabledProp = disabled ? { 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={`${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","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","source","wapo_login_id","Error","attributeInfo","name","collection_behavior","jucid","localStorage","getItem","ga","payload","type","metadata","response","method","body","JSON","stringify","DESelect","label","dataDictionaryConfig","defaultValue","disabled","submit","onChange","onFinished","valuesFilter","children","config","setConfig","useState","selected","setSelected","useEffect","process","env","NODE_ENV","result","isError","isFinished","React","defaultValueProp","disabledProp","values","sort","a","b","order","filter","archived","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/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,\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,\n 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 { ingest } from '../../services/dataEnrichment';\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: Switch to window.__twpdeu.push\n // TODO: Log to GA\n const result = await ingest({\n submitData: { fieldName, value: [selected] },\n type: config?.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,\n source,\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 (submit && selected) {\n submitSelected();\n }\n }, [submit, selected]);\n\n if (!(children || config)) {\n return <span>loading</span>;\n }\n\n const defaultValueProp = defaultValue ? { defaultValue } : {};\n\n const disabledProp = disabled ? { 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={`${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","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","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","result","explicit","isError","isFinished","React","defaultValueProp","disabledProp","values","sort","a","b","order","filter","archived","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,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("@washingtonpost/subs-sdk"),a=require("react"),o=(e=a)&&"object"==typeof e&&"default"in e?e.default:e,n=require("@washingtonpost/wpds-ui-kit");const s={COLLECT:"COLLECT",DO_NOT_COLLECT:"DO_NOT_COLLECT"},r={EXPLICIT:"explicit",IMPLICIT:"implicit"},i=()=>{var e;if("undefined"==typeof window)return!1;const a=t.getCookie("wp_usp"),o=null===(e=t.WPGeo())||void 0===e?void 0:e.country_code;return!(!a||"US"!==o)},l=t.ENDPOINTS.base+"/de/v1",c={},u=async e=>{let{fieldName:a}=e;if(c[a])return c[a];const o=[a];try{const e=new URL(l+"/attributes");e.searchParams.set("attributes",o.join(","));const n=await fetch(e.toString(),{credentials:"include",headers:t.JSON_HEADERS}),s=await n.json();if(n.ok&&s.status===t.ResponseStatus.SUCCESS){const e=s.attributes||[];return c[a]=e,e}return[]}catch(e){return console.debug(e),[]}},d=async e=>{let{submitData:{fieldName:a,value:o},source:n}=e;const d=l+"/ingest",E=t.getCookie("wapo_login_id");if(!i())throw new Error("does not satisfy cookie check");let I=c[a];if(I||(I=await u({fieldName:a})),I[0]&&I[0].name===a&&I[0].collection_behavior===s.DO_NOT_COLLECT)throw new Error("do not collect");const S={jucid:localStorage.getItem("uuid"),ga:t.getCookie("_ga"),type:r.EXPLICIT,wapo_login_id:E,data:{fieldName:a,value:o},metadata:{source:n}};try{const e=await fetch(d,{method:"POST",credentials:"include",headers:t.JSON_HEADERS,body:JSON.stringify(S)});return await e.json()}catch(e){return console.debug(e),null}},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=s,exports.DESelect=e=>{let{source:s,fieldName:r,label:i,dataDictionaryConfig:l,defaultValue:c,disabled:I,submit:S,onChange:m=(()=>{}),onFinished:p=(()=>{}),valuesFilter:f=(()=>!0),children:g}=e;const[C,N]=a.useState(l),[T,b]=a.useState("");if(a.useEffect(()=>{g?"production"!==process.env.NODE_ENV&&console.debug("childen props",g):C||(async()=>{const e=await u({fieldName:r});"production"!==process.env.NODE_ENV&&console.debug("config from API",e),N(e[0])})()},[]),a.useEffect(()=>{(async()=>{if(S&&T){const e=await d({submitData:{fieldName:r,value:T},source:s});p({isFinished:!0,isError:!e||e.status!==t.ResponseStatus.SUCCESS})}})()},[S,T]),!g&&!C)return o.createElement("span",null,"loading");const _=c?{defaultValue:c}:{},D=I?{disabled:!0}:{},h=C?C.values.sort((e,t)=>e.order-t.order).filter(e=>!0!==e.archived).filter(f):[];return o.createElement(E,null,o.createElement(n.Select.Root,{onValueChange:e=>{m({value:e}),b(e)},..._,...D},g||null,!g&&C&&o.createElement(o.Fragment,null,o.createElement(n.Select.Trigger,{"data-test-id":C.name+"-select-trigger"},o.createElement(n.Select.Label,null,i||C.name),o.createElement(n.Select.Value,null)),o.createElement(n.Select.Content,{css:{zIndex:n.theme.zIndices.page},"data-test-id":C.name+"-select-content"},h.map(e=>o.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"},exports.IngestType=r,exports.getAttributes=u,exports.hasRequiredPrivacyCookies=i,exports.ingest=d;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("@washingtonpost/subs-sdk"),s=require("react"),a=(e=s)&&"object"==typeof e&&"default"in e?e.default:e,o=require("@washingtonpost/wpds-ui-kit"),i=require("@washingtonpost/subs-hooks");const n={COLLECT:"COLLECT",DO_NOT_COLLECT:"DO_NOT_COLLECT"},r={EXPLICIT:"explicit",IMPLICIT:"implicit"},l=()=>{var e;if("undefined"==typeof window)return!1;const s=t.getCookie("wp_usp"),a=null===(e=t.WPGeo())||void 0===e?void 0:e.country_code;return!(!s||"US"!==a)},c=t.ENDPOINTS.base+"/de/v1",u={},d=async e=>{let{fieldName:s}=e;if(u[s])return u[s];const a=[s];try{const e=new URL(c+"/attributes");e.searchParams.set("attributes",a.join(","));const o=await fetch(e.toString(),{credentials:"include",headers:t.JSON_HEADERS}),i=await o.json();if(o.ok&&i.status===t.ResponseStatus.SUCCESS){const e=i.attributes||[];return u[s]=e,e}return[]}catch(e){return console.debug(e),[]}},E=async e=>{let{submitData:{fieldName:s,value:a},type:o,source:i}=e;const r=c+"/ingest",E=t.getCookie("wapo_login_id");if(!l())throw new Error("does not satisfy cookie check");let I=u[s];if(I||(I=await d({fieldName:s})),I[0]&&I[0].name===s&&I[0].collection_behavior===n.DO_NOT_COLLECT)throw new Error("do not collect");const S={jucid:localStorage.getItem("uuid"),ga:t.getCookie("_ga"),type:o,wapo_login_id:E,data:{fieldName:s,value:a},metadata:{source:i}};try{const e=await fetch(r,{method:"POST",credentials:"include",headers:t.JSON_HEADERS,body:JSON.stringify(S)});return await e.json()}catch(e){return console.debug(e),null}},I=("https://subscribe.washingtonpost.com/static"===t.ENDPOINTS.staticAssets?"https://www.washingtonpost.com/subscribe/static/":t.ENDPOINTS.staticAssets)+"/de-utils/twpdeu.min.js",S=o.styled("div",{boxSizing:"border-box",display:"flex",marginBottom:"$100",flexDirection:"column","& button":{padding:"1px 6px"},"& *":{boxSizing:"border-box"}});exports.AttributesState={SUCCESS:"100"},exports.CollectionBehaviors=n,exports.DESelect=e=>{let{source:n,fieldName:l,label:c,dataDictionaryConfig:u,defaultValue:d,disabled:p,submit:g,onChange:m=(()=>{}),onFinished:T=(()=>{}),valuesFilter:f=(()=>!0),children:C}=e;const[N,b]=s.useState(u),[_,h]=s.useState(""),w=i.useScript(I);if(s.useEffect(()=>{w!==i.ScriptStatus.READY||C||N||(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?b(t[0]):console.error("unable to get config",l)}catch(e){console.warn("unable to get config",l,e)}})()},[w]),s.useEffect(()=>{g&&_&&(async()=>{try{const e=await E({submitData:{fieldName:l,value:[_]},type:null!=N&&N.explicit?r.EXPLICIT:r.IMPLICIT,source:n});T({isFinished:!0,isError:!e||e.status!==t.ResponseStatus.SUCCESS})}catch(e){T({isFinished:!1,isError:!0})}})()},[g,_]),!C&&!N)return a.createElement("span",null,"loading");const D=d?{defaultValue:d}:{},O=p?{disabled:!0}:{},y=N?N.values.sort((e,t)=>e.order-t.order).filter(e=>!0!==e.archived).filter(f):[];return a.createElement(S,null,a.createElement(o.Select.Root,{onValueChange:e=>{m({value:e}),h(e)},...D,...O},C||null,!C&&N&&a.createElement(a.Fragment,null,a.createElement(o.Select.Trigger,{"data-test-id":N.name+"-select-trigger"},a.createElement(o.Select.Label,null,c||N.name),a.createElement(o.Select.Value,null)),a.createElement(o.Select.Content,{css:{zIndex:o.theme.zIndices.page},"data-test-id":N.name+"-select-content"},y.map(e=>a.createElement(o.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=E;
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} 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 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: IngestType.EXPLICIT,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n fieldName,\n value,\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n source: string;\n}) => Promise<{\n status: 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 } from '../../interfaces';\nimport { getAttributes, ingest } from '../../services/dataEnrichment';\nimport { ResponseStatus } from '@washingtonpost/subs-sdk';\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\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 useEffect(() => {\n if (children) {\n if (__DEV__) {\n console.debug('childen props', children);\n }\n return;\n }\n\n if (!config) {\n (async () => {\n // TODO: Switch to window.__twpdeu.getFieldConfigs\n const config = await getAttributes({ fieldName });\n if (__DEV__) {\n console.debug('config from API', config);\n }\n setConfig(config[0]);\n })();\n }\n }, []);\n\n useEffect(() => {\n (async () => {\n if (submit && selected) {\n // TODO: Switch to window.__twpdeu.push\n // TODO: Log to GA\n // TODO: Differentiate between explicit and implicit inputs?\n const result = await ingest({\n submitData: { fieldName, value: selected },\n source,\n });\n const isError = result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n }\n })();\n }, [submit, selected]);\n\n if (!(children || config)) {\n return <span>loading</span>;\n }\n\n const defaultValueProp = defaultValue ? { defaultValue } : {};\n\n const disabledProp = disabled ? { 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={`${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","fieldNames","url","URL","searchParams","set","join","data","fetch","toString","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","SUCCESS","attributes","e","console","debug","ingest","submitData","value","source","_ref2","wapo_login_id","Error","attributeInfo","name","collection_behavior","payload","jucid","localStorage","getItem","ga","type","metadata","response","method","body","JSON","stringify","SelectWrapper","styled","boxSizing","display","marginBottom","flexDirection","& button","padding","& *","label","dataDictionaryConfig","defaultValue","disabled","submit","onChange","onFinished","valuesFilter","children","config","setConfig","useState","selected","setSelected","useEffect","process","env","NODE_ENV","result","isFinished","isError","React","defaultValueProp","disabledProp","values","sort","a","b","order","filter","archived","Select","Root","onValueChange","Trigger","Label","Value","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"],"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/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,\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,\n 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 { ingest } from '../../services/dataEnrichment';\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: Switch to window.__twpdeu.push\n // TODO: Log to GA\n const result = await ingest({\n submitData: { fieldName, value: [selected] },\n type: config?.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,\n source,\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 (submit && selected) {\n submitSelected();\n }\n }, [submit, selected]);\n\n if (!(children || config)) {\n return <span>loading</span>;\n }\n\n const defaultValueProp = defaultValue ? { defaultValue } : {};\n\n const disabledProp = disabled ? { 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={`${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","fieldNames","url","URL","searchParams","set","join","data","fetch","toString","credentials","headers","JSON_HEADERS","json","ok","status","ResponseStatus","SUCCESS","attributes","e","console","debug","ingest","submitData","value","type","source","_ref2","wapo_login_id","Error","attributeInfo","name","collection_behavior","payload","jucid","localStorage","getItem","ga","metadata","response","method","body","JSON","stringify","scriptSrc","staticAssets","SelectWrapper","styled","boxSizing","display","marginBottom","flexDirection","& button","padding","& *","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","result","explicit","isFinished","isError","submitSelected","React","defaultValueProp","disabledProp","values","sort","a","b","order","filter","archived","Select","Root","onValueChange","Trigger","Label","Value","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"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { getCookie, WPGeo, JSON_HEADERS, ResponseStatus, ENDPOINTS } from '@washingtonpost/subs-sdk';
2
2
  import React, { useState, useEffect } from 'react';
3
3
  import { Select, theme, styled } from '@washingtonpost/wpds-ui-kit';
4
+ import { useScript, ScriptStatus } from '@washingtonpost/subs-hooks';
4
5
 
5
6
  const CollectionBehaviors = {
6
7
  COLLECT: 'COLLECT',
@@ -22,7 +23,9 @@ const IngestResponseState = {
22
23
  INVALID_ATTRIBUTE_DEFINITION: '105',
23
24
  INVALID_META_DEFINITION: '106',
24
25
  UNAUTHENTICATED: '107',
25
- MISMATCHED_IDENTIFIER: '108'
26
+ MISMATCHED_IDENTIFIER: '108',
27
+ DISABLED_ATTRIBUTE_DEFINITION: '109',
28
+ DO_NOT_COLLECT: '110'
26
29
  };
27
30
 
28
31
  const hasRequiredPrivacyCookies = () => {
@@ -71,6 +74,7 @@ const ingest = async _ref2 => {
71
74
  fieldName,
72
75
  value
73
76
  },
77
+ type,
74
78
  source
75
79
  } = _ref2;
76
80
  const url = `${base}/ingest`;
@@ -92,7 +96,7 @@ const ingest = async _ref2 => {
92
96
  const payload = {
93
97
  jucid,
94
98
  ga,
95
- type: IngestType.EXPLICIT,
99
+ type,
96
100
  wapo_login_id,
97
101
  data: {
98
102
  fieldName,
@@ -117,6 +121,7 @@ const ingest = async _ref2 => {
117
121
  }
118
122
  };
119
123
 
124
+ const scriptSrc = `${ENDPOINTS.staticAssets === 'https://subscribe.washingtonpost.com/static' ? 'https://www.washingtonpost.com/subscribe/static/' : ENDPOINTS.staticAssets}/de-utils/twpdeu.min.js`;
120
125
  const DESelect = _ref => {
121
126
  let {
122
127
  source,
@@ -133,37 +138,38 @@ const DESelect = _ref => {
133
138
  } = _ref;
134
139
  const [config, setConfig] = useState(dataDictionaryConfig);
135
140
  const [selected, setSelected] = useState('');
141
+ const scriptStatus = useScript(scriptSrc);
136
142
  useEffect(() => {
137
- if (children) {
138
- if (process.env.NODE_ENV !== "production") {
139
- console.debug('childen props', children);
140
- }
141
- return;
142
- }
143
- if (!config) {
144
- (async () => {
145
- // TODO: Switch to window.__twpdeu.getFieldConfigs
146
- const config = await getAttributes({
143
+ const fetchConfig = async () => {
144
+ try {
145
+ var _window;
146
+ const config = await ((_window = window) === null || _window === void 0 || (_window = _window.__twpdeu) === null || _window === void 0 ? void 0 : _window.getFieldConfigs({
147
147
  fieldName
148
- });
149
- if (process.env.NODE_ENV !== "production") {
150
- console.debug('config from API', config);
148
+ }));
149
+ if (config) {
150
+ setConfig(config[0]);
151
+ } else {
152
+ console.error('unable to get config', fieldName);
151
153
  }
152
- setConfig(config[0]);
153
- })();
154
+ } catch (e) {
155
+ console.warn('unable to get config', fieldName, e);
156
+ }
157
+ };
158
+ if (scriptStatus === ScriptStatus.READY && !(children || config)) {
159
+ fetchConfig();
154
160
  }
155
- }, []);
161
+ }, [scriptStatus]);
156
162
  useEffect(() => {
157
- (async () => {
158
- if (submit && selected) {
163
+ const submitSelected = async () => {
164
+ try {
159
165
  // TODO: Switch to window.__twpdeu.push
160
166
  // TODO: Log to GA
161
- // TODO: Differentiate between explicit and implicit inputs?
162
167
  const result = await ingest({
163
168
  submitData: {
164
169
  fieldName,
165
- value: selected
170
+ value: [selected]
166
171
  },
172
+ type: config !== null && config !== void 0 && config.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,
167
173
  source
168
174
  });
169
175
  const isError = result ? result.status !== ResponseStatus.SUCCESS : true;
@@ -171,8 +177,16 @@ const DESelect = _ref => {
171
177
  isFinished: true,
172
178
  isError
173
179
  });
180
+ } catch (e) {
181
+ onFinished({
182
+ isFinished: false,
183
+ isError: true
184
+ });
174
185
  }
175
- })();
186
+ };
187
+ if (submit && selected) {
188
+ submitSelected();
189
+ }
176
190
  }, [submit, selected]);
177
191
  if (!(children || config)) {
178
192
  return React.createElement("span", null, "loading");
@@ -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} 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 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: IngestType.EXPLICIT,\n wapo_login_id, // TODO: move this to BE to read from cookie headers\n data: {\n fieldName,\n value,\n },\n metadata: { source },\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: JSON_HEADERS,\n body: JSON.stringify(payload),\n });\n\n const json = await response.json();\n\n return json;\n } catch (e) {\n console.debug(e);\n return null;\n }\n};\n\ntype IngestType = ({\n submitData: { fieldName, value },\n source,\n}: {\n submitData: {\n fieldName: string;\n value: string;\n };\n source: string;\n}) => Promise<{\n status: 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 } from '../../interfaces';\nimport { getAttributes, ingest } from '../../services/dataEnrichment';\nimport { ResponseStatus } from '@washingtonpost/subs-sdk';\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\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 useEffect(() => {\n if (children) {\n if (__DEV__) {\n console.debug('childen props', children);\n }\n return;\n }\n\n if (!config) {\n (async () => {\n // TODO: Switch to window.__twpdeu.getFieldConfigs\n const config = await getAttributes({ fieldName });\n if (__DEV__) {\n console.debug('config from API', config);\n }\n setConfig(config[0]);\n })();\n }\n }, []);\n\n useEffect(() => {\n (async () => {\n if (submit && selected) {\n // TODO: Switch to window.__twpdeu.push\n // TODO: Log to GA\n // TODO: Differentiate between explicit and implicit inputs?\n const result = await ingest({\n submitData: { fieldName, value: selected },\n source,\n });\n const isError = result\n ? result.status !== ResponseStatus.SUCCESS\n : true;\n\n onFinished({\n isFinished: true,\n isError,\n });\n }\n })();\n }, [submit, selected]);\n\n if (!(children || config)) {\n return <span>loading</span>;\n }\n\n const defaultValueProp = defaultValue ? { defaultValue } : {};\n\n const disabledProp = disabled ? { 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={`${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","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","source","wapo_login_id","Error","attributeInfo","name","collection_behavior","jucid","localStorage","getItem","ga","payload","type","metadata","response","method","body","JSON","stringify","DESelect","label","dataDictionaryConfig","defaultValue","disabled","submit","onChange","onFinished","valuesFilter","children","config","setConfig","useState","selected","setSelected","useEffect","process","env","NODE_ENV","result","isError","isFinished","React","defaultValueProp","disabledProp","values","sort","a","b","order","filter","archived","SelectWrapper","Select","Root","onValueChange","Trigger","Label","Value","Content","css","zIndex","theme","zIndices","page","map","Item","key","styled","boxSizing","display","marginBottom","flexDirection","padding"],"mappings":"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"}
1
+ {"version":3,"file":"subs-de-inputs.esm.js","sources":["../src/interfaces/index.ts","../src/utils/hasRequiredPrivacyCookies.ts","../src/services/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 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,\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,\n 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 { ingest } from '../../services/dataEnrichment';\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: Switch to window.__twpdeu.push\n // TODO: Log to GA\n const result = await ingest({\n submitData: { fieldName, value: [selected] },\n type: config?.explicit ? IngestType.EXPLICIT : IngestType.IMPLICIT,\n source,\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 (submit && selected) {\n submitSelected();\n }\n }, [submit, selected]);\n\n if (!(children || config)) {\n return <span>loading</span>;\n }\n\n const defaultValueProp = defaultValue ? { defaultValue } : {};\n\n const disabledProp = disabled ? { 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={`${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","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","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","result","explicit","isError","isFinished","React","defaultValueProp","disabledProp","values","sort","a","b","order","filter","archived","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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"}
package/package.json CHANGED
@@ -1,7 +1,6 @@
1
1
  {
2
- "version": "0.2.0-canary.1",
2
+ "version": "0.2.1-canary.0",
3
3
  "license": "UNLICENSED",
4
- "main": "dist/index.js",
5
4
  "typings": "dist/index.d.ts",
6
5
  "files": [
7
6
  "dist",
@@ -36,13 +35,13 @@
36
35
  "name": "de-inputs: utils",
37
36
  "path": "dist/subs-de-inputs.esm.js",
38
37
  "import": "{ getAttributes, ingest }",
39
- "limit": "5 KB"
38
+ "limit": "1 KB"
40
39
  },
41
40
  {
42
41
  "name": "de-inputs: DESelect",
43
42
  "path": "dist/subs-de-inputs.esm.js",
44
43
  "import": "{ DESelect }",
45
- "limit": "5 KB"
44
+ "limit": "2 KB"
46
45
  }
47
46
  ],
48
47
  "devDependencies": {