@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
167 lines • 4.85 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import React from 'react';
import Selection from "../../Field/Selection/index.js";
import useTranslation from "../../hooks/useTranslation.js";
import { fetchData, handleCountryPath, isSupportedCountryCode } from "../createContext.js";
export const supportedCountryCodes = ['NO'];
export const unsupportedCountryMessage = 'Postal code verification is not supported for {countryCode}.';
export const preResponseResolver = ({
value
}) => {
if (!value) {
return {
addresses: []
};
}
};
export const responseResolver = (data, handlerConfig) => {
const resolver = handlerConfig?.responseResolver;
if (typeof resolver === 'function') {
return resolver(data);
}
const payload = data?.addresses.map(item => {
const street = [item.street_name, item.house_number].filter(Boolean).join(' ');
const city = [item.postal_code, item.city].filter(Boolean).join(' ');
return {
item,
selected_value: street,
selectedKey: street || item['address_id'],
content: [street, city]
};
});
return {
payload
};
};
export function suggestions(generalConfig, handlerConfig) {
const abortControllerRef = {
current: null
};
return async function suggestionsHandlerWrapper(event) {
return await suggestionsHandler(event.value, event);
};
async function suggestionsHandler(value, additionalArgs) {
if (!(typeof value === 'string')) {
return;
}
const {
countryCode
} = handleCountryPath({
value,
countryCode: handlerConfig?.countryCode,
additionalArgs,
handler: suggestionsHandler
});
if (!isSupportedCountryCode(countryCode, supportedCountryCodes)) {
return;
}
try {
var _handlerConfig$preRes;
additionalArgs.showIndicator();
const parameters = {
countryCode: String(countryCode).toLowerCase()
};
const {
data
} = await fetchData(value, {
generalConfig,
parameters,
abortControllerRef,
preResponseResolver: (_handlerConfig$preRes = handlerConfig?.preResponseResolver) !== null && _handlerConfig$preRes !== void 0 ? _handlerConfig$preRes : preResponseResolver
});
const {
payload
} = responseResolver(data, handlerConfig);
additionalArgs.updateData(payload);
additionalArgs.hideIndicator();
} catch (error) {
additionalArgs.hideIndicator();
return error;
}
}
}
export function suggestionsElement(generalConfig, handlerConfig) {
const onType = suggestions(generalConfig, handlerConfig);
const onChange = (value, additionalArgs) => {
const {
cityPath,
postalCodePath
} = handlerConfig || {};
const data = additionalArgs?.data;
if (data) {
const dataContext = additionalArgs.dataContext;
dataContext.handlePathChangeUnvalidated(postalCodePath, data.item.postal_code);
dataContext.handlePathChangeUnvalidated(cityPath, data.item.city);
}
};
const Autocomplete = props => {
const {
suggestionPlaceholder
} = useTranslation().StreetAddress;
return React.createElement(Selection, _extends({
variant: "autocomplete"
}, props, {
autocompleteProps: {
mode: 'async',
disableFilter: true,
keepValue: true,
openOnFocus: true,
placeholder: suggestionPlaceholder,
onType,
...props?.autocompleteProps
},
onChange: onChange
}));
};
return Autocomplete;
}
export function getMockData(countryCode) {
switch (String(countryCode).toUpperCase()) {
case 'SE':
return {
addresses: []
};
case 'NO':
default:
return {
addresses: [{
address_id: '1398742',
street_name: 'Gransvea',
house_number: 37,
postal_code: '1391',
city: 'Vollen',
county: 'Akershus',
municipality: 'Asker',
type: 'STREET'
}, {
address_id: '3168496',
street_name: 'Gransvegen',
house_number: 1,
postal_code: '2090',
city: 'Hurdal',
county: 'Akershus',
municipality: 'Hurdal',
type: 'STREET'
}, {
address_id: '325829',
street_name: 'Gransveien',
house_number: 2,
postal_code: '1900',
city: 'Fetsund',
county: 'Akershus',
municipality: 'Lillestrøm',
type: 'STREET'
}, {
address_id: '325829',
street_name: 'Somewhere else',
house_number: 100,
postal_code: '1234',
city: 'City',
county: 'County',
municipality: 'Municipality',
type: 'STREET'
}]
};
}
}
//# sourceMappingURL=address.js.map