diff --git a/modules.local/ppcp-button/assets/js/button.js b/modules.local/ppcp-button/assets/js/button.js index 79157060a..d0dbd555b 100644 --- a/modules.local/ppcp-button/assets/js/button.js +++ b/modules.local/ppcp-button/assets/js/button.js @@ -1,2 +1,2 @@ -!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";r.r(t);var n=class{constructor(e){this.wrapper=e}render(e){paypal.Buttons(e).render(this.wrapper)}hideButtons(){document.querySelector(this.wrapper).style.display="none"}showButtons(){document.querySelector(this.wrapper).style.display="block"}};var o=class{constructor(e,t,r){this.element=e,this.showCallback=t,this.hideCallback=r,this.observer=null}init(){this.observer=new MutationObserver(()=>{this.element.classList.contains("disabled")?this.hideCallback():this.showCallback()}),this.observer.observe(this.element,{attributes:!0})}disconnect(){this.observer.disconnect()}};var a=class{constructor(e,t,r){this.id=e,this.quantity=t,this.variations=r}data(){return{id:this.id,quantity:this.quantity,variations:this.variations}}};var c=e=>(t,r)=>fetch(e.config.ajax.approve_order.endpoint,{method:"POST",body:JSON.stringify({nonce:e.config.ajax.approve_order.nonce,order_id:t.orderID})}).then(e=>e.json()).then(t=>{t.success&&(location.href=e.config.redirect)});var i=class{constructor(e,t,r,n,o,a){this.config=e,this.updateCart=t,this.showButtonCallback=r,this.hideButtonCallback=n,this.formElement=o,this.errorHandler=a}configuration(){if(this.hasVariations()){new o(this.formElement.querySelector(".single_add_to_cart_button"),this.showButtonCallback,this.hideButtonCallback).init()}return{createOrder:this.createOrder(),onApprove:c(this),onError:e=>{this.errorHandler.message(e)}}}createOrder(){var e=null;e=this.isGroupedProduct()?()=>{const e=[];return this.formElement.querySelectorAll('input[type="number"]').forEach(t=>{if(!t.value)return;const r=t.getAttribute("name").match(/quantity\[([\d]*)\]/);if(2!==r.length)return;const n=parseInt(r[1]),o=parseInt(t.value);e.push(new a(n,o,null))}),e}:()=>{const e=document.querySelector('[name="add-to-cart"]').value,t=document.querySelector('[name="quantity"]').value,r=this.variations();return[new a(e,t,r)]};return(t,r)=>{this.errorHandler.clear();return this.updateCart.update(e=>fetch(this.config.ajax.create_order.endpoint,{method:"POST",body:JSON.stringify({nonce:this.config.ajax.create_order.nonce,purchase_units:e})}).then((function(e){return e.json()})).then((function(e){if(e.success)return e.data.id})),e())}}variations(){if(!this.hasVariations())return null;return[...this.formElement.querySelectorAll("[name^='attribute_']")].map(e=>({value:e.value,name:e.name}))}hasVariations(){return this.formElement.classList.contains("variations_form")}isGroupedProduct(){return this.formElement.classList.contains("grouped_form")}};var s=class{constructor(e,t){this.endpoint=e,this.nonce=t}update(e,t){return new Promise((r,n)=>{fetch(this.endpoint,{method:"POST",body:JSON.stringify({nonce:this.nonce,products:t})}).then(e=>e.json()).then(t=>{if(!t.success)return void n(t.data);const o=e(t.data);r(o)})})}};var u=class{constructor(){this.wrapper=document.querySelector(".woocommerce-notices-wrapper")}message(e){this.wrapper.classList.add("woocommerce-error"),this.wrapper.innerText=this.sanitize(e)}sanitize(e){const t=document.createElement("textarea");return t.innerHTML=e,t.value}clear(){this.wrapper.classList.contains("woocommerce-error")&&(this.wrapper.classList.remove("woocommerce-error"),this.wrapper.innerText="")}};var d=class{constructor(e,t){this.config=e,this.errorHandler=t}configuration(){return{createOrder:(e,t)=>fetch(this.config.ajax.create_order.endpoint,{method:"POST",body:JSON.stringify({nonce:this.config.ajax.create_order.nonce,purchase_units:[]})}).then((function(e){return e.json()})).then((function(e){if(e.success)return e.data.id})),onApprove:c(this),onError:e=>{this.errorHandler.message(e)}}}};var l=e=>(t,r)=>fetch(e.config.ajax.approve_order.endpoint,{method:"POST",body:JSON.stringify({nonce:e.config.ajax.approve_order.nonce,order_id:t.orderID})}).then(e=>e.json()).then(e=>{e.success&&document.querySelector("#place_order").click()});var h=class{constructor(e,t){this.config=e,this.errorHandler=t}configuration(){return{createOrder:(e,t)=>fetch(this.config.ajax.create_order.endpoint,{method:"POST",body:JSON.stringify({nonce:this.config.ajax.create_order.nonce,purchase_units:[]})}).then((function(e){return e.json()})).then((function(e){if(e.success)return e.data.id})),onApprove:l(this),onError:e=>{this.errorHandler.message(e)}}}};document.addEventListener("DOMContentLoaded",()=>{const e=document.createElement("script");e.setAttribute("src",PayPalCommerceGateway.button.url),e.addEventListener("load",e=>{(()=>{const e=PayPalCommerceGateway.context,t=new u,r=new d(PayPalCommerceGateway,t);if(document.querySelector(PayPalCommerceGateway.button.mini_cart_wrapper)){new n(PayPalCommerceGateway.button.mini_cart_wrapper).render(r.configuration())}if(jQuery(document.body).on("wc_fragments_loaded wc_fragments_refreshed",()=>{if(!document.querySelector(PayPalCommerceGateway.button.mini_cart_wrapper))return;new n(PayPalCommerceGateway.button.mini_cart_wrapper).render(r.configuration())}),!document.querySelector(PayPalCommerceGateway.button.wrapper))return;const o=new n(PayPalCommerceGateway.button.wrapper);let a=null;if("product"===e){if(!document.querySelector("form.cart"))return;const e=new s(PayPalCommerceGateway.ajax.change_cart.endpoint,PayPalCommerceGateway.ajax.change_cart.nonce);a=new i(PayPalCommerceGateway,e,o.showButtons.bind(o),o.hideButtons.bind(o),document.querySelector("form.cart"),t)}if("cart"===e&&(a=r,jQuery(document.body).on("updated_cart_totals updated_checkout",()=>{o.render(a.configuration())})),"checkout"===e&&(a=new h(PayPalCommerceGateway,t),!document.querySelector(PayPalCommerceGateway.button.cancel_wrapper))){const e=()=>{"ppcp-gateway"!==jQuery('input[name="payment_method"]:checked').val()?(o.hideButtons(),jQuery("#place_order").show()):(o.showButtons(),jQuery("#place_order").hide())};jQuery(document.body).on("updated_checkout",()=>{o.render(a.configuration()),jQuery(document.body).trigger("payment_method_selected")}),jQuery(document.body).on("payment_method_selected",e),e()}a?o.render(a.configuration()):console.error("No context for button found.")})()}),document.body.append(e)})}]); +!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";r.r(t);var n=class{constructor(){this.wrapper=document.querySelector(".woocommerce-notices-wrapper")}message(e){this.wrapper.classList.add("woocommerce-error"),this.wrapper.innerText=this.sanitize(e)}sanitize(e){const t=document.createElement("textarea");return t.innerHTML=e,t.value}clear(){this.wrapper.classList.contains("woocommerce-error")&&(this.wrapper.classList.remove("woocommerce-error"),this.wrapper.innerText="")}};var o=e=>(t,r)=>fetch(e.config.ajax.approve_order.endpoint,{method:"POST",body:JSON.stringify({nonce:e.config.ajax.approve_order.nonce,order_id:t.orderID})}).then(e=>e.json()).then(t=>{t.success&&(location.href=e.config.redirect)});var a=class{constructor(e,t){this.config=e,this.errorHandler=t}configuration(){return{createOrder:(e,t)=>fetch(this.config.ajax.create_order.endpoint,{method:"POST",body:JSON.stringify({nonce:this.config.ajax.create_order.nonce,purchase_units:[]})}).then((function(e){return e.json()})).then((function(e){if(e.success)return e.data.id})),onApprove:o(this),onError:e=>{this.errorHandler.message(e)}}}};var i=e=>(t,r)=>fetch(e.config.ajax.approve_order.endpoint,{method:"POST",body:JSON.stringify({nonce:e.config.ajax.approve_order.nonce,order_id:t.orderID})}).then(e=>e.json()).then(e=>{e.success&&document.querySelector("#place_order").click()});var s=class{constructor(e,t){this.config=e,this.errorHandler=t}configuration(){return{createOrder:(e,t)=>fetch(this.config.ajax.create_order.endpoint,{method:"POST",body:JSON.stringify({nonce:this.config.ajax.create_order.nonce,purchase_units:[]})}).then((function(e){return e.json()})).then((function(e){if(e.success)return e.data.id})),onApprove:i(this),onError:e=>{this.errorHandler.message(e)}}}};var c=class{constructor(e,t,r){this.gateway=e,this.renderer=t,this.configurator=r}init(){this.shouldRender()&&(jQuery(document.body).on("wc_fragments_loaded wc_fragments_refreshed",()=>{renderer.render(this.configurator.configuration())}),this.renderer.render(this.gateway.button.mini_cart_wrapper,this.configurator.configuration()))}shouldRender(){return null!==document.querySelector(this.gateway.button.mini_cart_wrapper)}};var u=class{constructor(e,t,r){this.id=e,this.quantity=t,this.variations=r}data(){return{id:this.id,quantity:this.quantity,variations:this.variations}}};var d=class{constructor(e,t){this.endpoint=e,this.nonce=t}update(e,t){return new Promise((r,n)=>{fetch(this.endpoint,{method:"POST",body:JSON.stringify({nonce:this.nonce,products:t})}).then(e=>e.json()).then(t=>{if(!t.success)return void n(t.data);const o=e(t.data);r(o)})})}};var h=class{constructor(e,t,r){this.element=e,this.showCallback=t,this.hideCallback=r,this.observer=null}init(){const e=()=>{this.element.classList.contains("disabled")?this.hideCallback():this.showCallback()};this.observer=new MutationObserver(e),this.observer.observe(this.element,{attributes:!0}),e()}disconnect(){this.observer.disconnect()}};var l=class{constructor(e,t,r,n,o,a){this.config=e,this.updateCart=t,this.showButtonCallback=r,this.hideButtonCallback=n,this.formElement=o,this.errorHandler=a}configuration(){if(this.hasVariations()){new h(this.formElement.querySelector(".single_add_to_cart_button"),this.showButtonCallback,this.hideButtonCallback).init()}return{createOrder:this.createOrder(),onApprove:o(this),onError:e=>{this.errorHandler.message(e)}}}createOrder(){var e=null;e=this.isGroupedProduct()?()=>{const e=[];return this.formElement.querySelectorAll('input[type="number"]').forEach(t=>{if(!t.value)return;const r=t.getAttribute("name").match(/quantity\[([\d]*)\]/);if(2!==r.length)return;const n=parseInt(r[1]),o=parseInt(t.value);e.push(new u(n,o,null))}),e}:()=>{const e=document.querySelector('[name="add-to-cart"]').value,t=document.querySelector('[name="quantity"]').value,r=this.variations();return[new u(e,t,r)]};return(t,r)=>{this.errorHandler.clear();return this.updateCart.update(e=>fetch(this.config.ajax.create_order.endpoint,{method:"POST",body:JSON.stringify({nonce:this.config.ajax.create_order.nonce,purchase_units:e})}).then((function(e){return e.json()})).then((function(e){if(e.success)return e.data.id})),e())}}variations(){if(!this.hasVariations())return null;return[...this.formElement.querySelectorAll("[name^='attribute_']")].map(e=>({value:e.value,name:e.name}))}hasVariations(){return this.formElement.classList.contains("variations_form")}isGroupedProduct(){return this.formElement.classList.contains("grouped_form")}};var p=class{constructor(e,t){this.gateway=e,this.renderer=t}init(){if(!this.shouldRender())return;const e=new n,t=new d(this.gateway.ajax.change_cart.endpoint,this.gateway.ajax.change_cart.nonce),r=this.gateway.button.wrapper,o=new l(this.gateway,t,()=>{this.renderer.showButtons(r)},()=>{this.renderer.hideButtons(r)},document.querySelector("form.cart"),e);this.renderer.render(r,o.configuration())}shouldRender(){return null!==document.querySelector("form.cart")&&null!==document.querySelector(this.gateway.button.wrapper)}};var f=class{constructor(e,t,r){this.gateway=e,this.renderer=t,this.configurator=r}init(){this.shouldRender()&&(jQuery(document.body).on("updated_cart_totals updated_checkout",()=>{this.renderer.render(this.configurator.configuration())}),this.renderer.render(this.gateway.button.wrapper,this.configurator.configuration()))}shouldRender(){return null!==document.querySelector(this.gateway.button.wrapper)}};var m=class{constructor(e,t,r){this.gateway=e,this.renderer=t,this.configurator=r}init(){if(!this.shouldRender())return;const e=this.gateway.button.wrapper,t=()=>{"ppcp-gateway"!==jQuery('input[name="payment_method"]:checked').val()?(this.renderer.hideButtons(e),jQuery("#place_order").show()):(this.renderer.showButtons(e),jQuery("#place_order").hide())};jQuery(document.body).on("updated_checkout",()=>{this.renderer.render(e,this.configurator.configuration()),t()}),jQuery(document.body).on("payment_method_selected",()=>{t()}),this.renderer.render(e,this.configurator.configuration())}shouldRender(){return!document.querySelector(this.gateway.button.cancel_wrapper)&&null!==document.querySelector(this.gateway.button.wrapper)}};var y=class{render(e,t){this.isAlreadyRendered(e)||paypal.Buttons(t).render(e)}isAlreadyRendered(e){return document.querySelector(e).hasChildNodes()}hideButtons(e){document.querySelector(e).style.display="none"}showButtons(e){document.querySelector(e).style.display="block"}};document.addEventListener("DOMContentLoaded",()=>{const e=document.createElement("script");e.setAttribute("src",PayPalCommerceGateway.button.url),e.addEventListener("load",e=>{(()=>{const e=new y,t=new n,r=new a(PayPalCommerceGateway,t),o=new s(PayPalCommerceGateway,t),i=PayPalCommerceGateway.context;if("mini-cart"===i||"product"===i){new c(PayPalCommerceGateway,e,r).init()}if("product"===i){new p(PayPalCommerceGateway,e).init()}if("cart"===i){new f(PayPalCommerceGateway,e,r).init()}if("checkout"===i){new m(PayPalCommerceGateway,e,o).init()}})()}),document.body.append(e)})}]); //# sourceMappingURL=button.js.map \ No newline at end of file diff --git a/modules.local/ppcp-button/assets/js/button.js.map b/modules.local/ppcp-button/assets/js/button.js.map index c38c94ff5..762cc656a 100644 --- a/modules.local/ppcp-button/assets/js/button.js.map +++ b/modules.local/ppcp-button/assets/js/button.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./resources/js/modules/Renderer.js","webpack:///./resources/js/modules/ButtonsToggleListener.js","webpack:///./resources/js/modules/Product.js","webpack:///./resources/js/modules/onApproveForContinue.js","webpack:///./resources/js/modules/SingleProductConfig.js","webpack:///./resources/js/modules/UpdateCart.js","webpack:///./resources/js/modules/ErrorHandler.js","webpack:///./resources/js/modules/CartConfig.js","webpack:///./resources/js/modules/onApproveForPayNow.js","webpack:///./resources/js/modules/CheckoutConfig.js","webpack:///./resources/js/button.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Renderer","constructor","wrapper","this","render","buttonConfig","paypal","Buttons","hideButtons","document","querySelector","style","display","showButtons","ButtonsToggleListener","element","showCallback","hideCallback","observer","init","MutationObserver","classList","contains","observe","attributes","disconnect","Product","id","quantity","variations","data","onApprove","context","actions","fetch","config","ajax","approve_order","endpoint","method","body","JSON","stringify","nonce","order_id","orderID","then","res","json","success","location","href","redirect","SingleProductConfig","updateCart","showButtonCallback","hideButtonCallback","formElement","errorHandler","configuration","hasVariations","createOrder","onError","error","message","getProducts","isGroupedProduct","products","querySelectorAll","forEach","elementName","getAttribute","match","length","parseInt","push","qty","clear","update","purchase_units","create_order","map","UpdateCart","onResolve","Promise","resolve","reject","result","resolved","ErrorHandler","text","add","innerText","sanitize","textarea","createElement","innerHTML","remove","CartConfig","click","CheckoutConfig","addEventListener","script","setAttribute","PayPalCommerceGateway","button","url","event","cartConfigurator","mini_cart_wrapper","jQuery","on","renderer","configurator","change_cart","cancel_wrapper","toggleButtons","val","show","hide","trigger","console","bootstrap","append"],"mappings":"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","file":"js/button.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","class Renderer {\n\n constructor(wrapper)\n {\n this.wrapper = wrapper;\n }\n\n render(buttonConfig)\n {\n\n paypal.Buttons(\n buttonConfig\n ).render(this.wrapper);\n }\n\n hideButtons()\n {\n document.querySelector(this.wrapper).style.display = 'none';\n }\n\n showButtons()\n {\n document.querySelector(this.wrapper).style.display = 'block';\n }\n}\n\nexport default Renderer;","/**\n * When you can't add something to the cart, the PayPal buttons should not show.\n * Therefore we listen for changes on the add to cart button and show/hide the buttons accordingly.\n */\n\nclass ButtonsToggleListener {\n constructor(element, showCallback, hideCallback)\n {\n this.element = element;\n this.showCallback = showCallback;\n this.hideCallback = hideCallback;\n this.observer = null;\n }\n\n init()\n {\n const config = { attributes : true };\n const callback = () => {\n if (this.element.classList.contains('disabled')) {\n this.hideCallback();\n return;\n }\n this.showCallback();\n }\n this.observer = new MutationObserver(callback);\n this.observer.observe(this.element, config);\n }\n\n disconnect()\n {\n this.observer.disconnect();\n }\n}\n\nexport default ButtonsToggleListener;","class Product {\n\n constructor(id, quantity, variations) {\n this.id = id;\n this.quantity = quantity;\n this.variations = variations;\n }\n\n data() {\n return {\n id:this.id,\n quantity:this.quantity,\n variations:this.variations\n }\n }\n}\n\nexport default Product;","const onApprove = (context) => {\n return (data, actions) => {\n return fetch(context.config.ajax.approve_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: context.config.ajax.approve_order.nonce,\n order_id:data.orderID\n })\n }).then((res)=>{\n return res.json();\n }).then((data)=>{\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n location.href = context.config.redirect;\n });\n\n }\n}\n\nexport default onApprove;\n","import ButtonsToggleListener from \"./ButtonsToggleListener\";\nimport Product from \"./Product\";\nimport onApprove from \"./onApproveForContinue\";\nclass SingleProductConfig {\n\n constructor(\n config,\n updateCart,\n showButtonCallback,\n hideButtonCallback,\n formElement,\n errorHandler\n ) {\n this.config = config;\n this.updateCart = updateCart;\n this.showButtonCallback = showButtonCallback;\n this.hideButtonCallback = hideButtonCallback;\n this.formElement = formElement;\n this.errorHandler = errorHandler;\n }\n\n configuration()\n {\n\n if ( this.hasVariations() ) {\n const observer = new ButtonsToggleListener(\n this.formElement.querySelector('.single_add_to_cart_button'),\n this.showButtonCallback,\n this.hideButtonCallback\n );\n observer.init();\n }\n\n return {\n createOrder: this.createOrder(),\n onApprove: onApprove(this),\n onError: (error) => {\n this.errorHandler.message(error);\n }\n }\n }\n\n createOrder()\n {\n var getProducts = null;\n if (! this.isGroupedProduct() ) {\n getProducts = () => {\n const id = document.querySelector('[name=\"add-to-cart\"]').value;\n const qty = document.querySelector('[name=\"quantity\"]').value;\n const variations = this.variations();\n return [new Product(id, qty, variations)];\n }\n } else {\n getProducts = () => {\n const products = [];\n this.formElement.querySelectorAll('input[type=\"number\"]').forEach((element) => {\n if (! element.value) {\n return;\n }\n const elementName = element.getAttribute('name').match(/quantity\\[([\\d]*)\\]/);\n if (elementName.length !== 2) {\n return;\n }\n const id = parseInt(elementName[1]);\n const quantity = parseInt(element.value);\n products.push(new Product(id, quantity, null));\n })\n return products;\n }\n }\n const createOrder = (data, actions) => {\n this.errorHandler.clear();\n\n const onResolve = (purchase_units) => {\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n purchase_units\n })\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n return data.data.id;\n });\n };\n\n const promise = this.updateCart.update(onResolve, getProducts());\n return promise;\n };\n return createOrder;\n }\n\n variations()\n {\n\n if (! this.hasVariations()) {\n return null;\n }\n const attributes = [...this.formElement.querySelectorAll(\"[name^='attribute_']\")].map(\n (element) => {\n return {\n value:element.value,\n name:element.name\n }\n }\n );\n return attributes;\n }\n\n hasVariations()\n {\n return this.formElement.classList.contains('variations_form');\n }\n\n isGroupedProduct()\n {\n return this.formElement.classList.contains('grouped_form');\n }\n}\nexport default SingleProductConfig;","import Product from \"./Product\";\nclass UpdateCart {\n\n constructor(endpoint, nonce)\n {\n this.endpoint = endpoint;\n this.nonce = nonce;\n }\n\n /**\n *\n * @param onResolve\n * @param {Product[]} products\n * @returns {Promise}\n */\n update(onResolve, products)\n {\n return new Promise((resolve, reject) => {\n fetch(\n this.endpoint,\n {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.nonce,\n products,\n })\n }\n ).then(\n (result) => {\n return result.json();\n }\n ).then((result) => {\n if (! result.success) {\n reject(result.data);\n return;\n }\n\n const resolved = onResolve(result.data);\n resolve(resolved);\n })\n });\n }\n}\n\nexport default UpdateCart;","class ErrorHandler {\n\n constructor()\n {\n this.wrapper = document.querySelector('.woocommerce-notices-wrapper');\n }\n\n message(text)\n {\n this.wrapper.classList.add('woocommerce-error');\n this.wrapper.innerText = this.sanitize(text);\n }\n\n sanitize(text)\n {\n const textarea = document.createElement('textarea');\n textarea.innerHTML = text;\n return textarea.value;\n }\n\n clear()\n {\n if (! this.wrapper.classList.contains('woocommerce-error')) {\n return;\n }\n this.wrapper.classList.remove('woocommerce-error');\n this.wrapper.innerText = '';\n }\n}\n\nexport default ErrorHandler;","import onApprove from \"./onApproveForContinue.js\";\n\nclass CartConfig {\n\n constructor(config, errorHandler) {\n this.config = config;\n this.errorHandler = errorHandler;\n }\n\n configuration() {\n\n const createOrder = (data, actions) => {\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n purchase_units:[]\n })\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n return data.data.id;\n });\n }\n return {\n createOrder,\n onApprove:onApprove(this),\n onError: (error) => {\n this.errorHandler.message(error);\n }\n }\n }\n}\n\nexport default CartConfig;","const onApprove = (context) => {\n return (data, actions) => {\n return fetch(context.config.ajax.approve_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: context.config.ajax.approve_order.nonce,\n order_id:data.orderID\n })\n }).then((res)=>{\n return res.json();\n }).then((data)=>{\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n document.querySelector('#place_order').click()\n });\n\n }\n}\n\nexport default onApprove;","import onApprove from \"./onApproveForPayNow.js\";\n\nclass CheckoutConfig {\n\n constructor(config, errorHandler) {\n this.config = config;\n this.errorHandler = errorHandler;\n }\n\n configuration() {\n\n const createOrder = (data, actions) => {\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n purchase_units:[]\n })\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n return data.data.id;\n });\n }\n return {\n createOrder,\n onApprove:onApprove(this),\n onError: (error) => {\n this.errorHandler.message(error);\n }\n }\n }\n}\n\nexport default CheckoutConfig;","import Renderer from './modules/Renderer';\nimport SingleProductConfig from './modules/SingleProductConfig';\nimport UpdateCart from './modules/UpdateCart';\nimport ErrorHandler from './modules/ErrorHandler';\nimport CartConfig from './modules/CartConfig';\nimport CheckoutConfig from './modules/CheckoutConfig';\n\nconst bootstrap = ()=> {\n const context = PayPalCommerceGateway.context;\n const errorHandler = new ErrorHandler();\n const cartConfigurator = new CartConfig(\n PayPalCommerceGateway,\n errorHandler\n );\n // Configure mini cart buttons\n if (document.querySelector(PayPalCommerceGateway.button.mini_cart_wrapper)) {\n\n const renderer = new Renderer(\n PayPalCommerceGateway.button.mini_cart_wrapper\n );\n renderer.render(cartConfigurator.configuration())\n }\n jQuery( document.body ).on( 'wc_fragments_loaded wc_fragments_refreshed', () => {\n if (! document.querySelector(PayPalCommerceGateway.button.mini_cart_wrapper)) {\n return;\n }\n const renderer = new Renderer(\n PayPalCommerceGateway.button.mini_cart_wrapper\n );\n renderer.render(cartConfigurator.configuration())\n } );\n\n // Configure context buttons\n if (! document.querySelector(PayPalCommerceGateway.button.wrapper)) {\n return;\n }\n const renderer = new Renderer(\n PayPalCommerceGateway.button.wrapper\n );\n let configurator = null;\n if (context === 'product') {\n if (! document.querySelector('form.cart')) {\n return;\n }\n const updateCart = new UpdateCart(\n PayPalCommerceGateway.ajax.change_cart.endpoint,\n PayPalCommerceGateway.ajax.change_cart.nonce\n );\n configurator = new SingleProductConfig(\n PayPalCommerceGateway,\n updateCart,\n renderer.showButtons.bind(renderer),\n renderer.hideButtons.bind(renderer),\n document.querySelector('form.cart'),\n errorHandler\n );\n }\n if (context === 'cart') {\n configurator = cartConfigurator;\n\n jQuery( document.body ).on( 'updated_cart_totals updated_checkout', () => {\n renderer.render(configurator.configuration())\n });\n }\n if (context === 'checkout' ) {\n configurator = new CheckoutConfig(\n PayPalCommerceGateway,\n errorHandler\n );\n\n if (!document.querySelector(PayPalCommerceGateway.button.cancel_wrapper)) {\n\n const toggleButtons = () => {\n const currentPaymentMethod = jQuery('input[name=\"payment_method\"]:checked').val();\n\n if (currentPaymentMethod !== 'ppcp-gateway') {\n renderer.hideButtons();\n jQuery('#place_order').show();\n } else {\n renderer.showButtons();\n jQuery('#place_order').hide();\n }\n }\n jQuery(document.body).on('updated_checkout', () => {\n renderer.render(configurator.configuration());\n jQuery(document.body).trigger('payment_method_selected')\n });\n jQuery(document.body).on('payment_method_selected', toggleButtons );\n toggleButtons();\n }\n }\n if (! configurator) {\n console.error('No context for button found.');\n return;\n }\n\n renderer.render(configurator.configuration());\n}\ndocument.addEventListener(\n 'DOMContentLoaded',\n () => {\n\n if (! typeof(PayPalCommerceGateway)) {\n console.error('PayPal button could not be configured.');\n return;\n }\n\n const script = document.createElement('script');\n script.setAttribute('src', PayPalCommerceGateway.button.url);\n script.addEventListener('load', (event) => {\n bootstrap();\n })\n document.body.append(script);\n\n\n }\n);"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./resources/js/modules/ErrorHandler.js","webpack:///./resources/js/modules/onApproveForContinue.js","webpack:///./resources/js/modules/CartConfig.js","webpack:///./resources/js/modules/onApproveForPayNow.js","webpack:///./resources/js/modules/CheckoutConfig.js","webpack:///./resources/js/modules/MiniCartBootstap.js","webpack:///./resources/js/modules/Product.js","webpack:///./resources/js/modules/UpdateCart.js","webpack:///./resources/js/modules/ButtonsToggleListener.js","webpack:///./resources/js/modules/SingleProductConfig.js","webpack:///./resources/js/modules/SingleProductBootstap.js","webpack:///./resources/js/modules/CartBootstap.js","webpack:///./resources/js/modules/CheckoutBootstap.js","webpack:///./resources/js/modules/Renderer.js","webpack:///./resources/js/button.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","ErrorHandler","constructor","this","wrapper","document","querySelector","message","text","classList","add","innerText","sanitize","textarea","createElement","innerHTML","clear","contains","remove","onApprove","context","data","actions","fetch","config","ajax","approve_order","endpoint","method","body","JSON","stringify","nonce","order_id","orderID","then","res","json","success","location","href","redirect","CartConfig","errorHandler","configuration","createOrder","create_order","purchase_units","id","onError","error","click","CheckoutConfig","MiniCartBootstap","gateway","renderer","configurator","init","shouldRender","jQuery","on","render","button","mini_cart_wrapper","Product","quantity","variations","UpdateCart","update","onResolve","products","Promise","resolve","reject","result","resolved","ButtonsToggleListener","element","showCallback","hideCallback","observer","callback","MutationObserver","observe","attributes","disconnect","SingleProductConfig","updateCart","showButtonCallback","hideButtonCallback","formElement","hasVariations","getProducts","isGroupedProduct","querySelectorAll","forEach","elementName","getAttribute","match","length","parseInt","push","qty","map","SingleProductBootstap","change_cart","buttonWrapper","showButtons","hideButtons","CartBootstrap","CheckoutBootstap","toggleButtons","val","show","hide","cancel_wrapper","Renderer","buttonConfig","isAlreadyRendered","paypal","Buttons","hasChildNodes","style","display","addEventListener","script","setAttribute","PayPalCommerceGateway","url","event","cartConfig","checkoutConfig","bootstrap","append"],"mappings":"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","file":"js/button.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","class ErrorHandler {\n\n constructor()\n {\n this.wrapper = document.querySelector('.woocommerce-notices-wrapper');\n }\n\n message(text)\n {\n this.wrapper.classList.add('woocommerce-error');\n this.wrapper.innerText = this.sanitize(text);\n }\n\n sanitize(text)\n {\n const textarea = document.createElement('textarea');\n textarea.innerHTML = text;\n return textarea.value;\n }\n\n clear()\n {\n if (! this.wrapper.classList.contains('woocommerce-error')) {\n return;\n }\n this.wrapper.classList.remove('woocommerce-error');\n this.wrapper.innerText = '';\n }\n}\n\nexport default ErrorHandler;","const onApprove = (context) => {\n return (data, actions) => {\n return fetch(context.config.ajax.approve_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: context.config.ajax.approve_order.nonce,\n order_id:data.orderID\n })\n }).then((res)=>{\n return res.json();\n }).then((data)=>{\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n location.href = context.config.redirect;\n });\n\n }\n}\n\nexport default onApprove;\n","import onApprove from \"./onApproveForContinue.js\";\n\nclass CartConfig {\n\n constructor(config, errorHandler) {\n this.config = config;\n this.errorHandler = errorHandler;\n }\n\n configuration() {\n\n const createOrder = (data, actions) => {\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n purchase_units:[]\n })\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n return data.data.id;\n });\n }\n return {\n createOrder,\n onApprove:onApprove(this),\n onError: (error) => {\n this.errorHandler.message(error);\n }\n }\n }\n}\n\nexport default CartConfig;","const onApprove = (context) => {\n return (data, actions) => {\n return fetch(context.config.ajax.approve_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: context.config.ajax.approve_order.nonce,\n order_id:data.orderID\n })\n }).then((res)=>{\n return res.json();\n }).then((data)=>{\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n document.querySelector('#place_order').click()\n });\n\n }\n}\n\nexport default onApprove;","import onApprove from \"./onApproveForPayNow.js\";\n\nclass CheckoutConfig {\n\n constructor(config, errorHandler) {\n this.config = config;\n this.errorHandler = errorHandler;\n }\n\n configuration() {\n\n const createOrder = (data, actions) => {\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n purchase_units:[]\n })\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n return data.data.id;\n });\n }\n return {\n createOrder,\n onApprove:onApprove(this),\n onError: (error) => {\n this.errorHandler.message(error);\n }\n }\n }\n}\n\nexport default CheckoutConfig;","class MiniCartBootstap {\n constructor(gateway, renderer, configurator) {\n this.gateway = gateway;\n this.renderer = renderer;\n this.configurator = configurator;\n }\n\n init() {\n if (!this.shouldRender()) {\n return;\n }\n\n jQuery(document.body).\n on('wc_fragments_loaded wc_fragments_refreshed', () => {\n renderer.render(this.configurator.configuration());\n });\n\n this.renderer.render(\n this.gateway.button.mini_cart_wrapper,\n this.configurator.configuration(),\n );\n }\n\n shouldRender() {\n return document.querySelector(this.gateway.button.mini_cart_wrapper) !== null;\n }\n}\n\nexport default MiniCartBootstap;","class Product {\n\n constructor(id, quantity, variations) {\n this.id = id;\n this.quantity = quantity;\n this.variations = variations;\n }\n\n data() {\n return {\n id:this.id,\n quantity:this.quantity,\n variations:this.variations\n }\n }\n}\n\nexport default Product;","import Product from \"./Product\";\nclass UpdateCart {\n\n constructor(endpoint, nonce)\n {\n this.endpoint = endpoint;\n this.nonce = nonce;\n }\n\n /**\n *\n * @param onResolve\n * @param {Product[]} products\n * @returns {Promise}\n */\n update(onResolve, products)\n {\n return new Promise((resolve, reject) => {\n fetch(\n this.endpoint,\n {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.nonce,\n products,\n })\n }\n ).then(\n (result) => {\n return result.json();\n }\n ).then((result) => {\n if (! result.success) {\n reject(result.data);\n return;\n }\n\n const resolved = onResolve(result.data);\n resolve(resolved);\n })\n });\n }\n}\n\nexport default UpdateCart;","/**\n * When you can't add something to the cart, the PayPal buttons should not show.\n * Therefore we listen for changes on the add to cart button and show/hide the buttons accordingly.\n */\n\nclass ButtonsToggleListener {\n constructor(element, showCallback, hideCallback)\n {\n this.element = element;\n this.showCallback = showCallback;\n this.hideCallback = hideCallback;\n this.observer = null;\n }\n\n init()\n {\n const config = { attributes : true };\n const callback = () => {\n if (this.element.classList.contains('disabled')) {\n this.hideCallback();\n return;\n }\n this.showCallback();\n }\n this.observer = new MutationObserver(callback);\n this.observer.observe(this.element, config);\n callback();\n }\n\n disconnect()\n {\n this.observer.disconnect();\n }\n}\n\nexport default ButtonsToggleListener;","import ButtonsToggleListener from \"./ButtonsToggleListener\";\nimport Product from \"./Product\";\nimport onApprove from \"./onApproveForContinue\";\nclass SingleProductConfig {\n\n constructor(\n config,\n updateCart,\n showButtonCallback,\n hideButtonCallback,\n formElement,\n errorHandler\n ) {\n this.config = config;\n this.updateCart = updateCart;\n this.showButtonCallback = showButtonCallback;\n this.hideButtonCallback = hideButtonCallback;\n this.formElement = formElement;\n this.errorHandler = errorHandler;\n }\n\n configuration()\n {\n\n if ( this.hasVariations() ) {\n const observer = new ButtonsToggleListener(\n this.formElement.querySelector('.single_add_to_cart_button'),\n this.showButtonCallback,\n this.hideButtonCallback\n );\n observer.init();\n }\n\n return {\n createOrder: this.createOrder(),\n onApprove: onApprove(this),\n onError: (error) => {\n this.errorHandler.message(error);\n }\n }\n }\n\n createOrder()\n {\n var getProducts = null;\n if (! this.isGroupedProduct() ) {\n getProducts = () => {\n const id = document.querySelector('[name=\"add-to-cart\"]').value;\n const qty = document.querySelector('[name=\"quantity\"]').value;\n const variations = this.variations();\n return [new Product(id, qty, variations)];\n }\n } else {\n getProducts = () => {\n const products = [];\n this.formElement.querySelectorAll('input[type=\"number\"]').forEach((element) => {\n if (! element.value) {\n return;\n }\n const elementName = element.getAttribute('name').match(/quantity\\[([\\d]*)\\]/);\n if (elementName.length !== 2) {\n return;\n }\n const id = parseInt(elementName[1]);\n const quantity = parseInt(element.value);\n products.push(new Product(id, quantity, null));\n })\n return products;\n }\n }\n const createOrder = (data, actions) => {\n this.errorHandler.clear();\n\n const onResolve = (purchase_units) => {\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n purchase_units\n })\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n return data.data.id;\n });\n };\n\n const promise = this.updateCart.update(onResolve, getProducts());\n return promise;\n };\n return createOrder;\n }\n\n variations()\n {\n\n if (! this.hasVariations()) {\n return null;\n }\n const attributes = [...this.formElement.querySelectorAll(\"[name^='attribute_']\")].map(\n (element) => {\n return {\n value:element.value,\n name:element.name\n }\n }\n );\n return attributes;\n }\n\n hasVariations()\n {\n return this.formElement.classList.contains('variations_form');\n }\n\n isGroupedProduct()\n {\n return this.formElement.classList.contains('grouped_form');\n }\n}\nexport default SingleProductConfig;","import ErrorHandler from './ErrorHandler';\nimport UpdateCart from './UpdateCart';\nimport SingleProductConfig from './SingleProductConfig';\n\nclass SingleProductBootstap {\n constructor(gateway, renderer) {\n this.gateway = gateway;\n this.renderer = renderer;\n }\n\n init() {\n if (!this.shouldRender()) {\n return;\n }\n\n const errorHandler = new ErrorHandler();\n const updateCart = new UpdateCart(\n this.gateway.ajax.change_cart.endpoint,\n this.gateway.ajax.change_cart.nonce,\n );\n const buttonWrapper = this.gateway.button.wrapper;\n const configurator = new SingleProductConfig(\n this.gateway,\n updateCart,\n () => {\n this.renderer.showButtons(buttonWrapper);\n },\n () => {\n this.renderer.hideButtons(buttonWrapper);\n },\n document.querySelector('form.cart'),\n errorHandler,\n );\n\n this.renderer.render(\n buttonWrapper,\n configurator.configuration(),\n );\n }\n\n shouldRender() {\n if (document.querySelector('form.cart') === null) {\n return false;\n }\n\n return document.querySelector(this.gateway.button.wrapper) !== null;\n }\n}\n\nexport default SingleProductBootstap;","class CartBootstrap {\n constructor(gateway, renderer, configurator) {\n this.gateway = gateway;\n this.renderer = renderer;\n this.configurator = configurator;\n }\n\n init() {\n if (!this.shouldRender()) {\n return;\n }\n\n jQuery(document.body).on('updated_cart_totals updated_checkout', () => {\n this.renderer.render(this.configurator.configuration());\n });\n\n this.renderer.render(\n this.gateway.button.wrapper,\n this.configurator.configuration(),\n );\n }\n\n shouldRender() {\n return document.querySelector(this.gateway.button.wrapper) !== null;\n }\n}\n\nexport default CartBootstrap;","class CheckoutBootstap {\n constructor(gateway, renderer, configurator) {\n this.gateway = gateway;\n this.renderer = renderer;\n this.configurator = configurator;\n }\n\n init() {\n if (!this.shouldRender()) {\n return;\n }\n\n const buttonWrapper = this.gateway.button.wrapper;\n\n const toggleButtons = () => {\n const currentPaymentMethod = jQuery(\n 'input[name=\"payment_method\"]:checked').val();\n\n if (currentPaymentMethod !== 'ppcp-gateway') {\n this.renderer.hideButtons(buttonWrapper);\n jQuery('#place_order').show();\n }\n else {\n this.renderer.showButtons(buttonWrapper);\n jQuery('#place_order').hide();\n }\n };\n\n jQuery(document.body).on('updated_checkout', () => {\n this.renderer.render(\n buttonWrapper,\n this.configurator.configuration(),\n );\n toggleButtons();\n });\n\n jQuery(document.body).on('payment_method_selected', () => {\n toggleButtons();\n });\n\n this.renderer.render(\n buttonWrapper,\n this.configurator.configuration(),\n );\n }\n\n shouldRender() {\n if (document.querySelector(this.gateway.button.cancel_wrapper)) {\n return false;\n }\n\n return document.querySelector(this.gateway.button.wrapper) !== null;\n }\n}\n\nexport default CheckoutBootstap;","class Renderer {\n render(wrapper, buttonConfig) {\n if (this.isAlreadyRendered(wrapper)) {\n return;\n }\n\n paypal.Buttons(\n buttonConfig,\n ).render(wrapper);\n }\n\n isAlreadyRendered(wrapper) {\n return document.querySelector(wrapper).hasChildNodes();\n }\n\n hideButtons(element) {\n document.querySelector(element).style.display = 'none';\n }\n\n showButtons(element) {\n document.querySelector(element).style.display = 'block';\n }\n}\n\nexport default Renderer;","import ErrorHandler from './modules/ErrorHandler';\nimport CartConfig from './modules/CartConfig';\nimport CheckoutConfig from \"./modules/CheckoutConfig\";\nimport MiniCartBootstap from './modules/MiniCartBootstap';\nimport SingleProductBootstap from './modules/SingleProductBootstap';\nimport CartBootstrap from './modules/CartBootstap';\nimport CheckoutBootstap from './modules/CheckoutBootstap';\nimport Renderer from './modules/Renderer';\n\nconst bootstrap = () => {\n const renderer = new Renderer;\n const errorHandler = new ErrorHandler();\n const cartConfig = new CartConfig(\n PayPalCommerceGateway,\n errorHandler,\n );\n const checkoutConfig = new CheckoutConfig(\n PayPalCommerceGateway,\n errorHandler\n );\n const context = PayPalCommerceGateway.context;\n\n if (context === 'mini-cart' || context === 'product') {\n const miniCartBootstap = new MiniCartBootstap(\n PayPalCommerceGateway,\n renderer,\n cartConfig,\n );\n\n miniCartBootstap.init();\n }\n\n if (context === 'product') {\n const singleProductBootstap = new SingleProductBootstap(\n PayPalCommerceGateway,\n renderer,\n );\n\n singleProductBootstap.init();\n }\n\n if (context === 'cart') {\n const cartBootstrap = new CartBootstrap(\n PayPalCommerceGateway,\n renderer,\n cartConfig,\n );\n\n cartBootstrap.init();\n }\n\n if (context === 'checkout') {\n const checkoutBootstap = new CheckoutBootstap(\n PayPalCommerceGateway,\n renderer,\n checkoutConfig,\n );\n\n checkoutBootstap.init();\n }\n};\ndocument.addEventListener(\n 'DOMContentLoaded',\n () => {\n if (!typeof (PayPalCommerceGateway)) {\n console.error('PayPal button could not be configured.');\n return;\n }\n\n const script = document.createElement('script');\n\n script.setAttribute('src', PayPalCommerceGateway.button.url);\n script.addEventListener('load', (event) => {\n bootstrap();\n });\n\n document.body.append(script);\n },\n);"],"sourceRoot":""} \ No newline at end of file diff --git a/modules.local/ppcp-button/resources/js/button.js b/modules.local/ppcp-button/resources/js/button.js index 74cf19a26..b49a8f86b 100644 --- a/modules.local/ppcp-button/resources/js/button.js +++ b/modules.local/ppcp-button/resources/js/button.js @@ -1,117 +1,79 @@ -import Renderer from './modules/Renderer'; -import SingleProductConfig from './modules/SingleProductConfig'; -import UpdateCart from './modules/UpdateCart'; import ErrorHandler from './modules/ErrorHandler'; import CartConfig from './modules/CartConfig'; -import CheckoutConfig from './modules/CheckoutConfig'; +import CheckoutConfig from "./modules/CheckoutConfig"; +import MiniCartBootstap from './modules/MiniCartBootstap'; +import SingleProductBootstap from './modules/SingleProductBootstap'; +import CartBootstrap from './modules/CartBootstap'; +import CheckoutBootstap from './modules/CheckoutBootstap'; +import Renderer from './modules/Renderer'; -const bootstrap = ()=> { - const context = PayPalCommerceGateway.context; +const bootstrap = () => { + const renderer = new Renderer; const errorHandler = new ErrorHandler(); - const cartConfigurator = new CartConfig( + const cartConfig = new CartConfig( + PayPalCommerceGateway, + errorHandler, + ); + const checkoutConfig = new CheckoutConfig( PayPalCommerceGateway, errorHandler ); - // Configure mini cart buttons - if (document.querySelector(PayPalCommerceGateway.button.mini_cart_wrapper)) { + const context = PayPalCommerceGateway.context; - const renderer = new Renderer( - PayPalCommerceGateway.button.mini_cart_wrapper + if (context === 'mini-cart' || context === 'product') { + const miniCartBootstap = new MiniCartBootstap( + PayPalCommerceGateway, + renderer, + cartConfig, ); - renderer.render(cartConfigurator.configuration()) - } - jQuery( document.body ).on( 'wc_fragments_loaded wc_fragments_refreshed', () => { - if (! document.querySelector(PayPalCommerceGateway.button.mini_cart_wrapper)) { - return; - } - const renderer = new Renderer( - PayPalCommerceGateway.button.mini_cart_wrapper - ); - renderer.render(cartConfigurator.configuration()) - } ); - // Configure context buttons - if (! document.querySelector(PayPalCommerceGateway.button.wrapper)) { - return; + miniCartBootstap.init(); } - const renderer = new Renderer( - PayPalCommerceGateway.button.wrapper - ); - let configurator = null; + if (context === 'product') { - if (! document.querySelector('form.cart')) { - return; - } - const updateCart = new UpdateCart( - PayPalCommerceGateway.ajax.change_cart.endpoint, - PayPalCommerceGateway.ajax.change_cart.nonce - ); - configurator = new SingleProductConfig( + const singleProductBootstap = new SingleProductBootstap( PayPalCommerceGateway, - updateCart, - renderer.showButtons.bind(renderer), - renderer.hideButtons.bind(renderer), - document.querySelector('form.cart'), - errorHandler + renderer, ); + + singleProductBootstap.init(); } + if (context === 'cart') { - configurator = cartConfigurator; - - jQuery( document.body ).on( 'updated_cart_totals updated_checkout', () => { - renderer.render(configurator.configuration()) - }); - } - if (context === 'checkout' ) { - configurator = new CheckoutConfig( + const cartBootstrap = new CartBootstrap( PayPalCommerceGateway, - errorHandler + renderer, + cartConfig, ); - if (!document.querySelector(PayPalCommerceGateway.button.cancel_wrapper)) { - - const toggleButtons = () => { - const currentPaymentMethod = jQuery('input[name="payment_method"]:checked').val(); - - if (currentPaymentMethod !== 'ppcp-gateway') { - renderer.hideButtons(); - jQuery('#place_order').show(); - } else { - renderer.showButtons(); - jQuery('#place_order').hide(); - } - } - jQuery(document.body).on('updated_checkout', () => { - renderer.render(configurator.configuration()); - jQuery(document.body).trigger('payment_method_selected') - }); - jQuery(document.body).on('payment_method_selected', toggleButtons ); - toggleButtons(); - } - } - if (! configurator) { - console.error('No context for button found.'); - return; + cartBootstrap.init(); } - renderer.render(configurator.configuration()); -} + if (context === 'checkout') { + const checkoutBootstap = new CheckoutBootstap( + PayPalCommerceGateway, + renderer, + checkoutConfig, + ); + + checkoutBootstap.init(); + } +}; document.addEventListener( 'DOMContentLoaded', () => { - - if (! typeof(PayPalCommerceGateway)) { + if (!typeof (PayPalCommerceGateway)) { console.error('PayPal button could not be configured.'); return; } const script = document.createElement('script'); + script.setAttribute('src', PayPalCommerceGateway.button.url); script.addEventListener('load', (event) => { bootstrap(); - }) + }); + document.body.append(script); - - - } + }, ); \ No newline at end of file diff --git a/modules.local/ppcp-button/resources/js/modules/ButtonsToggleListener.js b/modules.local/ppcp-button/resources/js/modules/ButtonsToggleListener.js index 4158fc44a..bed5afcda 100644 --- a/modules.local/ppcp-button/resources/js/modules/ButtonsToggleListener.js +++ b/modules.local/ppcp-button/resources/js/modules/ButtonsToggleListener.js @@ -24,6 +24,7 @@ class ButtonsToggleListener { } this.observer = new MutationObserver(callback); this.observer.observe(this.element, config); + callback(); } disconnect() diff --git a/modules.local/ppcp-button/resources/js/modules/CartBootstap.js b/modules.local/ppcp-button/resources/js/modules/CartBootstap.js new file mode 100644 index 000000000..a2a1f9917 --- /dev/null +++ b/modules.local/ppcp-button/resources/js/modules/CartBootstap.js @@ -0,0 +1,28 @@ +class CartBootstrap { + constructor(gateway, renderer, configurator) { + this.gateway = gateway; + this.renderer = renderer; + this.configurator = configurator; + } + + init() { + if (!this.shouldRender()) { + return; + } + + jQuery(document.body).on('updated_cart_totals updated_checkout', () => { + this.renderer.render(this.configurator.configuration()); + }); + + this.renderer.render( + this.gateway.button.wrapper, + this.configurator.configuration(), + ); + } + + shouldRender() { + return document.querySelector(this.gateway.button.wrapper) !== null; + } +} + +export default CartBootstrap; \ No newline at end of file diff --git a/modules.local/ppcp-button/resources/js/modules/CheckoutBootstap.js b/modules.local/ppcp-button/resources/js/modules/CheckoutBootstap.js new file mode 100644 index 000000000..2b6e2d3ea --- /dev/null +++ b/modules.local/ppcp-button/resources/js/modules/CheckoutBootstap.js @@ -0,0 +1,56 @@ +class CheckoutBootstap { + constructor(gateway, renderer, configurator) { + this.gateway = gateway; + this.renderer = renderer; + this.configurator = configurator; + } + + init() { + if (!this.shouldRender()) { + return; + } + + const buttonWrapper = this.gateway.button.wrapper; + + const toggleButtons = () => { + const currentPaymentMethod = jQuery( + 'input[name="payment_method"]:checked').val(); + + if (currentPaymentMethod !== 'ppcp-gateway') { + this.renderer.hideButtons(buttonWrapper); + jQuery('#place_order').show(); + } + else { + this.renderer.showButtons(buttonWrapper); + jQuery('#place_order').hide(); + } + }; + + jQuery(document.body).on('updated_checkout', () => { + this.renderer.render( + buttonWrapper, + this.configurator.configuration(), + ); + toggleButtons(); + }); + + jQuery(document.body).on('payment_method_selected', () => { + toggleButtons(); + }); + + this.renderer.render( + buttonWrapper, + this.configurator.configuration(), + ); + } + + shouldRender() { + if (document.querySelector(this.gateway.button.cancel_wrapper)) { + return false; + } + + return document.querySelector(this.gateway.button.wrapper) !== null; + } +} + +export default CheckoutBootstap; \ No newline at end of file diff --git a/modules.local/ppcp-button/resources/js/modules/MiniCartBootstap.js b/modules.local/ppcp-button/resources/js/modules/MiniCartBootstap.js new file mode 100644 index 000000000..58c7139f0 --- /dev/null +++ b/modules.local/ppcp-button/resources/js/modules/MiniCartBootstap.js @@ -0,0 +1,29 @@ +class MiniCartBootstap { + constructor(gateway, renderer, configurator) { + this.gateway = gateway; + this.renderer = renderer; + this.configurator = configurator; + } + + init() { + if (!this.shouldRender()) { + return; + } + + jQuery(document.body). + on('wc_fragments_loaded wc_fragments_refreshed', () => { + renderer.render(this.configurator.configuration()); + }); + + this.renderer.render( + this.gateway.button.mini_cart_wrapper, + this.configurator.configuration(), + ); + } + + shouldRender() { + return document.querySelector(this.gateway.button.mini_cart_wrapper) !== null; + } +} + +export default MiniCartBootstap; \ No newline at end of file diff --git a/modules.local/ppcp-button/resources/js/modules/Renderer.js b/modules.local/ppcp-button/resources/js/modules/Renderer.js index c9cebf6f2..8fe20147b 100644 --- a/modules.local/ppcp-button/resources/js/modules/Renderer.js +++ b/modules.local/ppcp-button/resources/js/modules/Renderer.js @@ -1,26 +1,24 @@ class Renderer { - - constructor(wrapper) - { - this.wrapper = wrapper; - } - - render(buttonConfig) - { + render(wrapper, buttonConfig) { + if (this.isAlreadyRendered(wrapper)) { + return; + } paypal.Buttons( - buttonConfig - ).render(this.wrapper); + buttonConfig, + ).render(wrapper); } - hideButtons() - { - document.querySelector(this.wrapper).style.display = 'none'; + isAlreadyRendered(wrapper) { + return document.querySelector(wrapper).hasChildNodes(); } - showButtons() - { - document.querySelector(this.wrapper).style.display = 'block'; + hideButtons(element) { + document.querySelector(element).style.display = 'none'; + } + + showButtons(element) { + document.querySelector(element).style.display = 'block'; } } diff --git a/modules.local/ppcp-button/resources/js/modules/SingleProductBootstap.js b/modules.local/ppcp-button/resources/js/modules/SingleProductBootstap.js new file mode 100644 index 000000000..e06829fc6 --- /dev/null +++ b/modules.local/ppcp-button/resources/js/modules/SingleProductBootstap.js @@ -0,0 +1,50 @@ +import ErrorHandler from './ErrorHandler'; +import UpdateCart from './UpdateCart'; +import SingleProductConfig from './SingleProductConfig'; + +class SingleProductBootstap { + constructor(gateway, renderer) { + this.gateway = gateway; + this.renderer = renderer; + } + + init() { + if (!this.shouldRender()) { + return; + } + + const errorHandler = new ErrorHandler(); + const updateCart = new UpdateCart( + this.gateway.ajax.change_cart.endpoint, + this.gateway.ajax.change_cart.nonce, + ); + const buttonWrapper = this.gateway.button.wrapper; + const configurator = new SingleProductConfig( + this.gateway, + updateCart, + () => { + this.renderer.showButtons(buttonWrapper); + }, + () => { + this.renderer.hideButtons(buttonWrapper); + }, + document.querySelector('form.cart'), + errorHandler, + ); + + this.renderer.render( + buttonWrapper, + configurator.configuration(), + ); + } + + shouldRender() { + if (document.querySelector('form.cart') === null) { + return false; + } + + return document.querySelector(this.gateway.button.wrapper) !== null; + } +} + +export default SingleProductBootstap; \ No newline at end of file