@nuskin/shipping-address-form 1.5.1 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -12
- package/dist/addressLookup/AddressLookup.js +74 -0
- package/dist/addressLookup/AddressLookup.js.map +1 -0
- package/dist/addressLookup/components/LocationPinIcon.js +33 -0
- package/dist/addressLookup/components/LocationPinIcon.js.map +1 -0
- package/dist/addressLookup/components/SmartyIntlResults.js +1020 -0
- package/dist/addressLookup/components/SmartyIntlResults.js.map +1 -0
- package/dist/addressLookup/components/SmartyUSResults.js +1001 -0
- package/dist/addressLookup/components/SmartyUSResults.js.map +1 -0
- package/dist/addressLookup/config/address/countries.js +61 -0
- package/dist/addressLookup/config/address/countries.js.map +1 -0
- package/dist/addressLookup/config/address/index.js +19 -0
- package/dist/addressLookup/config/address/index.js.map +1 -0
- package/dist/addressLookup/config/googleMaps.js +12 -0
- package/dist/addressLookup/config/googleMaps.js.map +1 -0
- package/dist/addressLookup/countries.js +19 -0
- package/dist/addressLookup/countries.js.map +1 -0
- package/dist/addressLookup/hooks/useAddressFieldLabels.js +41 -0
- package/dist/addressLookup/hooks/useAddressFieldLabels.js.map +1 -0
- package/dist/addressLookup/hooks/useAddressForm.js +36 -0
- package/dist/addressLookup/hooks/useAddressForm.js.map +1 -0
- package/dist/addressLookup/hooks/useAddressMapModal.js +136 -0
- package/dist/addressLookup/hooks/useAddressMapModal.js.map +1 -0
- package/dist/addressLookup/hooks/useAddressValidationBase.js +143 -0
- package/dist/addressLookup/hooks/useAddressValidationBase.js.map +1 -0
- package/dist/addressLookup/hooks/useInitialAddressVerification.js +57 -0
- package/dist/addressLookup/hooks/useInitialAddressVerification.js.map +1 -0
- package/dist/addressLookup/hooks/useIntlAddressValidation.js +122 -0
- package/dist/addressLookup/hooks/useIntlAddressValidation.js.map +1 -0
- package/dist/addressLookup/hooks/useSmartyInternationalLookup.js +74 -0
- package/dist/addressLookup/hooks/useSmartyInternationalLookup.js.map +1 -0
- package/dist/addressLookup/hooks/useSmartyLookupBase.js +152 -0
- package/dist/addressLookup/hooks/useSmartyLookupBase.js.map +1 -0
- package/dist/addressLookup/hooks/useSmartyUSLookup.js +79 -0
- package/dist/addressLookup/hooks/useSmartyUSLookup.js.map +1 -0
- package/dist/addressLookup/hooks/useUSAddressValidation.js +166 -0
- package/dist/addressLookup/hooks/useUSAddressValidation.js.map +1 -0
- package/dist/addressLookup/index.js +41 -0
- package/dist/addressLookup/index.js.map +1 -0
- package/dist/addressLookup/styles/addressLookup.css +383 -0
- package/dist/addressLookup/utils/addressForm.js +150 -0
- package/dist/addressLookup/utils/addressForm.js.map +1 -0
- package/dist/addressLookup/utils/addressMapping.js +190 -0
- package/dist/addressLookup/utils/addressMapping.js.map +1 -0
- package/dist/addressLookup/utils/addressStatus.js +173 -0
- package/dist/addressLookup/utils/addressStatus.js.map +1 -0
- package/dist/addressLookup/utils/addressStrings.js +159 -0
- package/dist/addressLookup/utils/addressStrings.js.map +1 -0
- package/dist/addressLookup/utils/addressVerification.js +66 -0
- package/dist/addressLookup/utils/addressVerification.js.map +1 -0
- package/dist/addressLookup/utils/addressWrapper.js +40 -0
- package/dist/addressLookup/utils/addressWrapper.js.map +1 -0
- package/dist/addressLookup/utils/componentPropTypes.js +118 -0
- package/dist/addressLookup/utils/componentPropTypes.js.map +1 -0
- package/dist/addressLookup/utils/googleMapsLoader.js +68 -0
- package/dist/addressLookup/utils/googleMapsLoader.js.map +1 -0
- package/dist/addressLookup/utils/inFlightRequests.js +50 -0
- package/dist/addressLookup/utils/inFlightRequests.js.map +1 -0
- package/dist/addressLookup/utils/intlAutocompleteBusinessRules.js +62 -0
- package/dist/addressLookup/utils/intlAutocompleteBusinessRules.js.map +1 -0
- package/dist/addressLookup/utils/requestCache.js +44 -0
- package/dist/addressLookup/utils/requestCache.js.map +1 -0
- package/dist/addressLookup/utils/requestRateLimiter.js +53 -0
- package/dist/addressLookup/utils/requestRateLimiter.js.map +1 -0
- package/dist/addressLookup/utils/smartyConfig.js +11 -0
- package/dist/addressLookup/utils/smartyConfig.js.map +1 -0
- package/dist/addressLookup/utils/validators.js +45 -0
- package/dist/addressLookup/utils/validators.js.map +1 -0
- package/dist/index.js +28 -1
- package/dist/index.js.map +1 -1
- package/dist/{ShippingAddressForm.js → shippingAddressForm/ShippingAddressForm.js} +10 -2
- package/dist/shippingAddressForm/ShippingAddressForm.js.map +1 -0
- package/dist/{components → shippingAddressForm/components}/ShippingField.js +32 -22
- package/dist/shippingAddressForm/components/ShippingField.js.map +1 -0
- package/dist/shippingAddressForm/hooks/useAddressFieldLabels.js.map +1 -0
- package/dist/shippingAddressForm/hooks/useShippingAddressForm.js.map +1 -0
- package/dist/shippingAddressForm/hooks/useShippingFormState.js.map +1 -0
- package/dist/shippingAddressForm/utils/emailVerify.js.map +1 -0
- package/dist/{utils → shippingAddressForm/utils}/shippingAddressForm.js +3 -3
- package/dist/shippingAddressForm/utils/shippingAddressForm.js.map +1 -0
- package/dist/shippingAddressForm/utils/shippingStrings.js.map +1 -0
- package/package.json +2 -3
- package/dist/ShippingAddressForm.js.map +0 -1
- package/dist/components/ShippingField.js.map +0 -1
- package/dist/hooks/useAddressFieldLabels.js.map +0 -1
- package/dist/hooks/useShippingAddressForm.js.map +0 -1
- package/dist/hooks/useShippingFormState.js.map +0 -1
- package/dist/utils/emailVerify.js.map +0 -1
- package/dist/utils/shippingAddressForm.js.map +0 -1
- package/dist/utils/shippingStrings.js.map +0 -1
- /package/dist/{hooks → shippingAddressForm/hooks}/useAddressFieldLabels.js +0 -0
- /package/dist/{hooks → shippingAddressForm/hooks}/useShippingAddressForm.js +0 -0
- /package/dist/{hooks → shippingAddressForm/hooks}/useShippingFormState.js +0 -0
- /package/dist/{styles → shippingAddressForm/styles}/shippingAddressForm.css +0 -0
- /package/dist/{utils → shippingAddressForm/utils}/emailVerify.js +0 -0
- /package/dist/{utils → shippingAddressForm/utils}/shippingStrings.js +0 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _axios = _interopRequireDefault(require("axios"));
|
|
9
|
+
var _requestCache = require("../utils/requestCache");
|
|
10
|
+
var _requestRateLimiter = require("../utils/requestRateLimiter");
|
|
11
|
+
var _inFlightRequests = require("../utils/inFlightRequests");
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
const RATE_LIMIT_MESSAGE = 'Too many requests. Please wait a moment and try again.';
|
|
14
|
+
const useAddressValidationBase = ({
|
|
15
|
+
isEnabled,
|
|
16
|
+
cacheNamespace = null,
|
|
17
|
+
cacheTtlMs = null,
|
|
18
|
+
rateLimitNamespace,
|
|
19
|
+
rateLimitConfig,
|
|
20
|
+
requestKey,
|
|
21
|
+
requestUrl,
|
|
22
|
+
requestParams,
|
|
23
|
+
transformResponse,
|
|
24
|
+
effectDeps = []
|
|
25
|
+
}) => {
|
|
26
|
+
const requestCycleKey = JSON.stringify({
|
|
27
|
+
isEnabled,
|
|
28
|
+
effectDeps
|
|
29
|
+
});
|
|
30
|
+
const [suggestions, setSuggestions] = (0, _react.useState)([]);
|
|
31
|
+
const [loading, setLoading] = (0, _react.useState)(false);
|
|
32
|
+
const [error, setError] = (0, _react.useState)(null);
|
|
33
|
+
const [rateLimited, setRateLimited] = (0, _react.useState)(false);
|
|
34
|
+
const [activeCycleKey, setActiveCycleKey] = (0, _react.useState)(requestCycleKey);
|
|
35
|
+
const isPendingCycleChange = activeCycleKey !== requestCycleKey;
|
|
36
|
+
(0, _react.useEffect)(() => {
|
|
37
|
+
setActiveCycleKey(requestCycleKey);
|
|
38
|
+
if (!isEnabled) {
|
|
39
|
+
setRateLimited(false);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
let cancelled = false;
|
|
43
|
+
let activeRequest = null;
|
|
44
|
+
let activeRequestKey = null;
|
|
45
|
+
const validateAddress = async () => {
|
|
46
|
+
setLoading(true);
|
|
47
|
+
setError(null);
|
|
48
|
+
setSuggestions([]);
|
|
49
|
+
try {
|
|
50
|
+
const cached = cacheNamespace ? (0, _requestCache.getCachedValue)(cacheNamespace, requestKey) : null;
|
|
51
|
+
if (cached) {
|
|
52
|
+
if (!cancelled) {
|
|
53
|
+
setRateLimited(false);
|
|
54
|
+
setSuggestions(cached.suggestions);
|
|
55
|
+
setLoading(false);
|
|
56
|
+
}
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const rateLimitStatus = (0, _requestRateLimiter.checkRateLimit)(rateLimitNamespace, rateLimitConfig);
|
|
60
|
+
if (!rateLimitStatus.allowed) {
|
|
61
|
+
setRateLimited(true);
|
|
62
|
+
setError(RATE_LIMIT_MESSAGE);
|
|
63
|
+
setLoading(false);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
activeRequestKey = requestKey;
|
|
67
|
+
const existingRequest = (0, _inFlightRequests.getInFlightRequest)(activeRequestKey);
|
|
68
|
+
let response;
|
|
69
|
+
if (existingRequest) {
|
|
70
|
+
activeRequest = (0, _inFlightRequests.retainInFlightRequest)(activeRequestKey);
|
|
71
|
+
({
|
|
72
|
+
response
|
|
73
|
+
} = await activeRequest.promise);
|
|
74
|
+
} else {
|
|
75
|
+
const controller = new AbortController();
|
|
76
|
+
const request = {
|
|
77
|
+
controller,
|
|
78
|
+
settled: false,
|
|
79
|
+
promise: (async () => {
|
|
80
|
+
const networkResponse = await _axios.default.get(requestUrl, {
|
|
81
|
+
params: requestParams,
|
|
82
|
+
signal: controller.signal
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
response: networkResponse
|
|
86
|
+
};
|
|
87
|
+
})()
|
|
88
|
+
};
|
|
89
|
+
(0, _inFlightRequests.setInFlightRequest)(activeRequestKey, request);
|
|
90
|
+
activeRequest = (0, _inFlightRequests.retainInFlightRequest)(activeRequestKey);
|
|
91
|
+
try {
|
|
92
|
+
({
|
|
93
|
+
response
|
|
94
|
+
} = await activeRequest.promise);
|
|
95
|
+
} finally {
|
|
96
|
+
(0, _inFlightRequests.settleInFlightRequest)(activeRequestKey, activeRequest);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (cancelled) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const transformedSuggestions = transformResponse(response.data);
|
|
103
|
+
if (cacheNamespace) {
|
|
104
|
+
(0, _requestCache.setCachedValue)(cacheNamespace, requestKey, {
|
|
105
|
+
suggestions: transformedSuggestions
|
|
106
|
+
}, cacheTtlMs || undefined);
|
|
107
|
+
}
|
|
108
|
+
setRateLimited(false);
|
|
109
|
+
setSuggestions(transformedSuggestions);
|
|
110
|
+
} catch (err) {
|
|
111
|
+
var _err$response;
|
|
112
|
+
if (cancelled || err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
setRateLimited(false);
|
|
116
|
+
setError(((_err$response = err.response) === null || _err$response === void 0 || (_err$response = _err$response.data) === null || _err$response === void 0 ? void 0 : _err$response.message) || err.message);
|
|
117
|
+
} finally {
|
|
118
|
+
if (!cancelled) {
|
|
119
|
+
setLoading(false);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
validateAddress();
|
|
124
|
+
return () => {
|
|
125
|
+
var _activeRequest, _activeRequest2;
|
|
126
|
+
cancelled = true;
|
|
127
|
+
if (activeRequestKey && activeRequest) {
|
|
128
|
+
(0, _inFlightRequests.releaseInFlightRequest)(activeRequestKey, activeRequest);
|
|
129
|
+
}
|
|
130
|
+
if (((_activeRequest = activeRequest) === null || _activeRequest === void 0 ? void 0 : _activeRequest.subscribers) === 0 && !((_activeRequest2 = activeRequest) !== null && _activeRequest2 !== void 0 && _activeRequest2.settled)) {
|
|
131
|
+
activeRequest.controller.abort();
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
}, [isEnabled, requestCycleKey]);
|
|
135
|
+
return {
|
|
136
|
+
suggestions: isPendingCycleChange ? [] : suggestions,
|
|
137
|
+
loading: isPendingCycleChange ? Boolean(isEnabled) : loading,
|
|
138
|
+
error: isPendingCycleChange ? null : error,
|
|
139
|
+
rateLimited: isPendingCycleChange ? false : rateLimited
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
var _default = exports.default = useAddressValidationBase;
|
|
143
|
+
//# sourceMappingURL=useAddressValidationBase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAddressValidationBase.js","names":["_react","require","_axios","_interopRequireDefault","_requestCache","_requestRateLimiter","_inFlightRequests","e","__esModule","default","RATE_LIMIT_MESSAGE","useAddressValidationBase","isEnabled","cacheNamespace","cacheTtlMs","rateLimitNamespace","rateLimitConfig","requestKey","requestUrl","requestParams","transformResponse","effectDeps","requestCycleKey","JSON","stringify","suggestions","setSuggestions","useState","loading","setLoading","error","setError","rateLimited","setRateLimited","activeCycleKey","setActiveCycleKey","isPendingCycleChange","useEffect","cancelled","activeRequest","activeRequestKey","validateAddress","cached","getCachedValue","rateLimitStatus","checkRateLimit","allowed","existingRequest","getInFlightRequest","response","retainInFlightRequest","promise","controller","AbortController","request","settled","networkResponse","axios","get","params","signal","setInFlightRequest","settleInFlightRequest","transformedSuggestions","data","setCachedValue","undefined","err","_err$response","name","code","message","_activeRequest","_activeRequest2","releaseInFlightRequest","subscribers","abort","Boolean","_default","exports"],"sources":["../../../src/addressLookup/hooks/useAddressValidationBase.jsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport axios from 'axios';\nimport { getCachedValue, setCachedValue } from '../utils/requestCache';\nimport { checkRateLimit } from '../utils/requestRateLimiter';\nimport {\n getInFlightRequest,\n setInFlightRequest,\n retainInFlightRequest,\n releaseInFlightRequest,\n settleInFlightRequest\n} from '../utils/inFlightRequests';\n\nconst RATE_LIMIT_MESSAGE = 'Too many requests. Please wait a moment and try again.';\n\nconst useAddressValidationBase = ({\n isEnabled,\n cacheNamespace = null,\n cacheTtlMs = null,\n rateLimitNamespace,\n rateLimitConfig,\n requestKey,\n requestUrl,\n requestParams,\n transformResponse,\n effectDeps = []\n}) => {\n const requestCycleKey = JSON.stringify({\n isEnabled,\n effectDeps\n });\n const [suggestions, setSuggestions] = useState([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [rateLimited, setRateLimited] = useState(false);\n const [activeCycleKey, setActiveCycleKey] = useState(requestCycleKey);\n\n const isPendingCycleChange = activeCycleKey !== requestCycleKey;\n\n useEffect(() => {\n setActiveCycleKey(requestCycleKey);\n\n if (!isEnabled) {\n setRateLimited(false);\n return;\n }\n\n let cancelled = false;\n let activeRequest = null;\n let activeRequestKey = null;\n\n const validateAddress = async () => {\n setLoading(true);\n setError(null);\n setSuggestions([]);\n\n try {\n const cached = cacheNamespace ? getCachedValue(cacheNamespace, requestKey) : null;\n if (cached) {\n if (!cancelled) {\n setRateLimited(false);\n setSuggestions(cached.suggestions);\n setLoading(false);\n }\n return;\n }\n\n const rateLimitStatus = checkRateLimit(rateLimitNamespace, rateLimitConfig);\n if (!rateLimitStatus.allowed) {\n setRateLimited(true);\n setError(RATE_LIMIT_MESSAGE);\n setLoading(false);\n return;\n }\n\n activeRequestKey = requestKey;\n const existingRequest = getInFlightRequest(activeRequestKey);\n let response;\n\n if (existingRequest) {\n activeRequest = retainInFlightRequest(activeRequestKey);\n ({ response } = await activeRequest.promise);\n } else {\n const controller = new AbortController();\n const request = {\n controller,\n settled: false,\n promise: (async () => {\n const networkResponse = await axios.get(requestUrl, {\n params: requestParams,\n signal: controller.signal\n });\n return { response: networkResponse };\n })()\n };\n\n setInFlightRequest(activeRequestKey, request);\n activeRequest = retainInFlightRequest(activeRequestKey);\n\n try {\n ({ response } = await activeRequest.promise);\n } finally {\n settleInFlightRequest(activeRequestKey, activeRequest);\n }\n }\n\n if (cancelled) {\n return;\n }\n\n const transformedSuggestions = transformResponse(response.data);\n if (cacheNamespace) {\n setCachedValue(cacheNamespace, requestKey, {\n suggestions: transformedSuggestions\n }, cacheTtlMs || undefined);\n }\n\n setRateLimited(false);\n setSuggestions(transformedSuggestions);\n } catch (err) {\n if (cancelled || err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n return;\n }\n setRateLimited(false);\n setError(err.response?.data?.message || err.message);\n } finally {\n if (!cancelled) {\n setLoading(false);\n }\n }\n };\n\n validateAddress();\n\n return () => {\n cancelled = true;\n if (activeRequestKey && activeRequest) {\n releaseInFlightRequest(activeRequestKey, activeRequest);\n }\n if (activeRequest?.subscribers === 0 && !activeRequest?.settled) {\n activeRequest.controller.abort();\n }\n };\n }, [isEnabled, requestCycleKey]);\n\n return {\n suggestions: isPendingCycleChange ? [] : suggestions,\n loading: isPendingCycleChange ? Boolean(isEnabled) : loading,\n error: isPendingCycleChange ? null : error,\n rateLimited: isPendingCycleChange ? false : rateLimited\n };\n};\n\nexport default useAddressValidationBase;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _addressVerification = require("../utils/addressVerification");
|
|
9
|
+
const useInitialAddressVerification = ({
|
|
10
|
+
initialAddress,
|
|
11
|
+
countryCode,
|
|
12
|
+
lookupField,
|
|
13
|
+
requireValidation,
|
|
14
|
+
resolvedAddressForm,
|
|
15
|
+
setValidationServiceError,
|
|
16
|
+
setCustomError = null,
|
|
17
|
+
setShowValidationSuggestions,
|
|
18
|
+
setValidationTriggerSource,
|
|
19
|
+
setValidationTrigger
|
|
20
|
+
}) => {
|
|
21
|
+
const initialVerificationAttemptedRef = (0, _react.useRef)(null);
|
|
22
|
+
(0, _react.useEffect)(() => {
|
|
23
|
+
var _resolvedAddressForm$;
|
|
24
|
+
if (!initialAddress) {
|
|
25
|
+
initialVerificationAttemptedRef.current = null;
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (!(resolvedAddressForm !== null && resolvedAddressForm !== void 0 && (_resolvedAddressForm$ = resolvedAddressForm.addressElements) !== null && _resolvedAddressForm$ !== void 0 && _resolvedAddressForm$.length) || !requireValidation) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if ((0, _addressVerification.getIncomingVerificationStatus)(initialAddress) !== 'unverified') {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const lookupValueForValidation = String((initialAddress === null || initialAddress === void 0 ? void 0 : initialAddress[lookupField]) || (initialAddress === null || initialAddress === void 0 ? void 0 : initialAddress.address1) || '').trim();
|
|
35
|
+
if (!lookupValueForValidation) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const attemptKey = JSON.stringify({
|
|
39
|
+
countryCode,
|
|
40
|
+
lookupField,
|
|
41
|
+
initialAddress
|
|
42
|
+
});
|
|
43
|
+
if (initialVerificationAttemptedRef.current === attemptKey) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
initialVerificationAttemptedRef.current = attemptKey;
|
|
47
|
+
setValidationServiceError(null);
|
|
48
|
+
if (setCustomError) {
|
|
49
|
+
setCustomError(null);
|
|
50
|
+
}
|
|
51
|
+
setShowValidationSuggestions(false);
|
|
52
|
+
setValidationTriggerSource('initial');
|
|
53
|
+
setValidationTrigger(previousValue => previousValue + 1);
|
|
54
|
+
}, [countryCode, initialAddress, lookupField, requireValidation, resolvedAddressForm, setCustomError, setShowValidationSuggestions, setValidationServiceError, setValidationTrigger, setValidationTriggerSource]);
|
|
55
|
+
};
|
|
56
|
+
var _default = exports.default = useInitialAddressVerification;
|
|
57
|
+
//# sourceMappingURL=useInitialAddressVerification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInitialAddressVerification.js","names":["_react","require","_addressVerification","useInitialAddressVerification","initialAddress","countryCode","lookupField","requireValidation","resolvedAddressForm","setValidationServiceError","setCustomError","setShowValidationSuggestions","setValidationTriggerSource","setValidationTrigger","initialVerificationAttemptedRef","useRef","useEffect","_resolvedAddressForm$","current","addressElements","length","getIncomingVerificationStatus","lookupValueForValidation","String","address1","trim","attemptKey","JSON","stringify","previousValue","_default","exports","default"],"sources":["../../../src/addressLookup/hooks/useInitialAddressVerification.jsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { getIncomingVerificationStatus } from '../utils/addressVerification';\n\nconst useInitialAddressVerification = ({\n initialAddress,\n countryCode,\n lookupField,\n requireValidation,\n resolvedAddressForm,\n setValidationServiceError,\n setCustomError = null,\n setShowValidationSuggestions,\n setValidationTriggerSource,\n setValidationTrigger\n}) => {\n const initialVerificationAttemptedRef = useRef(null);\n\n useEffect(() => {\n if (!initialAddress) {\n initialVerificationAttemptedRef.current = null;\n return;\n }\n\n if (!resolvedAddressForm?.addressElements?.length || !requireValidation) {\n return;\n }\n\n if (getIncomingVerificationStatus(initialAddress) !== 'unverified') {\n return;\n }\n\n const lookupValueForValidation = String(\n initialAddress?.[lookupField] || initialAddress?.address1 || ''\n ).trim();\n\n if (!lookupValueForValidation) {\n return;\n }\n\n const attemptKey = JSON.stringify({\n countryCode,\n lookupField,\n initialAddress\n });\n\n if (initialVerificationAttemptedRef.current === attemptKey) {\n return;\n }\n\n initialVerificationAttemptedRef.current = attemptKey;\n setValidationServiceError(null);\n if (setCustomError) {\n setCustomError(null);\n }\n setShowValidationSuggestions(false);\n setValidationTriggerSource('initial');\n setValidationTrigger((previousValue) => previousValue + 1);\n }, [\n countryCode,\n initialAddress,\n lookupField,\n requireValidation,\n resolvedAddressForm,\n setCustomError,\n setShowValidationSuggestions,\n setValidationServiceError,\n setValidationTrigger,\n setValidationTriggerSource\n ]);\n};\n\nexport default useInitialAddressVerification;\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,oBAAA,GAAAD,OAAA;AAEA,MAAME,6BAA6B,GAAGA,CAAC;EACrCC,cAAc;EACdC,WAAW;EACXC,WAAW;EACXC,iBAAiB;EACjBC,mBAAmB;EACnBC,yBAAyB;EACzBC,cAAc,GAAG,IAAI;EACrBC,4BAA4B;EAC5BC,0BAA0B;EAC1BC;AACF,CAAC,KAAK;EACJ,MAAMC,+BAA+B,GAAG,IAAAC,aAAM,EAAC,IAAI,CAAC;EAEpD,IAAAC,gBAAS,EAAC,MAAM;IAAA,IAAAC,qBAAA;IACd,IAAI,CAACb,cAAc,EAAE;MACnBU,+BAA+B,CAACI,OAAO,GAAG,IAAI;MAC9C;IACF;IAEA,IAAI,EAACV,mBAAmB,aAAnBA,mBAAmB,gBAAAS,qBAAA,GAAnBT,mBAAmB,CAAEW,eAAe,cAAAF,qBAAA,eAApCA,qBAAA,CAAsCG,MAAM,KAAI,CAACb,iBAAiB,EAAE;MACvE;IACF;IAEA,IAAI,IAAAc,kDAA6B,EAACjB,cAAc,CAAC,KAAK,YAAY,EAAE;MAClE;IACF;IAEA,MAAMkB,wBAAwB,GAAGC,MAAM,CACrC,CAAAnB,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAGE,WAAW,CAAC,MAAIF,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAEoB,QAAQ,KAAI,EAC/D,CAAC,CAACC,IAAI,CAAC,CAAC;IAER,IAAI,CAACH,wBAAwB,EAAE;MAC7B;IACF;IAEA,MAAMI,UAAU,GAAGC,IAAI,CAACC,SAAS,CAAC;MAChCvB,WAAW;MACXC,WAAW;MACXF;IACF,CAAC,CAAC;IAEF,IAAIU,+BAA+B,CAACI,OAAO,KAAKQ,UAAU,EAAE;MAC1D;IACF;IAEAZ,+BAA+B,CAACI,OAAO,GAAGQ,UAAU;IACpDjB,yBAAyB,CAAC,IAAI,CAAC;IAC/B,IAAIC,cAAc,EAAE;MAClBA,cAAc,CAAC,IAAI,CAAC;IACtB;IACAC,4BAA4B,CAAC,KAAK,CAAC;IACnCC,0BAA0B,CAAC,SAAS,CAAC;IACrCC,oBAAoB,CAAEgB,aAAa,IAAKA,aAAa,GAAG,CAAC,CAAC;EAC5D,CAAC,EAAE,CACDxB,WAAW,EACXD,cAAc,EACdE,WAAW,EACXC,iBAAiB,EACjBC,mBAAmB,EACnBE,cAAc,EACdC,4BAA4B,EAC5BF,yBAAyB,EACzBI,oBAAoB,EACpBD,0BAA0B,CAC3B,CAAC;AACJ,CAAC;AAAC,IAAAkB,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEa7B,6BAA6B","ignoreList":[]}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _smartyConfig = require("../utils/smartyConfig");
|
|
8
|
+
var _validators = require("../utils/validators");
|
|
9
|
+
var _useAddressValidationBase = _interopRequireDefault(require("./useAddressValidationBase"));
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
const CACHE_NAMESPACE = 'smarty-intl-validation';
|
|
12
|
+
const CACHE_TTL_MS = 60 * 1000;
|
|
13
|
+
const RATE_LIMIT_NAMESPACE = 'smarty-intl-validation';
|
|
14
|
+
const RATE_LIMIT_CONFIG = {
|
|
15
|
+
limit: 5,
|
|
16
|
+
windowMs: 60 * 1000,
|
|
17
|
+
cooldownMs: 60 * 1000
|
|
18
|
+
};
|
|
19
|
+
const VERIFY_URL = 'https://international-street.api.smarty.com/verify';
|
|
20
|
+
const PRECISION_LABELS = {
|
|
21
|
+
DeliveryPoint: 'delivery point',
|
|
22
|
+
Premise: 'premise',
|
|
23
|
+
Thoroughfare: 'street',
|
|
24
|
+
Locality: 'city',
|
|
25
|
+
AdministrativeArea: 'region'
|
|
26
|
+
};
|
|
27
|
+
const getLookupAddressLine = (formData = {}, lookupField = 'address1') => (formData === null || formData === void 0 ? void 0 : formData[lookupField]) || '';
|
|
28
|
+
const buildValidationParams = (formData, countryCode, lookupField = 'address1') => {
|
|
29
|
+
const params = {
|
|
30
|
+
key: _smartyConfig.SMARTY_INTL_STREET_KEY,
|
|
31
|
+
country: countryCode,
|
|
32
|
+
address1: getLookupAddressLine(formData, lookupField),
|
|
33
|
+
locality: formData.city || '',
|
|
34
|
+
administrative_area: formData.region || '',
|
|
35
|
+
postal_code: (0, _validators.normalizePostalCodeValue)(formData.postalCode || ''),
|
|
36
|
+
geocode: true
|
|
37
|
+
};
|
|
38
|
+
Object.keys(params).forEach(key => {
|
|
39
|
+
if (!params[key]) {
|
|
40
|
+
delete params[key];
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return params;
|
|
44
|
+
};
|
|
45
|
+
const buildRequestKey = (formData, countryCode, lookupField = 'address1') => JSON.stringify({
|
|
46
|
+
countryCode,
|
|
47
|
+
address1: getLookupAddressLine(formData, lookupField),
|
|
48
|
+
locality: formData.city || '',
|
|
49
|
+
administrativeArea: formData.region || '',
|
|
50
|
+
postalCode: (0, _validators.normalizePostalCodeValue)(formData.postalCode || '')
|
|
51
|
+
});
|
|
52
|
+
const getPrecisionLabel = precision => PRECISION_LABELS[precision] || 'available level';
|
|
53
|
+
const buildValidationSummary = item => {
|
|
54
|
+
var _item$analysis, _item$analysis2, _item$changes, _item$changes2;
|
|
55
|
+
const verificationStatus = ((_item$analysis = item.analysis) === null || _item$analysis === void 0 ? void 0 : _item$analysis.verification_status) || 'None';
|
|
56
|
+
const precision = ((_item$analysis2 = item.analysis) === null || _item$analysis2 === void 0 ? void 0 : _item$analysis2.address_precision) || 'None';
|
|
57
|
+
const subBuildingChange = ((_item$changes = item.changes) === null || _item$changes === void 0 ? void 0 : _item$changes.sub_building) || ((_item$changes2 = item.changes) === null || _item$changes2 === void 0 || (_item$changes2 = _item$changes2.components) === null || _item$changes2 === void 0 ? void 0 : _item$changes2.sub_building);
|
|
58
|
+
const hasVerifiedSubBuilding = subBuildingChange === null || subBuildingChange === void 0 ? void 0 : subBuildingChange.startsWith('Verified');
|
|
59
|
+
if (verificationStatus === 'Verified') {
|
|
60
|
+
if (item.address2 && subBuildingChange && hasVerifiedSubBuilding) {
|
|
61
|
+
return {
|
|
62
|
+
code: 'verified-sub-building-changed',
|
|
63
|
+
title: 'Verified with unit changes',
|
|
64
|
+
message: 'This address is verified, but the apartment or suite information was changed.',
|
|
65
|
+
sortPriority: 2
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
code: 'verified',
|
|
70
|
+
title: 'Verified',
|
|
71
|
+
message: `This address is verified to the ${getPrecisionLabel(precision)} level.`,
|
|
72
|
+
sortPriority: 1
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
if (verificationStatus === 'Partial') {
|
|
76
|
+
return {
|
|
77
|
+
code: 'partial',
|
|
78
|
+
title: 'Partially verified',
|
|
79
|
+
message: `This address could only be verified to the ${getPrecisionLabel(precision)} level.`,
|
|
80
|
+
sortPriority: 3
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
if (verificationStatus === 'Ambiguous') {
|
|
84
|
+
return {
|
|
85
|
+
code: 'ambiguous',
|
|
86
|
+
title: 'Multiple matches found',
|
|
87
|
+
message: `Multiple possible matches were found at the ${getPrecisionLabel(precision)} level.`,
|
|
88
|
+
sortPriority: 4
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
code: 'not-verified',
|
|
93
|
+
title: 'Not verified',
|
|
94
|
+
message: 'This address could not be verified.',
|
|
95
|
+
sortPriority: 5
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
const transformSuggestions = (responseData = []) => responseData.map(item => ({
|
|
99
|
+
...item,
|
|
100
|
+
displayText: [item.address1, item.address2, item.address3].filter(Boolean).join(', '),
|
|
101
|
+
validationSummary: buildValidationSummary(item)
|
|
102
|
+
})).sort((left, right) => left.validationSummary.sortPriority - right.validationSummary.sortPriority);
|
|
103
|
+
const useIntlAddressValidation = (formData, countryCode, trigger, lookupField = 'address1') => {
|
|
104
|
+
const lookupValue = getLookupAddressLine(formData, lookupField);
|
|
105
|
+
const isEnabled = Boolean(trigger && trigger !== 0 && lookupValue && countryCode);
|
|
106
|
+
const requestParams = buildValidationParams(formData, countryCode, lookupField);
|
|
107
|
+
const requestKey = `smarty-intl-validation:${buildRequestKey(formData, countryCode, lookupField)}`;
|
|
108
|
+
return (0, _useAddressValidationBase.default)({
|
|
109
|
+
isEnabled,
|
|
110
|
+
cacheNamespace: CACHE_NAMESPACE,
|
|
111
|
+
cacheTtlMs: CACHE_TTL_MS,
|
|
112
|
+
rateLimitNamespace: RATE_LIMIT_NAMESPACE,
|
|
113
|
+
rateLimitConfig: RATE_LIMIT_CONFIG,
|
|
114
|
+
requestKey,
|
|
115
|
+
requestUrl: VERIFY_URL,
|
|
116
|
+
requestParams,
|
|
117
|
+
transformResponse: transformSuggestions,
|
|
118
|
+
effectDeps: [trigger, lookupField]
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
var _default = exports.default = useIntlAddressValidation;
|
|
122
|
+
//# sourceMappingURL=useIntlAddressValidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIntlAddressValidation.js","names":["_smartyConfig","require","_validators","_useAddressValidationBase","_interopRequireDefault","e","__esModule","default","CACHE_NAMESPACE","CACHE_TTL_MS","RATE_LIMIT_NAMESPACE","RATE_LIMIT_CONFIG","limit","windowMs","cooldownMs","VERIFY_URL","PRECISION_LABELS","DeliveryPoint","Premise","Thoroughfare","Locality","AdministrativeArea","getLookupAddressLine","formData","lookupField","buildValidationParams","countryCode","params","key","SMARTY_INTL_STREET_KEY","country","address1","locality","city","administrative_area","region","postal_code","normalizePostalCodeValue","postalCode","geocode","Object","keys","forEach","buildRequestKey","JSON","stringify","administrativeArea","getPrecisionLabel","precision","buildValidationSummary","item","_item$analysis","_item$analysis2","_item$changes","_item$changes2","verificationStatus","analysis","verification_status","address_precision","subBuildingChange","changes","sub_building","components","hasVerifiedSubBuilding","startsWith","address2","code","title","message","sortPriority","transformSuggestions","responseData","map","displayText","address3","filter","Boolean","join","validationSummary","sort","left","right","useIntlAddressValidation","trigger","lookupValue","isEnabled","requestParams","requestKey","useAddressValidationBase","cacheNamespace","cacheTtlMs","rateLimitNamespace","rateLimitConfig","requestUrl","transformResponse","effectDeps","_default","exports"],"sources":["../../../src/addressLookup/hooks/useIntlAddressValidation.jsx"],"sourcesContent":["import { SMARTY_INTL_STREET_KEY } from '../utils/smartyConfig';\nimport { normalizePostalCodeValue } from '../utils/validators';\nimport useAddressValidationBase from './useAddressValidationBase';\n\nconst CACHE_NAMESPACE = 'smarty-intl-validation';\nconst CACHE_TTL_MS = 60 * 1000;\nconst RATE_LIMIT_NAMESPACE = 'smarty-intl-validation';\nconst RATE_LIMIT_CONFIG = {\n limit: 5,\n windowMs: 60 * 1000,\n cooldownMs: 60 * 1000\n};\nconst VERIFY_URL = 'https://international-street.api.smarty.com/verify';\n\nconst PRECISION_LABELS = {\n DeliveryPoint: 'delivery point',\n Premise: 'premise',\n Thoroughfare: 'street',\n Locality: 'city',\n AdministrativeArea: 'region'\n};\n\nconst getLookupAddressLine = (formData = {}, lookupField = 'address1') => (\n formData?.[lookupField] || ''\n);\n\nconst buildValidationParams = (formData, countryCode, lookupField = 'address1') => {\n const params = {\n key: SMARTY_INTL_STREET_KEY,\n country: countryCode,\n address1: getLookupAddressLine(formData, lookupField),\n locality: formData.city || '',\n administrative_area: formData.region || '',\n postal_code: normalizePostalCodeValue(formData.postalCode || ''),\n geocode: true\n };\n\n Object.keys(params).forEach((key) => {\n if (!params[key]) {\n delete params[key];\n }\n });\n\n return params;\n};\n\nconst buildRequestKey = (formData, countryCode, lookupField = 'address1') => JSON.stringify({\n countryCode,\n address1: getLookupAddressLine(formData, lookupField),\n locality: formData.city || '',\n administrativeArea: formData.region || '',\n postalCode: normalizePostalCodeValue(formData.postalCode || '')\n});\n\nconst getPrecisionLabel = (precision) => PRECISION_LABELS[precision] || 'available level';\n\nconst buildValidationSummary = (item) => {\n const verificationStatus = item.analysis?.verification_status || 'None';\n const precision = item.analysis?.address_precision || 'None';\n const subBuildingChange = item.changes?.sub_building || item.changes?.components?.sub_building;\n const hasVerifiedSubBuilding = subBuildingChange?.startsWith('Verified');\n\n if (verificationStatus === 'Verified') {\n if (item.address2 && subBuildingChange && hasVerifiedSubBuilding) {\n return {\n code: 'verified-sub-building-changed',\n title: 'Verified with unit changes',\n message: 'This address is verified, but the apartment or suite information was changed.',\n sortPriority: 2\n };\n }\n\n return {\n code: 'verified',\n title: 'Verified',\n message: `This address is verified to the ${getPrecisionLabel(precision)} level.`,\n sortPriority: 1\n };\n }\n\n if (verificationStatus === 'Partial') {\n return {\n code: 'partial',\n title: 'Partially verified',\n message: `This address could only be verified to the ${getPrecisionLabel(precision)} level.`,\n sortPriority: 3\n };\n }\n\n if (verificationStatus === 'Ambiguous') {\n return {\n code: 'ambiguous',\n title: 'Multiple matches found',\n message: `Multiple possible matches were found at the ${getPrecisionLabel(precision)} level.`,\n sortPriority: 4\n };\n }\n\n return {\n code: 'not-verified',\n title: 'Not verified',\n message: 'This address could not be verified.',\n sortPriority: 5\n };\n};\n\nconst transformSuggestions = (responseData = []) => responseData\n .map((item) => ({\n ...item,\n displayText: [\n item.address1,\n item.address2,\n item.address3\n ].filter(Boolean).join(', '),\n validationSummary: buildValidationSummary(item)\n }))\n .sort((left, right) => left.validationSummary.sortPriority - right.validationSummary.sortPriority);\n\nconst useIntlAddressValidation = (formData, countryCode, trigger, lookupField = 'address1') => {\n const lookupValue = getLookupAddressLine(formData, lookupField);\n const isEnabled = Boolean(trigger && trigger !== 0 && lookupValue && countryCode);\n const requestParams = buildValidationParams(formData, countryCode, lookupField);\n const requestKey = `smarty-intl-validation:${buildRequestKey(formData, countryCode, lookupField)}`;\n\n return useAddressValidationBase({\n isEnabled,\n cacheNamespace: CACHE_NAMESPACE,\n cacheTtlMs: CACHE_TTL_MS,\n rateLimitNamespace: RATE_LIMIT_NAMESPACE,\n rateLimitConfig: RATE_LIMIT_CONFIG,\n requestKey,\n requestUrl: VERIFY_URL,\n requestParams,\n transformResponse: transformSuggestions,\n effectDeps: [trigger, lookupField]\n });\n};\n\nexport default useIntlAddressValidation;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _countries = require("../countries");
|
|
8
|
+
var _intlAutocompleteBusinessRules = require("../utils/intlAutocompleteBusinessRules");
|
|
9
|
+
var _smartyConfig = require("../utils/smartyConfig");
|
|
10
|
+
var _useSmartyLookupBase = _interopRequireDefault(require("./useSmartyLookupBase"));
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
const MIN_QUERY_LENGTH = 3;
|
|
13
|
+
const CACHE_NAMESPACE = 'smarty-intl-autocomplete';
|
|
14
|
+
const CACHE_TTL_MS = 60 * 1000;
|
|
15
|
+
const RATE_LIMIT_NAMESPACE = 'smarty-intl-autocomplete';
|
|
16
|
+
const RATE_LIMIT_CONFIG = {
|
|
17
|
+
limit: 15,
|
|
18
|
+
windowMs: 60 * 1000,
|
|
19
|
+
cooldownMs: 30 * 1000
|
|
20
|
+
};
|
|
21
|
+
const LOOKUP_URL = 'https://international-autocomplete.api.smarty.com/v2/lookup';
|
|
22
|
+
const buildCacheKey = (trimmedQuery, countryCode, selectedAddressId) => JSON.stringify({
|
|
23
|
+
query: trimmedQuery,
|
|
24
|
+
countryCode,
|
|
25
|
+
selectedAddressId: selectedAddressId || null
|
|
26
|
+
});
|
|
27
|
+
const buildLookupUrl = (trimmedQuery, countryCode, selectedAddressId) => {
|
|
28
|
+
const iso3 = _countries.COUNTRY_MAP[countryCode].iso3;
|
|
29
|
+
if (selectedAddressId) {
|
|
30
|
+
return `${LOOKUP_URL}/${selectedAddressId}?key=${_smartyConfig.SMARTY_INTL_AUTOCOMPLETE_KEY}&country=${iso3}&max_results=10`;
|
|
31
|
+
}
|
|
32
|
+
return `${LOOKUP_URL}?key=${_smartyConfig.SMARTY_INTL_AUTOCOMPLETE_KEY}&country=${iso3}&search=${encodeURIComponent(trimmedQuery)}&max_results=10`;
|
|
33
|
+
};
|
|
34
|
+
const transformSuggestions = (candidates = []) => candidates.map(result => {
|
|
35
|
+
if (result.street) {
|
|
36
|
+
return {
|
|
37
|
+
...result,
|
|
38
|
+
displayText: `${result.street}, ${result.locality}, ${result.administrative_area} ${result.postal_code}`,
|
|
39
|
+
isDetailed: true
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
let displayText = result.address_text;
|
|
43
|
+
if (result.entries > 1) {
|
|
44
|
+
displayText += ` (${result.entries})`;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
...result,
|
|
48
|
+
displayText,
|
|
49
|
+
isDetailed: false
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
const useSmartyInternationalLookup = (query, countryCode = '', selectedAddressId = null, debounceMs = 300) => {
|
|
53
|
+
const trimmedQuery = query.trim();
|
|
54
|
+
const isEnabled = Boolean((trimmedQuery && trimmedQuery.length >= MIN_QUERY_LENGTH || selectedAddressId) && countryCode && _countries.COUNTRY_MAP[countryCode]);
|
|
55
|
+
const cacheKey = buildCacheKey(trimmedQuery, countryCode, selectedAddressId);
|
|
56
|
+
const requestUrl = isEnabled ? buildLookupUrl(trimmedQuery, countryCode, selectedAddressId) : '';
|
|
57
|
+
return (0, _useSmartyLookupBase.default)({
|
|
58
|
+
isEnabled,
|
|
59
|
+
debounceMs,
|
|
60
|
+
cacheNamespace: CACHE_NAMESPACE,
|
|
61
|
+
cacheTtlMs: CACHE_TTL_MS,
|
|
62
|
+
rateLimitNamespace: RATE_LIMIT_NAMESPACE,
|
|
63
|
+
rateLimitConfig: RATE_LIMIT_CONFIG,
|
|
64
|
+
cacheKey,
|
|
65
|
+
requestUrl,
|
|
66
|
+
transformResponse: responseData => (0, _intlAutocompleteBusinessRules.applyIntlAutocompleteBusinessRules)(countryCode, transformSuggestions(responseData.candidates || [])),
|
|
67
|
+
onError: err => {
|
|
68
|
+
console.error('Smarty International lookup failed:', err);
|
|
69
|
+
},
|
|
70
|
+
effectDeps: [query, countryCode, selectedAddressId]
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
var _default = exports.default = useSmartyInternationalLookup;
|
|
74
|
+
//# sourceMappingURL=useSmartyInternationalLookup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSmartyInternationalLookup.js","names":["_countries","require","_intlAutocompleteBusinessRules","_smartyConfig","_useSmartyLookupBase","_interopRequireDefault","e","__esModule","default","MIN_QUERY_LENGTH","CACHE_NAMESPACE","CACHE_TTL_MS","RATE_LIMIT_NAMESPACE","RATE_LIMIT_CONFIG","limit","windowMs","cooldownMs","LOOKUP_URL","buildCacheKey","trimmedQuery","countryCode","selectedAddressId","JSON","stringify","query","buildLookupUrl","iso3","COUNTRY_MAP","SMARTY_INTL_AUTOCOMPLETE_KEY","encodeURIComponent","transformSuggestions","candidates","map","result","street","displayText","locality","administrative_area","postal_code","isDetailed","address_text","entries","useSmartyInternationalLookup","debounceMs","trim","isEnabled","Boolean","length","cacheKey","requestUrl","useSmartyLookupBase","cacheNamespace","cacheTtlMs","rateLimitNamespace","rateLimitConfig","transformResponse","responseData","applyIntlAutocompleteBusinessRules","onError","err","console","error","effectDeps","_default","exports"],"sources":["../../../src/addressLookup/hooks/useSmartyInternationalLookup.jsx"],"sourcesContent":["import { COUNTRY_MAP } from '../countries';\nimport { applyIntlAutocompleteBusinessRules } from '../utils/intlAutocompleteBusinessRules';\nimport { SMARTY_INTL_AUTOCOMPLETE_KEY } from '../utils/smartyConfig';\nimport useSmartyLookupBase from './useSmartyLookupBase';\n\nconst MIN_QUERY_LENGTH = 3;\nconst CACHE_NAMESPACE = 'smarty-intl-autocomplete';\nconst CACHE_TTL_MS = 60 * 1000;\nconst RATE_LIMIT_NAMESPACE = 'smarty-intl-autocomplete';\nconst RATE_LIMIT_CONFIG = {\n limit: 15,\n windowMs: 60 * 1000,\n cooldownMs: 30 * 1000\n};\nconst LOOKUP_URL = 'https://international-autocomplete.api.smarty.com/v2/lookup';\n\nconst buildCacheKey = (trimmedQuery, countryCode, selectedAddressId) => JSON.stringify({\n query: trimmedQuery,\n countryCode,\n selectedAddressId: selectedAddressId || null\n});\n\nconst buildLookupUrl = (trimmedQuery, countryCode, selectedAddressId) => {\n const iso3 = COUNTRY_MAP[countryCode].iso3;\n\n if (selectedAddressId) {\n return `${LOOKUP_URL}/${selectedAddressId}?key=${SMARTY_INTL_AUTOCOMPLETE_KEY}&country=${iso3}&max_results=10`;\n }\n\n return `${LOOKUP_URL}?key=${SMARTY_INTL_AUTOCOMPLETE_KEY}&country=${iso3}&search=${encodeURIComponent(trimmedQuery)}&max_results=10`;\n};\n\nconst transformSuggestions = (candidates = []) => candidates.map((result) => {\n if (result.street) {\n return {\n ...result,\n displayText: `${result.street}, ${result.locality}, ${result.administrative_area} ${result.postal_code}`,\n isDetailed: true\n };\n }\n\n let displayText = result.address_text;\n if (result.entries > 1) {\n displayText += ` (${result.entries})`;\n }\n\n return {\n ...result,\n displayText,\n isDetailed: false\n };\n});\n\nconst useSmartyInternationalLookup = (\n query,\n countryCode = '',\n selectedAddressId = null,\n debounceMs = 300\n) => {\n const trimmedQuery = query.trim();\n const isEnabled = Boolean(\n (((trimmedQuery && trimmedQuery.length >= MIN_QUERY_LENGTH) || selectedAddressId)) &&\n countryCode &&\n COUNTRY_MAP[countryCode]\n );\n const cacheKey = buildCacheKey(trimmedQuery, countryCode, selectedAddressId);\n const requestUrl = isEnabled ? buildLookupUrl(trimmedQuery, countryCode, selectedAddressId) : '';\n\n return useSmartyLookupBase({\n isEnabled,\n debounceMs,\n cacheNamespace: CACHE_NAMESPACE,\n cacheTtlMs: CACHE_TTL_MS,\n rateLimitNamespace: RATE_LIMIT_NAMESPACE,\n rateLimitConfig: RATE_LIMIT_CONFIG,\n cacheKey,\n requestUrl,\n transformResponse: (responseData) => (\n applyIntlAutocompleteBusinessRules(\n countryCode,\n transformSuggestions(responseData.candidates || [])\n )\n ),\n onError: (err) => {\n console.error('Smarty International lookup failed:', err);\n },\n effectDeps: [query, countryCode, selectedAddressId]\n });\n};\n\nexport default useSmartyInternationalLookup;\n"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,8BAAA,GAAAD,OAAA;AACA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,oBAAA,GAAAC,sBAAA,CAAAJ,OAAA;AAAwD,SAAAI,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAExD,MAAMG,gBAAgB,GAAG,CAAC;AAC1B,MAAMC,eAAe,GAAG,0BAA0B;AAClD,MAAMC,YAAY,GAAG,EAAE,GAAG,IAAI;AAC9B,MAAMC,oBAAoB,GAAG,0BAA0B;AACvD,MAAMC,iBAAiB,GAAG;EACxBC,KAAK,EAAE,EAAE;EACTC,QAAQ,EAAE,EAAE,GAAG,IAAI;EACnBC,UAAU,EAAE,EAAE,GAAG;AACnB,CAAC;AACD,MAAMC,UAAU,GAAG,6DAA6D;AAEhF,MAAMC,aAAa,GAAGA,CAACC,YAAY,EAAEC,WAAW,EAAEC,iBAAiB,KAAKC,IAAI,CAACC,SAAS,CAAC;EACrFC,KAAK,EAAEL,YAAY;EACnBC,WAAW;EACXC,iBAAiB,EAAEA,iBAAiB,IAAI;AAC1C,CAAC,CAAC;AAEF,MAAMI,cAAc,GAAGA,CAACN,YAAY,EAAEC,WAAW,EAAEC,iBAAiB,KAAK;EACvE,MAAMK,IAAI,GAAGC,sBAAW,CAACP,WAAW,CAAC,CAACM,IAAI;EAE1C,IAAIL,iBAAiB,EAAE;IACrB,OAAO,GAAGJ,UAAU,IAAII,iBAAiB,QAAQO,0CAA4B,YAAYF,IAAI,iBAAiB;EAChH;EAEA,OAAO,GAAGT,UAAU,QAAQW,0CAA4B,YAAYF,IAAI,WAAWG,kBAAkB,CAACV,YAAY,CAAC,iBAAiB;AACtI,CAAC;AAED,MAAMW,oBAAoB,GAAGA,CAACC,UAAU,GAAG,EAAE,KAAKA,UAAU,CAACC,GAAG,CAAEC,MAAM,IAAK;EAC3E,IAAIA,MAAM,CAACC,MAAM,EAAE;IACjB,OAAO;MACL,GAAGD,MAAM;MACTE,WAAW,EAAE,GAAGF,MAAM,CAACC,MAAM,KAAKD,MAAM,CAACG,QAAQ,KAAKH,MAAM,CAACI,mBAAmB,IAAIJ,MAAM,CAACK,WAAW,EAAE;MACxGC,UAAU,EAAE;IACd,CAAC;EACH;EAEA,IAAIJ,WAAW,GAAGF,MAAM,CAACO,YAAY;EACrC,IAAIP,MAAM,CAACQ,OAAO,GAAG,CAAC,EAAE;IACtBN,WAAW,IAAI,KAAKF,MAAM,CAACQ,OAAO,GAAG;EACvC;EAEA,OAAO;IACL,GAAGR,MAAM;IACTE,WAAW;IACXI,UAAU,EAAE;EACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAMG,4BAA4B,GAAGA,CACnClB,KAAK,EACLJ,WAAW,GAAG,EAAE,EAChBC,iBAAiB,GAAG,IAAI,EACxBsB,UAAU,GAAG,GAAG,KACb;EACH,MAAMxB,YAAY,GAAGK,KAAK,CAACoB,IAAI,CAAC,CAAC;EACjC,MAAMC,SAAS,GAAGC,OAAO,CACvB,CAAG3B,YAAY,IAAIA,YAAY,CAAC4B,MAAM,IAAItC,gBAAgB,IAAKY,iBAAiB,KAChFD,WAAW,IACXO,sBAAW,CAACP,WAAW,CACzB,CAAC;EACD,MAAM4B,QAAQ,GAAG9B,aAAa,CAACC,YAAY,EAAEC,WAAW,EAAEC,iBAAiB,CAAC;EAC5E,MAAM4B,UAAU,GAAGJ,SAAS,GAAGpB,cAAc,CAACN,YAAY,EAAEC,WAAW,EAAEC,iBAAiB,CAAC,GAAG,EAAE;EAEhG,OAAO,IAAA6B,4BAAmB,EAAC;IACzBL,SAAS;IACTF,UAAU;IACVQ,cAAc,EAAEzC,eAAe;IAC/B0C,UAAU,EAAEzC,YAAY;IACxB0C,kBAAkB,EAAEzC,oBAAoB;IACxC0C,eAAe,EAAEzC,iBAAiB;IAClCmC,QAAQ;IACRC,UAAU;IACVM,iBAAiB,EAAGC,YAAY,IAC9B,IAAAC,iEAAkC,EAChCrC,WAAW,EACXU,oBAAoB,CAAC0B,YAAY,CAACzB,UAAU,IAAI,EAAE,CACpD,CACD;IACD2B,OAAO,EAAGC,GAAG,IAAK;MAChBC,OAAO,CAACC,KAAK,CAAC,qCAAqC,EAAEF,GAAG,CAAC;IAC3D,CAAC;IACDG,UAAU,EAAE,CAACtC,KAAK,EAAEJ,WAAW,EAAEC,iBAAiB;EACpD,CAAC,CAAC;AACJ,CAAC;AAAC,IAAA0C,QAAA,GAAAC,OAAA,CAAAxD,OAAA,GAEakC,4BAA4B","ignoreList":[]}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _axios = _interopRequireDefault(require("axios"));
|
|
9
|
+
var _requestCache = require("../utils/requestCache");
|
|
10
|
+
var _requestRateLimiter = require("../utils/requestRateLimiter");
|
|
11
|
+
var _inFlightRequests = require("../utils/inFlightRequests");
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
const RATE_LIMIT_MESSAGE = 'Too many requests. Please wait a moment and try again.';
|
|
14
|
+
const useSmartyLookupBase = ({
|
|
15
|
+
isEnabled,
|
|
16
|
+
debounceMs,
|
|
17
|
+
cacheNamespace,
|
|
18
|
+
cacheTtlMs,
|
|
19
|
+
rateLimitNamespace,
|
|
20
|
+
rateLimitConfig,
|
|
21
|
+
cacheKey,
|
|
22
|
+
requestUrl,
|
|
23
|
+
transformResponse,
|
|
24
|
+
onError = null,
|
|
25
|
+
effectDeps = []
|
|
26
|
+
}) => {
|
|
27
|
+
const [suggestions, setSuggestions] = (0, _react.useState)([]);
|
|
28
|
+
const [loading, setLoading] = (0, _react.useState)(false);
|
|
29
|
+
const [error, setError] = (0, _react.useState)(null);
|
|
30
|
+
const [rateLimited, setRateLimited] = (0, _react.useState)(false);
|
|
31
|
+
const [responseTime, setResponseTime] = (0, _react.useState)(null);
|
|
32
|
+
(0, _react.useEffect)(() => {
|
|
33
|
+
if (!isEnabled) {
|
|
34
|
+
setSuggestions([]);
|
|
35
|
+
setLoading(false);
|
|
36
|
+
setError(null);
|
|
37
|
+
setRateLimited(false);
|
|
38
|
+
setResponseTime(null);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
setLoading(true);
|
|
42
|
+
setError(null);
|
|
43
|
+
let cancelled = false;
|
|
44
|
+
let activeRequest = null;
|
|
45
|
+
let activeRequestKey = null;
|
|
46
|
+
const timer = setTimeout(async () => {
|
|
47
|
+
try {
|
|
48
|
+
const cached = (0, _requestCache.getCachedValue)(cacheNamespace, cacheKey);
|
|
49
|
+
if (cached) {
|
|
50
|
+
if (!cancelled) {
|
|
51
|
+
setSuggestions(cached.suggestions);
|
|
52
|
+
setResponseTime(cached.responseTime);
|
|
53
|
+
setRateLimited(false);
|
|
54
|
+
setLoading(false);
|
|
55
|
+
}
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const rateLimitStatus = (0, _requestRateLimiter.checkRateLimit)(rateLimitNamespace, rateLimitConfig);
|
|
59
|
+
if (!rateLimitStatus.allowed) {
|
|
60
|
+
if (!cancelled) {
|
|
61
|
+
setSuggestions([]);
|
|
62
|
+
setResponseTime(null);
|
|
63
|
+
setRateLimited(true);
|
|
64
|
+
setError(RATE_LIMIT_MESSAGE);
|
|
65
|
+
setLoading(false);
|
|
66
|
+
}
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
activeRequestKey = cacheKey;
|
|
70
|
+
const existingRequest = (0, _inFlightRequests.getInFlightRequest)(activeRequestKey);
|
|
71
|
+
let response;
|
|
72
|
+
let elapsedTime;
|
|
73
|
+
if (existingRequest) {
|
|
74
|
+
activeRequest = (0, _inFlightRequests.retainInFlightRequest)(activeRequestKey);
|
|
75
|
+
({
|
|
76
|
+
response,
|
|
77
|
+
elapsedTime
|
|
78
|
+
} = await activeRequest.promise);
|
|
79
|
+
} else {
|
|
80
|
+
const controller = new AbortController();
|
|
81
|
+
const request = {
|
|
82
|
+
controller,
|
|
83
|
+
settled: false,
|
|
84
|
+
promise: (async () => {
|
|
85
|
+
const startTime = performance.now();
|
|
86
|
+
const networkResponse = await _axios.default.get(requestUrl, {
|
|
87
|
+
signal: controller.signal
|
|
88
|
+
});
|
|
89
|
+
const endTime = performance.now();
|
|
90
|
+
return {
|
|
91
|
+
response: networkResponse,
|
|
92
|
+
elapsedTime: Math.round(endTime - startTime)
|
|
93
|
+
};
|
|
94
|
+
})()
|
|
95
|
+
};
|
|
96
|
+
(0, _inFlightRequests.setInFlightRequest)(activeRequestKey, request);
|
|
97
|
+
activeRequest = (0, _inFlightRequests.retainInFlightRequest)(activeRequestKey);
|
|
98
|
+
try {
|
|
99
|
+
({
|
|
100
|
+
response,
|
|
101
|
+
elapsedTime
|
|
102
|
+
} = await activeRequest.promise);
|
|
103
|
+
} finally {
|
|
104
|
+
(0, _inFlightRequests.settleInFlightRequest)(activeRequestKey, activeRequest);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (cancelled) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const formattedSuggestions = transformResponse(response.data);
|
|
111
|
+
setResponseTime(elapsedTime);
|
|
112
|
+
(0, _requestCache.setCachedValue)(cacheNamespace, cacheKey, {
|
|
113
|
+
suggestions: formattedSuggestions,
|
|
114
|
+
responseTime: elapsedTime
|
|
115
|
+
}, cacheTtlMs);
|
|
116
|
+
setRateLimited(false);
|
|
117
|
+
setSuggestions(formattedSuggestions);
|
|
118
|
+
} catch (err) {
|
|
119
|
+
if (cancelled || err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
onError === null || onError === void 0 || onError(err);
|
|
123
|
+
setRateLimited(false);
|
|
124
|
+
setError(err.message);
|
|
125
|
+
setSuggestions([]);
|
|
126
|
+
setResponseTime(null);
|
|
127
|
+
} finally {
|
|
128
|
+
setLoading(false);
|
|
129
|
+
}
|
|
130
|
+
}, debounceMs);
|
|
131
|
+
return () => {
|
|
132
|
+
var _activeRequest, _activeRequest2;
|
|
133
|
+
cancelled = true;
|
|
134
|
+
clearTimeout(timer);
|
|
135
|
+
if (activeRequestKey && activeRequest) {
|
|
136
|
+
(0, _inFlightRequests.releaseInFlightRequest)(activeRequestKey, activeRequest);
|
|
137
|
+
}
|
|
138
|
+
if (((_activeRequest = activeRequest) === null || _activeRequest === void 0 ? void 0 : _activeRequest.subscribers) === 0 && !((_activeRequest2 = activeRequest) !== null && _activeRequest2 !== void 0 && _activeRequest2.settled)) {
|
|
139
|
+
activeRequest.controller.abort();
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
}, [isEnabled, debounceMs, ...effectDeps]);
|
|
143
|
+
return {
|
|
144
|
+
suggestions,
|
|
145
|
+
loading,
|
|
146
|
+
error,
|
|
147
|
+
rateLimited,
|
|
148
|
+
responseTime
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
var _default = exports.default = useSmartyLookupBase;
|
|
152
|
+
//# sourceMappingURL=useSmartyLookupBase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSmartyLookupBase.js","names":["_react","require","_axios","_interopRequireDefault","_requestCache","_requestRateLimiter","_inFlightRequests","e","__esModule","default","RATE_LIMIT_MESSAGE","useSmartyLookupBase","isEnabled","debounceMs","cacheNamespace","cacheTtlMs","rateLimitNamespace","rateLimitConfig","cacheKey","requestUrl","transformResponse","onError","effectDeps","suggestions","setSuggestions","useState","loading","setLoading","error","setError","rateLimited","setRateLimited","responseTime","setResponseTime","useEffect","cancelled","activeRequest","activeRequestKey","timer","setTimeout","cached","getCachedValue","rateLimitStatus","checkRateLimit","allowed","existingRequest","getInFlightRequest","response","elapsedTime","retainInFlightRequest","promise","controller","AbortController","request","settled","startTime","performance","now","networkResponse","axios","get","signal","endTime","Math","round","setInFlightRequest","settleInFlightRequest","formattedSuggestions","data","setCachedValue","err","name","code","message","_activeRequest","_activeRequest2","clearTimeout","releaseInFlightRequest","subscribers","abort","_default","exports"],"sources":["../../../src/addressLookup/hooks/useSmartyLookupBase.jsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport axios from 'axios';\nimport { getCachedValue, setCachedValue } from '../utils/requestCache';\nimport { checkRateLimit } from '../utils/requestRateLimiter';\nimport {\n getInFlightRequest,\n setInFlightRequest,\n retainInFlightRequest,\n releaseInFlightRequest,\n settleInFlightRequest\n} from '../utils/inFlightRequests';\n\nconst RATE_LIMIT_MESSAGE = 'Too many requests. Please wait a moment and try again.';\n\nconst useSmartyLookupBase = ({\n isEnabled,\n debounceMs,\n cacheNamespace,\n cacheTtlMs,\n rateLimitNamespace,\n rateLimitConfig,\n cacheKey,\n requestUrl,\n transformResponse,\n onError = null,\n effectDeps = []\n}) => {\n const [suggestions, setSuggestions] = useState([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [rateLimited, setRateLimited] = useState(false);\n const [responseTime, setResponseTime] = useState(null);\n\n useEffect(() => {\n if (!isEnabled) {\n setSuggestions([]);\n setLoading(false);\n setError(null);\n setRateLimited(false);\n setResponseTime(null);\n return;\n }\n\n setLoading(true);\n setError(null);\n let cancelled = false;\n let activeRequest = null;\n let activeRequestKey = null;\n\n const timer = setTimeout(async () => {\n try {\n const cached = getCachedValue(cacheNamespace, cacheKey);\n if (cached) {\n if (!cancelled) {\n setSuggestions(cached.suggestions);\n setResponseTime(cached.responseTime);\n setRateLimited(false);\n setLoading(false);\n }\n return;\n }\n\n const rateLimitStatus = checkRateLimit(rateLimitNamespace, rateLimitConfig);\n if (!rateLimitStatus.allowed) {\n if (!cancelled) {\n setSuggestions([]);\n setResponseTime(null);\n setRateLimited(true);\n setError(RATE_LIMIT_MESSAGE);\n setLoading(false);\n }\n return;\n }\n\n activeRequestKey = cacheKey;\n const existingRequest = getInFlightRequest(activeRequestKey);\n let response;\n let elapsedTime;\n\n if (existingRequest) {\n activeRequest = retainInFlightRequest(activeRequestKey);\n ({ response, elapsedTime } = await activeRequest.promise);\n } else {\n const controller = new AbortController();\n const request = {\n controller,\n settled: false,\n promise: (async () => {\n const startTime = performance.now();\n const networkResponse = await axios.get(requestUrl, { signal: controller.signal });\n const endTime = performance.now();\n return {\n response: networkResponse,\n elapsedTime: Math.round(endTime - startTime)\n };\n })()\n };\n setInFlightRequest(activeRequestKey, request);\n activeRequest = retainInFlightRequest(activeRequestKey);\n try {\n ({ response, elapsedTime } = await activeRequest.promise);\n } finally {\n settleInFlightRequest(activeRequestKey, activeRequest);\n }\n }\n\n if (cancelled) {\n return;\n }\n\n const formattedSuggestions = transformResponse(response.data);\n setResponseTime(elapsedTime);\n setCachedValue(cacheNamespace, cacheKey, {\n suggestions: formattedSuggestions,\n responseTime: elapsedTime\n }, cacheTtlMs);\n setRateLimited(false);\n setSuggestions(formattedSuggestions);\n } catch (err) {\n if (cancelled || err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n return;\n }\n onError?.(err);\n setRateLimited(false);\n setError(err.message);\n setSuggestions([]);\n setResponseTime(null);\n } finally {\n setLoading(false);\n }\n }, debounceMs);\n\n return () => {\n cancelled = true;\n clearTimeout(timer);\n if (activeRequestKey && activeRequest) {\n releaseInFlightRequest(activeRequestKey, activeRequest);\n }\n if (activeRequest?.subscribers === 0 && !activeRequest?.settled) {\n activeRequest.controller.abort();\n }\n };\n }, [isEnabled, debounceMs, ...effectDeps]);\n\n return {\n suggestions,\n loading,\n error,\n rateLimited,\n responseTime\n };\n};\n\nexport default useSmartyLookupBase;\n"],"mappings":"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","ignoreList":[]}
|