@nuskin/address-lookup 1.0.1-pa-954.8 → 1.0.1

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.
Files changed (43) hide show
  1. package/README.md +10 -2
  2. package/dist/AddressLookup.js +12 -0
  3. package/dist/AddressLookup.js.map +1 -1
  4. package/dist/components/SmartyIntlResults.js +248 -91
  5. package/dist/components/SmartyIntlResults.js.map +1 -1
  6. package/dist/components/SmartyUSResults.js +224 -88
  7. package/dist/components/SmartyUSResults.js.map +1 -1
  8. package/dist/config/address/postalCodeRules.js +1 -1
  9. package/dist/config/address/postalCodeRules.js.map +1 -1
  10. package/dist/hooks/useAddressValidationBase.js +118 -0
  11. package/dist/hooks/useAddressValidationBase.js.map +1 -0
  12. package/dist/hooks/useIntlAddressValidation.js +49 -54
  13. package/dist/hooks/useIntlAddressValidation.js.map +1 -1
  14. package/dist/hooks/useSmartyInternationalLookup.js +59 -70
  15. package/dist/hooks/useSmartyInternationalLookup.js.map +1 -1
  16. package/dist/hooks/useSmartyLookupBase.js +152 -0
  17. package/dist/hooks/useSmartyLookupBase.js.map +1 -0
  18. package/dist/hooks/useSmartyUSLookup.js +67 -63
  19. package/dist/hooks/useSmartyUSLookup.js.map +1 -1
  20. package/dist/hooks/useUSAddressValidation.js +53 -55
  21. package/dist/hooks/useUSAddressValidation.js.map +1 -1
  22. package/dist/styles/addressLookup.css +28 -4
  23. package/dist/utils/addressStrings.js +16 -10
  24. package/dist/utils/addressStrings.js.map +1 -1
  25. package/dist/utils/componentPropTypes.js +35 -0
  26. package/dist/utils/componentPropTypes.js.map +1 -0
  27. package/dist/utils/inFlightRequests.js +50 -0
  28. package/dist/utils/inFlightRequests.js.map +1 -0
  29. package/dist/utils/requestCache.js +44 -0
  30. package/dist/utils/requestCache.js.map +1 -0
  31. package/dist/utils/requestRateLimiter.js +53 -0
  32. package/dist/utils/requestRateLimiter.js.map +1 -0
  33. package/dist/utils/validators.js +20 -1
  34. package/dist/utils/validators.js.map +1 -1
  35. package/package.json +13 -8
  36. package/dist/components/EgonResults.js +0 -195
  37. package/dist/components/EgonResults.js.map +0 -1
  38. package/dist/components/SmartyResults.js +0 -327
  39. package/dist/components/SmartyResults.js.map +0 -1
  40. package/dist/hooks/useEgonLookup.js +0 -168
  41. package/dist/hooks/useEgonLookup.js.map +0 -1
  42. package/dist/hooks/useEgonNormalize.js +0 -105
  43. package/dist/hooks/useEgonNormalize.js.map +0 -1
package/README.md CHANGED
@@ -34,7 +34,7 @@ import AddressLookup, { COUNTRY_MAP } from '@nuskin/address-lookup'
34
34
 
35
35
  ```jsx
36
36
  import { useState } from 'react'
37
- import { AddressLookup } from '@nuskin/address-lookup'
37
+ import AddressLookup from '@nuskin/address-lookup'
38
38
 
39
39
  export default function ShippingAddress() {
40
40
  const [validationRequestId, setValidationRequestId] = useState(0)
@@ -90,7 +90,8 @@ If passed, these labels are used instead of loading from Contentstack:
90
90
  emailLabel: 'Email',
91
91
  invalidEmail: 'Invalid email address.',
92
92
  fieldRequired: 'This field is required.',
93
- invalidPostalCode: 'Invalid postal code.'
93
+ invalidPostalCode: 'Invalid postal code.',
94
+ rateLimited: 'Too many requests. Please wait a moment and try again.'
94
95
  }
95
96
  ```
96
97
 
@@ -160,6 +161,7 @@ Common payload shape:
160
161
  - `fieldRequired`
161
162
  - `invalidPostalCode`
162
163
  - `invalidEmail`
164
+ - `rateLimited`
163
165
  - Safe defaults are used when those validation strings are missing
164
166
 
165
167
  ## Autocomplete and manual mode
@@ -200,6 +202,7 @@ Common class names:
200
202
  - `.ns-address-lookup__field--with-error`
201
203
  - `.ns-address-lookup__label-row`
202
204
  - `.ns-address-lookup__label`
205
+ - `.ns-address-lookup__actions`
203
206
  - `.ns-address-lookup__toggle`
204
207
  - `.ns-address-lookup__input`
205
208
  - `.ns-address-lookup__input--readonly`
@@ -210,11 +213,14 @@ Common class names:
210
213
  - `.ns-address-lookup__spinner`
211
214
  - `.ns-address-lookup__validation`
212
215
  - `.ns-address-lookup__button`
216
+ - `.ns-address-lookup__button--compact`
213
217
  - `.ns-address-lookup__list`
214
218
  - `.ns-address-lookup__list--suggestions`
215
219
  - `.ns-address-lookup__list--validation`
220
+ - `.ns-address-lookup__list--validation-inline`
216
221
  - `.ns-address-lookup__list-item`
217
222
  - `.ns-address-lookup__list-item--divided`
223
+ - `.ns-address-lookup__list-button`
218
224
  - `.ns-address-lookup__list-title`
219
225
  - `.ns-address-lookup__list-subtitle`
220
226
 
@@ -227,6 +233,8 @@ Supported CSS variables on `.ns-address-lookup`:
227
233
  - `--nsal-error-color`
228
234
  - `--nsal-surface-color`
229
235
  - `--nsal-disabled-surface`
236
+ - `--nsal-validation-surface`
237
+ - `--nsal-validation-border`
230
238
  - `--nsal-shadow`
231
239
  - `--nsal-radius`
232
240
  - `--nsal-field-gap`
@@ -4,9 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+ var _propTypes = _interopRequireDefault(require("prop-types"));
7
8
  require("./styles/addressLookup.css");
8
9
  var _SmartyUSResults = _interopRequireDefault(require("./components/SmartyUSResults"));
9
10
  var _SmartyIntlResults = _interopRequireDefault(require("./components/SmartyIntlResults"));
11
+ var _componentPropTypes = require("./utils/componentPropTypes");
10
12
  var _jsxRuntime = require("react/jsx-runtime");
11
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
14
  const AddressLookup = ({
@@ -42,5 +44,15 @@ const AddressLookup = ({
42
44
  })
43
45
  });
44
46
  };
47
+ AddressLookup.propTypes = {
48
+ onAddressSelect: _propTypes.default.func,
49
+ country: _propTypes.default.string,
50
+ address: _componentPropTypes.addressPropType,
51
+ requireValidation: _propTypes.default.bool,
52
+ showManualValidateButton: _propTypes.default.bool,
53
+ validationRequestId: _propTypes.default.number,
54
+ language: _propTypes.default.string,
55
+ strings: _componentPropTypes.labelStringsPropType
56
+ };
45
57
  var _default = exports.default = AddressLookup;
46
58
  //# sourceMappingURL=AddressLookup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AddressLookup.js","names":["require","_SmartyUSResults","_interopRequireDefault","_SmartyIntlResults","_jsxRuntime","e","__esModule","default","AddressLookup","onAddressSelect","country","address","requireValidation","showManualValidateButton","validationRequestId","language","strings","isUS","jsx","className","children","onSelect","initialAddress","countryCode","_default","exports"],"sources":["../src/AddressLookup.jsx"],"sourcesContent":["import './styles/addressLookup.css';\nimport SmartyUSResults from './components/SmartyUSResults';\nimport SmartyIntlResults from './components/SmartyIntlResults';\n\nconst AddressLookup = ({ \n onAddressSelect, \n country = 'US',\n address = null,\n requireValidation = true,\n showManualValidateButton = false,\n validationRequestId = 0,\n language = 'en',\n strings = null\n}) => {\n const isUS = country === 'US';\n\n return (\n <div className='ns-address-lookup'>\n {isUS ? (\n <SmartyUSResults \n onSelect={onAddressSelect}\n initialAddress={address}\n requireValidation={requireValidation}\n showManualValidateButton={showManualValidateButton}\n validationRequestId={validationRequestId}\n language={language}\n strings={strings}\n />\n ) : (\n <SmartyIntlResults \n countryCode={country}\n onSelect={onAddressSelect}\n initialAddress={address}\n requireValidation={requireValidation}\n showManualValidateButton={showManualValidateButton}\n validationRequestId={validationRequestId}\n language={language}\n strings={strings}\n />\n )}\n </div>\n );\n};\n\nexport default AddressLookup;\n"],"mappings":";;;;;;AAAAA,OAAA;AACA,IAAAC,gBAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,kBAAA,GAAAD,sBAAA,CAAAF,OAAA;AAA+D,IAAAI,WAAA,GAAAJ,OAAA;AAAA,SAAAE,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE/D,MAAMG,aAAa,GAAGA,CAAC;EACrBC,eAAe;EACfC,OAAO,GAAG,IAAI;EACdC,OAAO,GAAG,IAAI;EACdC,iBAAiB,GAAG,IAAI;EACxBC,wBAAwB,GAAG,KAAK;EAChCC,mBAAmB,GAAG,CAAC;EACvBC,QAAQ,GAAG,IAAI;EACfC,OAAO,GAAG;AACZ,CAAC,KAAK;EACJ,MAAMC,IAAI,GAAGP,OAAO,KAAK,IAAI;EAE7B,oBACE,IAAAN,WAAA,CAAAc,GAAA;IAAKC,SAAS,EAAC,mBAAmB;IAAAC,QAAA,EAC/BH,IAAI,gBACH,IAAAb,WAAA,CAAAc,GAAA,EAACjB,gBAAA,CAAAM,OAAe;MACdc,QAAQ,EAAEZ,eAAgB;MAC1Ba,cAAc,EAAEX,OAAQ;MACxBC,iBAAiB,EAAEA,iBAAkB;MACrCC,wBAAwB,EAAEA,wBAAyB;MACnDC,mBAAmB,EAAEA,mBAAoB;MACzCC,QAAQ,EAAEA,QAAS;MACnBC,OAAO,EAAEA;IAAQ,CAClB,CAAC,gBAEF,IAAAZ,WAAA,CAAAc,GAAA,EAACf,kBAAA,CAAAI,OAAiB;MAChBgB,WAAW,EAAEb,OAAQ;MACrBW,QAAQ,EAAEZ,eAAgB;MAC1Ba,cAAc,EAAEX,OAAQ;MACxBC,iBAAiB,EAAEA,iBAAkB;MACrCC,wBAAwB,EAAEA,wBAAyB;MACnDC,mBAAmB,EAAEA,mBAAoB;MACzCC,QAAQ,EAAEA,QAAS;MACnBC,OAAO,EAAEA;IAAQ,CAClB;EACF,CACE,CAAC;AAEV,CAAC;AAAC,IAAAQ,QAAA,GAAAC,OAAA,CAAAlB,OAAA,GAEaC,aAAa","ignoreList":[]}
1
+ {"version":3,"file":"AddressLookup.js","names":["_propTypes","_interopRequireDefault","require","_SmartyUSResults","_SmartyIntlResults","_componentPropTypes","_jsxRuntime","e","__esModule","default","AddressLookup","onAddressSelect","country","address","requireValidation","showManualValidateButton","validationRequestId","language","strings","isUS","jsx","className","children","onSelect","initialAddress","countryCode","propTypes","PropTypes","func","string","addressPropType","bool","number","labelStringsPropType","_default","exports"],"sources":["../src/AddressLookup.jsx"],"sourcesContent":["import PropTypes from 'prop-types';\nimport './styles/addressLookup.css';\nimport SmartyUSResults from './components/SmartyUSResults';\nimport SmartyIntlResults from './components/SmartyIntlResults';\nimport { addressPropType, labelStringsPropType } from './utils/componentPropTypes';\n\nconst AddressLookup = ({ \n onAddressSelect, \n country = 'US',\n address = null,\n requireValidation = true,\n showManualValidateButton = false,\n validationRequestId = 0,\n language = 'en',\n strings = null\n}) => {\n const isUS = country === 'US';\n\n return (\n <div className='ns-address-lookup'>\n {isUS ? (\n <SmartyUSResults \n onSelect={onAddressSelect}\n initialAddress={address}\n requireValidation={requireValidation}\n showManualValidateButton={showManualValidateButton}\n validationRequestId={validationRequestId}\n language={language}\n strings={strings}\n />\n ) : (\n <SmartyIntlResults \n countryCode={country}\n onSelect={onAddressSelect}\n initialAddress={address}\n requireValidation={requireValidation}\n showManualValidateButton={showManualValidateButton}\n validationRequestId={validationRequestId}\n language={language}\n strings={strings}\n />\n )}\n </div>\n );\n};\n\nAddressLookup.propTypes = {\n onAddressSelect: PropTypes.func,\n country: PropTypes.string,\n address: addressPropType,\n requireValidation: PropTypes.bool,\n showManualValidateButton: PropTypes.bool,\n validationRequestId: PropTypes.number,\n language: PropTypes.string,\n strings: labelStringsPropType\n};\n\nexport default AddressLookup;\n"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AACAA,OAAA;AACA,IAAAC,gBAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,kBAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,mBAAA,GAAAH,OAAA;AAAmF,IAAAI,WAAA,GAAAJ,OAAA;AAAA,SAAAD,uBAAAM,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEnF,MAAMG,aAAa,GAAGA,CAAC;EACrBC,eAAe;EACfC,OAAO,GAAG,IAAI;EACdC,OAAO,GAAG,IAAI;EACdC,iBAAiB,GAAG,IAAI;EACxBC,wBAAwB,GAAG,KAAK;EAChCC,mBAAmB,GAAG,CAAC;EACvBC,QAAQ,GAAG,IAAI;EACfC,OAAO,GAAG;AACZ,CAAC,KAAK;EACJ,MAAMC,IAAI,GAAGP,OAAO,KAAK,IAAI;EAE7B,oBACE,IAAAN,WAAA,CAAAc,GAAA;IAAKC,SAAS,EAAC,mBAAmB;IAAAC,QAAA,EAC/BH,IAAI,gBACH,IAAAb,WAAA,CAAAc,GAAA,EAACjB,gBAAA,CAAAM,OAAe;MACdc,QAAQ,EAAEZ,eAAgB;MAC1Ba,cAAc,EAAEX,OAAQ;MACxBC,iBAAiB,EAAEA,iBAAkB;MACrCC,wBAAwB,EAAEA,wBAAyB;MACnDC,mBAAmB,EAAEA,mBAAoB;MACzCC,QAAQ,EAAEA,QAAS;MACnBC,OAAO,EAAEA;IAAQ,CAClB,CAAC,gBAEF,IAAAZ,WAAA,CAAAc,GAAA,EAAChB,kBAAA,CAAAK,OAAiB;MAChBgB,WAAW,EAAEb,OAAQ;MACrBW,QAAQ,EAAEZ,eAAgB;MAC1Ba,cAAc,EAAEX,OAAQ;MACxBC,iBAAiB,EAAEA,iBAAkB;MACrCC,wBAAwB,EAAEA,wBAAyB;MACnDC,mBAAmB,EAAEA,mBAAoB;MACzCC,QAAQ,EAAEA,QAAS;MACnBC,OAAO,EAAEA;IAAQ,CAClB;EACF,CACE,CAAC;AAEV,CAAC;AAEDR,aAAa,CAACgB,SAAS,GAAG;EACxBf,eAAe,EAAEgB,kBAAS,CAACC,IAAI;EAC/BhB,OAAO,EAAEe,kBAAS,CAACE,MAAM;EACzBhB,OAAO,EAAEiB,mCAAe;EACxBhB,iBAAiB,EAAEa,kBAAS,CAACI,IAAI;EACjChB,wBAAwB,EAAEY,kBAAS,CAACI,IAAI;EACxCf,mBAAmB,EAAEW,kBAAS,CAACK,MAAM;EACrCf,QAAQ,EAAEU,kBAAS,CAACE,MAAM;EAC1BX,OAAO,EAAEe;AACX,CAAC;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAA1B,OAAA,GAEaC,aAAa","ignoreList":[]}
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+ var _propTypes = _interopRequireDefault(require("prop-types"));
7
8
  var _react = require("react");
8
9
  var _useSmartyInternationalLookup = _interopRequireDefault(require("../hooks/useSmartyInternationalLookup"));
9
10
  var _useIntlAddressValidation = _interopRequireDefault(require("../hooks/useIntlAddressValidation"));
@@ -12,6 +13,7 @@ var _countries = require("../countries");
12
13
  var _addressWrapper = require("../utils/addressWrapper");
13
14
  var _addressStatus = require("../utils/addressStatus");
14
15
  var _validators = require("../utils/validators");
16
+ var _componentPropTypes = require("../utils/componentPropTypes");
15
17
  var _jsxRuntime = require("react/jsx-runtime");
16
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
19
  const SmartyIntlResults = ({
@@ -40,6 +42,8 @@ const SmartyIntlResults = ({
40
42
  const [hasPendingLookupDraft, setHasPendingLookupDraft] = (0, _react.useState)(false);
41
43
  const [touchedFields, setTouchedFields] = (0, _react.useState)({});
42
44
  const [showAllRequiredErrors, setShowAllRequiredErrors] = (0, _react.useState)(false);
45
+ const [lookupServiceError, setLookupServiceError] = (0, _react.useState)(null);
46
+ const [validationServiceError, setValidationServiceError] = (0, _react.useState)(null);
43
47
  const shouldSearchRef = (0, _react.useRef)(true);
44
48
  const fieldTimerRef = (0, _react.useRef)(null);
45
49
  const componentRef = (0, _react.useRef)(null);
@@ -55,6 +59,8 @@ const SmartyIntlResults = ({
55
59
  lookupDraftOriginalRef.current = initialAddress;
56
60
  setTouchedFields({});
57
61
  setShowAllRequiredErrors(false);
62
+ setLookupServiceError(null);
63
+ setValidationServiceError(null);
58
64
  }
59
65
  }, [initialAddress]);
60
66
  (0, _react.useEffect)(() => {
@@ -89,14 +95,95 @@ const SmartyIntlResults = ({
89
95
  const {
90
96
  suggestions,
91
97
  loading,
92
- error
98
+ error,
99
+ rateLimited
93
100
  } = (0, _useSmartyInternationalLookup.default)(shouldSearchRef.current && isAutocompleteMode ? query : '', countryCode, selectedIntlAddressId, 500);
94
101
  const {
95
102
  suggestions: validationSuggestions,
96
103
  loading: validationLoading,
97
- error: validationError
104
+ error: validationError,
105
+ rateLimited: validationRateLimited
98
106
  } = (0, _useIntlAddressValidation.default)(formData, countryCode, requireValidation ? validationTrigger : 0);
99
107
  const lookupValue = formData[lookupField];
108
+ const lookupErrorMessage = lookupServiceError !== null && lookupServiceError !== void 0 && lookupServiceError.rateLimited ? (fieldLabels === null || fieldLabels === void 0 ? void 0 : fieldLabels.rateLimited) || 'Too many requests. Please wait a moment and try again.' : (fieldLabels === null || fieldLabels === void 0 ? void 0 : fieldLabels.lookupError) || 'We could not look up that address right now.';
109
+ const validationErrorMessage = validationServiceError !== null && validationServiceError !== void 0 && validationServiceError.rateLimited ? (fieldLabels === null || fieldLabels === void 0 ? void 0 : fieldLabels.rateLimited) || 'Too many requests. Please wait a moment and try again.' : (fieldLabels === null || fieldLabels === void 0 ? void 0 : fieldLabels.validationError) || 'We could not validate that address right now.';
110
+ (0, _react.useEffect)(() => {
111
+ if (!error) {
112
+ setLookupServiceError(null);
113
+ return;
114
+ }
115
+ setLookupServiceError({
116
+ rateLimited,
117
+ rawMessage: error
118
+ });
119
+ }, [error, rateLimited]);
120
+ (0, _react.useEffect)(() => {
121
+ if (!validationError) {
122
+ setValidationServiceError(null);
123
+ return;
124
+ }
125
+ setValidationServiceError({
126
+ rateLimited: validationRateLimited,
127
+ rawMessage: validationError
128
+ });
129
+ }, [validationError, validationRateLimited]);
130
+ (0, _react.useEffect)(() => {
131
+ if (!lookupServiceError) {
132
+ return;
133
+ }
134
+ onSelect === null || onSelect === void 0 || onSelect({
135
+ type: 'lookup-error',
136
+ address: formData,
137
+ status: (0, _addressStatus.buildAddressStatus)({
138
+ countryCode,
139
+ formData,
140
+ verificationStatus,
141
+ mode,
142
+ requireValidation
143
+ }),
144
+ error: {
145
+ kind: lookupServiceError.rateLimited ? 'rate-limited' : 'api',
146
+ source: 'autocomplete',
147
+ message: lookupErrorMessage
148
+ }
149
+ });
150
+ }, [lookupServiceError]);
151
+ (0, _react.useEffect)(() => {
152
+ if (!validationServiceError) {
153
+ return;
154
+ }
155
+ onSelect === null || onSelect === void 0 || onSelect({
156
+ type: 'validation-error',
157
+ address: formData,
158
+ status: (0, _addressStatus.buildAddressStatus)({
159
+ countryCode,
160
+ formData,
161
+ verificationStatus,
162
+ mode,
163
+ requireValidation
164
+ }),
165
+ error: {
166
+ kind: validationServiceError.rateLimited ? 'rate-limited' : 'api',
167
+ source: 'validation',
168
+ message: validationErrorMessage
169
+ }
170
+ });
171
+ }, [validationServiceError]);
172
+ const clearServiceErrors = ({
173
+ lookup = true,
174
+ validation = true,
175
+ custom = false
176
+ } = {}) => {
177
+ if (lookup) {
178
+ setLookupServiceError(null);
179
+ }
180
+ if (validation) {
181
+ setValidationServiceError(null);
182
+ }
183
+ if (custom) {
184
+ setCustomError(null);
185
+ }
186
+ };
100
187
  (0, _react.useEffect)(() => {
101
188
  if (selectedIntlAddressId) {
102
189
  if (suggestions.length === 1 && suggestions[0].isDetailed) {
@@ -125,16 +212,19 @@ const SmartyIntlResults = ({
125
212
  }
126
213
  const handleDocumentMouseDown = event => {
127
214
  const component = componentRef.current;
128
- if (component && component.contains(event.target)) {
215
+ if (component !== null && component !== void 0 && component.contains(event.target)) {
129
216
  return;
130
217
  }
131
218
  const suggestionsList = suggestionsListRef.current;
132
- if (suggestionsList && !suggestionsList.contains(event.target)) {
219
+ if ((suggestionsList === null || suggestionsList === void 0 ? void 0 : suggestionsList.contains(event.target)) === false) {
133
220
  shouldSearchRef.current = false;
134
221
  setQuery('');
135
222
  setSelectedAddress(null);
136
223
  setSelectedIntlAddressId(null);
137
224
  setShowValidationSuggestions(false);
225
+ clearServiceErrors({
226
+ custom: true
227
+ });
138
228
  setFormData(lookupDraftOriginalRef.current);
139
229
  setHasPendingLookupDraft(false);
140
230
  }
@@ -167,6 +257,9 @@ const SmartyIntlResults = ({
167
257
  lastCommittedAddressRef.current = updatedFormData;
168
258
  lookupDraftOriginalRef.current = updatedFormData;
169
259
  setHasPendingLookupDraft(false);
260
+ clearServiceErrors({
261
+ custom: true
262
+ });
170
263
  const currentVerificationStatus = 'autocomplete';
171
264
  setVerificationStatus(currentVerificationStatus);
172
265
  onSelect === null || onSelect === void 0 || onSelect({
@@ -195,6 +288,9 @@ const SmartyIntlResults = ({
195
288
  setSelectedAddress(null);
196
289
  setSelectedIntlAddressId(null);
197
290
  setShowValidationSuggestions(false);
291
+ clearServiceErrors({
292
+ custom: true
293
+ });
198
294
  if (!hasPendingLookupDraft) {
199
295
  lookupDraftOriginalRef.current = formData;
200
296
  setHasPendingLookupDraft(true);
@@ -264,6 +360,9 @@ const SmartyIntlResults = ({
264
360
  if (field === lookupField) {
265
361
  setShowValidationSuggestions(false);
266
362
  }
363
+ clearServiceErrors({
364
+ custom: true
365
+ });
267
366
  const updatedFormData = {
268
367
  ...formData,
269
368
  [field]: value
@@ -295,6 +394,11 @@ const SmartyIntlResults = ({
295
394
  }, 500);
296
395
  };
297
396
  const handleSelect = address => {
397
+ clearServiceErrors({
398
+ lookup: true,
399
+ validation: false,
400
+ custom: true
401
+ });
298
402
  if (address.entries > 1 || address.entries === 1 && address.isDetailed === false) {
299
403
  shouldSearchRef.current = true;
300
404
  appliedSelectionKeyRef.current = null;
@@ -310,6 +414,11 @@ const SmartyIntlResults = ({
310
414
  };
311
415
  const handleValidationSelect = validatedAddress => {
312
416
  var _countryConfig$config;
417
+ clearServiceErrors({
418
+ lookup: false,
419
+ validation: true,
420
+ custom: false
421
+ });
313
422
  const components = validatedAddress.components || {};
314
423
  const config = (countryConfig === null || countryConfig === void 0 ? void 0 : countryConfig.addressForm) || [];
315
424
  const formFields = new Set(config.map(f => f.field));
@@ -363,9 +472,129 @@ const SmartyIntlResults = ({
363
472
  if (!requireValidation) {
364
473
  return;
365
474
  }
475
+ clearServiceErrors({
476
+ lookup: false,
477
+ validation: true,
478
+ custom: false
479
+ });
366
480
  setShowValidationSuggestions(true);
367
481
  setValidationTrigger(prev => prev + 1);
368
482
  };
483
+ const getFieldKey = fieldConfig => fieldConfig.field;
484
+ const getSuggestionKey = suggestion => suggestion.address_id || [suggestion.displayText, suggestion.street, suggestion.address_text, suggestion.locality, suggestion.administrative_area, suggestion.postal_code, suggestion.entries].filter(value => value !== undefined && value !== null).join('|');
485
+ const getValidationSuggestionKey = suggestion => {
486
+ var _suggestion$component, _suggestion$component2, _suggestion$component3, _suggestion$component4, _suggestion$component5;
487
+ return [suggestion.displayText, suggestion.address1, suggestion.address2, suggestion.address3, (_suggestion$component = suggestion.components) === null || _suggestion$component === void 0 ? void 0 : _suggestion$component.thoroughfare, (_suggestion$component2 = suggestion.components) === null || _suggestion$component2 === void 0 ? void 0 : _suggestion$component2.premise, (_suggestion$component3 = suggestion.components) === null || _suggestion$component3 === void 0 ? void 0 : _suggestion$component3.locality, (_suggestion$component4 = suggestion.components) === null || _suggestion$component4 === void 0 ? void 0 : _suggestion$component4.administrative_area, (_suggestion$component5 = suggestion.components) === null || _suggestion$component5 === void 0 ? void 0 : _suggestion$component5.postal_code].filter(value => value !== undefined && value !== null).join('|');
488
+ };
489
+ const renderLookupActions = () => /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
490
+ className: "ns-address-lookup__actions",
491
+ children: [!isAutocompleteMode && requireValidation && showManualValidateButton && /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
492
+ type: "button",
493
+ onClick: handleValidate,
494
+ disabled: validationLoading || !String(formData[lookupField] || '').trim(),
495
+ className: "ns-address-lookup__button ns-address-lookup__button--compact",
496
+ children: validationLoading ? 'Validating...' : 'Validate Address'
497
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
498
+ type: "button",
499
+ onClick: () => {
500
+ setShowValidationSuggestions(false);
501
+ clearServiceErrors({
502
+ custom: true
503
+ });
504
+ setMode(mode === 'autocomplete' ? 'manual' : 'autocomplete');
505
+ },
506
+ className: "ns-address-lookup__toggle",
507
+ children: mode === 'autocomplete' ? 'Switch to Manual Entry' : 'Switch to Autocomplete'
508
+ })]
509
+ });
510
+ const renderLookupLists = isLookupField => {
511
+ if (!isLookupField) {
512
+ return null;
513
+ }
514
+ if (loading && isAutocompleteMode) {
515
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
516
+ className: "ns-address-lookup__spinner"
517
+ });
518
+ }
519
+ if (suggestions.length > 0 && !selectedAddress && isAutocompleteMode) {
520
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("ul", {
521
+ ref: suggestionsListRef,
522
+ className: "ns-address-lookup__list ns-address-lookup__list--suggestions",
523
+ children: suggestions.map((suggestion, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)("li", {
524
+ className: ['ns-address-lookup__list-item', index < suggestions.length - 1 ? 'ns-address-lookup__list-item--divided' : ''].filter(Boolean).join(' '),
525
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
526
+ type: "button",
527
+ onClick: () => handleSelect(suggestion),
528
+ className: "ns-address-lookup__list-button",
529
+ children: suggestion.displayText
530
+ })
531
+ }, getSuggestionKey(suggestion)))
532
+ });
533
+ }
534
+ if (!isAutocompleteMode && requireValidation && showValidationSuggestions && validationSuggestions.length > 0) {
535
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("ul", {
536
+ className: "ns-address-lookup__list ns-address-lookup__list--validation-inline",
537
+ children: validationSuggestions.map((suggestion, index) => {
538
+ var _suggestion$analysis;
539
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("li", {
540
+ className: ['ns-address-lookup__list-item', index < validationSuggestions.length - 1 ? 'ns-address-lookup__list-item--divided' : ''].filter(Boolean).join(' '),
541
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("button", {
542
+ type: "button",
543
+ onClick: () => handleValidationSelect(suggestion),
544
+ className: "ns-address-lookup__list-button",
545
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
546
+ className: "ns-address-lookup__list-title",
547
+ children: ((_suggestion$analysis = suggestion.analysis) === null || _suggestion$analysis === void 0 ? void 0 : _suggestion$analysis.verification_status) || 'Unknown'
548
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
549
+ className: "ns-address-lookup__list-subtitle",
550
+ children: suggestion.displayText
551
+ })]
552
+ })
553
+ }, getValidationSuggestionKey(suggestion));
554
+ })
555
+ });
556
+ }
557
+ return null;
558
+ };
559
+ const renderField = fieldConfig => {
560
+ const isLookupField = fieldConfig.field === lookupField;
561
+ const fieldError = getFieldErrorMessage(fieldConfig.field);
562
+ const isInvalid = hasVisibleFieldError(fieldConfig.field);
563
+ const isReadOnly = !fieldConfig.editable && !isLookupField && isAutocompleteMode;
564
+ const inputClassName = ['ns-address-lookup__input', isInvalid ? 'ns-address-lookup__input--invalid' : '', isReadOnly ? 'ns-address-lookup__input--readonly' : '', isLookupField && loading ? 'ns-address-lookup__input--loading' : ''].filter(Boolean).join(' ');
565
+ const fieldClassName = ['ns-address-lookup__field', isInvalid ? 'ns-address-lookup__field--with-error' : ''].filter(Boolean).join(' ');
566
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
567
+ className: fieldClassName,
568
+ style: {
569
+ width: fieldConfig.width === 'full' ? '100%' : '50%'
570
+ },
571
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
572
+ className: "ns-address-lookup__label-row",
573
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("label", {
574
+ className: "ns-address-lookup__label",
575
+ children: areLabelsLoading ? '' : (fieldLabels === null || fieldLabels === void 0 ? void 0 : fieldLabels[fieldConfig.field]) || fieldConfig.label
576
+ }), isLookupField && renderLookupActions()]
577
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
578
+ type: "text",
579
+ value: formData[fieldConfig.field] || '',
580
+ maxLength: fieldConfig.maxLength,
581
+ "aria-invalid": shouldShowFieldError(fieldConfig.field) ? 'true' : undefined,
582
+ onBlur: () => handleFieldBlur(fieldConfig.field),
583
+ onChange: e => {
584
+ if (isLookupField && isAutocompleteMode) {
585
+ handleInputChange(e);
586
+ } else {
587
+ handleEditableFieldChange(fieldConfig.field, e.target.value);
588
+ }
589
+ },
590
+ readOnly: !isAutocompleteMode && !fieldConfig.editable && !isLookupField ? false : !fieldConfig.editable && !isLookupField,
591
+ className: inputClassName
592
+ }), fieldError && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
593
+ className: "ns-address-lookup__error-text",
594
+ children: fieldError
595
+ }), renderLookupLists(isLookupField)]
596
+ }, getFieldKey(fieldConfig));
597
+ };
369
598
  (0, _react.useEffect)(() => {
370
599
  if (validationSuggestions.length === 1) {
371
600
  // Auto-select when exactly one validation result is returned
@@ -381,108 +610,36 @@ const SmartyIntlResults = ({
381
610
  });
382
611
  }
383
612
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
384
- children: config.map((fieldConfig, index) => {
385
- const isLookupField = fieldConfig.field === lookupField;
386
- const fieldError = getFieldErrorMessage(fieldConfig.field);
387
- const isInvalid = hasVisibleFieldError(fieldConfig.field);
388
- const isReadOnly = !fieldConfig.editable && !isLookupField && isAutocompleteMode;
389
- const inputClassName = ['ns-address-lookup__input', isInvalid ? 'ns-address-lookup__input--invalid' : '', isReadOnly ? 'ns-address-lookup__input--readonly' : '', isLookupField && loading ? 'ns-address-lookup__input--loading' : ''].filter(Boolean).join(' ');
390
- const fieldClassName = ['ns-address-lookup__field', isInvalid ? 'ns-address-lookup__field--with-error' : ''].filter(Boolean).join(' ');
391
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
392
- className: fieldClassName,
393
- style: {
394
- width: fieldConfig.width === 'full' ? '100%' : '50%'
395
- },
396
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
397
- className: "ns-address-lookup__label-row",
398
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("label", {
399
- className: "ns-address-lookup__label",
400
- children: areLabelsLoading ? '' : (fieldLabels === null || fieldLabels === void 0 ? void 0 : fieldLabels[fieldConfig.field]) || fieldConfig.label
401
- }), isLookupField && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
402
- className: "ns-address-lookup__actions",
403
- children: [!isAutocompleteMode && requireValidation && showManualValidateButton && /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
404
- type: "button",
405
- onClick: handleValidate,
406
- disabled: validationLoading || !String(formData[lookupField] || '').trim(),
407
- className: "ns-address-lookup__button ns-address-lookup__button--compact",
408
- children: validationLoading ? 'Validating...' : 'Validate Address'
409
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
410
- href: "#",
411
- onClick: e => {
412
- e.preventDefault();
413
- setShowValidationSuggestions(false);
414
- setMode(mode === 'autocomplete' ? 'manual' : 'autocomplete');
415
- },
416
- className: "ns-address-lookup__toggle",
417
- children: mode === 'autocomplete' ? 'Switch to Manual Entry' : 'Switch to Autocomplete'
418
- })]
419
- })]
420
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
421
- type: "text",
422
- value: formData[fieldConfig.field] || '',
423
- maxLength: fieldConfig.maxLength,
424
- "aria-invalid": shouldShowFieldError(fieldConfig.field) ? 'true' : undefined,
425
- onBlur: () => handleFieldBlur(fieldConfig.field),
426
- onChange: e => {
427
- if (isLookupField && isAutocompleteMode) {
428
- handleInputChange(e);
429
- } else {
430
- handleEditableFieldChange(fieldConfig.field, e.target.value);
431
- }
432
- },
433
- readOnly: !isAutocompleteMode && !fieldConfig.editable && !isLookupField ? false : !fieldConfig.editable && !isLookupField,
434
- className: inputClassName
435
- }), fieldError && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
436
- className: "ns-address-lookup__error-text",
437
- children: fieldError
438
- }), isLookupField && loading && isAutocompleteMode && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
439
- className: "ns-address-lookup__spinner"
440
- }), isLookupField && suggestions.length > 0 && !selectedAddress && isAutocompleteMode && /*#__PURE__*/(0, _jsxRuntime.jsx)("ul", {
441
- ref: suggestionsListRef,
442
- className: "ns-address-lookup__list ns-address-lookup__list--suggestions",
443
- children: suggestions.map((suggestion, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)("li", {
444
- onClick: () => handleSelect(suggestion),
445
- className: ['ns-address-lookup__list-item', index < suggestions.length - 1 ? 'ns-address-lookup__list-item--divided' : ''].filter(Boolean).join(' '),
446
- children: suggestion.displayText
447
- }, index))
448
- }), isLookupField && !isAutocompleteMode && requireValidation && showValidationSuggestions && validationSuggestions.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)("ul", {
449
- className: "ns-address-lookup__list ns-address-lookup__list--validation-inline",
450
- children: validationSuggestions.map((suggestion, index) => {
451
- var _suggestion$analysis;
452
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)("li", {
453
- onClick: () => handleValidationSelect(suggestion),
454
- className: ['ns-address-lookup__list-item', index < validationSuggestions.length - 1 ? 'ns-address-lookup__list-item--divided' : ''].filter(Boolean).join(' '),
455
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
456
- className: "ns-address-lookup__list-title",
457
- children: ((_suggestion$analysis = suggestion.analysis) === null || _suggestion$analysis === void 0 ? void 0 : _suggestion$analysis.verification_status) || 'Unknown'
458
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
459
- className: "ns-address-lookup__list-subtitle",
460
- children: suggestion.displayText
461
- })]
462
- }, index);
463
- })
464
- })]
465
- }, index);
466
- })
613
+ children: config.map(renderField)
467
614
  });
468
615
  };
469
616
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
470
617
  ref: componentRef,
471
618
  className: "ns-address-lookup__panel",
472
- children: [error && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
619
+ children: [lookupServiceError && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
473
620
  className: "ns-address-lookup__message",
474
- children: ["Error: ", error]
621
+ children: lookupErrorMessage
475
622
  }), customError && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
476
623
  className: "ns-address-lookup__message",
477
624
  children: customError
478
- }), requireValidation && validationError && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
625
+ }), requireValidation && validationServiceError && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
479
626
  className: "ns-address-lookup__message",
480
- children: ["Validation Error: ", validationError]
627
+ children: validationErrorMessage
481
628
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
482
629
  className: "ns-address-lookup__form",
483
630
  children: renderAddressForm()
484
631
  })]
485
632
  });
486
633
  };
634
+ SmartyIntlResults.propTypes = {
635
+ countryCode: _propTypes.default.string.isRequired,
636
+ onSelect: _propTypes.default.func,
637
+ initialAddress: _componentPropTypes.addressPropType,
638
+ requireValidation: _propTypes.default.bool,
639
+ showManualValidateButton: _propTypes.default.bool,
640
+ validationRequestId: _propTypes.default.number,
641
+ language: _propTypes.default.string,
642
+ strings: _componentPropTypes.labelStringsPropType
643
+ };
487
644
  var _default = exports.default = SmartyIntlResults;
488
645
  //# sourceMappingURL=SmartyIntlResults.js.map