/* * 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'; export const ApmButton = function(conf) { this.method = typeof conf['method'] != 'undefined' ? conf['method'] : null; this.button = typeof conf['button'] != 'undefined' ? conf['button'] : null; this.controller = typeof conf['controller'] != 'undefined' ? conf['controller'] : null; this.validationController = typeof conf['validationController'] != 'undefined' ? conf['validationController'] : null; this.paypal = conf['paypal'] === undefined ? null : conf['paypal']; this.messages = conf['messages'] === undefined ? [] : conf['messages']; }; ApmButton.prototype.initButton = function() { if (this.paypal == null) { return; } let paypalButton = this.paypal.Buttons({ fundingSource: this.method, createOrder: function(data, actions) { return this.getIdOrder(); }.bind(this), onApprove: function(data, actions) { this.sendData(data); }.bind(this), }); if (paypalButton.isEligible() == false) { let buttonContainer = this.button instanceof Element ? this.button : document.querySelector(this.button); if (buttonContainer instanceof Element) { buttonContainer.appendChild( Tools.getAlert( this.messages['NOT_ELIGIBLE'] === undefined ? 'Payment method is not eligible' : this.messages['NOT_ELIGIBLE'], 'danger') ); } return; } paypalButton.render(this.button); Tools.disableTillConsenting( document.querySelector(this.button), document.getElementById('conditions_to_approve[terms-and-conditions]') ); }; ApmButton.prototype.getIdOrder = function() { let url = new URL(this.controller); url.searchParams.append('ajax', '1'); url.searchParams.append('action', 'CreateOrder'); return fetch(url.toString(), { method: 'post', headers: { 'content-type': 'application/json;charset=utf-8' }, body: JSON.stringify({page: 'cart', apmMethod: this.method}) }).then(function(res) { return res.json(); }).then(function(data) { if (data.success) { return data.idOrder; } }); }; ApmButton.prototype.sendData = function(data) { let form = document.createElement('form'); let input = document.createElement('input'); input.name = "paymentData"; input.value = JSON.stringify(data); form.method = "POST"; form.action = this.validationController; form.appendChild(input); document.body.appendChild(form); form.submit(); }; ApmButton.prototype.hideElementTillPaymentOptionChecked = function(paymentOptionSelector, hideElementSelector) { Tools.hideElementTillPaymentOptionChecked(paymentOptionSelector, hideElementSelector); }; ApmButton.prototype.addMarkTo = function(element, styles = {}) { if (element instanceof Element == false) { return; } const markContainer = document.createElement('span'); for (let key in styles) { markContainer.style[key] = styles[key]; } markContainer.setAttribute('paypal-mark-container', ''); element.appendChild(markContainer); const mark = this.paypal.Marks({ fundingSource: this.method }); if (mark.isEligible()) { mark.render(markContainer); } }; window.ApmButton = ApmButton;