@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.
Files changed (96) hide show
  1. package/README.md +54 -12
  2. package/dist/addressLookup/AddressLookup.js +74 -0
  3. package/dist/addressLookup/AddressLookup.js.map +1 -0
  4. package/dist/addressLookup/components/LocationPinIcon.js +33 -0
  5. package/dist/addressLookup/components/LocationPinIcon.js.map +1 -0
  6. package/dist/addressLookup/components/SmartyIntlResults.js +1020 -0
  7. package/dist/addressLookup/components/SmartyIntlResults.js.map +1 -0
  8. package/dist/addressLookup/components/SmartyUSResults.js +1001 -0
  9. package/dist/addressLookup/components/SmartyUSResults.js.map +1 -0
  10. package/dist/addressLookup/config/address/countries.js +61 -0
  11. package/dist/addressLookup/config/address/countries.js.map +1 -0
  12. package/dist/addressLookup/config/address/index.js +19 -0
  13. package/dist/addressLookup/config/address/index.js.map +1 -0
  14. package/dist/addressLookup/config/googleMaps.js +12 -0
  15. package/dist/addressLookup/config/googleMaps.js.map +1 -0
  16. package/dist/addressLookup/countries.js +19 -0
  17. package/dist/addressLookup/countries.js.map +1 -0
  18. package/dist/addressLookup/hooks/useAddressFieldLabels.js +41 -0
  19. package/dist/addressLookup/hooks/useAddressFieldLabels.js.map +1 -0
  20. package/dist/addressLookup/hooks/useAddressForm.js +36 -0
  21. package/dist/addressLookup/hooks/useAddressForm.js.map +1 -0
  22. package/dist/addressLookup/hooks/useAddressMapModal.js +136 -0
  23. package/dist/addressLookup/hooks/useAddressMapModal.js.map +1 -0
  24. package/dist/addressLookup/hooks/useAddressValidationBase.js +143 -0
  25. package/dist/addressLookup/hooks/useAddressValidationBase.js.map +1 -0
  26. package/dist/addressLookup/hooks/useInitialAddressVerification.js +57 -0
  27. package/dist/addressLookup/hooks/useInitialAddressVerification.js.map +1 -0
  28. package/dist/addressLookup/hooks/useIntlAddressValidation.js +122 -0
  29. package/dist/addressLookup/hooks/useIntlAddressValidation.js.map +1 -0
  30. package/dist/addressLookup/hooks/useSmartyInternationalLookup.js +74 -0
  31. package/dist/addressLookup/hooks/useSmartyInternationalLookup.js.map +1 -0
  32. package/dist/addressLookup/hooks/useSmartyLookupBase.js +152 -0
  33. package/dist/addressLookup/hooks/useSmartyLookupBase.js.map +1 -0
  34. package/dist/addressLookup/hooks/useSmartyUSLookup.js +79 -0
  35. package/dist/addressLookup/hooks/useSmartyUSLookup.js.map +1 -0
  36. package/dist/addressLookup/hooks/useUSAddressValidation.js +166 -0
  37. package/dist/addressLookup/hooks/useUSAddressValidation.js.map +1 -0
  38. package/dist/addressLookup/index.js +41 -0
  39. package/dist/addressLookup/index.js.map +1 -0
  40. package/dist/addressLookup/styles/addressLookup.css +383 -0
  41. package/dist/addressLookup/utils/addressForm.js +150 -0
  42. package/dist/addressLookup/utils/addressForm.js.map +1 -0
  43. package/dist/addressLookup/utils/addressMapping.js +190 -0
  44. package/dist/addressLookup/utils/addressMapping.js.map +1 -0
  45. package/dist/addressLookup/utils/addressStatus.js +173 -0
  46. package/dist/addressLookup/utils/addressStatus.js.map +1 -0
  47. package/dist/addressLookup/utils/addressStrings.js +159 -0
  48. package/dist/addressLookup/utils/addressStrings.js.map +1 -0
  49. package/dist/addressLookup/utils/addressVerification.js +66 -0
  50. package/dist/addressLookup/utils/addressVerification.js.map +1 -0
  51. package/dist/addressLookup/utils/addressWrapper.js +40 -0
  52. package/dist/addressLookup/utils/addressWrapper.js.map +1 -0
  53. package/dist/addressLookup/utils/componentPropTypes.js +118 -0
  54. package/dist/addressLookup/utils/componentPropTypes.js.map +1 -0
  55. package/dist/addressLookup/utils/googleMapsLoader.js +68 -0
  56. package/dist/addressLookup/utils/googleMapsLoader.js.map +1 -0
  57. package/dist/addressLookup/utils/inFlightRequests.js +50 -0
  58. package/dist/addressLookup/utils/inFlightRequests.js.map +1 -0
  59. package/dist/addressLookup/utils/intlAutocompleteBusinessRules.js +62 -0
  60. package/dist/addressLookup/utils/intlAutocompleteBusinessRules.js.map +1 -0
  61. package/dist/addressLookup/utils/requestCache.js +44 -0
  62. package/dist/addressLookup/utils/requestCache.js.map +1 -0
  63. package/dist/addressLookup/utils/requestRateLimiter.js +53 -0
  64. package/dist/addressLookup/utils/requestRateLimiter.js.map +1 -0
  65. package/dist/addressLookup/utils/smartyConfig.js +11 -0
  66. package/dist/addressLookup/utils/smartyConfig.js.map +1 -0
  67. package/dist/addressLookup/utils/validators.js +45 -0
  68. package/dist/addressLookup/utils/validators.js.map +1 -0
  69. package/dist/index.js +28 -1
  70. package/dist/index.js.map +1 -1
  71. package/dist/{ShippingAddressForm.js → shippingAddressForm/ShippingAddressForm.js} +10 -2
  72. package/dist/shippingAddressForm/ShippingAddressForm.js.map +1 -0
  73. package/dist/{components → shippingAddressForm/components}/ShippingField.js +32 -22
  74. package/dist/shippingAddressForm/components/ShippingField.js.map +1 -0
  75. package/dist/shippingAddressForm/hooks/useAddressFieldLabels.js.map +1 -0
  76. package/dist/shippingAddressForm/hooks/useShippingAddressForm.js.map +1 -0
  77. package/dist/shippingAddressForm/hooks/useShippingFormState.js.map +1 -0
  78. package/dist/shippingAddressForm/utils/emailVerify.js.map +1 -0
  79. package/dist/{utils → shippingAddressForm/utils}/shippingAddressForm.js +3 -3
  80. package/dist/shippingAddressForm/utils/shippingAddressForm.js.map +1 -0
  81. package/dist/shippingAddressForm/utils/shippingStrings.js.map +1 -0
  82. package/package.json +2 -3
  83. package/dist/ShippingAddressForm.js.map +0 -1
  84. package/dist/components/ShippingField.js.map +0 -1
  85. package/dist/hooks/useAddressFieldLabels.js.map +0 -1
  86. package/dist/hooks/useShippingAddressForm.js.map +0 -1
  87. package/dist/hooks/useShippingFormState.js.map +0 -1
  88. package/dist/utils/emailVerify.js.map +0 -1
  89. package/dist/utils/shippingAddressForm.js.map +0 -1
  90. package/dist/utils/shippingStrings.js.map +0 -1
  91. /package/dist/{hooks → shippingAddressForm/hooks}/useAddressFieldLabels.js +0 -0
  92. /package/dist/{hooks → shippingAddressForm/hooks}/useShippingAddressForm.js +0 -0
  93. /package/dist/{hooks → shippingAddressForm/hooks}/useShippingFormState.js +0 -0
  94. /package/dist/{styles → shippingAddressForm/styles}/shippingAddressForm.css +0 -0
  95. /package/dist/{utils → shippingAddressForm/utils}/emailVerify.js +0 -0
  96. /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":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,aAAA,GAAAH,OAAA;AACA,IAAAI,mBAAA,GAAAJ,OAAA;AACA,IAAAK,iBAAA,GAAAL,OAAA;AAMmC,SAAAE,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEnC,MAAMG,kBAAkB,GAAG,wDAAwD;AAEnF,MAAMC,wBAAwB,GAAGA,CAAC;EAChCC,SAAS;EACTC,cAAc,GAAG,IAAI;EACrBC,UAAU,GAAG,IAAI;EACjBC,kBAAkB;EAClBC,eAAe;EACfC,UAAU;EACVC,UAAU;EACVC,aAAa;EACbC,iBAAiB;EACjBC,UAAU,GAAG;AACf,CAAC,KAAK;EACJ,MAAMC,eAAe,GAAGC,IAAI,CAACC,SAAS,CAAC;IACrCZ,SAAS;IACTS;EACF,CAAC,CAAC;EACF,MAAM,CAACI,WAAW,EAAEC,cAAc,CAAC,GAAG,IAAAC,eAAQ,EAAC,EAAE,CAAC;EAClD,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAG,IAAAF,eAAQ,EAAC,KAAK,CAAC;EAC7C,MAAM,CAACG,KAAK,EAAEC,QAAQ,CAAC,GAAG,IAAAJ,eAAQ,EAAC,IAAI,CAAC;EACxC,MAAM,CAACK,WAAW,EAAEC,cAAc,CAAC,GAAG,IAAAN,eAAQ,EAAC,KAAK,CAAC;EACrD,MAAM,CAACO,cAAc,EAAEC,iBAAiB,CAAC,GAAG,IAAAR,eAAQ,EAACL,eAAe,CAAC;EAErE,MAAMc,oBAAoB,GAAGF,cAAc,KAAKZ,eAAe;EAE/D,IAAAe,gBAAS,EAAC,MAAM;IACdF,iBAAiB,CAACb,eAAe,CAAC;IAElC,IAAI,CAACV,SAAS,EAAE;MACdqB,cAAc,CAAC,KAAK,CAAC;MACrB;IACF;IAEA,IAAIK,SAAS,GAAG,KAAK;IACrB,IAAIC,aAAa,GAAG,IAAI;IACxB,IAAIC,gBAAgB,GAAG,IAAI;IAE3B,MAAMC,eAAe,GAAG,MAAAA,CAAA,KAAY;MAClCZ,UAAU,CAAC,IAAI,CAAC;MAChBE,QAAQ,CAAC,IAAI,CAAC;MACdL,cAAc,CAAC,EAAE,CAAC;MAElB,IAAI;QACF,MAAMgB,MAAM,GAAG7B,cAAc,GAAG,IAAA8B,4BAAc,EAAC9B,cAAc,EAAEI,UAAU,CAAC,GAAG,IAAI;QACjF,IAAIyB,MAAM,EAAE;UACV,IAAI,CAACJ,SAAS,EAAE;YACdL,cAAc,CAAC,KAAK,CAAC;YACrBP,cAAc,CAACgB,MAAM,CAACjB,WAAW,CAAC;YAClCI,UAAU,CAAC,KAAK,CAAC;UACnB;UACA;QACF;QAEA,MAAMe,eAAe,GAAG,IAAAC,kCAAc,EAAC9B,kBAAkB,EAAEC,eAAe,CAAC;QAC3E,IAAI,CAAC4B,eAAe,CAACE,OAAO,EAAE;UAC5Bb,cAAc,CAAC,IAAI,CAAC;UACpBF,QAAQ,CAACrB,kBAAkB,CAAC;UAC5BmB,UAAU,CAAC,KAAK,CAAC;UACjB;QACF;QAEAW,gBAAgB,GAAGvB,UAAU;QAC7B,MAAM8B,eAAe,GAAG,IAAAC,oCAAkB,EAACR,gBAAgB,CAAC;QAC5D,IAAIS,QAAQ;QAEZ,IAAIF,eAAe,EAAE;UACnBR,aAAa,GAAG,IAAAW,uCAAqB,EAACV,gBAAgB,CAAC;UACvD,CAAC;YAAES;UAAS,CAAC,GAAG,MAAMV,aAAa,CAACY,OAAO;QAC7C,CAAC,MAAM;UACL,MAAMC,UAAU,GAAG,IAAIC,eAAe,CAAC,CAAC;UACxC,MAAMC,OAAO,GAAG;YACdF,UAAU;YACVG,OAAO,EAAE,KAAK;YACdJ,OAAO,EAAE,CAAC,YAAY;cACpB,MAAMK,eAAe,GAAG,MAAMC,cAAK,CAACC,GAAG,CAACxC,UAAU,EAAE;gBAClDyC,MAAM,EAAExC,aAAa;gBACrByC,MAAM,EAAER,UAAU,CAACQ;cACrB,CAAC,CAAC;cACF,OAAO;gBAAEX,QAAQ,EAAEO;cAAgB,CAAC;YACtC,CAAC,EAAE;UACL,CAAC;UAED,IAAAK,oCAAkB,EAACrB,gBAAgB,EAAEc,OAAO,CAAC;UAC7Cf,aAAa,GAAG,IAAAW,uCAAqB,EAACV,gBAAgB,CAAC;UAEvD,IAAI;YACF,CAAC;cAAES;YAAS,CAAC,GAAG,MAAMV,aAAa,CAACY,OAAO;UAC7C,CAAC,SAAS;YACR,IAAAW,uCAAqB,EAACtB,gBAAgB,EAAED,aAAa,CAAC;UACxD;QACF;QAEA,IAAID,SAAS,EAAE;UACb;QACF;QAEA,MAAMyB,sBAAsB,GAAG3C,iBAAiB,CAAC6B,QAAQ,CAACe,IAAI,CAAC;QAC/D,IAAInD,cAAc,EAAE;UAClB,IAAAoD,4BAAc,EAACpD,cAAc,EAAEI,UAAU,EAAE;YACzCQ,WAAW,EAAEsC;UACf,CAAC,EAAEjD,UAAU,IAAIoD,SAAS,CAAC;QAC7B;QAEAjC,cAAc,CAAC,KAAK,CAAC;QACrBP,cAAc,CAACqC,sBAAsB,CAAC;MACxC,CAAC,CAAC,OAAOI,GAAG,EAAE;QAAA,IAAAC,aAAA;QACZ,IAAI9B,SAAS,IAAI6B,GAAG,CAACE,IAAI,KAAK,eAAe,IAAIF,GAAG,CAACG,IAAI,KAAK,cAAc,EAAE;UAC5E;QACF;QACArC,cAAc,CAAC,KAAK,CAAC;QACrBF,QAAQ,CAAC,EAAAqC,aAAA,GAAAD,GAAG,CAAClB,QAAQ,cAAAmB,aAAA,gBAAAA,aAAA,GAAZA,aAAA,CAAcJ,IAAI,cAAAI,aAAA,uBAAlBA,aAAA,CAAoBG,OAAO,KAAIJ,GAAG,CAACI,OAAO,CAAC;MACtD,CAAC,SAAS;QACR,IAAI,CAACjC,SAAS,EAAE;UACdT,UAAU,CAAC,KAAK,CAAC;QACnB;MACF;IACF,CAAC;IAEDY,eAAe,CAAC,CAAC;IAEjB,OAAO,MAAM;MAAA,IAAA+B,cAAA,EAAAC,eAAA;MACXnC,SAAS,GAAG,IAAI;MAChB,IAAIE,gBAAgB,IAAID,aAAa,EAAE;QACrC,IAAAmC,wCAAsB,EAAClC,gBAAgB,EAAED,aAAa,CAAC;MACzD;MACA,IAAI,EAAAiC,cAAA,GAAAjC,aAAa,cAAAiC,cAAA,uBAAbA,cAAA,CAAeG,WAAW,MAAK,CAAC,IAAI,GAAAF,eAAA,GAAClC,aAAa,cAAAkC,eAAA,eAAbA,eAAA,CAAelB,OAAO,GAAE;QAC/DhB,aAAa,CAACa,UAAU,CAACwB,KAAK,CAAC,CAAC;MAClC;IACF,CAAC;EACH,CAAC,EAAE,CAAChE,SAAS,EAAEU,eAAe,CAAC,CAAC;EAEhC,OAAO;IACLG,WAAW,EAAEW,oBAAoB,GAAG,EAAE,GAAGX,WAAW;IACpDG,OAAO,EAAEQ,oBAAoB,GAAGyC,OAAO,CAACjE,SAAS,CAAC,GAAGgB,OAAO;IAC5DE,KAAK,EAAEM,oBAAoB,GAAG,IAAI,GAAGN,KAAK;IAC1CE,WAAW,EAAEI,oBAAoB,GAAG,KAAK,GAAGJ;EAC9C,CAAC;AACH,CAAC;AAAC,IAAA8C,QAAA,GAAAC,OAAA,CAAAtE,OAAA,GAEaE,wBAAwB","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":"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","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":[]}