mirror of
https://github.com/vr-payment/shopware-6.git
synced 2026-06-05 03:19:49 +00:00
202 lines
7.7 KiB
JavaScript
202 lines
7.7 KiB
JavaScript
/* global window */
|
|
// noinspection ThisExpressionReferencesGlobalObjectJS
|
|
(function (window) {
|
|
/**
|
|
* VRPaymentCheckout
|
|
* @type {
|
|
* {
|
|
* payment_method_handler_name: string,
|
|
* payment_method_iframe_class: string,
|
|
* init: init,
|
|
* validationCallBack: validationCallBack,
|
|
* payment_method_handler_status: string,
|
|
* submitPayment: (function(*): boolean),
|
|
* payment_method_iframe_prefix: string,
|
|
* payment_form_id: string,
|
|
* payment_method_handler_prefix: string,
|
|
* payment_method_tabs: string,
|
|
* getIframe: (function(): boolean
|
|
* }
|
|
* }
|
|
*/
|
|
const VRPaymentCheckout = {
|
|
/**
|
|
* Variables
|
|
*/
|
|
payment_panel_id: 'vrpayment-payment-panel',
|
|
payment_method_iframe_id: 'vrpayment-payment-iframe',
|
|
payment_method_handler_name: 'vrpayment_payment_handler',
|
|
payment_method_handler_status: 'input[name="vrpayment_payment_handler_validation_status"]',
|
|
payment_form_id: 'confirmOrderForm',
|
|
button_cancel_id: 'vrpaymentOrderCancel',
|
|
button_home_override: 'vrpaymentHomeLink',
|
|
loader_id: 'vrpaymentLoader',
|
|
checkout_url: null,
|
|
checkout_url_id: 'checkoutUrl',
|
|
cart_recreate_url: null,
|
|
cart_recreate_url_id: 'cartRecreateUrl',
|
|
handler: null,
|
|
|
|
/**
|
|
* Initialize plugin
|
|
*/
|
|
init: function () {
|
|
VRPaymentCheckout.activateLoader(true);
|
|
this.checkout_url = document.getElementById(this.checkout_url_id).value;
|
|
this.cart_recreate_url = document.getElementById(this.cart_recreate_url_id).value;
|
|
|
|
document.getElementById(this.button_cancel_id).addEventListener('click', this.recreateCart, false);
|
|
document.getElementById(this.button_home_override).addEventListener('click', this.recreateCart, false);
|
|
document.getElementById(this.payment_form_id).addEventListener('submit', this.submitPayment, false);
|
|
|
|
VRPaymentCheckout.getIframe();
|
|
},
|
|
|
|
activateLoader: function (activate) {
|
|
const buttons = document.querySelectorAll('button');
|
|
if (activate) {
|
|
for (let i = 0; i < buttons.length; i++) {
|
|
buttons[i].disabled = true;
|
|
}
|
|
} else {
|
|
for (let i = 0; i < buttons.length; i++) {
|
|
buttons[i].disabled = false;
|
|
}
|
|
}
|
|
},
|
|
|
|
hideLoader: function () {
|
|
const loader = document.getElementById(VRPaymentCheckout.loader_id);
|
|
if (loader !== null && loader.parentNode !== null) {
|
|
loader.parentNode.removeChild(loader);
|
|
}
|
|
VRPaymentCheckout.activateLoader(false);
|
|
},
|
|
|
|
recreateCart: function (e) {
|
|
window.location.href = VRPaymentCheckout.cart_recreate_url;
|
|
e.preventDefault();
|
|
},
|
|
|
|
/**
|
|
* Submit form
|
|
*
|
|
* @param event
|
|
* @return {boolean}
|
|
*/
|
|
submitPayment: function (event) {
|
|
VRPaymentCheckout.activateLoader(true);
|
|
VRPaymentCheckout.handler.validate();
|
|
event.preventDefault();
|
|
return false;
|
|
},
|
|
|
|
/**
|
|
* Get iframe
|
|
*/
|
|
getIframe: function () {
|
|
const paymentPanel = document.getElementById(VRPaymentCheckout.payment_panel_id);
|
|
const paymentMethodConfigurationId = paymentPanel.dataset.id;
|
|
const iframeContainer = document.getElementById(VRPaymentCheckout.payment_method_iframe_id);
|
|
|
|
if (!VRPaymentCheckout.handler) { // iframe has not been loaded yet
|
|
// noinspection JSUnresolvedFunction
|
|
VRPaymentCheckout.handler = window.IframeCheckoutHandler(paymentMethodConfigurationId);
|
|
// noinspection JSUnresolvedFunction
|
|
VRPaymentCheckout.handler.setValidationCallback(function(validationResult){
|
|
VRPaymentCheckout.hideErrors();
|
|
VRPaymentCheckout.validationCallBack(validationResult);
|
|
});
|
|
VRPaymentCheckout.handler.setInitializeCallback(VRPaymentCheckout.hideLoader());
|
|
VRPaymentCheckout.handler.setHeightChangeCallback(function(height){
|
|
if(height < 1){ // iframe has no fields
|
|
VRPaymentCheckout.handler.submit();
|
|
}
|
|
});
|
|
VRPaymentCheckout.handler.create(iframeContainer);
|
|
setTimeout(VRPaymentCheckout.hideLoader(), 10000);
|
|
|
|
}
|
|
},
|
|
|
|
/**
|
|
* validation callback
|
|
* @param validationResult
|
|
*/
|
|
validationCallBack: function (validationResult) {
|
|
if (validationResult.success) {
|
|
document.querySelector(this.payment_method_handler_status).value = true;
|
|
VRPaymentCheckout.handler.submit();
|
|
} else {
|
|
document.body.scrollTop = 0;
|
|
document.documentElement.scrollTop = 0;
|
|
|
|
if (validationResult.errors) {
|
|
VRPaymentCheckout.showErrors(validationResult.errors);
|
|
}
|
|
document.querySelector(this.payment_method_handler_status).value = false;
|
|
VRPaymentCheckout.activateLoader(false);
|
|
}
|
|
},
|
|
|
|
showErrors: function(errors) {
|
|
let alert = document.createElement('div');
|
|
alert.setAttribute('class', 'alert alert-danger');
|
|
alert.setAttribute('role', 'alert');
|
|
alert.setAttribute('id', 'vrpayment-errors');
|
|
document.getElementsByClassName('flashbags')[0].appendChild(alert);
|
|
|
|
let alertContentContainer = document.createElement('div');
|
|
alertContentContainer.setAttribute('class', 'alert-content-container');
|
|
alert.appendChild(alertContentContainer);
|
|
|
|
let alertContent = document.createElement('div');
|
|
alertContent.setAttribute('class', 'alert-content');
|
|
alertContentContainer.appendChild(alertContent);
|
|
|
|
if (errors.length > 1) {
|
|
let alertList = document.createElement('ul');
|
|
alertList.setAttribute('class', 'alert-list');
|
|
alertContent.appendChild(alertList);
|
|
for (let index = 0; index < errors.length; index++) {
|
|
let alertListItem = document.createElement('li');
|
|
alertListItem.innerHTML = errors[index];
|
|
alertList.appendChild(alertListItem);
|
|
}
|
|
} else {
|
|
alertContent.innerHTML = errors[0];
|
|
}
|
|
},
|
|
|
|
hideErrors: function() {
|
|
let errorElement = document.getElementById('vrpayment-errors');
|
|
if (errorElement) {
|
|
errorElement.parentNode.removeChild(errorElement);
|
|
}
|
|
}
|
|
};
|
|
|
|
window.VRPaymentCheckout = VRPaymentCheckout;
|
|
|
|
}(typeof window !== "undefined" ? window : this));
|
|
|
|
/**
|
|
* Vanilla JS over JQuery
|
|
*/
|
|
window.addEventListener('load', function (e) {
|
|
VRPaymentCheckout.init();
|
|
window.history.pushState({}, document.title, VRPaymentCheckout.cart_recreate_url);
|
|
window.history.pushState({}, document.title, VRPaymentCheckout.checkout_url);
|
|
}, false);
|
|
|
|
/**
|
|
* This only works if the user has interacted with the page
|
|
* @link https://stackoverflow.com/questions/57339098/chrome-popstate-not-firing-on-back-button-if-no-user-interaction
|
|
*/
|
|
window.addEventListener('popstate', function (e) {
|
|
if (window.history.state == null) { // This means it's page load
|
|
return;
|
|
}
|
|
window.location.href = VRPaymentCheckout.cart_recreate_url;
|
|
}, false);
|