/* * 2007-2022 PayPal * * NOTICE OF LICENSE * * This source file is subject to the Academic Free License (AFL 3.0) * that is bundled with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/afl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@prestashop.com so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to http://www.prestashop.com for more information. * * @author 2007-2022 PayPal * @author 202 ecommerce * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * @copyright PayPal */ // init incontext import {Tools} from './tools.js'; const BNPL = { idProduct: null, combination: null, productQuantity: null, page: null, button: null, controller: sc_init_url, controllerScOrder: scOrderUrl, color: null, init() { this.updateInfo(); BNPL.checkProductAvailability(); prestashop.on('updatedProduct', function(e, xhr, settings) { BNPL.checkProductAvailability(); }); }, updateInfo() { this.page = $('[data-container-bnpl]').data('paypal-bnpl-source-page'); this.button = document.querySelector('[paypal-bnpl-button-container]'); if (this.page == 'product') { this.productQuantity = $('input[name="qty"]').val(); this.idProduct = $('[data-paypal-bnpl-id-product]').val(); this.combination = this.getCombination(); } }, getCombination() { let combination = [], res = false, re = /group\[([0-9]+)\]/; $.each($('#add-to-cart-or-refresh').serializeArray(), (key, item) => { if(res = item.name.match(re)) { combination.push(`${res[1]} : ${item.value}`); } }); return combination; }, initButton() { totPaypalBnplSdkButtons.Buttons({ fundingSource: totPaypalBnplSdkButtons.FUNDING.PAYLATER, style: { label: 'pay', height: 35, color: BNPL.getColor() }, createOrder: function(data, actions) { return BNPL.getIdOrder(); }, onApprove: function(data, actions) { BNPL.sendData(data); }, }).render(this.button); let event = new Event('paypal-after-init-bnpl-button'); document.dispatchEvent(event); }, getColor() { if (BNPL.color) { return BNPL.color; } return 'white'; }, setColor(color) { BNPL.color = color; }, sendData(data) { let form = document.createElement('form'); let input = document.createElement('input'); input.name = "paymentData"; input.value = JSON.stringify(data); form.method = "POST"; form.action = BNPL.controllerScOrder; form.appendChild(input); document.body.appendChild(form); form.submit(); }, getIdOrder() { let data = new Object(); let url = new URL(this.controller); url.searchParams.append('ajax', '1'); url.searchParams.append('action', 'CreateOrder'); this.updateInfo(); data['page'] = this.page; if (this.page == 'product') { data['idProduct'] = this.idProduct; data['quantity'] = this.productQuantity; data['combination'] = this.combination.join('|'); } return fetch(url.toString(), { method: 'post', headers: { 'content-type': 'application/json;charset=utf-8' }, body: JSON.stringify(data) }).then(function(res) { return res.json(); }).then(function(data) { if (data.success) { return data.idOrder; } }); }, checkProductAvailability() { if (this.page == 'payment-step') { return true; } let data = new Object(); let url = new URL(this.controller); url.searchParams.append('ajax', '1'); url.searchParams.append('action', 'CheckAvailability'); this.updateInfo(); data['page'] = this.page; if (this.page == 'product') { data['idProduct'] = this.idProduct; data['quantity'] = this.productQuantity; data['combination'] = this.combination.join('|'); } fetch(url.toString(), { method: 'post', headers: { 'content-type': 'application/json;charset=utf-8' }, body: JSON.stringify(data), }).then(function(res){ return res.json(); }).then(function (json) { if (json.success) { BNPL.button.style.display = 'block'; } else { BNPL.button.style.display = 'none'; } }); }, getStyleSetting() { // Returns a default styles if styleSetting is not setted if (this.styleSetting === null) { return { label: 'buynow', height: 35 }; } return this.styleSetting; }, disableTillConsenting() { Tools.disableTillConsenting( this.button, document.getElementById('conditions_to_approve[terms-and-conditions]') ); }, hideElementTillPaymentOptionChecked(paymentOptionSelector, hideElementSelector) { Tools.hideElementTillPaymentOptionChecked(paymentOptionSelector, hideElementSelector); } }; window.BNPL = BNPL;