{"version":3,"sources":["webpack:///./cartridges/app_storefront_widgets/cartridge/client/default/js/widgets/account/PasswordResetForm.js","webpack:///./cartridges/app_storefront_widgets/cartridge/client/default/js/widgets/forms/AddressForm.js","webpack:///./cartridges/app_storefront_widgets/cartridge/client/default/js/widgets/forms/GoogleAutocompleteField.js","webpack:///./cartridges/app_storefront_widgets/cartridge/client/default/js/widgets/toolbox/googleMgr.js"],"names":["AjaxForm","PasswordResetForm","onSubmitted","data","success","emitWithoutContext","AddressForm","prefs","addressFields","addressAutocompleteEnabled","addressAutocompleteProvider","onCountryChange","el","config","countryCode","getValue","updateFormData","then","updateAddressAutocomplete","currentSelector","document","querySelector","stateCode","postalCode","value","getAddressFields","split","handlePlaceChange","address","forEach","item","getById","addressField","name","getName","shortName","pop","setValue","autocompleteField","updateState","AutocompleteField","GoogleAutocompleteField","init","inited","handleFocus","initGoogleMapsApi","apiKey","field","ref","get","initGoogleAutocomplete","initEvents","bind","autocomplete","addListener","place","getPlace","addressComponents","address_components","parseAddress","parsedAddress","emit","setComponentRestrictions","country","googleApi","resolveGMapsFn","initialized","initializationPromise","Promise","resolve","window","googleMapsApiCallback","google","getAddressFieldsMappingConfig","address1","serviceObjectTypes","serviceObjectProperty","city","getAddressComponentByType","type","find","addressComponent","types","indexOf","getAddressField","fieldConfig","typesForMerge","aimProperty","targetAddressProperties","mergeType","Array","isArray","i","l","length","push","join","url","URL","searchParams","append","script","createElement","src","toString","async","body","appendChild","maps","places","Autocomplete","componentRestrictions","mappingConfig","Object","keys","reduce","addressObject"],"mappings":"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","file":"account.widgets~checkout.widgets.bundle.js","sourcesContent":["/**\n * @typedef {ReturnType<typeof import('widgets/forms/AjaxForm').default>} AjaxForm\n */\n\n/**\n * @param {AjaxForm} AjaxForm Base widget for extending\n * @returns {typeof PasswordResetForm} PasswordResetForm widget\n */\nexport default function (AjaxForm) {\n    /**\n     * @category widgets\n     * @subcategory account\n     * @class PasswordResetForm\n     * @augments AjaxForm\n     * @classdesc Represents PasswordResetForm component with next features:\n     * 1. Allow fire {@link PasswordResetForm#event:submitted} event on success response from backend\n     * 3. The main purpose of the widget is emit event that form was successfully submitted\n     *\n     * PasswordResetDialogForm widget should be a part of {@link PasswordResetModal} widgets that implement modal\n     * Widget has next relationship:\n     * * PasswordResetForm fire {@link PasswordResetForm#event:submitted} event that {@link PasswordResetModal} listens\n     * @property {string} data-widget - Widget name `PasswordResetForm`\n     * @example <caption>Example of PasswordResetForm widget usage</caption>\n     * <form\n     *      class=\"reset-password-form\"\n     *      action=\"${URLUtils.url('Account-PasswordResetDialogForm', 'mobile', pdict.mobile)}\"\n     *      method=\"POST\"\n     *      name=\"email-form\"\n     *      id=\"email-form\"\n     *      data-widget=\"passwordResetForm\"\n     *      data-id=\"passwordResetForm\"\n     *      data-event-submit.prevent=\"handleSubmit\"\n     *      data-widget-event-submitted=\"showModal\"\n     *  >\n     *      <div data-ref=\"errorMessageLabel\"></div>\n     *      {{^receivedMsgBody}}\n     *          <isprint value=\"${\n     *              formElement(pdict.profileForm.resetPassword.email).render()\n     *          }\" encoding=\"off\"/>\n     *          <div class=\"b-dialog-footer m-actions\">\n     *              <button\n     *                  type=\"submit\"\n     *                  class=\"b-button m-width_full\"\n     *                  data-widget=\"button\"\n     *                  data-widget-event-click=\"handleSubmit\"\n     *                  data-event-click.prevent=\"handleClick\"\n     *                  data-ref=\"lastFocusElement\"\n     *                  data-tau=\"forgot_password_submit\"\n     *                  data-id=\"submitButton\"\n     *              >\n     *                  ${Resource.msg('form.passwordReset.submit','forms',null)}\n     *              </button>\n     *          </div>\n     *      {{/receivedMsgBody}}\n     *  </form>\n     */\n    class PasswordResetForm extends AjaxForm {\n        /**\n         * @description Handle server response\n         * @emits PasswordResetForm#submitted\n         * @param {object} data - response data\n         * @returns {void}\n         */\n        onSubmitted(data) {\n            if (data.success) {\n                /**\n                 * @description Event to submitted form\n                 * @event PasswordResetForm#submitted\n                 */\n                this.emitWithoutContext('submitted', data);\n            } else {\n                super.onSubmitted(data);\n            }\n        }\n    }\n\n    return PasswordResetForm;\n}\n","/**\n * @typedef {ReturnType<typeof import('widgets/forms/AjaxForm').default>} AjaxForm\n * @typedef {InstanceType<ReturnType<typeof import('widgets/forms/BasicInput').default>>} basicInput\n *\n */\n\n/**\n * @param {AjaxForm} AjaxForm Base widget for extending\n * @returns {typeof AddressForm} Address Form widget\n */\nexport default function (AjaxForm) {\n    /**\n     * @category widgets\n     * @subcategory forms\n     * @class AddressForm\n     * @augments AjaxForm\n     * @classdesc Address form component with next features:\n     * 1. Initiates form definition update and autocomplete config on country change event.\n     * 2. After triggering state change on address autocomplete field, filles address fields with autocomplete data\n     *\n     * Widget has next relationship:\n     * * After country changing updates autocomplete config by calling {@link AutocompleteField#updateState}\n     *\n     * >* As an address autocomplete provider could be used different 3d parties.\n     * >* Class is not intended to be used directly, but instead concrete forms (like profile address, shipping / billing address) should extend this class.\n     * @property {string[]} data-address-fields - Form address fields array\n     * @property {boolean} [data-address-autocomplete-enabled=true] - Is address autocomplete enabled for the form\n     * @property {string} [data-address-autocomplete-provider=googleAutocomplete] - An identifier of address autocomplete form field\n     * @example <caption>Example of shipping form</caption>\n     * <form\n     *     autocomplete=\"on\"\n     *     novalidate\n     *     data-widget=\"shippingForm\"\n     *     data-event-submit.prevent=\"handleSubmit\"\n     *     ...\n     *     data-address-fields=\"${[\n     *         shippingFields.firstName.htmlName,\n     *         shippingFields.lastName.htmlName,\n     *         shippingFields.address1.htmlName,\n     *         shippingFields.address2.htmlName,\n     *         shippingFields.country.htmlName,\n     *         shippingFields.states.stateCode.htmlName,\n     *         shippingFields.city.htmlName,\n     *         shippingFields.postalCode.htmlName,\n     *         shippingFields.phone.htmlName\n     *     ].join(',')}\"\n     *     ...\n     *     data-form-definition-url=\"${URLUtils.url('Forms-FormDefinition', 'form', 'shipping')}\"\n     *     <isprint value=${pdict.forms.shippingForm.attributes} encoding=\"off\"/>\n     *     data-address-autocomplete-enabled=\"${!!require('util/sitepref').getValue('googleAutocompleteEnabled')}\"\n     * >\n     *     ...\n     *     <div\n     *         class=\"b-form-message\"\n     *         role=\"alert\"\n     *         hidden=\"hidden\"\n     *         data-ref=\"errorMessageLabel\"\n     *     ></div>\n     *     ...\n     * </form>\n     */\n    class AddressForm extends AjaxForm {\n        prefs() {\n            return {\n                addressFields: '',\n                addressAutocompleteEnabled: true,\n                addressAutocompleteProvider: 'googleAutocomplete',\n                ...super.prefs()\n            };\n        }\n\n        /**\n         * @description Update form html body, after country change\n         * @listens InputSelect#change\n         * @param {basicInput} el - Country code field\n         * @returns {void}\n         */\n        onCountryChange(el) {\n            this.config.countryCode = el.getValue();\n\n            this.updateFormData({ countryCode: this.config.countryCode })\n                .then(() => this.updateAddressAutocomplete()).then(() => {\n                    var currentSelector = document.querySelector(`form[data-address-selector=\"billingAddressSelector\"]`);\n                    if (currentSelector) {\n                        var stateCode = currentSelector.querySelector(`input[id$=\"states_stateCode\"]`);\n                        var postalCode = currentSelector.querySelector(`input[id$=\"addressFields_postalCode\"]`);\n                        if (stateCode && postalCode) {\n                            stateCode.value = '';\n                            postalCode.value = '';\n                        }\n                    }\n                });\n        }\n\n        /**\n         * @description Get address fields from prefs\n         * @returns {string[]} Address fields names, separated by a comma\n         */\n        getAddressFields() {\n            return this.prefs().addressFields.split(',');\n        }\n\n        /**\n         * @description Update address fields with new address object\n         * @listens GoogleAutoComplateField#placechanged\n         * @param {basicInput} el - Autocomplete input field\n         * @param {object} address - Address object\n         * @param {string} [address.address1] - Address 1\n         * @param {string} [address.city] - City\n         * @param {string} [address.county] - County\n         * @param {string} [address.postalCode] - Postal Code\n         * @param {string} [address.stateCode] - State code\n         * @returns {void}\n         */\n        handlePlaceChange(el, address) {\n            this.getAddressFields().forEach(item => {\n                this.getById(item, (/** @type {basicInput} */addressField) => {\n                    const name = addressField.getName() || '';\n                    const shortName = name.split('_').pop();\n\n                    if (shortName && (shortName in address)) {\n                        addressField.setValue(address[shortName] || '', true);\n                    }\n                });\n            });\n        }\n\n        /**\n         * @description Handles address autocomplete update with the current country code\n         * @returns {void}\n         */\n        updateAddressAutocomplete() {\n            if (this.prefs().addressAutocompleteEnabled) {\n                this.getById(this.prefs().addressAutocompleteProvider, (autocompleteField) => {\n                    autocompleteField.updateState(this.config.countryCode);\n                });\n            }\n        }\n    }\n\n    return AddressForm;\n}\n","/**\n * @typedef {ReturnType<typeof import('widgets/forms/AutocompleteField').default>} AutocompleteField\n */\n\nimport {\n    initGoogleMapsApi,\n    initGoogleAutocomplete,\n    parseAddress\n} from 'widgets/toolbox/googleMgr';\n\n/**\n * @param {AutocompleteField} AutocompleteField Base widget for extending\n * @returns {typeof GoogleAutocompleteField} Input Textarea widget\n */\nexport default function (AutocompleteField) {\n    /**\n     * @category widgets\n     * @subcategory forms\n     * @class GoogleAutocompleteField\n     * @augments AutocompleteField\n     * @classdesc Represents GoogleAutocompleteField components that implement Google Autocomplete functionality using Google Places API.\n     * It has next features:\n     * 1. Inits google autocomplete once user is clicked on the input field\n     * 2. Emits widget event with the suggested address by google autocomplete API\n     *\n     * GoogleAutocompleteField widget should receive countryCode\n     * and google maps API key values in order to properly init the google autocomplete functionality\n     * @property {string} data-country-code - current country code value\n     * @property {string} data-api-key - google maps API key\n     * @example <caption>Example of Google autocomplete field </caption>\n     *    <div\n     *        data-widget=\"googleAutocompleteField\"\n     *        data-widget-event-placechanged=\"handlePlaceChange\"\n     *        data-id=\"googleAutocomplete\"\n     *        data-api-key=\"...\"\n     *        data-country-code=\"US\"\n     *        ...\n     *    >\n     *        <label\n     *            class=\"b-form_section-label\"\n     *            for=\"dwfrm_shipping_shippingAddress_addressFields_quickFinder\"\n     *            ...\n     *        >\n     *            Quick Address Finder\n     *        </label>\n     *        <input\n     *            data-ref=\"field\"\n     *            id=\"dwfrm_shipping_shippingAddress_addressFields_quickFinder\"\n     *            type=\"text\"\n     *            class=\"b-input pac-target-input m-valid\"\n     *            placeholder=\"Start typing address or ZIP code\"\n     *            aria-describedby=\"dwfrm_shipping_shippingAddress_addressFields_quickFinder-error\"\n     *            name=\"dwfrm_shipping_shippingAddress_addressFields_quickFinder\"\n     *            value=\"\"\n     *            maxlength=\"2147483647\"\n     *            data-event-focus=\"handleFocus\"\n     *            data-event-blur=\"validate\"\n     *            autocomplete=\"off\"\n     *            ...\n     *        >\n     *        <div\n     *            role=\"alert\"\n     *            class=\"b-form_section-message m-hide\"\n     *            data-ref=\"errorFeedback\"\n     *            id=\"dwfrm_shipping_shippingAddress_addressFields_quickFinder-error\"\n     *            hidden=\"hidden\"\n     *            ...\n     *        >\n     *            ...error text\n     *        </div>\n     *    </div>\n     */\n    class GoogleAutocompleteField extends AutocompleteField {\n        /**\n          * @description Initialize widget logic\n          * @returns {void}\n          */\n        init() {\n            super.init();\n\n            this.inited = false;\n        }\n\n        /**\n         * @listens dom:focus\n         * @description Inits google API once field is focused\n         * @returns {void}\n         */\n        handleFocus() {\n            if (this.inited) {\n                return;\n            }\n\n            initGoogleMapsApi(this.config.apiKey).then(() => {\n                const field = /** @type {HTMLInputElement} */ (this.ref('field').get());\n\n                if (field) {\n                    initGoogleAutocomplete(field, this.prefs().countryCode)\n                        .then(this.initEvents.bind(this))\n                        .then(() => {\n                            this.inited = true;\n                        });\n                }\n            });\n        }\n\n        /**\n         * @description Inits google API events\n         * @param {object} autocomplete - google autocomplete\n         * @returns {void}\n         */\n        initEvents(autocomplete) {\n            if (!autocomplete) {\n                return;\n            }\n\n            this.autocomplete = autocomplete;\n\n            this.autocomplete.addListener('place_changed', () => {\n                var place = autocomplete.getPlace();\n                var addressComponents = place.address_components;\n\n                if (addressComponents) {\n                    parseAddress(addressComponents, this.prefs().countryCode).then((parsedAddress) => {\n                        if (parsedAddress) {\n                            /**\n                             * @description Event to trigger address form fields prefill\n                             * @event AddressForm#handlePlaceChange\n                             */\n                            this.emit('placechanged', parsedAddress);\n                        }\n                    });\n                }\n            });\n        }\n\n        /**\n         * @description Updates google API restrictions\n         * @param {string} countryCode - current country code\n         * @returns {void}\n         */\n        updateState(countryCode) {\n            if (countryCode && this.autocomplete) {\n                this.autocomplete.setComponentRestrictions({\n                    country: countryCode\n                });\n            }\n        }\n    }\n\n    return GoogleAutocompleteField;\n}\n","let googleApi;\nlet resolveGMapsFn;\nlet initialized = false;\n\nconst initializationPromise = new Promise((resolve) => {\n    resolveGMapsFn = resolve;\n});\n\n/**\n * @description callback fires once google maps api loaded\n */\n// @ts-ignore\nwindow.googleMapsApiCallback = () => {\n    // @ts-ignore\n    googleApi = window.google;\n\n    resolveGMapsFn();\n};\n\n/**\n * @description Return mapping config for provided country\n * @param {string} country - Mapping config country\n * @returns {object} Mapping config\n */\nfunction getAddressFieldsMappingConfig(country) {\n    const config = {\n        address1: {\n            serviceObjectTypes: ['street_number', 'route'],\n            serviceObjectProperty: 'long_name'\n        },\n        city: {\n            serviceObjectTypes: [['locality', 'postal_town']],\n            serviceObjectProperty: 'long_name'\n        },\n        stateCode: {\n            serviceObjectTypes: ['administrative_area_level_1'],\n            serviceObjectProperty: 'short_name'\n        },\n        postalCode: {\n            serviceObjectTypes: ['postal_code'],\n            serviceObjectProperty: 'long_name'\n        }\n    };\n    switch (country) {\n        case 'GB':\n            config.stateCode.serviceObjectTypes = ['administrative_area_level_2'];\n            break;\n        default:\n            break;\n    }\n\n    return config;\n}\n\n/**\n * @description Return address component by provided type\n * @param {Array} addressComponents - API address components\n * @param {string} type - Target component type\n * @returns {object|undefined} Address component\n */\nfunction getAddressComponentByType(addressComponents, type) {\n    return addressComponents.find((addressComponent) => {\n        return addressComponent.types.indexOf(type) > -1;\n    });\n}\n\n/**\n * @description Return address component by provided type\n * @param {object} addressComponents - API address components\n * @param {object} fieldConfig - Configuration object for current field\n * @returns {string} Address field\n */\nfunction getAddressField(addressComponents, fieldConfig) {\n    const typesForMerge = fieldConfig.serviceObjectTypes;\n    const aimProperty = fieldConfig.serviceObjectProperty;\n    const targetAddressProperties = [];\n    let addressComponent;\n\n    typesForMerge.forEach((mergeType) => {\n        if (Array.isArray(mergeType)) {\n            for (let i = 0, l = mergeType.length; i < l; i++) {\n                addressComponent = getAddressComponentByType(addressComponents, mergeType[i]);\n                if (addressComponent && addressComponent[aimProperty]) {\n                    break;\n                }\n            }\n        } else {\n            addressComponent = getAddressComponentByType(addressComponents, mergeType);\n        }\n\n        if (addressComponent && addressComponent[aimProperty]) {\n            targetAddressProperties.push(addressComponent[aimProperty]);\n        }\n    });\n    return targetAddressProperties.join(' ');\n}\n\n/**\n * @description Loads google maps API\n * @param {string} apiKey - api key\n * @returns {Promise} result\n */\nexport function initGoogleMapsApi(apiKey) {\n    if (!initialized) {\n        const url = new URL('https://maps.googleapis.com/maps/api/js');\n\n        url.searchParams.append('key', apiKey);\n        url.searchParams.append('libraries', 'places');\n        url.searchParams.append('callback', 'googleMapsApiCallback');\n\n        const script = document.createElement('script');\n        script.src = url.toString();\n        script.async = true;\n        script.type = 'text/javascript';\n\n        document.body.appendChild(script);\n\n        initialized = true;\n    }\n\n    return initializationPromise;\n}\n\n/**\n * @description Inits google autocomplete for the field\n * @param {HTMLInputElement} field - input field\n * @param {string} countryCode - country code to restrict search results\n * @returns {Promise} result\n */\nexport function initGoogleAutocomplete(field, countryCode) {\n    return Promise.resolve(new googleApi.maps.places.Autocomplete(\n        field, {\n            componentRestrictions: {\n                country: countryCode\n            }\n        }\n    ));\n}\n\n/**\n * @description Returns parsed address object\n * @param {Array} addressComponents - Array with google address components\n * @param {string} country - Components country\n * @returns {object} result\n */\nexport function parseAddress(addressComponents, country) {\n    const mappingConfig = getAddressFieldsMappingConfig(country);\n    const address = Object.keys(mappingConfig).reduce((addressObject, field) => {\n        addressObject[field] = getAddressField(addressComponents, mappingConfig[field]);\n\n        return addressObject;\n    }, {});\n\n    return Promise.resolve(address);\n}\n"],"sourceRoot":""}