UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

167 lines 4.85 kB
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