MDL-69166 core_payment: Use promises instead of callbacks
[moodle.git] / payment / amd / build / gateways_modal.min.js.map
1 {"version":3,"sources":["../src/gateways_modal.js"],"names":["registerEventListeners","document","addEventListener","e","gatewayTrigger","target","closest","preventDefault","show","focusOnClose","rootNode","ModalFactory","ModalGateways","TYPE","Templates","render","type","title","body","create","modal","rootElement","getRoot","on","ModalEvents","hidden","destroy","focus","PaymentEvents","proceed","gateway","querySelector","Selectors","values","value","processPayment","dataset","component","paymentarea","itemid","description","then","message","hide","Notification","addNotification","location","reload","catch","alert","matches","elements","gateways","updateCostRegion","cost","context","renderForPromise","html","js","replaceNodeContents","regions","gatewaysContainer","selectSingleGateway","root","querySelectorAll","length","checked","defaultCost","gatewayElement","surcharge","parseInt","fee","costContainer","paymentArea","itemId","paymentMethod","process","init","initialised"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Contain the logic for the gateways modal.\n *\n * @module     core_payment/gateways_modal\n * @package    core_payment\n * @copyright  2019 Shamim Rezaie <shamim@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport ModalFactory from 'core/modal_factory';\nimport Templates from 'core/templates';\nimport {get_string as getString} from 'core/str';\nimport {getAvailableGateways} from './repository';\nimport Selectors from './selectors';\nimport ModalEvents from 'core/modal_events';\nimport PaymentEvents from 'core_payment/events';\nimport {add as addToast, addToastRegion} from 'core/toast';\nimport Notification from 'core/notification';\nimport ModalGateways from './modal_gateways';\n\n/**\n * Register event listeners for the module.\n */\nconst registerEventListeners = () => {\n    document.addEventListener('click', e => {\n        const gatewayTrigger = e.target.closest('[data-action=\"core_payment/triggerPayment\"]');\n        if (gatewayTrigger) {\n            e.preventDefault();\n\n            show(gatewayTrigger, {focusOnClose: e.target});\n        }\n    });\n};\n\n/**\n * Shows the gateway selector modal.\n *\n * @param {HTMLElement} rootNode\n * @param {Object} options - Additional options\n * @param {HTMLElement} options.focusOnClose The element to focus on when the modal is closed.\n */\nconst show = async(rootNode, {\n    focusOnClose = null,\n} = {}) => {\n    const modal = await ModalFactory.create({\n        type: ModalGateways.TYPE,\n        title: await getString('selectpaymenttype', 'core_payment'),\n        body: await Templates.render('core_payment/gateways_modal', {}),\n    });\n\n    const rootElement = modal.getRoot()[0];\n    addToastRegion(rootElement);\n\n    modal.show();\n\n    modal.getRoot().on(ModalEvents.hidden, () => {\n        // Destroy when hidden.\n        modal.destroy();\n        try {\n            focusOnClose.focus();\n        } catch (e) {\n            // eslint-disable-line\n        }\n    });\n\n    modal.getRoot().on(PaymentEvents.proceed, (e) => {\n        const gateway = (rootElement.querySelector(Selectors.values.gateway) || {value: ''}).value;\n\n        if (gateway) {\n            processPayment(\n                gateway,\n                rootNode.dataset.component,\n                rootNode.dataset.paymentarea,\n                rootNode.dataset.itemid,\n                rootNode.dataset.description\n            )\n            .then(message => {\n                modal.hide();\n                Notification.addNotification({\n                    message: message,\n                    type: 'success',\n                });\n                location.reload();\n\n                // The following return statement is never reached. It is put here just to make eslint happy.\n                return message;\n            })\n            .catch(message => Notification.alert('', message));\n        } else {\n            // We cannot use await in the following line.\n            // The reason is that we are preventing the default action of the save event being triggered,\n            // therefore we cannot define the event handler function asynchronous.\n            getString('nogatewayselected', 'core_payment').then(message => addToast(message)).catch();\n        }\n\n        e.preventDefault();\n    });\n\n    // Re-calculate the cost when gateway is changed.\n    rootElement.addEventListener('change', e => {\n        if (e.target.matches(Selectors.elements.gateways)) {\n            updateCostRegion(rootElement, rootNode.dataset.cost);\n        }\n    });\n\n    const gateways = await getAvailableGateways(rootNode.dataset.component, rootNode.dataset.paymentarea, rootNode.dataset.itemid);\n    const context = {\n        gateways\n    };\n\n    const {html, js} = await Templates.renderForPromise('core_payment/gateways', context);\n    Templates.replaceNodeContents(rootElement.querySelector(Selectors.regions.gatewaysContainer), html, js);\n    selectSingleGateway(rootElement);\n    await updateCostRegion(rootElement, rootNode.dataset.cost);\n};\n\n/**\n * Auto-select the gateway if there is only one gateway.\n *\n * @param {HTMLElement} root An HTMLElement that contains the cost region\n */\nconst selectSingleGateway = root => {\n    const gateways = root.querySelectorAll(Selectors.elements.gateways);\n\n    if (gateways.length == 1) {\n        gateways[0].checked = true;\n    }\n};\n\n/**\n * Shows the cost of the item the user is purchasing in the cost region.\n *\n * @param {HTMLElement} root An HTMLElement that contains the cost region\n * @param {string} defaultCost The default cost that is going to be displayed if no gateway is selected\n * @returns {Promise<void>}\n */\nconst updateCostRegion = async(root, defaultCost = '') => {\n    const gatewayElement = root.querySelector(Selectors.values.gateway);\n    const surcharge = parseInt((gatewayElement || {dataset: {surcharge: 0}}).dataset.surcharge);\n    const cost = (gatewayElement || {dataset: {cost: defaultCost}}).dataset.cost;\n\n    const {html, js} = await Templates.renderForPromise('core_payment/fee_breakdown', {fee: cost, surcharge});\n    Templates.replaceNodeContents(root.querySelector(Selectors.regions.costContainer), html, js);\n};\n\n/**\n * Process payment using the selected gateway.\n *\n * @param {string} gateway The gateway to be used for payment\n * @param {string} component Name of the component that the itemId belongs to\n * @param {string} paymentArea Name of the area in the component that the itemId belongs to\n * @param {number} itemId An internal identifier that is used by the component\n * @param {string} description Description of the payment\n * @returns {Promise<string>}\n */\nconst processPayment = async(gateway, component, paymentArea, itemId, description) => {\n    const paymentMethod = await import(`paygw_${gateway}/gateways_modal`);\n    return paymentMethod.process(component, paymentArea, itemId, description);\n};\n\n/**\n * Set up the payment actions.\n */\nexport const init = () => {\n    if (!init.initialised) {\n        // Event listeners should only be registered once.\n        init.initialised = true;\n        registerEventListeners();\n    }\n};\n\n/**\n * Whether the init function was called before.\n *\n * @static\n * @type {boolean}\n */\ninit.initialised = false;\n"],"file":"gateways_modal.min.js"}