MDL-69166 core_payment: Use promises instead of callbacks

This commit is contained in:
Shamim Rezaie 2020-10-19 02:31:44 +11:00
parent f5d94d6305
commit 0ecce652b1
9 changed files with 135 additions and 127 deletions

View file

@ -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,"&currency=").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,"&currency=").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

View file

@ -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

View file

@ -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"}

View file

@ -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}&currency=${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}&currency=${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 = '';

View file

@ -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];
};