mirror of
https://github.com/moodle/moodle.git
synced 2025-08-04 08:26:37 +02:00
MDL-69166 core_payment: Use promises instead of callbacks
This commit is contained in:
parent
f5d94d6305
commit
0ecce652b1
9 changed files with 135 additions and 127 deletions
2
payment/amd/build/gateways_modal.min.js
vendored
2
payment/amd/build/gateways_modal.min.js
vendored
|
@ -1,2 +1,2 @@
|
|||
define ("core_payment/gateways_modal",["exports","core/modal_factory","core/templates","core/str","./repository","./selectors","core/modal_events","core_payment/events","core/toast","core/notification","./modal_gateways"],function(a,b,c,d,e,f,g,h,i,j,k){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=l(b);c=l(c);f=l(f);g=l(g);h=l(h);j=l(j);k=l(k);var o="undefined"!=typeof window?window:"undefined"!=typeof self?self:"undefined"!=typeof global?global:{};function l(a){return a&&a.__esModule?a:{default:a}}function m(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){c(a);return}if(h.done){b(i)}else{Promise.resolve(i).then(d,e)}}function n(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){var h=a.apply(b,c);function f(a){m(h,d,e,f,g,"next",a)}function g(a){m(h,d,e,f,g,"throw",a)}f(void 0)})}}var p=function(){document.addEventListener("click",function(a){var b=a.target.closest("[data-action=\"core_payment/triggerPayment\"]");if(b){a.preventDefault();q(b,{focusOnClose:a.target})}})},q=function(){var a=n(regeneratorRuntime.mark(function a(l){var m,n,o,p,q,u,v,w,x,y,z=arguments;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:m=1<z.length&&z[1]!==void 0?z[1]:{},n=m.focusOnClose,o=void 0===n?null:n;a.t0=b.default;a.t1=k.default.TYPE;a.next=5;return(0,d.get_string)("selectpaymenttype","core_payment");case 5:a.t2=a.sent;a.next=8;return c.default.render("core_payment/gateways_modal",{});case 8:a.t3=a.sent;a.t4={type:a.t1,title:a.t2,body:a.t3};a.next=12;return a.t0.create.call(a.t0,a.t4);case 12:p=a.sent;q=p.getRoot()[0];(0,i.addToastRegion)(q);p.show();p.getRoot().on(g.default.hidden,function(){p.destroy();try{o.focus()}catch(a){}});p.getRoot().on(h.default.proceed,function(a){var b=(q.querySelector(f.default.values.gateway)||{value:""}).value;if(b){t(b,l.dataset.component,l.dataset.paymentarea,l.dataset.itemid,l.dataset.description,function(a){var b=a.success,c=a.message,d=void 0===c?"":c;p.hide();if(b){j.default.addNotification({message:d,type:"success"});location.reload()}else{j.default.alert("",d)}})}else{(0,d.get_string)("nogatewayselected","core_payment").then(function(a){return(0,i.add)(a)})}a.preventDefault()});q.addEventListener("change",function(a){if(a.target.matches(f.default.elements.gateways)){s(q,l.dataset.cost)}});a.next=21;return(0,e.getAvailableGateways)(l.dataset.component,l.dataset.paymentarea,l.dataset.itemid);case 21:u=a.sent;v={gateways:u};a.next=25;return c.default.renderForPromise("core_payment/gateways",v);case 25:w=a.sent;x=w.html;y=w.js;c.default.replaceNodeContents(q.querySelector(f.default.regions.gatewaysContainer),x,y);r(q);a.next=32;return s(q,l.dataset.cost);case 32:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}(),r=function(a){var b=a.querySelectorAll(f.default.elements.gateways);if(1==b.length){b[0].checked=!0}},s=function(){var a=n(regeneratorRuntime.mark(function a(b){var d,e,g,h,i,j,k,l=arguments;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:d=1<l.length&&l[1]!==void 0?l[1]:"";e=b.querySelector(f.default.values.gateway);g=parseInt((e||{dataset:{surcharge:0}}).dataset.surcharge);h=(e||{dataset:{cost:d}}).dataset.cost;a.next=6;return c.default.renderForPromise("core_payment/fee_breakdown",{fee:h,surcharge:g});case 6:i=a.sent;j=i.html;k=i.js;c.default.replaceNodeContents(b.querySelector(f.default.regions.costContainer),j,k);case 10:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}(),t=function(){var a=n(regeneratorRuntime.mark(function a(b,c,d,e,f,g){var h;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:a.next=2;return"function"==typeof o.define&&o.define.amd?new Promise(function(a,c){o.require(["paygw_".concat(b,"/gateways_modal")],a,c)}):"undefined"!=typeof module&&module.exports&&"undefined"!=typeof require||"undefined"!=typeof module&&module.component&&o.require&&"component"===o.require.loader?Promise.resolve(require(("paygw_".concat(b,"/gateways_modal")))):Promise.resolve(o["paygw_".concat(b,"/gateways_modal")]);case 2:h=a.sent;h.process(c,d,e,f,g);case 4:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}(),u=function(){if(!u.initialised){u.initialised=!0;p()}};a.init=u;u.initialised=!1});
|
||||
define ("core_payment/gateways_modal",["exports","core/modal_factory","core/templates","core/str","./repository","./selectors","core/modal_events","core_payment/events","core/toast","core/notification","./modal_gateways"],function(a,b,c,d,e,f,g,h,i,j,k){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=l(b);c=l(c);f=l(f);g=l(g);h=l(h);j=l(j);k=l(k);var o="undefined"!=typeof window?window:"undefined"!=typeof self?self:"undefined"!=typeof global?global:{};function l(a){return a&&a.__esModule?a:{default:a}}function m(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){c(a);return}if(h.done){b(i)}else{Promise.resolve(i).then(d,e)}}function n(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){var h=a.apply(b,c);function f(a){m(h,d,e,f,g,"next",a)}function g(a){m(h,d,e,f,g,"throw",a)}f(void 0)})}}var p=function(){document.addEventListener("click",function(a){var b=a.target.closest("[data-action=\"core_payment/triggerPayment\"]");if(b){a.preventDefault();q(b,{focusOnClose:a.target})}})},q=function(){var a=n(regeneratorRuntime.mark(function a(l){var m,n,o,p,q,u,v,w,x,y,z=arguments;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:m=1<z.length&&z[1]!==void 0?z[1]:{},n=m.focusOnClose,o=void 0===n?null:n;a.t0=b.default;a.t1=k.default.TYPE;a.next=5;return(0,d.get_string)("selectpaymenttype","core_payment");case 5:a.t2=a.sent;a.next=8;return c.default.render("core_payment/gateways_modal",{});case 8:a.t3=a.sent;a.t4={type:a.t1,title:a.t2,body:a.t3};a.next=12;return a.t0.create.call(a.t0,a.t4);case 12:p=a.sent;q=p.getRoot()[0];(0,i.addToastRegion)(q);p.show();p.getRoot().on(g.default.hidden,function(){p.destroy();try{o.focus()}catch(a){}});p.getRoot().on(h.default.proceed,function(a){var b=(q.querySelector(f.default.values.gateway)||{value:""}).value;if(b){t(b,l.dataset.component,l.dataset.paymentarea,l.dataset.itemid,l.dataset.description).then(function(a){p.hide();j.default.addNotification({message:a,type:"success"});location.reload();return a}).catch(function(a){return j.default.alert("",a)})}else{(0,d.get_string)("nogatewayselected","core_payment").then(function(a){return(0,i.add)(a)}).catch()}a.preventDefault()});q.addEventListener("change",function(a){if(a.target.matches(f.default.elements.gateways)){s(q,l.dataset.cost)}});a.next=21;return(0,e.getAvailableGateways)(l.dataset.component,l.dataset.paymentarea,l.dataset.itemid);case 21:u=a.sent;v={gateways:u};a.next=25;return c.default.renderForPromise("core_payment/gateways",v);case 25:w=a.sent;x=w.html;y=w.js;c.default.replaceNodeContents(q.querySelector(f.default.regions.gatewaysContainer),x,y);r(q);a.next=32;return s(q,l.dataset.cost);case 32:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}(),r=function(a){var b=a.querySelectorAll(f.default.elements.gateways);if(1==b.length){b[0].checked=!0}},s=function(){var a=n(regeneratorRuntime.mark(function a(b){var d,e,g,h,i,j,k,l=arguments;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:d=1<l.length&&l[1]!==void 0?l[1]:"";e=b.querySelector(f.default.values.gateway);g=parseInt((e||{dataset:{surcharge:0}}).dataset.surcharge);h=(e||{dataset:{cost:d}}).dataset.cost;a.next=6;return c.default.renderForPromise("core_payment/fee_breakdown",{fee:h,surcharge:g});case 6:i=a.sent;j=i.html;k=i.js;c.default.replaceNodeContents(b.querySelector(f.default.regions.costContainer),j,k);case 10:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}(),t=function(){var a=n(regeneratorRuntime.mark(function a(b,c,d,e,f){var g;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:a.next=2;return"function"==typeof o.define&&o.define.amd?new Promise(function(a,c){o.require(["paygw_".concat(b,"/gateways_modal")],a,c)}):"undefined"!=typeof module&&module.exports&&"undefined"!=typeof require||"undefined"!=typeof module&&module.component&&o.require&&"component"===o.require.loader?Promise.resolve(require(("paygw_".concat(b,"/gateways_modal")))):Promise.resolve(o["paygw_".concat(b,"/gateways_modal")]);case 2:g=a.sent;return a.abrupt("return",g.process(c,d,e,f));case 4:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}(),u=function(){if(!u.initialised){u.initialised=!0;p()}};a.init=u;u.initialised=!1});
|
||||
//# sourceMappingURL=gateways_modal.min.js.map
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -87,25 +87,25 @@ const show = async(rootNode, {
|
|||
rootNode.dataset.component,
|
||||
rootNode.dataset.paymentarea,
|
||||
rootNode.dataset.itemid,
|
||||
rootNode.dataset.description,
|
||||
({success, message = ''}) => {
|
||||
modal.hide();
|
||||
if (success) {
|
||||
Notification.addNotification({
|
||||
message: message,
|
||||
type: 'success',
|
||||
});
|
||||
location.reload();
|
||||
} else {
|
||||
Notification.alert('', message);
|
||||
}
|
||||
},
|
||||
);
|
||||
rootNode.dataset.description
|
||||
)
|
||||
.then(message => {
|
||||
modal.hide();
|
||||
Notification.addNotification({
|
||||
message: message,
|
||||
type: 'success',
|
||||
});
|
||||
location.reload();
|
||||
|
||||
// The following return statement is never reached. It is put here just to make eslint happy.
|
||||
return message;
|
||||
})
|
||||
.catch(message => Notification.alert('', message));
|
||||
} else {
|
||||
// We cannot use await in the following line.
|
||||
// The reason is that we are preventing the default action of the save event being triggered,
|
||||
// therefore we cannot define the event handler function asynchronous.
|
||||
getString('nogatewayselected', 'core_payment').then(message => addToast(message));
|
||||
getString('nogatewayselected', 'core_payment').then(message => addToast(message)).catch();
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
|
@ -166,22 +166,13 @@ const updateCostRegion = async(root, defaultCost = '') => {
|
|||
* @param {string} paymentArea Name of the area in the component that the itemId belongs to
|
||||
* @param {number} itemId An internal identifier that is used by the component
|
||||
* @param {string} description Description of the payment
|
||||
* @param {processPaymentCallback} callback The callback function to call when processing is finished
|
||||
* @returns {Promise<void>}
|
||||
* @returns {Promise<string>}
|
||||
*/
|
||||
const processPayment = async(gateway, component, paymentArea, itemId, description, callback) => {
|
||||
const processPayment = async(gateway, component, paymentArea, itemId, description) => {
|
||||
const paymentMethod = await import(`paygw_${gateway}/gateways_modal`);
|
||||
paymentMethod.process(component, paymentArea, itemId, description, callback);
|
||||
return paymentMethod.process(component, paymentArea, itemId, description);
|
||||
};
|
||||
|
||||
/**
|
||||
* The callback definition for processPayment.
|
||||
*
|
||||
* @callback processPaymentCallback
|
||||
* @param {bool} success
|
||||
* @param {string} message
|
||||
*/
|
||||
|
||||
/**
|
||||
* Set up the payment actions.
|
||||
*/
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
function _typeof(a){"@babel/helpers - typeof";if("function"==typeof Symbol&&"symbol"==typeof Symbol.iterator){_typeof=function(a){return typeof a}}else{_typeof=function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a}}return _typeof(a)}define ("paygw_paypal/gateways_modal",["exports","./repository","core/templates","core/truncate","core/ajax","core/modal_factory","core/modal_events","core/str"],function(a,b,c,d,e,f,g,h){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.process=void 0;b=k(b);c=i(c);d=i(d);e=i(e);f=i(f);g=i(g);function i(a){return a&&a.__esModule?a:{default:a}}function j(){if("function"!=typeof WeakMap)return null;var a=new WeakMap;j=function(){return a};return a}function k(a){if(a&&a.__esModule){return a}if(null===a||"object"!==_typeof(a)&&"function"!=typeof a){return{default:a}}var b=j();if(b&&b.has(a)){return b.get(a)}var c={},d=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var e in a){if(Object.prototype.hasOwnProperty.call(a,e)){var f=d?Object.getOwnPropertyDescriptor(a,e):null;if(f&&(f.get||f.set)){Object.defineProperty(c,e,f)}else{c[e]=a[e]}}}c.default=a;if(b){b.set(a,c)}return c}function l(a,b){return r(a)||q(a,b)||n(a,b)||m()}function m(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function n(a,b){if(!a)return;if("string"==typeof a)return p(a,b);var c=Object.prototype.toString.call(a).slice(8,-1);if("Object"===c&&a.constructor)c=a.constructor.name;if("Map"===c||"Set"===c)return Array.from(c);if("Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c))return p(a,b)}function p(a,b){if(null==b||b>a.length)b=a.length;for(var c=0,d=Array(b);c<b;c++){d[c]=a[c]}return d}function q(a,b){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(a)))return;var c=[],d=!0,e=!1,f=void 0;try{for(var g=a[Symbol.iterator](),h;!(d=(h=g.next()).done);d=!0){c.push(h.value);if(b&&c.length===b)break}}catch(a){e=!0;f=a}finally{try{if(!d&&null!=g["return"])g["return"]()}finally{if(e)throw f}}return c}function r(a){if(Array.isArray(a))return a}function s(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){c(a);return}if(h.done){b(i)}else{Promise.resolve(i).then(d,e)}}function t(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){var h=a.apply(b,c);function f(a){s(h,d,e,f,g,"next",a)}function g(a){s(h,d,e,f,g,"throw",a)}f(void 0)})}}var u=function(){var a=t(regeneratorRuntime.mark(function a(){var b;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:a.t0=f.default;a.next=3;return c.default.render("paygw_paypal/paypal_button_placeholder",{});case 3:a.t1=a.sent;a.t2={body:a.t1};a.next=7;return a.t0.create.call(a.t0,a.t2);case 7:b=a.sent;b.show();return a.abrupt("return",b);case 10:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}(),v=function(){var a=t(regeneratorRuntime.mark(function a(c,f,i,j,k){var m,n,o,p,q,r,s;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:a.next=2;return Promise.all([u(),b.getConfigForJs(c,f,i)]);case 2:m=a.sent;n=l(m,2);o=n[0];p=n[1];q=p.currency;r=p.cost;o.getRoot().on(g.default.hidden,function(){o.destroy()});s="https://www.paypal.com/sdk/js?client-id=".concat(p.clientid,"¤cy=").concat(q);w(s,function(){o.setBody("");paypal.Buttons({createOrder:function createOrder(a,b){return b.order.create({purchase_units:[{amount:{currency_code:q,value:r},description:d.default.truncate(j,{length:127,stripTags:!0})}],application_context:{shipping_preference:"NO_SHIPPING",brand_name:d.default.truncate(p.brandname,{length:127,stripTags:!0})}})},onApprove:function onApprove(a){o.getRoot().on(g.default.outsideClick,function(a){a.preventDefault()});o.setBody((0,h.get_string)("authorising","paygw_paypal"));return e.default.call([{methodname:"paygw_paypal_create_transaction_complete",args:{component:c,paymentarea:f,itemid:i,orderid:a.orderID}}])[0].then(function(a){o.hide();return k(a)})}}).render(o.getBody()[0])});case 11:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}();a.process=v;var w=function(a,b){if(w.currentlyloaded==a){b();return}if(w.currentlyloaded){var d=document.querySelector("script[src=\"".concat(w.currentlyloaded,"\"]"));if(d){d.parentNode.removeChild(d)}}var c=document.createElement("script");if(c.readyState){c.onreadystatechange=function(){if("complete"==this.readyState||"loaded"==this.readyState){this.onreadystatechange=null;b()}}}else{c.onload=function(){b()}}c.setAttribute("src",a);document.head.appendChild(c);w.currentlyloaded=a};w.currentlyloaded=""});
|
||||
function _typeof(a){"@babel/helpers - typeof";if("function"==typeof Symbol&&"symbol"==typeof Symbol.iterator){_typeof=function(a){return typeof a}}else{_typeof=function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a}}return _typeof(a)}define ("paygw_paypal/gateways_modal",["exports","./repository","core/templates","core/truncate","core/modal_factory","core/modal_events","core/str"],function(a,b,c,d,e,f,g){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.process=void 0;b=j(b);c=h(c);d=h(d);e=h(e);f=h(f);function h(a){return a&&a.__esModule?a:{default:a}}function i(){if("function"!=typeof WeakMap)return null;var a=new WeakMap;i=function(){return a};return a}function j(a){if(a&&a.__esModule){return a}if(null===a||"object"!==_typeof(a)&&"function"!=typeof a){return{default:a}}var b=i();if(b&&b.has(a)){return b.get(a)}var c={},d=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var e in a){if(Object.prototype.hasOwnProperty.call(a,e)){var f=d?Object.getOwnPropertyDescriptor(a,e):null;if(f&&(f.get||f.set)){Object.defineProperty(c,e,f)}else{c[e]=a[e]}}}c.default=a;if(b){b.set(a,c)}return c}function k(a,b){return r(a)||q(a,b)||m(a,b)||l()}function l(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function m(a,b){if(!a)return;if("string"==typeof a)return p(a,b);var c=Object.prototype.toString.call(a).slice(8,-1);if("Object"===c&&a.constructor)c=a.constructor.name;if("Map"===c||"Set"===c)return Array.from(c);if("Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c))return p(a,b)}function p(a,b){if(null==b||b>a.length)b=a.length;for(var c=0,d=Array(b);c<b;c++){d[c]=a[c]}return d}function q(a,b){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(a)))return;var c=[],d=!0,e=!1,f=void 0;try{for(var g=a[Symbol.iterator](),h;!(d=(h=g.next()).done);d=!0){c.push(h.value);if(b&&c.length===b)break}}catch(a){e=!0;f=a}finally{try{if(!d&&null!=g["return"])g["return"]()}finally{if(e)throw f}}return c}function r(a){if(Array.isArray(a))return a}function s(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){c(a);return}if(h.done){b(i)}else{Promise.resolve(i).then(d,e)}}function t(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){var h=a.apply(b,c);function f(a){s(h,d,e,f,g,"next",a)}function g(a){s(h,d,e,f,g,"throw",a)}f(void 0)})}}var u=function(){var a=t(regeneratorRuntime.mark(function a(){var b;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:a.t0=e.default;a.next=3;return c.default.render("paygw_paypal/paypal_button_placeholder",{});case 3:a.t1=a.sent;a.t2={body:a.t1};a.next=7;return a.t0.create.call(a.t0,a.t2);case 7:b=a.sent;b.show();return a.abrupt("return",b);case 10:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}(),v=function(a,c,e,h){return Promise.all([u(),b.getConfigForJs(a,c,e)]).then(function(a){var b=k(a,2),c=b[0],d=b[1];c.getRoot().on(f.default.hidden,function(){c.destroy()});return Promise.all([c,d,w(d.clientid,d.currency)])}).then(function(i){var j=k(i,2),l=j[0],m=j[1];l.setBody("");return new Promise(function(i){window.paypal.Buttons({createOrder:function createOrder(a,b){return b.order.create({purchase_units:[{amount:{currency_code:m.currency_code,value:m.cost},description:d.default.truncate(h,{length:127,stripTags:!0})}],application_context:{shipping_preference:"NO_SHIPPING",brand_name:d.default.truncate(m.brandname,{length:127,stripTags:!0})}})},onApprove:function onApprove(d){l.getRoot().on(f.default.outsideClick,function(a){a.preventDefault()});l.setBody((0,g.get_string)("authorising","paygw_paypal"));b.markTransactionComplete(a,c,e,d.orderID).then(function(a){l.hide();return a}).then(i)}}).render(l.getBody()[0])})}).then(function(a){if(a.success){return Promise.resolve(a.message)}return Promise.reject(a.message)})};a.process=v;var w=function(a,b){var c="https://www.paypal.com/sdk/js?client-id=".concat(a,"¤cy=").concat(b);if(w.currentlyloaded===c){return Promise.resolve()}if(w.currentlyloaded){var e=document.querySelector("script[src=\"".concat(w.currentlyloaded,"\"]"));if(e){e.parentNode.removeChild(e)}}var d=document.createElement("script");return new Promise(function(a){if(d.readyState){d.onreadystatechange=function(){if("complete"==this.readyState||"loaded"==this.readyState){this.onreadystatechange=null;a()}}}else{d.onload=function(){a()}}d.setAttribute("src",c);document.head.appendChild(d);w.currentlyloaded=c})};w.currentlyloaded=""});
|
||||
//# sourceMappingURL=gateways_modal.min.js.map
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,2 +1,2 @@
|
|||
define ("paygw_paypal/repository",["exports","core/ajax"],function(a,b){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.getConfigForJs=void 0;b=function(a){return a&&a.__esModule?a:{default:a}}(b);var c=function(a,c,d){return b.default.call([{methodname:"paygw_paypal_get_config_for_js",args:{component:a,paymentarea:c,itemid:d}}])[0]};a.getConfigForJs=c});
|
||||
define ("paygw_paypal/repository",["exports","core/ajax"],function(a,b){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.markTransactionComplete=a.getConfigForJs=void 0;b=function(a){return a&&a.__esModule?a:{default:a}}(b);var c=function(a,c,d){return b.default.call([{methodname:"paygw_paypal_get_config_for_js",args:{component:a,paymentarea:c,itemid:d}}])[0]};a.getConfigForJs=c;var d=function(a,c,d,e){return b.default.call([{methodname:"paygw_paypal_create_transaction_complete",args:{component:a,paymentarea:c,itemid:d,orderid:e}}])[0]};a.markTransactionComplete=d});
|
||||
//# sourceMappingURL=repository.min.js.map
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"sources":["../src/repository.js"],"names":["getConfigForJs","component","paymentArea","itemId","Ajax","call","methodname","args","paymentarea","itemid"],"mappings":"8JAwBA,uDAUO,GAAMA,CAAAA,CAAc,CAAG,SAACC,CAAD,CAAYC,CAAZ,CAAyBC,CAAzB,CAAoC,CAU9D,MAAOC,WAAKC,IAAL,CAAU,CATD,CACZC,UAAU,CAAE,gCADA,CAEZC,IAAI,CAAE,CACFN,SAAS,CAATA,CADE,CAEFO,WAAW,CAAEN,CAFX,CAGFO,MAAM,CAAEN,CAHN,CAFM,CASC,CAAV,EAAqB,CAArB,CACV,CAXM,C","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 * PayPal repository module to encapsulate all of the AJAX requests that can be sent for PayPal.\n *\n * @module paygw_paypal/repository\n * @package paygw_paypal\n * @copyright 2020 Shamim Rezaie <shamim@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Ajax from 'core/ajax';\n\n/**\n * Return the PayPal JavaScript SDK URL.\n *\n * @param {string} component Name of the component that the itemId belongs to\n * @param {string} paymentArea The area of the component that the itemId belongs to\n * @param {number} itemId An internal identifier that is used by the component\n * @returns {Promise<{clientid: string, brandname: string}>}\n */\nexport const getConfigForJs = (component, paymentArea, itemId) => {\n const request = {\n methodname: 'paygw_paypal_get_config_for_js',\n args: {\n component,\n paymentarea: paymentArea,\n itemid: itemId,\n },\n };\n\n return Ajax.call([request])[0];\n};\n"],"file":"repository.min.js"}
|
||||
{"version":3,"sources":["../src/repository.js"],"names":["getConfigForJs","component","paymentArea","itemId","Ajax","call","methodname","args","paymentarea","itemid","markTransactionComplete","orderId","orderid"],"mappings":"wLAwBA,uDAUO,GAAMA,CAAAA,CAAc,CAAG,SAACC,CAAD,CAAYC,CAAZ,CAAyBC,CAAzB,CAAoC,CAU9D,MAAOC,WAAKC,IAAL,CAAU,CATD,CACZC,UAAU,CAAE,gCADA,CAEZC,IAAI,CAAE,CACFN,SAAS,CAATA,CADE,CAEFO,WAAW,CAAEN,CAFX,CAGFO,MAAM,CAAEN,CAHN,CAFM,CASC,CAAV,EAAqB,CAArB,CACV,CAXM,C,mBAsBA,GAAMO,CAAAA,CAAuB,CAAG,SAACT,CAAD,CAAYC,CAAZ,CAAyBC,CAAzB,CAAiCQ,CAAjC,CAA6C,CAWhF,MAAOP,WAAKC,IAAL,CAAU,CAVD,CACZC,UAAU,CAAE,0CADA,CAEZC,IAAI,CAAE,CACFN,SAAS,CAATA,CADE,CAEFO,WAAW,CAAEN,CAFX,CAGFO,MAAM,CAAEN,CAHN,CAIFS,OAAO,CAAED,CAJP,CAFM,CAUC,CAAV,EAAqB,CAArB,CACV,CAZM,C","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 * PayPal repository module to encapsulate all of the AJAX requests that can be sent for PayPal.\n *\n * @module paygw_paypal/repository\n * @package paygw_paypal\n * @copyright 2020 Shamim Rezaie <shamim@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Ajax from 'core/ajax';\n\n/**\n * Return the PayPal JavaScript SDK URL.\n *\n * @param {string} component Name of the component that the itemId belongs to\n * @param {string} paymentArea The area of the component that the itemId belongs to\n * @param {number} itemId An internal identifier that is used by the component\n * @returns {Promise<{clientid: string, brandname: string, cost: number, currency: string}>}\n */\nexport const getConfigForJs = (component, paymentArea, itemId) => {\n const request = {\n methodname: 'paygw_paypal_get_config_for_js',\n args: {\n component,\n paymentarea: paymentArea,\n itemid: itemId,\n },\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Call server to validate and capture payment for order.\n *\n * @param {string} component Name of the component that the itemId belongs to\n * @param {string} paymentArea The area of the component that the itemId belongs to\n * @param {number} itemId An internal identifier that is used by the component\n * @param {string} orderId The order id coming back from PayPal\n * @returns {*}\n */\nexport const markTransactionComplete = (component, paymentArea, itemId, orderId) => {\n const request = {\n methodname: 'paygw_paypal_create_transaction_complete',\n args: {\n component,\n paymentarea: paymentArea,\n itemid: itemId,\n orderid: orderId,\n },\n };\n\n return Ajax.call([request])[0];\n};\n"],"file":"repository.min.js"}
|
|
@ -24,7 +24,6 @@
|
|||
import * as Repository from './repository';
|
||||
import Templates from 'core/templates';
|
||||
import Truncate from 'core/truncate';
|
||||
import Ajax from 'core/ajax';
|
||||
import ModalFactory from 'core/modal_factory';
|
||||
import ModalEvents from 'core/modal_events';
|
||||
import {get_string as getString} from 'core/str';
|
||||
|
@ -49,102 +48,95 @@ const showModalWithPlaceholder = async() => {
|
|||
* @param {string} paymentArea The area of the component that the itemId belongs to
|
||||
* @param {number} itemId An internal identifier that is used by the component
|
||||
* @param {string} description Description of the payment
|
||||
* @param {processCallback} callback The callback function to call when processing is finished
|
||||
* @returns {Promise<void>}
|
||||
* @returns {Promise<string>}
|
||||
*/
|
||||
export const process = async(component, paymentArea, itemId, description, callback) => {
|
||||
|
||||
const [
|
||||
modal,
|
||||
paypalConfig,
|
||||
] = await Promise.all([
|
||||
export const process = (component, paymentArea, itemId, description) => {
|
||||
return Promise.all([
|
||||
showModalWithPlaceholder(),
|
||||
Repository.getConfigForJs(component, paymentArea, itemId),
|
||||
]);
|
||||
const currency = paypalConfig.currency;
|
||||
const amount = paypalConfig.cost; // Cost with surcharge.
|
||||
])
|
||||
.then(([modal, paypalConfig]) => {
|
||||
modal.getRoot().on(ModalEvents.hidden, () => {
|
||||
// Destroy when hidden.
|
||||
modal.destroy();
|
||||
});
|
||||
|
||||
modal.getRoot().on(ModalEvents.hidden, () => {
|
||||
// Destroy when hidden.
|
||||
modal.destroy();
|
||||
});
|
||||
return Promise.all([
|
||||
modal,
|
||||
paypalConfig,
|
||||
switchSdk(paypalConfig.clientid, paypalConfig.currency),
|
||||
]);
|
||||
})
|
||||
.then(([modal, paypalConfig]) => {
|
||||
// We have to clear the body. The render method in paypal.Buttons will render everything.
|
||||
modal.setBody('');
|
||||
|
||||
const paypalScript = `https://www.paypal.com/sdk/js?client-id=${paypalConfig.clientid}¤cy=${currency}`;
|
||||
|
||||
callExternalFunction(paypalScript, () => {
|
||||
modal.setBody(''); // We have to clear the body. The render method in paypal.Buttons will render everything.
|
||||
|
||||
paypal.Buttons({ // eslint-disable-line
|
||||
// Set up the transaction.
|
||||
createOrder: function(data, actions) {
|
||||
return actions.order.create({
|
||||
purchase_units: [{ // eslint-disable-line
|
||||
amount: {
|
||||
currency_code: currency, // eslint-disable-line
|
||||
value: amount
|
||||
return new Promise(resolve => {
|
||||
window.paypal.Buttons({
|
||||
// Set up the transaction.
|
||||
createOrder: function(data, actions) {
|
||||
return actions.order.create({
|
||||
purchase_units: [{ // eslint-disable-line
|
||||
amount: {
|
||||
currency_code: paypalConfig.currency_code, // eslint-disable-line
|
||||
value: paypalConfig.cost,
|
||||
},
|
||||
description: Truncate.truncate(description, {length: 127, stripTags: true}),
|
||||
}],
|
||||
application_context: { // eslint-disable-line
|
||||
shipping_preference: 'NO_SHIPPING', // eslint-disable-line
|
||||
brand_name: Truncate.truncate(paypalConfig.brandname, {length: 127, stripTags: true}), // eslint-disable-line
|
||||
},
|
||||
description: Truncate.truncate(description, {length: 127, stripTags: true}),
|
||||
}],
|
||||
application_context: { // eslint-disable-line
|
||||
shipping_preference: 'NO_SHIPPING', // eslint-disable-line
|
||||
brand_name: Truncate.truncate(paypalConfig.brandname, {length: 127, stripTags: true}), // eslint-disable-line
|
||||
},
|
||||
});
|
||||
},
|
||||
// Finalise the transaction.
|
||||
onApprove: function(data) {
|
||||
modal.getRoot().on(ModalEvents.outsideClick, (e) => {
|
||||
// Prevent closing the modal when clicking outside of it.
|
||||
e.preventDefault();
|
||||
});
|
||||
});
|
||||
},
|
||||
// Finalise the transaction.
|
||||
onApprove: function(data) {
|
||||
modal.getRoot().on(ModalEvents.outsideClick, (e) => {
|
||||
// Prevent closing the modal when clicking outside of it.
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
modal.setBody(getString('authorising', 'paygw_paypal'));
|
||||
modal.setBody(getString('authorising', 'paygw_paypal'));
|
||||
|
||||
// Call server to validate and capture payment for order.
|
||||
return Ajax.call([{
|
||||
methodname: 'paygw_paypal_create_transaction_complete',
|
||||
args: {
|
||||
component,
|
||||
paymentarea: paymentArea,
|
||||
itemid: itemId,
|
||||
orderid: data.orderID,
|
||||
},
|
||||
}])[0]
|
||||
.then(function(res) {
|
||||
modal.hide();
|
||||
return callback(res);
|
||||
});
|
||||
}
|
||||
}).render(modal.getBody()[0]);
|
||||
Repository.markTransactionComplete(component, paymentArea, itemId, data.orderID)
|
||||
.then(res => {
|
||||
modal.hide();
|
||||
return res;
|
||||
})
|
||||
.then(resolve);
|
||||
}
|
||||
}).render(modal.getBody()[0]);
|
||||
});
|
||||
})
|
||||
.then(res => {
|
||||
if (res.success) {
|
||||
return Promise.resolve(res.message);
|
||||
}
|
||||
|
||||
return Promise.reject(res.message);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* The callback definition for process.
|
||||
* Unloads the previously loaded PayPal JavaScript SDK, and loads a new one.
|
||||
*
|
||||
* @callback processCallback
|
||||
* @param {bool} success
|
||||
* @param {string} message
|
||||
* @param {string} clientId PayPal client ID
|
||||
* @param {string} currency The currency
|
||||
* @returns {Promise}
|
||||
*/
|
||||
const switchSdk = (clientId, currency) => {
|
||||
const sdkUrl = `https://www.paypal.com/sdk/js?client-id=${clientId}¤cy=${currency}`;
|
||||
|
||||
/**
|
||||
* Calls a function from an external javascript file.
|
||||
*
|
||||
* @param {string} jsFile URL of the external JavaScript file
|
||||
* @param {function} func The function to call
|
||||
*/
|
||||
const callExternalFunction = (jsFile, func) => {
|
||||
// Check to see if this file has already been loaded. If so just go straight to the func.
|
||||
if (callExternalFunction.currentlyloaded == jsFile) {
|
||||
func();
|
||||
return;
|
||||
if (switchSdk.currentlyloaded === sdkUrl) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
// PayPal can only work with one currency at the same time. We have to unload the previously loaded script
|
||||
// if it was loaded for a different currency. Weird way indeed, but the only way.
|
||||
// See: https://github.com/paypal/paypal-checkout-components/issues/1180
|
||||
if (callExternalFunction.currentlyloaded) {
|
||||
const suspectedScript = document.querySelector(`script[src="${callExternalFunction.currentlyloaded}"]`);
|
||||
if (switchSdk.currentlyloaded) {
|
||||
const suspectedScript = document.querySelector(`script[src="${switchSdk.currentlyloaded}"]`);
|
||||
if (suspectedScript) {
|
||||
suspectedScript.parentNode.removeChild(suspectedScript);
|
||||
}
|
||||
|
@ -152,29 +144,31 @@ const callExternalFunction = (jsFile, func) => {
|
|||
|
||||
const script = document.createElement('script');
|
||||
|
||||
if (script.readyState) {
|
||||
script.onreadystatechange = function() {
|
||||
if (this.readyState == 'complete' || this.readyState == 'loaded') {
|
||||
this.onreadystatechange = null;
|
||||
func();
|
||||
}
|
||||
};
|
||||
} else {
|
||||
script.onload = function() {
|
||||
func();
|
||||
};
|
||||
}
|
||||
return new Promise(resolve => {
|
||||
if (script.readyState) {
|
||||
script.onreadystatechange = function() {
|
||||
if (this.readyState == 'complete' || this.readyState == 'loaded') {
|
||||
this.onreadystatechange = null;
|
||||
resolve();
|
||||
}
|
||||
};
|
||||
} else {
|
||||
script.onload = function() {
|
||||
resolve();
|
||||
};
|
||||
}
|
||||
|
||||
script.setAttribute('src', jsFile);
|
||||
document.head.appendChild(script);
|
||||
script.setAttribute('src', sdkUrl);
|
||||
document.head.appendChild(script);
|
||||
|
||||
callExternalFunction.currentlyloaded = jsFile;
|
||||
switchSdk.currentlyloaded = sdkUrl;
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Holds the full url of loaded external JavaScript file.
|
||||
* Holds the full url of loaded PayPal JavaScript SDK.
|
||||
*
|
||||
* @static
|
||||
* @type {string}
|
||||
*/
|
||||
callExternalFunction.currentlyloaded = '';
|
||||
switchSdk.currentlyloaded = '';
|
||||
|
|
|
@ -30,7 +30,7 @@ import Ajax from 'core/ajax';
|
|||
* @param {string} component Name of the component that the itemId belongs to
|
||||
* @param {string} paymentArea The area of the component that the itemId belongs to
|
||||
* @param {number} itemId An internal identifier that is used by the component
|
||||
* @returns {Promise<{clientid: string, brandname: string}>}
|
||||
* @returns {Promise<{clientid: string, brandname: string, cost: number, currency: string}>}
|
||||
*/
|
||||
export const getConfigForJs = (component, paymentArea, itemId) => {
|
||||
const request = {
|
||||
|
@ -44,3 +44,26 @@ export const getConfigForJs = (component, paymentArea, itemId) => {
|
|||
|
||||
return Ajax.call([request])[0];
|
||||
};
|
||||
|
||||
/**
|
||||
* Call server to validate and capture payment for order.
|
||||
*
|
||||
* @param {string} component Name of the component that the itemId belongs to
|
||||
* @param {string} paymentArea The area of the component that the itemId belongs to
|
||||
* @param {number} itemId An internal identifier that is used by the component
|
||||
* @param {string} orderId The order id coming back from PayPal
|
||||
* @returns {*}
|
||||
*/
|
||||
export const markTransactionComplete = (component, paymentArea, itemId, orderId) => {
|
||||
const request = {
|
||||
methodname: 'paygw_paypal_create_transaction_complete',
|
||||
args: {
|
||||
component,
|
||||
paymentarea: paymentArea,
|
||||
itemid: itemId,
|
||||
orderid: orderId,
|
||||
},
|
||||
};
|
||||
|
||||
return Ajax.call([request])[0];
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue