2020-04-30 15:28:48 +03:00
|
|
|
import CheckoutActionHandler from '../ActionHandler/CheckoutActionHandler';
|
2022-10-20 09:24:24 +03:00
|
|
|
import {setVisible, setVisibleByClass} from '../Helper/Hiding';
|
2022-03-15 09:16:37 +02:00
|
|
|
import {
|
|
|
|
getCurrentPaymentMethod,
|
|
|
|
isSavedCardSelected, ORDER_BUTTON_SELECTOR,
|
|
|
|
PaymentMethods
|
|
|
|
} from "../Helper/CheckoutMethodState";
|
2023-07-03 17:35:01 +01:00
|
|
|
import {disable, enable} from "../Helper/ButtonDisabler";
|
2020-04-10 10:34:49 +03:00
|
|
|
|
2020-04-08 18:50:29 +03:00
|
|
|
class CheckoutBootstap {
|
2022-10-27 09:09:45 +03:00
|
|
|
constructor(gateway, renderer, messages, spinner, errorHandler) {
|
2020-04-09 12:56:05 +03:00
|
|
|
this.gateway = gateway;
|
2020-04-09 12:23:44 +03:00
|
|
|
this.renderer = renderer;
|
2020-09-28 14:05:02 +03:00
|
|
|
this.messages = messages;
|
|
|
|
this.spinner = spinner;
|
2022-10-27 09:09:45 +03:00
|
|
|
this.errorHandler = errorHandler;
|
2021-11-10 12:56:53 +02:00
|
|
|
|
2022-03-15 09:16:37 +02:00
|
|
|
this.standardOrderButtonSelector = ORDER_BUTTON_SELECTOR;
|
2023-07-03 17:35:01 +01:00
|
|
|
|
|
|
|
this.renderer.onButtonsInit(this.gateway.button.wrapper, () => {
|
|
|
|
this.handleButtonStatus();
|
|
|
|
}, true);
|
2020-04-08 18:50:29 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
init() {
|
2020-04-09 18:45:49 +03:00
|
|
|
this.render();
|
2023-07-03 17:35:01 +01:00
|
|
|
this.handleButtonStatus();
|
2023-07-03 11:40:37 +01:00
|
|
|
|
2021-11-11 10:57:17 +02:00
|
|
|
// Unselect saved card.
|
|
|
|
// WC saves form values, so with our current UI it would be a bit weird
|
|
|
|
// if the user paid with saved, then after some time tries to pay again,
|
|
|
|
// but wants to enter a new card, and to do that they have to choose “Select payment” in the list.
|
|
|
|
jQuery('#saved-credit-card').val(jQuery('#saved-credit-card option:first').val());
|
|
|
|
|
2020-04-09 11:54:19 +03:00
|
|
|
jQuery(document.body).on('updated_checkout', () => {
|
2021-04-20 11:56:27 +02:00
|
|
|
this.render()
|
2023-07-03 17:35:01 +01:00
|
|
|
this.handleButtonStatus();
|
2020-04-09 11:54:19 +03:00
|
|
|
});
|
|
|
|
|
2021-11-11 15:20:21 +02:00
|
|
|
jQuery(document.body).on('updated_checkout payment_method_selected', () => {
|
|
|
|
this.updateUi();
|
|
|
|
});
|
2021-04-20 11:56:27 +02:00
|
|
|
|
2021-09-14 11:24:27 +02:00
|
|
|
jQuery(document).on('hosted_fields_loaded', () => {
|
2021-09-09 17:28:16 +02:00
|
|
|
jQuery('#saved-credit-card').on('change', () => {
|
2021-11-11 15:20:21 +02:00
|
|
|
this.updateUi();
|
2021-09-09 17:28:16 +02:00
|
|
|
})
|
2021-09-14 11:24:27 +02:00
|
|
|
});
|
2021-04-20 11:56:27 +02:00
|
|
|
|
2021-11-11 15:20:21 +02:00
|
|
|
this.updateUi();
|
2020-04-08 18:50:29 +03:00
|
|
|
}
|
2020-04-09 10:49:37 +03:00
|
|
|
|
2023-07-03 17:35:01 +01:00
|
|
|
handleButtonStatus() {
|
|
|
|
if (!this.shouldEnable()) {
|
|
|
|
this.renderer.disableSmartButtons(this.gateway.button.wrapper);
|
|
|
|
disable(this.gateway.button.wrapper);
|
|
|
|
disable(this.gateway.messages.wrapper);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.renderer.enableSmartButtons(this.gateway.button.wrapper);
|
|
|
|
enable(this.gateway.button.wrapper);
|
|
|
|
enable(this.gateway.messages.wrapper);
|
|
|
|
}
|
|
|
|
|
2020-04-09 10:49:37 +03:00
|
|
|
shouldRender() {
|
2020-04-09 12:56:05 +03:00
|
|
|
if (document.querySelector(this.gateway.button.cancel_wrapper)) {
|
2020-04-09 10:49:37 +03:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-08-20 08:12:51 +03:00
|
|
|
return document.querySelector(this.gateway.button.wrapper) !== null || document.querySelector(this.gateway.hosted_fields.wrapper) !== null;
|
2020-04-09 10:49:37 +03:00
|
|
|
}
|
2020-04-09 18:45:49 +03:00
|
|
|
|
2023-07-03 11:40:37 +01:00
|
|
|
shouldEnable() {
|
|
|
|
return this.shouldRender()
|
|
|
|
&& this.gateway.button.is_disabled !== true;
|
|
|
|
}
|
|
|
|
|
2020-04-09 18:45:49 +03:00
|
|
|
render() {
|
2020-08-20 08:12:51 +03:00
|
|
|
if (!this.shouldRender()) {
|
|
|
|
return;
|
|
|
|
}
|
2020-08-20 08:20:37 +03:00
|
|
|
if (document.querySelector(this.gateway.hosted_fields.wrapper + '>div')) {
|
|
|
|
document.querySelector(this.gateway.hosted_fields.wrapper + '>div').setAttribute('style', '');
|
|
|
|
}
|
2020-04-10 10:34:49 +03:00
|
|
|
const actionHandler = new CheckoutActionHandler(
|
|
|
|
PayPalCommerceGateway,
|
2022-10-27 09:09:45 +03:00
|
|
|
this.errorHandler,
|
2020-09-28 14:05:02 +03:00
|
|
|
this.spinner
|
2020-04-10 10:34:49 +03:00
|
|
|
);
|
|
|
|
|
2023-01-16 12:37:16 +01:00
|
|
|
if(
|
|
|
|
PayPalCommerceGateway.data_client_id.has_subscriptions
|
|
|
|
&& PayPalCommerceGateway.data_client_id.paypal_subscriptions_enabled
|
|
|
|
) {
|
2023-05-09 11:42:31 +02:00
|
|
|
this.renderer.render(actionHandler.subscriptionsConfiguration(), {}, actionHandler.configuration());
|
2023-01-05 14:53:23 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2023-05-09 11:42:31 +02:00
|
|
|
this.renderer.render(actionHandler.configuration(), {}, actionHandler.configuration());
|
2020-04-09 18:45:49 +03:00
|
|
|
}
|
|
|
|
|
2021-11-11 15:20:21 +02:00
|
|
|
updateUi() {
|
2022-03-15 09:16:37 +02:00
|
|
|
const currentPaymentMethod = getCurrentPaymentMethod();
|
|
|
|
const isPaypal = currentPaymentMethod === PaymentMethods.PAYPAL;
|
|
|
|
const isCard = currentPaymentMethod === PaymentMethods.CARDS;
|
2022-07-19 09:20:26 +03:00
|
|
|
const isSeparateButtonGateway = [PaymentMethods.CARD_BUTTON].includes(currentPaymentMethod);
|
2022-03-15 09:16:37 +02:00
|
|
|
const isSavedCard = isCard && isSavedCardSelected();
|
2022-07-19 09:20:26 +03:00
|
|
|
const isNotOurGateway = !isPaypal && !isCard && !isSeparateButtonGateway;
|
2022-04-12 14:59:07 +03:00
|
|
|
const isFreeTrial = PayPalCommerceGateway.is_free_trial_cart;
|
|
|
|
const hasVaultedPaypal = PayPalCommerceGateway.vaulted_paypal_email !== '';
|
2021-11-11 15:20:21 +02:00
|
|
|
|
2022-07-19 09:20:26 +03:00
|
|
|
const paypalButtonWrappers = {
|
|
|
|
...Object.entries(PayPalCommerceGateway.separate_buttons)
|
|
|
|
.reduce((result, [k, data]) => {
|
|
|
|
return {...result, [data.id]: data.wrapper}
|
|
|
|
}, {}),
|
|
|
|
};
|
|
|
|
|
2022-10-20 09:24:24 +03:00
|
|
|
setVisibleByClass(this.standardOrderButtonSelector, (isPaypal && isFreeTrial && hasVaultedPaypal) || isNotOurGateway || isSavedCard, 'ppcp-hidden');
|
2022-04-12 14:59:07 +03:00
|
|
|
setVisible('.ppcp-vaulted-paypal-details', isPaypal);
|
|
|
|
setVisible(this.gateway.button.wrapper, isPaypal && !(isFreeTrial && hasVaultedPaypal));
|
|
|
|
setVisible(this.gateway.messages.wrapper, isPaypal && !isFreeTrial);
|
2021-11-11 18:00:20 +02:00
|
|
|
setVisible(this.gateway.hosted_fields.wrapper, isCard && !isSavedCard);
|
2022-07-19 09:20:26 +03:00
|
|
|
for (const [gatewayId, wrapper] of Object.entries(paypalButtonWrappers)) {
|
|
|
|
setVisible(wrapper, gatewayId === currentPaymentMethod);
|
|
|
|
}
|
2021-11-11 15:20:21 +02:00
|
|
|
|
2022-04-12 14:59:07 +03:00
|
|
|
if (isPaypal && !isFreeTrial) {
|
2021-11-11 15:20:21 +02:00
|
|
|
this.messages.render();
|
2021-04-20 14:27:37 +02:00
|
|
|
}
|
|
|
|
|
2021-11-11 15:20:21 +02:00
|
|
|
if (isCard) {
|
|
|
|
if (isSavedCard) {
|
|
|
|
this.disableCreditCardFields();
|
|
|
|
} else {
|
|
|
|
this.enableCreditCardFields();
|
|
|
|
}
|
2021-04-20 11:56:27 +02:00
|
|
|
}
|
|
|
|
}
|
2021-09-09 17:28:16 +02:00
|
|
|
|
|
|
|
disableCreditCardFields() {
|
2021-09-14 11:44:49 +02:00
|
|
|
jQuery('label[for="ppcp-credit-card-gateway-card-number"]').addClass('ppcp-credit-card-gateway-form-field-disabled')
|
|
|
|
jQuery('#ppcp-credit-card-gateway-card-number').addClass('ppcp-credit-card-gateway-form-field-disabled')
|
|
|
|
jQuery('label[for="ppcp-credit-card-gateway-card-expiry"]').addClass('ppcp-credit-card-gateway-form-field-disabled')
|
|
|
|
jQuery('#ppcp-credit-card-gateway-card-expiry').addClass('ppcp-credit-card-gateway-form-field-disabled')
|
|
|
|
jQuery('label[for="ppcp-credit-card-gateway-card-cvc"]').addClass('ppcp-credit-card-gateway-form-field-disabled')
|
|
|
|
jQuery('#ppcp-credit-card-gateway-card-cvc').addClass('ppcp-credit-card-gateway-form-field-disabled')
|
|
|
|
jQuery('label[for="vault"]').addClass('ppcp-credit-card-gateway-form-field-disabled')
|
|
|
|
jQuery('#ppcp-credit-card-vault').addClass('ppcp-credit-card-gateway-form-field-disabled')
|
2021-09-09 17:28:16 +02:00
|
|
|
jQuery('#ppcp-credit-card-vault').attr("disabled", true)
|
2021-09-16 12:29:30 +02:00
|
|
|
this.renderer.disableCreditCardFields()
|
2021-09-09 17:28:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
enableCreditCardFields() {
|
2021-09-14 11:44:49 +02:00
|
|
|
jQuery('label[for="ppcp-credit-card-gateway-card-number"]').removeClass('ppcp-credit-card-gateway-form-field-disabled')
|
|
|
|
jQuery('#ppcp-credit-card-gateway-card-number').removeClass('ppcp-credit-card-gateway-form-field-disabled')
|
|
|
|
jQuery('label[for="ppcp-credit-card-gateway-card-expiry"]').removeClass('ppcp-credit-card-gateway-form-field-disabled')
|
|
|
|
jQuery('#ppcp-credit-card-gateway-card-expiry').removeClass('ppcp-credit-card-gateway-form-field-disabled')
|
|
|
|
jQuery('label[for="ppcp-credit-card-gateway-card-cvc"]').removeClass('ppcp-credit-card-gateway-form-field-disabled')
|
|
|
|
jQuery('#ppcp-credit-card-gateway-card-cvc').removeClass('ppcp-credit-card-gateway-form-field-disabled')
|
|
|
|
jQuery('label[for="vault"]').removeClass('ppcp-credit-card-gateway-form-field-disabled')
|
|
|
|
jQuery('#ppcp-credit-card-vault').removeClass('ppcp-credit-card-gateway-form-field-disabled')
|
2021-09-09 17:28:16 +02:00
|
|
|
jQuery('#ppcp-credit-card-vault').attr("disabled", false)
|
2021-09-16 12:29:30 +02:00
|
|
|
this.renderer.enableCreditCardFields()
|
2021-09-09 17:28:16 +02:00
|
|
|
}
|
2020-04-08 18:50:29 +03:00
|
|
|
}
|
|
|
|
|
2021-04-20 11:56:27 +02:00
|
|
|
export default CheckoutBootstap
|