@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.
- package/README.md +10 -2
- package/dist/AddressLookup.js +12 -0
- package/dist/AddressLookup.js.map +1 -1
- package/dist/components/SmartyIntlResults.js +248 -91
- package/dist/components/SmartyIntlResults.js.map +1 -1
- package/dist/components/SmartyUSResults.js +224 -88
- package/dist/components/SmartyUSResults.js.map +1 -1
- package/dist/config/address/postalCodeRules.js +1 -1
- package/dist/config/address/postalCodeRules.js.map +1 -1
- package/dist/hooks/useAddressValidationBase.js +118 -0
- package/dist/hooks/useAddressValidationBase.js.map +1 -0
- package/dist/hooks/useIntlAddressValidation.js +49 -54
- package/dist/hooks/useIntlAddressValidation.js.map +1 -1
- package/dist/hooks/useSmartyInternationalLookup.js +59 -70
- package/dist/hooks/useSmartyInternationalLookup.js.map +1 -1
- package/dist/hooks/useSmartyLookupBase.js +152 -0
- package/dist/hooks/useSmartyLookupBase.js.map +1 -0
- package/dist/hooks/useSmartyUSLookup.js +67 -63
- package/dist/hooks/useSmartyUSLookup.js.map +1 -1
- package/dist/hooks/useUSAddressValidation.js +53 -55
- package/dist/hooks/useUSAddressValidation.js.map +1 -1
- package/dist/styles/addressLookup.css +28 -4
- package/dist/utils/addressStrings.js +16 -10
- package/dist/utils/addressStrings.js.map +1 -1
- package/dist/utils/componentPropTypes.js +35 -0
- package/dist/utils/componentPropTypes.js.map +1 -0
- package/dist/utils/inFlightRequests.js +50 -0
- package/dist/utils/inFlightRequests.js.map +1 -0
- package/dist/utils/requestCache.js +44 -0
- package/dist/utils/requestCache.js.map +1 -0
- package/dist/utils/requestRateLimiter.js +53 -0
- package/dist/utils/requestRateLimiter.js.map +1 -0
- package/dist/utils/validators.js +20 -1
- package/dist/utils/validators.js.map +1 -1
- package/package.json +13 -8
- package/dist/components/EgonResults.js +0 -195
- package/dist/components/EgonResults.js.map +0 -1
- package/dist/components/SmartyResults.js +0 -327
- package/dist/components/SmartyResults.js.map +0 -1
- package/dist/hooks/useEgonLookup.js +0 -168
- package/dist/hooks/useEgonLookup.js.map +0 -1
- package/dist/hooks/useEgonNormalize.js +0 -105
- 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
|
|
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`
|
package/dist/AddressLookup.js
CHANGED
|
@@ -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","
|
|
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
|
|
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(
|
|
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: [
|
|
619
|
+
children: [lookupServiceError && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
473
620
|
className: "ns-address-lookup__message",
|
|
474
|
-
children:
|
|
621
|
+
children: lookupErrorMessage
|
|
475
622
|
}), customError && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
476
623
|
className: "ns-address-lookup__message",
|
|
477
624
|
children: customError
|
|
478
|
-
}), requireValidation &&
|
|
625
|
+
}), requireValidation && validationServiceError && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
479
626
|
className: "ns-address-lookup__message",
|
|
480
|
-
children:
|
|
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
|