@nuskin/shipping-address-form 1.0.0-pa-1057.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +229 -0
- package/dist/ShippingAddressForm.js +180 -0
- package/dist/ShippingAddressForm.js.map +1 -0
- package/dist/components/EgonResults.js +195 -0
- package/dist/components/EgonResults.js.map +1 -0
- package/dist/components/ShippingField.js +67 -0
- package/dist/components/ShippingField.js.map +1 -0
- package/dist/components/SmartyResults.js +257 -0
- package/dist/components/SmartyResults.js.map +1 -0
- package/dist/config/countries.js +32 -0
- package/dist/config/countries.js.map +1 -0
- package/dist/config/shipping/countries.js +138 -0
- package/dist/config/shipping/countries.js.map +1 -0
- package/dist/config/shipping/fields.js +31 -0
- package/dist/config/shipping/fields.js.map +1 -0
- package/dist/config/shipping/forms.js +21 -0
- package/dist/config/shipping/forms.js.map +1 -0
- package/dist/countries.js +262 -0
- package/dist/countries.js.map +1 -0
- package/dist/hooks/useAddressFieldLabels.js +28 -0
- package/dist/hooks/useAddressFieldLabels.js.map +1 -0
- package/dist/hooks/useShippingFormState.js +90 -0
- package/dist/hooks/useShippingFormState.js.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/styles/shippingAddressForm.css +113 -0
- package/dist/utils/shippingStrings.js +76 -0
- package/dist/utils/shippingStrings.js.map +1 -0
- package/package.json +68 -0
package/README.md
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# @nuskin/shipping-address-form
|
|
2
|
+
|
|
3
|
+
React wrapper around [`@nuskin/address-lookup`](https://www.npmjs.com/package/@nuskin/address-lookup) that adds shipping-specific fields and actions.
|
|
4
|
+
|
|
5
|
+
The component:
|
|
6
|
+
|
|
7
|
+
- renders address lookup/validation via `@nuskin/address-lookup`
|
|
8
|
+
- adds shipping fields such as `addressName`, `mobilePhone`, and `instructions`
|
|
9
|
+
- loads localized strings from Contentstack and passes `formStrings` into `AddressLookup`
|
|
10
|
+
- emits a single action callback for `save` and `cancel`
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
yarn add @nuskin/shipping-address-form
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Peer dependencies:
|
|
19
|
+
|
|
20
|
+
- `react`
|
|
21
|
+
- `react-dom`
|
|
22
|
+
- `axios`
|
|
23
|
+
|
|
24
|
+
Direct dependencies used by this package:
|
|
25
|
+
|
|
26
|
+
- `@nuskin/address-lookup`
|
|
27
|
+
- `react-phone-number-input`
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
```jsx
|
|
32
|
+
import ShippingAddressForm from '@nuskin/shipping-address-form'
|
|
33
|
+
|
|
34
|
+
export default function Example() {
|
|
35
|
+
const handleAction = (payload) => {
|
|
36
|
+
if (payload.type === 'cancel') {
|
|
37
|
+
return
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (payload.type === 'save') {
|
|
41
|
+
console.log(payload.data)
|
|
42
|
+
console.log(payload.validationStatus)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<ShippingAddressForm
|
|
48
|
+
country='US'
|
|
49
|
+
language='en'
|
|
50
|
+
address={{
|
|
51
|
+
address1: '123 Main St',
|
|
52
|
+
city: 'Provo',
|
|
53
|
+
region: 'UT',
|
|
54
|
+
postalCode: '84604',
|
|
55
|
+
email: 'user@example.com'
|
|
56
|
+
}}
|
|
57
|
+
onAction={handleAction}
|
|
58
|
+
/>
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Props
|
|
64
|
+
|
|
65
|
+
### `country`
|
|
66
|
+
|
|
67
|
+
- Type: `string`
|
|
68
|
+
- Default: `'US'`
|
|
69
|
+
|
|
70
|
+
Two-character country code used for:
|
|
71
|
+
|
|
72
|
+
- shipping field configuration
|
|
73
|
+
- initial phone country
|
|
74
|
+
- localized string lookup
|
|
75
|
+
- the underlying `AddressLookup` country
|
|
76
|
+
|
|
77
|
+
### `language`
|
|
78
|
+
|
|
79
|
+
- Type: `string | undefined`
|
|
80
|
+
|
|
81
|
+
Language code used to load localized strings for this component and `AddressLookup`.
|
|
82
|
+
|
|
83
|
+
### `address`
|
|
84
|
+
|
|
85
|
+
- Type: `object | null`
|
|
86
|
+
- Default: `null`
|
|
87
|
+
|
|
88
|
+
Initial form values. Shipping fields supported by this wrapper include:
|
|
89
|
+
|
|
90
|
+
- `addressName`
|
|
91
|
+
- `mobilePhone`
|
|
92
|
+
- `instructions`
|
|
93
|
+
- `saveToAccount`
|
|
94
|
+
- `saveAsDefault`
|
|
95
|
+
|
|
96
|
+
Address fields used by `@nuskin/address-lookup` can also be provided.
|
|
97
|
+
|
|
98
|
+
### `onAction`
|
|
99
|
+
|
|
100
|
+
- Type: `(payload) => void`
|
|
101
|
+
|
|
102
|
+
Single callback for form actions.
|
|
103
|
+
|
|
104
|
+
#### Cancel payload
|
|
105
|
+
|
|
106
|
+
```js
|
|
107
|
+
{ type: 'cancel' }
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
#### Save payload
|
|
111
|
+
|
|
112
|
+
Only emitted after:
|
|
113
|
+
|
|
114
|
+
- `AddressLookup` validation is triggered
|
|
115
|
+
- `AddressLookup` reports `status.completeness === 'complete'`
|
|
116
|
+
- required shipping fields are complete
|
|
117
|
+
|
|
118
|
+
```js
|
|
119
|
+
{
|
|
120
|
+
type: 'save',
|
|
121
|
+
data: {
|
|
122
|
+
address1: '123 Main St',
|
|
123
|
+
city: 'Provo',
|
|
124
|
+
region: 'UT',
|
|
125
|
+
postalCode: '84604',
|
|
126
|
+
email: 'user@example.com',
|
|
127
|
+
addressName: 'Home',
|
|
128
|
+
mobilePhone: '+18015551212',
|
|
129
|
+
instructions: 'Leave at front desk',
|
|
130
|
+
saveToAccount: true,
|
|
131
|
+
saveAsDefault: false
|
|
132
|
+
},
|
|
133
|
+
validationStatus: {
|
|
134
|
+
verification: 'verified',
|
|
135
|
+
completeness: 'complete',
|
|
136
|
+
missingFields: [],
|
|
137
|
+
mode: 'manual',
|
|
138
|
+
postalCode: { ... },
|
|
139
|
+
email: { ... }
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Validation behavior
|
|
145
|
+
|
|
146
|
+
### Address fields
|
|
147
|
+
|
|
148
|
+
Address validation is delegated to `@nuskin/address-lookup`.
|
|
149
|
+
|
|
150
|
+
When the Save button is clicked:
|
|
151
|
+
|
|
152
|
+
- `ShippingAddressForm` increments `validationRequestId`
|
|
153
|
+
- `AddressLookup` validates its fields
|
|
154
|
+
- if the returned callback payload is a complete `validation-request`, `ShippingAddressForm` may emit `onAction({ type: 'save', ... })`
|
|
155
|
+
|
|
156
|
+
### Shipping fields
|
|
157
|
+
|
|
158
|
+
Shipping field validation is handled locally.
|
|
159
|
+
|
|
160
|
+
- Required field errors show on blur and on save attempt.
|
|
161
|
+
- Phone validation uses `isPossiblePhoneNumber()` from `react-phone-number-input`.
|
|
162
|
+
- Invalid phone numbers show an error message and red field styling.
|
|
163
|
+
- Invalid phone format is currently non-blocking for save.
|
|
164
|
+
- Missing required shipping fields block save.
|
|
165
|
+
|
|
166
|
+
## Localization
|
|
167
|
+
|
|
168
|
+
Strings are loaded from Contentstack content type:
|
|
169
|
+
|
|
170
|
+
- `shipping_component`
|
|
171
|
+
|
|
172
|
+
This component uses shipping-level strings such as:
|
|
173
|
+
|
|
174
|
+
- `addressName`
|
|
175
|
+
- `mobilePhoneLabel`
|
|
176
|
+
- `instructionsLabel`
|
|
177
|
+
- `agreeToSaveAddress`
|
|
178
|
+
- `setDefault`
|
|
179
|
+
- `saveAddress`
|
|
180
|
+
- `cancel`
|
|
181
|
+
- `invalidPhone`
|
|
182
|
+
- `fieldRequired`
|
|
183
|
+
|
|
184
|
+
It also passes `formStrings` through to `@nuskin/address-lookup`.
|
|
185
|
+
|
|
186
|
+
When the phone country is changed, the phone label is reloaded for that selected country and cached for reuse.
|
|
187
|
+
|
|
188
|
+
## Styling
|
|
189
|
+
|
|
190
|
+
This package imports:
|
|
191
|
+
|
|
192
|
+
- `react-phone-number-input/style.css`
|
|
193
|
+
- `src/styles/shippingAddressForm.css` in the built package
|
|
194
|
+
|
|
195
|
+
The component uses namespaced CSS classes starting with:
|
|
196
|
+
|
|
197
|
+
- `.ns-shipping-address-form`
|
|
198
|
+
|
|
199
|
+
Examples:
|
|
200
|
+
|
|
201
|
+
- `.ns-shipping-address-form__input`
|
|
202
|
+
- `.ns-shipping-address-form__input--invalid`
|
|
203
|
+
- `.ns-shipping-address-form__phone`
|
|
204
|
+
- `.ns-shipping-address-form__error-text`
|
|
205
|
+
- `.ns-shipping-address-form__button`
|
|
206
|
+
|
|
207
|
+
The stylesheet also exposes CSS variables for common overrides:
|
|
208
|
+
|
|
209
|
+
- `--nssf-border-color`
|
|
210
|
+
- `--nssf-error-color`
|
|
211
|
+
- `--nssf-primary-color`
|
|
212
|
+
- `--nssf-surface-color`
|
|
213
|
+
- `--nssf-radius`
|
|
214
|
+
|
|
215
|
+
Parent applications can override these selectors or variables to customize styling.
|
|
216
|
+
|
|
217
|
+
## Development
|
|
218
|
+
|
|
219
|
+
Run the local test app:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
yarn dev
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Build the package:
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
yarn build
|
|
229
|
+
```
|
|
@@ -0,0 +1,180 @@
|
|
|
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 _addressLookup = _interopRequireDefault(require("@nuskin/address-lookup"));
|
|
9
|
+
require("react-phone-number-input/style.css");
|
|
10
|
+
require("./styles/shippingAddressForm.css");
|
|
11
|
+
var _useAddressFieldLabels = _interopRequireDefault(require("./hooks/useAddressFieldLabels.jsx"));
|
|
12
|
+
var _useShippingFormState = _interopRequireDefault(require("./hooks/useShippingFormState.jsx"));
|
|
13
|
+
var _ShippingField = _interopRequireDefault(require("./components/ShippingField.jsx"));
|
|
14
|
+
var _countries = require("./config/shipping/countries.js");
|
|
15
|
+
var _shippingStrings = require("./utils/shippingStrings.js");
|
|
16
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
17
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
18
|
+
const getFieldLabel = (fieldName, labels, phoneLabelOverride) => {
|
|
19
|
+
const labelMap = {
|
|
20
|
+
addressName: labels.addressNameLabel,
|
|
21
|
+
mobilePhone: phoneLabelOverride || labels.mobilePhoneLabel,
|
|
22
|
+
instructions: labels.instructionsLabel
|
|
23
|
+
};
|
|
24
|
+
return labelMap[fieldName] || fieldName;
|
|
25
|
+
};
|
|
26
|
+
const ShippingAddressForm = ({
|
|
27
|
+
country = 'US',
|
|
28
|
+
language,
|
|
29
|
+
onAction,
|
|
30
|
+
address = null
|
|
31
|
+
}) => {
|
|
32
|
+
const labels = (0, _useAddressFieldLabels.default)(country, language);
|
|
33
|
+
const {
|
|
34
|
+
fields,
|
|
35
|
+
layout
|
|
36
|
+
} = (0, _countries.resolveShippingCountryConfig)(country);
|
|
37
|
+
const [isSavePending, setIsSavePending] = (0, _react.useState)(false);
|
|
38
|
+
const [validationRequestId, setValidationRequestId] = (0, _react.useState)(0);
|
|
39
|
+
const [phoneCountry, setPhoneCountry] = (0, _react.useState)(country);
|
|
40
|
+
const [mobilePhoneLabel, setMobilePhoneLabel] = (0, _react.useState)(labels.mobilePhoneLabel);
|
|
41
|
+
const {
|
|
42
|
+
values,
|
|
43
|
+
setFieldValue,
|
|
44
|
+
touchField,
|
|
45
|
+
markAllTouched,
|
|
46
|
+
resetValidationState,
|
|
47
|
+
getFieldError,
|
|
48
|
+
getValidationErrors
|
|
49
|
+
} = (0, _useShippingFormState.default)({
|
|
50
|
+
address,
|
|
51
|
+
shippingFields: fields,
|
|
52
|
+
labels
|
|
53
|
+
});
|
|
54
|
+
(0, _react.useEffect)(() => {
|
|
55
|
+
setPhoneCountry(country);
|
|
56
|
+
setMobilePhoneLabel(labels.mobilePhoneLabel);
|
|
57
|
+
}, [country, labels.mobilePhoneLabel]);
|
|
58
|
+
(0, _react.useEffect)(() => {
|
|
59
|
+
if (!values.saveToAccount && values.saveAsDefault) {
|
|
60
|
+
setFieldValue('saveAsDefault', false);
|
|
61
|
+
}
|
|
62
|
+
}, [setFieldValue, values.saveAsDefault, values.saveToAccount]);
|
|
63
|
+
const handleAddressSelect = data => {
|
|
64
|
+
var _data$status;
|
|
65
|
+
if (!isSavePending || (data === null || data === void 0 ? void 0 : data.type) !== 'validation-request') {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
setIsSavePending(false);
|
|
69
|
+
const shippingValidationErrors = getValidationErrors();
|
|
70
|
+
const isAddressLookupComplete = (data === null || data === void 0 || (_data$status = data.status) === null || _data$status === void 0 ? void 0 : _data$status.completeness) === 'complete';
|
|
71
|
+
const isShippingComplete = shippingValidationErrors.length === 0;
|
|
72
|
+
if (!isAddressLookupComplete || !isShippingComplete) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
onAction === null || onAction === void 0 || onAction({
|
|
76
|
+
type: 'save',
|
|
77
|
+
data: {
|
|
78
|
+
...data.address,
|
|
79
|
+
addressName: values.addressName,
|
|
80
|
+
mobilePhone: values.mobilePhone,
|
|
81
|
+
instructions: values.instructions,
|
|
82
|
+
saveToAccount: values.saveToAccount,
|
|
83
|
+
saveAsDefault: values.saveAsDefault
|
|
84
|
+
},
|
|
85
|
+
validationStatus: data.status
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
const handlePhoneCountryChange = async nextCountry => {
|
|
89
|
+
const resolvedCountry = nextCountry || country;
|
|
90
|
+
setPhoneCountry(resolvedCountry);
|
|
91
|
+
const resolvedLabels = await (0, _shippingStrings.getShippingLabels)({
|
|
92
|
+
country: resolvedCountry,
|
|
93
|
+
language
|
|
94
|
+
});
|
|
95
|
+
setMobilePhoneLabel(resolvedLabels.mobilePhoneLabel);
|
|
96
|
+
};
|
|
97
|
+
const handleSaveAddress = () => {
|
|
98
|
+
markAllTouched();
|
|
99
|
+
setIsSavePending(true);
|
|
100
|
+
setValidationRequestId(currentValue => currentValue + 1);
|
|
101
|
+
};
|
|
102
|
+
const handleCancel = () => {
|
|
103
|
+
setIsSavePending(false);
|
|
104
|
+
resetValidationState();
|
|
105
|
+
onAction === null || onAction === void 0 || onAction({
|
|
106
|
+
type: 'cancel'
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
const renderLayoutItem = (layoutItem, index) => {
|
|
110
|
+
if (layoutItem.type === 'component' && layoutItem.component === 'addressLookup') {
|
|
111
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_addressLookup.default, {
|
|
112
|
+
country: country,
|
|
113
|
+
language: language,
|
|
114
|
+
strings: labels.formStrings,
|
|
115
|
+
validationRequestId: validationRequestId,
|
|
116
|
+
onAddressSelect: handleAddressSelect,
|
|
117
|
+
initialAddress: address
|
|
118
|
+
}, `addressLookup-${index}`);
|
|
119
|
+
}
|
|
120
|
+
if (layoutItem.type === 'field') {
|
|
121
|
+
const fieldConfig = fields[layoutItem.field];
|
|
122
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ShippingField.default, {
|
|
123
|
+
fieldConfig: fieldConfig,
|
|
124
|
+
label: getFieldLabel(fieldConfig.field, labels, mobilePhoneLabel),
|
|
125
|
+
value: values[fieldConfig.field],
|
|
126
|
+
error: getFieldError(fieldConfig),
|
|
127
|
+
country: phoneCountry,
|
|
128
|
+
countries: _countries.SHIPPING_COUNTRIES,
|
|
129
|
+
onChange: nextValue => setFieldValue(fieldConfig.field, nextValue),
|
|
130
|
+
onBlur: () => touchField(fieldConfig.field),
|
|
131
|
+
onPhoneCountryChange: handlePhoneCountryChange
|
|
132
|
+
}, fieldConfig.field);
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
};
|
|
136
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
137
|
+
className: "ns-shipping-address-form",
|
|
138
|
+
children: [layout.map(renderLayoutItem), /*#__PURE__*/(0, _jsxRuntime.jsx)("hr", {
|
|
139
|
+
className: "ns-shipping-address-form__separator"
|
|
140
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
141
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("label", {
|
|
142
|
+
className: "ns-shipping-address-form__checkbox-label ns-shipping-address-form__checkbox-label--spaced",
|
|
143
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
|
|
144
|
+
type: "checkbox",
|
|
145
|
+
checked: values.saveToAccount,
|
|
146
|
+
onChange: e => setFieldValue('saveToAccount', e.target.checked),
|
|
147
|
+
className: "ns-shipping-address-form__checkbox"
|
|
148
|
+
}), labels.agreeToSaveAddressLabel]
|
|
149
|
+
})
|
|
150
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
151
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("label", {
|
|
152
|
+
className: "ns-shipping-address-form__checkbox-label",
|
|
153
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
|
|
154
|
+
type: "checkbox",
|
|
155
|
+
checked: values.saveAsDefault,
|
|
156
|
+
onChange: e => setFieldValue('saveAsDefault', e.target.checked),
|
|
157
|
+
className: "ns-shipping-address-form__checkbox",
|
|
158
|
+
disabled: !values.saveToAccount
|
|
159
|
+
}), labels.setDefaultLabel]
|
|
160
|
+
})
|
|
161
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("hr", {
|
|
162
|
+
className: "ns-shipping-address-form__separator"
|
|
163
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
164
|
+
className: "ns-shipping-address-form__actions",
|
|
165
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
|
|
166
|
+
type: "button",
|
|
167
|
+
onClick: handleSaveAddress,
|
|
168
|
+
className: "ns-shipping-address-form__button ns-shipping-address-form__button--primary",
|
|
169
|
+
children: labels.saveAddressButtonLabel
|
|
170
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
|
|
171
|
+
type: "button",
|
|
172
|
+
onClick: handleCancel,
|
|
173
|
+
className: "ns-shipping-address-form__button ns-shipping-address-form__button--secondary",
|
|
174
|
+
children: labels.cancelLabel
|
|
175
|
+
})]
|
|
176
|
+
})]
|
|
177
|
+
});
|
|
178
|
+
};
|
|
179
|
+
var _default = exports.default = ShippingAddressForm;
|
|
180
|
+
//# sourceMappingURL=ShippingAddressForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShippingAddressForm.js","names":["_react","require","_addressLookup","_interopRequireDefault","_useAddressFieldLabels","_useShippingFormState","_ShippingField","_countries","_shippingStrings","_jsxRuntime","e","__esModule","default","getFieldLabel","fieldName","labels","phoneLabelOverride","labelMap","addressName","addressNameLabel","mobilePhone","mobilePhoneLabel","instructions","instructionsLabel","ShippingAddressForm","country","language","onAction","address","useAddressFieldLabels","fields","layout","resolveShippingCountryConfig","isSavePending","setIsSavePending","useState","validationRequestId","setValidationRequestId","phoneCountry","setPhoneCountry","setMobilePhoneLabel","values","setFieldValue","touchField","markAllTouched","resetValidationState","getFieldError","getValidationErrors","useShippingFormState","shippingFields","useEffect","saveToAccount","saveAsDefault","handleAddressSelect","data","_data$status","type","shippingValidationErrors","isAddressLookupComplete","status","completeness","isShippingComplete","length","validationStatus","handlePhoneCountryChange","nextCountry","resolvedCountry","resolvedLabels","getShippingLabels","handleSaveAddress","currentValue","handleCancel","renderLayoutItem","layoutItem","index","component","jsx","strings","formStrings","onAddressSelect","initialAddress","fieldConfig","field","label","value","error","countries","SHIPPING_COUNTRIES","onChange","nextValue","onBlur","onPhoneCountryChange","jsxs","className","children","map","checked","target","agreeToSaveAddressLabel","disabled","setDefaultLabel","onClick","saveAddressButtonLabel","cancelLabel","_default","exports"],"sources":["../src/ShippingAddressForm.jsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport AddressLookup from '@nuskin/address-lookup'\nimport 'react-phone-number-input/style.css'\nimport './styles/shippingAddressForm.css'\nimport useAddressFieldLabels from './hooks/useAddressFieldLabels.jsx';\nimport useShippingFormState from './hooks/useShippingFormState.jsx';\nimport ShippingField from './components/ShippingField.jsx';\nimport { resolveShippingCountryConfig, SHIPPING_COUNTRIES } from './config/shipping/countries.js';\nimport { getShippingLabels } from './utils/shippingStrings.js';\n\nconst getFieldLabel = (fieldName, labels, phoneLabelOverride) => {\n const labelMap = {\n addressName: labels.addressNameLabel,\n mobilePhone: phoneLabelOverride || labels.mobilePhoneLabel,\n instructions: labels.instructionsLabel\n };\n\n return labelMap[fieldName] || fieldName;\n};\n\nconst ShippingAddressForm = ({\n country = 'US',\n language,\n onAction,\n address = null\n}) => {\n const labels = useAddressFieldLabels(country, language)\n const { fields, layout } = resolveShippingCountryConfig(country)\n const [isSavePending, setIsSavePending] = useState(false)\n const [validationRequestId, setValidationRequestId] = useState(0)\n const [phoneCountry, setPhoneCountry] = useState(country)\n const [mobilePhoneLabel, setMobilePhoneLabel] = useState(labels.mobilePhoneLabel)\n const {\n values,\n setFieldValue,\n touchField,\n markAllTouched,\n resetValidationState,\n getFieldError,\n getValidationErrors\n } = useShippingFormState({\n address,\n shippingFields: fields,\n labels\n });\n\n useEffect(() => {\n setPhoneCountry(country)\n setMobilePhoneLabel(labels.mobilePhoneLabel)\n }, [country, labels.mobilePhoneLabel])\n\n useEffect(() => {\n if (!values.saveToAccount && values.saveAsDefault) {\n setFieldValue('saveAsDefault', false);\n }\n }, [setFieldValue, values.saveAsDefault, values.saveToAccount])\n\n const handleAddressSelect = (data) => {\n if (!isSavePending || data?.type !== 'validation-request') {\n return;\n }\n\n setIsSavePending(false);\n\n const shippingValidationErrors = getValidationErrors();\n const isAddressLookupComplete = data?.status?.completeness === 'complete';\n const isShippingComplete = shippingValidationErrors.length === 0;\n\n if (!isAddressLookupComplete || !isShippingComplete) {\n return;\n }\n\n onAction?.({\n type: 'save',\n data: {\n ...data.address,\n addressName: values.addressName,\n mobilePhone: values.mobilePhone,\n instructions: values.instructions,\n saveToAccount: values.saveToAccount,\n saveAsDefault: values.saveAsDefault\n },\n validationStatus: data.status\n });\n }\n\n const handlePhoneCountryChange = async (nextCountry) => {\n const resolvedCountry = nextCountry || country;\n\n setPhoneCountry(resolvedCountry);\n\n const resolvedLabels = await getShippingLabels({\n country: resolvedCountry,\n language\n });\n\n setMobilePhoneLabel(resolvedLabels.mobilePhoneLabel);\n };\n\n const handleSaveAddress = () => {\n markAllTouched();\n setIsSavePending(true);\n setValidationRequestId((currentValue) => currentValue + 1);\n };\n\n const handleCancel = () => {\n setIsSavePending(false);\n resetValidationState();\n onAction?.({ type: 'cancel' });\n };\n\n const renderLayoutItem = (layoutItem, index) => {\n if (layoutItem.type === 'component' && layoutItem.component === 'addressLookup') {\n return (\n <AddressLookup\n key={`addressLookup-${index}`}\n country={country}\n language={language}\n strings={labels.formStrings}\n validationRequestId={validationRequestId}\n onAddressSelect={handleAddressSelect}\n initialAddress={address}\n />\n );\n }\n\n if (layoutItem.type === 'field') {\n const fieldConfig = fields[layoutItem.field];\n\n return (\n <ShippingField\n key={fieldConfig.field}\n fieldConfig={fieldConfig}\n label={getFieldLabel(fieldConfig.field, labels, mobilePhoneLabel)}\n value={values[fieldConfig.field]}\n error={getFieldError(fieldConfig)}\n country={phoneCountry}\n countries={SHIPPING_COUNTRIES}\n onChange={(nextValue) => setFieldValue(fieldConfig.field, nextValue)}\n onBlur={() => touchField(fieldConfig.field)}\n onPhoneCountryChange={handlePhoneCountryChange}\n />\n );\n }\n\n return null;\n };\n\n return (\n <div className='ns-shipping-address-form'>\n {layout.map(renderLayoutItem)}\n <hr className='ns-shipping-address-form__separator' />\n <div>\n <label className='ns-shipping-address-form__checkbox-label ns-shipping-address-form__checkbox-label--spaced'>\n <input\n type=\"checkbox\"\n checked={values.saveToAccount}\n onChange={(e) => setFieldValue('saveToAccount', e.target.checked)}\n className='ns-shipping-address-form__checkbox'\n />\n {labels.agreeToSaveAddressLabel}\n </label>\n </div>\n <div>\n <label className='ns-shipping-address-form__checkbox-label'>\n <input\n type=\"checkbox\"\n checked={values.saveAsDefault}\n onChange={(e) => setFieldValue('saveAsDefault', e.target.checked)}\n className='ns-shipping-address-form__checkbox'\n disabled={!values.saveToAccount}\n />\n {labels.setDefaultLabel}\n </label>\n </div>\n <hr className='ns-shipping-address-form__separator' />\n <div className='ns-shipping-address-form__actions'>\n <button\n type=\"button\"\n onClick={handleSaveAddress}\n className='ns-shipping-address-form__button ns-shipping-address-form__button--primary'\n >\n {labels.saveAddressButtonLabel}\n </button>\n <button\n type=\"button\"\n onClick={handleCancel}\n className='ns-shipping-address-form__button ns-shipping-address-form__button--secondary'\n >\n {labels.cancelLabel}\n </button>\n </div>\n </div>\n );\n};\n\nexport default ShippingAddressForm;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,195 @@
|
|
|
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 _useEgonLookup = _interopRequireDefault(require("../hooks/useEgonLookup"));
|
|
9
|
+
var _useEgonNormalize = _interopRequireDefault(require("../hooks/useEgonNormalize"));
|
|
10
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
const EgonResults = ({
|
|
13
|
+
countryCode,
|
|
14
|
+
onSelect
|
|
15
|
+
}) => {
|
|
16
|
+
const [query, setQuery] = (0, _react.useState)('');
|
|
17
|
+
const [selectedAddress, setSelectedAddress] = (0, _react.useState)(null);
|
|
18
|
+
const [houseNumber, setHouseNumber] = (0, _react.useState)('');
|
|
19
|
+
const [addressForNormalize, setAddressForNormalize] = (0, _react.useState)(null);
|
|
20
|
+
const [isWaitingForHouseNumber, setIsWaitingForHouseNumber] = (0, _react.useState)(false);
|
|
21
|
+
const shouldSearchRef = (0, _react.useRef)(true);
|
|
22
|
+
const {
|
|
23
|
+
suggestions,
|
|
24
|
+
loading,
|
|
25
|
+
error,
|
|
26
|
+
responseTime
|
|
27
|
+
} = (0, _useEgonLookup.default)(shouldSearchRef.current ? query : '', countryCode);
|
|
28
|
+
const {
|
|
29
|
+
normalizedAddress,
|
|
30
|
+
loading: normalizeLoading,
|
|
31
|
+
error: normalizeError,
|
|
32
|
+
responseTime: normalizeResponseTime
|
|
33
|
+
} = (0, _useEgonNormalize.default)(addressForNormalize, countryCode);
|
|
34
|
+
const handleSelect = address => {
|
|
35
|
+
shouldSearchRef.current = false;
|
|
36
|
+
if (!address.hn_num) {
|
|
37
|
+
// No house number - update field and wait for house number entry
|
|
38
|
+
setQuery(address.displayText);
|
|
39
|
+
setSelectedAddress(address);
|
|
40
|
+
setAddressForNormalize(null);
|
|
41
|
+
setIsWaitingForHouseNumber(true);
|
|
42
|
+
} else {
|
|
43
|
+
// Has house number - normalize immediately with just egoncode_place and hn
|
|
44
|
+
const normalizePayload = {
|
|
45
|
+
egoncode_place: address.id,
|
|
46
|
+
hn: address.hn_num + (address.hn_exp || '')
|
|
47
|
+
};
|
|
48
|
+
setQuery(address.displayText);
|
|
49
|
+
setSelectedAddress(address);
|
|
50
|
+
setAddressForNormalize(normalizePayload);
|
|
51
|
+
setIsWaitingForHouseNumber(false);
|
|
52
|
+
onSelect === null || onSelect === void 0 || onSelect({
|
|
53
|
+
type: 'egon',
|
|
54
|
+
address
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const handleHouseNumberSearch = () => {
|
|
59
|
+
if (selectedAddress && houseNumber) {
|
|
60
|
+
shouldSearchRef.current = false;
|
|
61
|
+
const addressWithHouseNumber = {
|
|
62
|
+
egoncode_place: selectedAddress.id,
|
|
63
|
+
hn: houseNumber
|
|
64
|
+
};
|
|
65
|
+
const formattedAddress = `${selectedAddress.displayText} ${houseNumber}`;
|
|
66
|
+
setQuery(formattedAddress);
|
|
67
|
+
setAddressForNormalize(addressWithHouseNumber);
|
|
68
|
+
setIsWaitingForHouseNumber(false);
|
|
69
|
+
onSelect === null || onSelect === void 0 || onSelect({
|
|
70
|
+
type: 'egon',
|
|
71
|
+
address: addressWithHouseNumber
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
const displayAddress = normalizedAddress || selectedAddress;
|
|
76
|
+
(0, _react.useEffect)(() => {
|
|
77
|
+
var _normalizedAddress$st;
|
|
78
|
+
if (normalizedAddress !== null && normalizedAddress !== void 0 && (_normalizedAddress$st = normalizedAddress.standard) !== null && _normalizedAddress$st !== void 0 && _normalizedAddress$st.full_address) {
|
|
79
|
+
shouldSearchRef.current = false;
|
|
80
|
+
setQuery(normalizedAddress.standard.full_address);
|
|
81
|
+
}
|
|
82
|
+
}, [normalizedAddress]);
|
|
83
|
+
const renderField = (label, value) => {
|
|
84
|
+
if (!value) return null;
|
|
85
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
86
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("strong", {
|
|
87
|
+
children: [label, ":"]
|
|
88
|
+
}), " ", value]
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
92
|
+
style: {
|
|
93
|
+
flex: '1 1 300px',
|
|
94
|
+
minWidth: '300px'
|
|
95
|
+
},
|
|
96
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h4", {
|
|
97
|
+
children: "Egon"
|
|
98
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
|
|
99
|
+
type: "text",
|
|
100
|
+
value: query,
|
|
101
|
+
onChange: e => {
|
|
102
|
+
shouldSearchRef.current = true;
|
|
103
|
+
setSelectedAddress(null);
|
|
104
|
+
setIsWaitingForHouseNumber(false);
|
|
105
|
+
setQuery(e.target.value);
|
|
106
|
+
},
|
|
107
|
+
placeholder: "Enter address...",
|
|
108
|
+
style: {
|
|
109
|
+
marginBottom: '10px',
|
|
110
|
+
padding: '8px',
|
|
111
|
+
width: '100%'
|
|
112
|
+
}
|
|
113
|
+
}), selectedAddress && !selectedAddress.hn_num && isWaitingForHouseNumber && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
114
|
+
style: {
|
|
115
|
+
display: 'flex',
|
|
116
|
+
gap: '5px',
|
|
117
|
+
marginBottom: '10px'
|
|
118
|
+
},
|
|
119
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
|
|
120
|
+
type: "text",
|
|
121
|
+
value: houseNumber,
|
|
122
|
+
onChange: e => setHouseNumber(e.target.value),
|
|
123
|
+
placeholder: "Enter house number...",
|
|
124
|
+
style: {
|
|
125
|
+
padding: '8px',
|
|
126
|
+
flex: 1
|
|
127
|
+
}
|
|
128
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
|
|
129
|
+
onClick: handleHouseNumberSearch,
|
|
130
|
+
style: {
|
|
131
|
+
padding: '8px'
|
|
132
|
+
},
|
|
133
|
+
children: "\uD83D\uDD0D"
|
|
134
|
+
})]
|
|
135
|
+
}), responseTime && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
136
|
+
style: {
|
|
137
|
+
fontSize: '12px',
|
|
138
|
+
color: '#666',
|
|
139
|
+
marginBottom: '10px'
|
|
140
|
+
},
|
|
141
|
+
children: ["Search response time: ", responseTime, "ms"]
|
|
142
|
+
}), loading && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
143
|
+
children: "Loading..."
|
|
144
|
+
}), error && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
145
|
+
children: ["Error: ", error]
|
|
146
|
+
}), selectedAddress && !isWaitingForHouseNumber ? /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
147
|
+
style: {
|
|
148
|
+
border: '1px solid #ccc',
|
|
149
|
+
padding: '10px',
|
|
150
|
+
borderRadius: '5px'
|
|
151
|
+
},
|
|
152
|
+
children: [normalizeLoading && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
153
|
+
children: "Normalizing..."
|
|
154
|
+
}), normalizeError && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
155
|
+
style: {
|
|
156
|
+
color: 'red'
|
|
157
|
+
},
|
|
158
|
+
children: ["Normalize Error: ", normalizeError]
|
|
159
|
+
}), normalizeResponseTime && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
160
|
+
style: {
|
|
161
|
+
fontSize: '12px',
|
|
162
|
+
color: '#666',
|
|
163
|
+
marginBottom: '10px'
|
|
164
|
+
},
|
|
165
|
+
children: ["Detail response time: ", normalizeResponseTime, "ms"]
|
|
166
|
+
}), displayAddress !== null && displayAddress !== void 0 && displayAddress.standard ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
167
|
+
children: [renderField('Address', displayAddress.standard.address), renderField('Full Address', displayAddress.standard.full_address), renderField('House Number', displayAddress.standard.hn), renderField('Street', displayAddress.standard.street), renderField('City', displayAddress.standard.city), renderField('State', displayAddress.standard.state), renderField('Province', displayAddress.standard.province), renderField('Region', displayAddress.standard.region), renderField('Postal Code', displayAddress.standard.zipcode), renderField('Country', displayAddress.standard.country)]
|
|
168
|
+
}) : displayAddress ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
169
|
+
children: [renderField('Street', `${displayAddress.hn_num || ''}${displayAddress.hn_exp || ''} ${displayAddress.street || ''}`.trim()), renderField('City', displayAddress.city), renderField('State', displayAddress.state), renderField('Province', displayAddress.province), renderField('Region', displayAddress.region), renderField('Postal Code', displayAddress.zipcode), renderField('Country', displayAddress.country)]
|
|
170
|
+
}) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
|
|
171
|
+
onClick: () => {
|
|
172
|
+
setSelectedAddress(null);
|
|
173
|
+
setQuery('');
|
|
174
|
+
setHouseNumber('');
|
|
175
|
+
setIsWaitingForHouseNumber(false);
|
|
176
|
+
},
|
|
177
|
+
style: {
|
|
178
|
+
marginTop: '8px',
|
|
179
|
+
padding: '4px 8px'
|
|
180
|
+
},
|
|
181
|
+
children: "Clear"
|
|
182
|
+
})]
|
|
183
|
+
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)("ul", {
|
|
184
|
+
children: suggestions.map((suggestion, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)("li", {
|
|
185
|
+
onClick: () => handleSelect(suggestion),
|
|
186
|
+
style: {
|
|
187
|
+
cursor: 'pointer'
|
|
188
|
+
},
|
|
189
|
+
children: suggestion.displayText
|
|
190
|
+
}, index))
|
|
191
|
+
})]
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
var _default = exports.default = EgonResults;
|
|
195
|
+
//# sourceMappingURL=EgonResults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EgonResults.js","names":["_react","require","_useEgonLookup","_interopRequireDefault","_useEgonNormalize","_jsxRuntime","e","__esModule","default","EgonResults","countryCode","onSelect","query","setQuery","useState","selectedAddress","setSelectedAddress","houseNumber","setHouseNumber","addressForNormalize","setAddressForNormalize","isWaitingForHouseNumber","setIsWaitingForHouseNumber","shouldSearchRef","useRef","suggestions","loading","error","responseTime","useEgonLookup","current","normalizedAddress","normalizeLoading","normalizeError","normalizeResponseTime","useEgonNormalize","handleSelect","address","hn_num","displayText","normalizePayload","egoncode_place","id","hn","hn_exp","type","handleHouseNumberSearch","addressWithHouseNumber","formattedAddress","displayAddress","useEffect","_normalizedAddress$st","standard","full_address","renderField","label","value","jsxs","children","style","flex","minWidth","jsx","onChange","target","placeholder","marginBottom","padding","width","display","gap","onClick","fontSize","color","border","borderRadius","Fragment","street","city","state","province","region","zipcode","country","trim","marginTop","map","suggestion","index","cursor","_default","exports"],"sources":["../../src/components/EgonResults.jsx"],"sourcesContent":["import { useState, useRef, useEffect } from 'react';\nimport useEgonLookup from '../hooks/useEgonLookup';\nimport useEgonNormalize from '../hooks/useEgonNormalize';\n\nconst EgonResults = ({ countryCode, onSelect }) => {\n const [query, setQuery] = useState('');\n const [selectedAddress, setSelectedAddress] = useState(null);\n const [houseNumber, setHouseNumber] = useState('');\n const [addressForNormalize, setAddressForNormalize] = useState(null);\n const [isWaitingForHouseNumber, setIsWaitingForHouseNumber] = useState(false);\n const shouldSearchRef = useRef(true);\n\n const { suggestions, loading, error, responseTime } = useEgonLookup(\n shouldSearchRef.current ? query : '',\n countryCode\n );\n const {\n normalizedAddress,\n loading: normalizeLoading,\n error: normalizeError,\n responseTime: normalizeResponseTime\n } = useEgonNormalize(addressForNormalize, countryCode);\n\n const handleSelect = (address) => {\n shouldSearchRef.current = false;\n if (!address.hn_num) {\n // No house number - update field and wait for house number entry\n setQuery(address.displayText);\n setSelectedAddress(address);\n setAddressForNormalize(null);\n setIsWaitingForHouseNumber(true);\n } else {\n // Has house number - normalize immediately with just egoncode_place and hn\n const normalizePayload = {\n egoncode_place: address.id,\n hn: address.hn_num + (address.hn_exp || '')\n };\n setQuery(address.displayText);\n setSelectedAddress(address);\n setAddressForNormalize(normalizePayload);\n setIsWaitingForHouseNumber(false);\n onSelect?.({ type: 'egon', address });\n }\n };\n\n const handleHouseNumberSearch = () => {\n if (selectedAddress && houseNumber) {\n shouldSearchRef.current = false;\n const addressWithHouseNumber = {\n egoncode_place: selectedAddress.id,\n hn: houseNumber\n };\n const formattedAddress = `${selectedAddress.displayText} ${houseNumber}`;\n setQuery(formattedAddress);\n setAddressForNormalize(addressWithHouseNumber);\n setIsWaitingForHouseNumber(false);\n onSelect?.({ type: 'egon', address: addressWithHouseNumber });\n }\n };\n\n const displayAddress = normalizedAddress || selectedAddress;\n\n useEffect(() => {\n if (normalizedAddress?.standard?.full_address) {\n shouldSearchRef.current = false;\n setQuery(normalizedAddress.standard.full_address);\n }\n }, [normalizedAddress]);\n\n const renderField = (label, value) => {\n if (!value) return null;\n return (\n <div>\n <strong>{label}:</strong> {value}\n </div>\n );\n };\n\n return (\n <div style={{ flex: '1 1 300px', minWidth: '300px' }}>\n <h4>Egon</h4>\n <input\n type=\"text\"\n value={query}\n onChange={(e) => {\n shouldSearchRef.current = true;\n setSelectedAddress(null);\n setIsWaitingForHouseNumber(false);\n setQuery(e.target.value);\n }}\n placeholder=\"Enter address...\"\n style={{ marginBottom: '10px', padding: '8px', width: '100%' }}\n />\n {selectedAddress && !selectedAddress.hn_num && isWaitingForHouseNumber && (\n <div style={{ display: 'flex', gap: '5px', marginBottom: '10px' }}>\n <input\n type=\"text\"\n value={houseNumber}\n onChange={(e) => setHouseNumber(e.target.value)}\n placeholder=\"Enter house number...\"\n style={{ padding: '8px', flex: 1 }}\n />\n <button onClick={handleHouseNumberSearch} style={{ padding: '8px' }}>\n 🔍\n </button>\n </div>\n )}\n {responseTime && (\n <div style={{ fontSize: '12px', color: '#666', marginBottom: '10px' }}>\n Search response time: {responseTime}ms\n </div>\n )}\n {loading && <div>Loading...</div>}\n {error && <div>Error: {error}</div>}\n {selectedAddress && !isWaitingForHouseNumber ? (\n <div style={{ border: '1px solid #ccc', padding: '10px', borderRadius: '5px' }}>\n {normalizeLoading && <div>Normalizing...</div>}\n {normalizeError && (\n <div style={{ color: 'red' }}>Normalize Error: {normalizeError}</div>\n )}\n {normalizeResponseTime && (\n <div style={{ fontSize: '12px', color: '#666', marginBottom: '10px' }}>\n Detail response time: {normalizeResponseTime}ms\n </div>\n )}\n {displayAddress?.standard ? (\n <>\n {renderField('Address', displayAddress.standard.address)}\n {renderField('Full Address', displayAddress.standard.full_address)}\n {renderField('House Number', displayAddress.standard.hn)}\n {renderField('Street', displayAddress.standard.street)}\n {renderField('City', displayAddress.standard.city)}\n {renderField('State', displayAddress.standard.state)}\n {renderField('Province', displayAddress.standard.province)}\n {renderField('Region', displayAddress.standard.region)}\n {renderField('Postal Code', displayAddress.standard.zipcode)}\n {renderField('Country', displayAddress.standard.country)}\n </>\n ) : displayAddress ? (\n <>\n {renderField(\n 'Street',\n `${displayAddress.hn_num || ''}${displayAddress.hn_exp || ''} ${displayAddress.street || ''}`.trim()\n )}\n {renderField('City', displayAddress.city)}\n {renderField('State', displayAddress.state)}\n {renderField('Province', displayAddress.province)}\n {renderField('Region', displayAddress.region)}\n {renderField('Postal Code', displayAddress.zipcode)}\n {renderField('Country', displayAddress.country)}\n </>\n ) : null}\n <button\n onClick={() => {\n setSelectedAddress(null);\n setQuery('');\n setHouseNumber('');\n setIsWaitingForHouseNumber(false);\n }}\n style={{ marginTop: '8px', padding: '4px 8px' }}\n >\n Clear\n </button>\n </div>\n ) : (\n <ul>\n {suggestions.map((suggestion, index) => (\n <li\n key={index}\n onClick={() => handleSelect(suggestion)}\n style={{ cursor: 'pointer' }}\n >\n {suggestion.displayText}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n};\n\nexport default EgonResults;\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,cAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAD,sBAAA,CAAAF,OAAA;AAAyD,IAAAI,WAAA,GAAAJ,OAAA;AAAA,SAAAE,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEzD,MAAMG,WAAW,GAAGA,CAAC;EAAEC,WAAW;EAAEC;AAAS,CAAC,KAAK;EACjD,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAG,IAAAC,eAAQ,EAAC,EAAE,CAAC;EACtC,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAG,IAAAF,eAAQ,EAAC,IAAI,CAAC;EAC5D,MAAM,CAACG,WAAW,EAAEC,cAAc,CAAC,GAAG,IAAAJ,eAAQ,EAAC,EAAE,CAAC;EAClD,MAAM,CAACK,mBAAmB,EAAEC,sBAAsB,CAAC,GAAG,IAAAN,eAAQ,EAAC,IAAI,CAAC;EACpE,MAAM,CAACO,uBAAuB,EAAEC,0BAA0B,CAAC,GAAG,IAAAR,eAAQ,EAAC,KAAK,CAAC;EAC7E,MAAMS,eAAe,GAAG,IAAAC,aAAM,EAAC,IAAI,CAAC;EAEpC,MAAM;IAAEC,WAAW;IAAEC,OAAO;IAAEC,KAAK;IAAEC;EAAa,CAAC,GAAG,IAAAC,sBAAa,EACjEN,eAAe,CAACO,OAAO,GAAGlB,KAAK,GAAG,EAAE,EACpCF,WACF,CAAC;EACD,MAAM;IACJqB,iBAAiB;IACjBL,OAAO,EAAEM,gBAAgB;IACzBL,KAAK,EAAEM,cAAc;IACrBL,YAAY,EAAEM;EAChB,CAAC,GAAG,IAAAC,yBAAgB,EAAChB,mBAAmB,EAAET,WAAW,CAAC;EAEtD,MAAM0B,YAAY,GAAIC,OAAO,IAAK;IAChCd,eAAe,CAACO,OAAO,GAAG,KAAK;IAC/B,IAAI,CAACO,OAAO,CAACC,MAAM,EAAE;MACnB;MACAzB,QAAQ,CAACwB,OAAO,CAACE,WAAW,CAAC;MAC7BvB,kBAAkB,CAACqB,OAAO,CAAC;MAC3BjB,sBAAsB,CAAC,IAAI,CAAC;MAC5BE,0BAA0B,CAAC,IAAI,CAAC;IAClC,CAAC,MAAM;MACL;MACA,MAAMkB,gBAAgB,GAAG;QACvBC,cAAc,EAAEJ,OAAO,CAACK,EAAE;QAC1BC,EAAE,EAAEN,OAAO,CAACC,MAAM,IAAID,OAAO,CAACO,MAAM,IAAI,EAAE;MAC5C,CAAC;MACD/B,QAAQ,CAACwB,OAAO,CAACE,WAAW,CAAC;MAC7BvB,kBAAkB,CAACqB,OAAO,CAAC;MAC3BjB,sBAAsB,CAACoB,gBAAgB,CAAC;MACxClB,0BAA0B,CAAC,KAAK,CAAC;MACjCX,QAAQ,aAARA,QAAQ,eAARA,QAAQ,CAAG;QAAEkC,IAAI,EAAE,MAAM;QAAER;MAAQ,CAAC,CAAC;IACvC;EACF,CAAC;EAED,MAAMS,uBAAuB,GAAGA,CAAA,KAAM;IACpC,IAAI/B,eAAe,IAAIE,WAAW,EAAE;MAClCM,eAAe,CAACO,OAAO,GAAG,KAAK;MAC/B,MAAMiB,sBAAsB,GAAG;QAC7BN,cAAc,EAAE1B,eAAe,CAAC2B,EAAE;QAClCC,EAAE,EAAE1B;MACN,CAAC;MACD,MAAM+B,gBAAgB,GAAG,GAAGjC,eAAe,CAACwB,WAAW,IAAItB,WAAW,EAAE;MACxEJ,QAAQ,CAACmC,gBAAgB,CAAC;MAC1B5B,sBAAsB,CAAC2B,sBAAsB,CAAC;MAC9CzB,0BAA0B,CAAC,KAAK,CAAC;MACjCX,QAAQ,aAARA,QAAQ,eAARA,QAAQ,CAAG;QAAEkC,IAAI,EAAE,MAAM;QAAER,OAAO,EAAEU;MAAuB,CAAC,CAAC;IAC/D;EACF,CAAC;EAED,MAAME,cAAc,GAAGlB,iBAAiB,IAAIhB,eAAe;EAE3D,IAAAmC,gBAAS,EAAC,MAAM;IAAA,IAAAC,qBAAA;IACd,IAAIpB,iBAAiB,aAAjBA,iBAAiB,gBAAAoB,qBAAA,GAAjBpB,iBAAiB,CAAEqB,QAAQ,cAAAD,qBAAA,eAA3BA,qBAAA,CAA6BE,YAAY,EAAE;MAC7C9B,eAAe,CAACO,OAAO,GAAG,KAAK;MAC/BjB,QAAQ,CAACkB,iBAAiB,CAACqB,QAAQ,CAACC,YAAY,CAAC;IACnD;EACF,CAAC,EAAE,CAACtB,iBAAiB,CAAC,CAAC;EAEvB,MAAMuB,WAAW,GAAGA,CAACC,KAAK,EAAEC,KAAK,KAAK;IACpC,IAAI,CAACA,KAAK,EAAE,OAAO,IAAI;IACvB,oBACE,IAAAnD,WAAA,CAAAoD,IAAA;MAAAC,QAAA,gBACE,IAAArD,WAAA,CAAAoD,IAAA;QAAAC,QAAA,GAASH,KAAK,EAAC,GAAC;MAAA,CAAQ,CAAC,KAAC,EAACC,KAAK;IAAA,CAC7B,CAAC;EAEV,CAAC;EAED,oBACE,IAAAnD,WAAA,CAAAoD,IAAA;IAAKE,KAAK,EAAE;MAAEC,IAAI,EAAE,WAAW;MAAEC,QAAQ,EAAE;IAAQ,CAAE;IAAAH,QAAA,gBACnD,IAAArD,WAAA,CAAAyD,GAAA;MAAAJ,QAAA,EAAI;IAAI,CAAI,CAAC,eACb,IAAArD,WAAA,CAAAyD,GAAA;MACEjB,IAAI,EAAC,MAAM;MACXW,KAAK,EAAE5C,KAAM;MACbmD,QAAQ,EAAGzD,CAAC,IAAK;QACfiB,eAAe,CAACO,OAAO,GAAG,IAAI;QAC9Bd,kBAAkB,CAAC,IAAI,CAAC;QACxBM,0BAA0B,CAAC,KAAK,CAAC;QACjCT,QAAQ,CAACP,CAAC,CAAC0D,MAAM,CAACR,KAAK,CAAC;MAC1B,CAAE;MACFS,WAAW,EAAC,kBAAkB;MAC9BN,KAAK,EAAE;QAAEO,YAAY,EAAE,MAAM;QAAEC,OAAO,EAAE,KAAK;QAAEC,KAAK,EAAE;MAAO;IAAE,CAChE,CAAC,EACDrD,eAAe,IAAI,CAACA,eAAe,CAACuB,MAAM,IAAIjB,uBAAuB,iBACpE,IAAAhB,WAAA,CAAAoD,IAAA;MAAKE,KAAK,EAAE;QAAEU,OAAO,EAAE,MAAM;QAAEC,GAAG,EAAE,KAAK;QAAEJ,YAAY,EAAE;MAAO,CAAE;MAAAR,QAAA,gBAChE,IAAArD,WAAA,CAAAyD,GAAA;QACEjB,IAAI,EAAC,MAAM;QACXW,KAAK,EAAEvC,WAAY;QACnB8C,QAAQ,EAAGzD,CAAC,IAAKY,cAAc,CAACZ,CAAC,CAAC0D,MAAM,CAACR,KAAK,CAAE;QAChDS,WAAW,EAAC,uBAAuB;QACnCN,KAAK,EAAE;UAAEQ,OAAO,EAAE,KAAK;UAAEP,IAAI,EAAE;QAAE;MAAE,CACpC,CAAC,eACF,IAAAvD,WAAA,CAAAyD,GAAA;QAAQS,OAAO,EAAEzB,uBAAwB;QAACa,KAAK,EAAE;UAAEQ,OAAO,EAAE;QAAM,CAAE;QAAAT,QAAA,EAAC;MAErE,CAAQ,CAAC;IAAA,CACN,CACN,EACA9B,YAAY,iBACX,IAAAvB,WAAA,CAAAoD,IAAA;MAAKE,KAAK,EAAE;QAAEa,QAAQ,EAAE,MAAM;QAAEC,KAAK,EAAE,MAAM;QAAEP,YAAY,EAAE;MAAO,CAAE;MAAAR,QAAA,GAAC,wBAC/C,EAAC9B,YAAY,EAAC,IACtC;IAAA,CAAK,CACN,EACAF,OAAO,iBAAI,IAAArB,WAAA,CAAAyD,GAAA;MAAAJ,QAAA,EAAK;IAAU,CAAK,CAAC,EAChC/B,KAAK,iBAAI,IAAAtB,WAAA,CAAAoD,IAAA;MAAAC,QAAA,GAAK,SAAO,EAAC/B,KAAK;IAAA,CAAM,CAAC,EAClCZ,eAAe,IAAI,CAACM,uBAAuB,gBAC1C,IAAAhB,WAAA,CAAAoD,IAAA;MAAKE,KAAK,EAAE;QAAEe,MAAM,EAAE,gBAAgB;QAAEP,OAAO,EAAE,MAAM;QAAEQ,YAAY,EAAE;MAAM,CAAE;MAAAjB,QAAA,GAC5E1B,gBAAgB,iBAAI,IAAA3B,WAAA,CAAAyD,GAAA;QAAAJ,QAAA,EAAK;MAAc,CAAK,CAAC,EAC7CzB,cAAc,iBACb,IAAA5B,WAAA,CAAAoD,IAAA;QAAKE,KAAK,EAAE;UAAEc,KAAK,EAAE;QAAM,CAAE;QAAAf,QAAA,GAAC,mBAAiB,EAACzB,cAAc;MAAA,CAAM,CACrE,EACAC,qBAAqB,iBACpB,IAAA7B,WAAA,CAAAoD,IAAA;QAAKE,KAAK,EAAE;UAAEa,QAAQ,EAAE,MAAM;UAAEC,KAAK,EAAE,MAAM;UAAEP,YAAY,EAAE;QAAO,CAAE;QAAAR,QAAA,GAAC,wBAC/C,EAACxB,qBAAqB,EAAC,IAC/C;MAAA,CAAK,CACN,EACAe,cAAc,aAAdA,cAAc,eAAdA,cAAc,CAAEG,QAAQ,gBACvB,IAAA/C,WAAA,CAAAoD,IAAA,EAAApD,WAAA,CAAAuE,QAAA;QAAAlB,QAAA,GACGJ,WAAW,CAAC,SAAS,EAAEL,cAAc,CAACG,QAAQ,CAACf,OAAO,CAAC,EACvDiB,WAAW,CAAC,cAAc,EAAEL,cAAc,CAACG,QAAQ,CAACC,YAAY,CAAC,EACjEC,WAAW,CAAC,cAAc,EAAEL,cAAc,CAACG,QAAQ,CAACT,EAAE,CAAC,EACvDW,WAAW,CAAC,QAAQ,EAAEL,cAAc,CAACG,QAAQ,CAACyB,MAAM,CAAC,EACrDvB,WAAW,CAAC,MAAM,EAAEL,cAAc,CAACG,QAAQ,CAAC0B,IAAI,CAAC,EACjDxB,WAAW,CAAC,OAAO,EAAEL,cAAc,CAACG,QAAQ,CAAC2B,KAAK,CAAC,EACnDzB,WAAW,CAAC,UAAU,EAAEL,cAAc,CAACG,QAAQ,CAAC4B,QAAQ,CAAC,EACzD1B,WAAW,CAAC,QAAQ,EAAEL,cAAc,CAACG,QAAQ,CAAC6B,MAAM,CAAC,EACrD3B,WAAW,CAAC,aAAa,EAAEL,cAAc,CAACG,QAAQ,CAAC8B,OAAO,CAAC,EAC3D5B,WAAW,CAAC,SAAS,EAAEL,cAAc,CAACG,QAAQ,CAAC+B,OAAO,CAAC;MAAA,CACxD,CAAC,GACDlC,cAAc,gBAChB,IAAA5C,WAAA,CAAAoD,IAAA,EAAApD,WAAA,CAAAuE,QAAA;QAAAlB,QAAA,GACGJ,WAAW,CACV,QAAQ,EACR,GAAGL,cAAc,CAACX,MAAM,IAAI,EAAE,GAAGW,cAAc,CAACL,MAAM,IAAI,EAAE,IAAIK,cAAc,CAAC4B,MAAM,IAAI,EAAE,EAAE,CAACO,IAAI,CAAC,CACrG,CAAC,EACA9B,WAAW,CAAC,MAAM,EAAEL,cAAc,CAAC6B,IAAI,CAAC,EACxCxB,WAAW,CAAC,OAAO,EAAEL,cAAc,CAAC8B,KAAK,CAAC,EAC1CzB,WAAW,CAAC,UAAU,EAAEL,cAAc,CAAC+B,QAAQ,CAAC,EAChD1B,WAAW,CAAC,QAAQ,EAAEL,cAAc,CAACgC,MAAM,CAAC,EAC5C3B,WAAW,CAAC,aAAa,EAAEL,cAAc,CAACiC,OAAO,CAAC,EAClD5B,WAAW,CAAC,SAAS,EAAEL,cAAc,CAACkC,OAAO,CAAC;MAAA,CAC/C,CAAC,GACD,IAAI,eACR,IAAA9E,WAAA,CAAAyD,GAAA;QACES,OAAO,EAAEA,CAAA,KAAM;UACbvD,kBAAkB,CAAC,IAAI,CAAC;UACxBH,QAAQ,CAAC,EAAE,CAAC;UACZK,cAAc,CAAC,EAAE,CAAC;UAClBI,0BAA0B,CAAC,KAAK,CAAC;QACnC,CAAE;QACFqC,KAAK,EAAE;UAAE0B,SAAS,EAAE,KAAK;UAAElB,OAAO,EAAE;QAAU,CAAE;QAAAT,QAAA,EACjD;MAED,CAAQ,CAAC;IAAA,CACN,CAAC,gBAEN,IAAArD,WAAA,CAAAyD,GAAA;MAAAJ,QAAA,EACGjC,WAAW,CAAC6D,GAAG,CAAC,CAACC,UAAU,EAAEC,KAAK,kBACjC,IAAAnF,WAAA,CAAAyD,GAAA;QAEES,OAAO,EAAEA,CAAA,KAAMnC,YAAY,CAACmD,UAAU,CAAE;QACxC5B,KAAK,EAAE;UAAE8B,MAAM,EAAE;QAAU,CAAE;QAAA/B,QAAA,EAE5B6B,UAAU,CAAChD;MAAW,GAJlBiD,KAKH,CACL;IAAC,CACA,CACL;EAAA,CACE,CAAC;AAEV,CAAC;AAAC,IAAAE,QAAA,GAAAC,OAAA,CAAAnF,OAAA,GAEaC,WAAW","ignoreList":[]}
|