@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 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":"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","ignoreList":[]}