From 868806a6291cba011aebcd8a65d85d7b813b6b94 Mon Sep 17 00:00:00 2001
From: Pedro Silva
Date: Fri, 12 Jan 2024 11:18:35 +0000
Subject: [PATCH] Add block PayPal subscription address change handler.
Validate PayPal button eligibility on block pages with subscriptions.
---
.../resources/js/checkout-block.js | 151 +++++++++++-------
1 file changed, 94 insertions(+), 57 deletions(-)
diff --git a/modules/ppcp-blocks/resources/js/checkout-block.js b/modules/ppcp-blocks/resources/js/checkout-block.js
index c6f91bfc6..cbf57eba1 100644
--- a/modules/ppcp-blocks/resources/js/checkout-block.js
+++ b/modules/ppcp-blocks/resources/js/checkout-block.js
@@ -286,6 +286,7 @@ const PayPalComponent = ({
};
let handleShippingChange = null;
+ let handleSubscriptionShippingChange = null;
if (shippingData.needsShipping && !config.finalReviewEnabled) {
handleShippingChange = async (data, actions) => {
try {
@@ -322,6 +323,30 @@ const PayPalComponent = ({
actions.reject();
}
};
+
+ handleSubscriptionShippingChange = async (data, actions) => {
+ console.log('--- handleSubscriptionShippingChange', data, actions);
+
+ try {
+ const shippingOptionId = data.selected_shipping_option?.id;
+ if (shippingOptionId) {
+ await shippingData.setSelectedRates(shippingOptionId);
+ }
+
+ const address = paypalAddressToWc(data.shipping_address);
+
+ await wp.data.dispatch('wc/store/cart').updateCustomerData({
+ shipping_address: address,
+ });
+
+ await shippingData.setShippingAddress(address);
+
+ } catch (e) {
+ console.error(e);
+
+ actions.reject();
+ }
+ };
}
useEffect(() => {
@@ -418,7 +443,7 @@ const PayPalComponent = ({
onError={onClose}
createSubscription={createSubscription}
onApprove={handleApproveSubscription}
- onShippingChange={handleShippingChange}
+ onShippingChange={handleSubscriptionShippingChange}
/>
);
}
@@ -438,74 +463,86 @@ const PayPalComponent = ({
}
const features = ['products'];
+let block_enabled = true;
if(cartHasSubscriptionProducts(config.scriptData)) {
+ // Don't show buttons on block cart page if using vault v2
+ if (
+ config.scriptData.context === "cart-block"
+ && ! isPayPalSubscription(config.scriptData) // using vaulting
+ && ! config.scriptData?.save_payment_methods?.id_token // not vault v3
+ ) {
+ block_enabled = false;
+ }
+
features.push('subscriptions');
}
-if ((config.addPlaceOrderMethod || config.usePlaceOrder) && !config.scriptData.continuation) {
- let descriptionElement = ;
- if (config.placeOrderButtonDescription) {
- descriptionElement = ;
- }
+if (block_enabled) {
+ if ((config.addPlaceOrderMethod || config.usePlaceOrder) && !config.scriptData.continuation) {
+ let descriptionElement = ;
+ if (config.placeOrderButtonDescription) {
+ descriptionElement = ;
+ }
- registerPaymentMethod({
- name: config.id,
- label: ,
- content: descriptionElement,
- edit: descriptionElement,
- placeOrderButtonLabel: config.placeOrderButtonText,
- ariaLabel: config.title,
- canMakePayment: () => {
- return config.enabled;
- },
- supports: {
- features: features,
- },
- });
-}
-
-if (config.scriptData.continuation) {
- registerPaymentMethod({
- name: config.id,
- label: ,
- content: ,
- edit: ,
- ariaLabel: config.title,
- canMakePayment: () => {
- return true;
- },
- supports: {
- features: [...features, 'ppcp_continuation'],
- },
- });
-} else if (!config.usePlaceOrder) {
- for (const fundingSource of ['paypal', ...config.enabledFundingSources]) {
- registerExpressPaymentMethod({
- name: `${config.id}-${fundingSource}`,
- paymentMethodId: config.id,
+ registerPaymentMethod({
+ name: config.id,
label: ,
- content: ,
- edit: ,
+ content: descriptionElement,
+ edit: descriptionElement,
+ placeOrderButtonLabel: config.placeOrderButtonText,
ariaLabel: config.title,
- canMakePayment: async () => {
- if (!paypalScriptPromise) {
- paypalScriptPromise = loadPaypalScriptPromise(config.scriptData);
- paypalScriptPromise.then(() => {
- const messagesBootstrap = new BlockCheckoutMessagesBootstrap(config.scriptData);
- messagesBootstrap.init();
- });
- }
- await paypalScriptPromise;
-
- return paypal.Buttons({fundingSource}).isEligible();
+ canMakePayment: () => {
+ return config.enabled;
},
supports: {
features: features,
},
});
}
+
+ if (config.scriptData.continuation) {
+ registerPaymentMethod({
+ name: config.id,
+ label: ,
+ content: ,
+ edit: ,
+ ariaLabel: config.title,
+ canMakePayment: () => {
+ return true;
+ },
+ supports: {
+ features: [...features, 'ppcp_continuation'],
+ },
+ });
+ } else if (!config.usePlaceOrder) {
+ for (const fundingSource of ['paypal', ...config.enabledFundingSources]) {
+ registerExpressPaymentMethod({
+ name: `${config.id}-${fundingSource}`,
+ paymentMethodId: config.id,
+ label: ,
+ content: ,
+ edit: ,
+ ariaLabel: config.title,
+ canMakePayment: async () => {
+ if (!paypalScriptPromise) {
+ paypalScriptPromise = loadPaypalScriptPromise(config.scriptData);
+ paypalScriptPromise.then(() => {
+ const messagesBootstrap = new BlockCheckoutMessagesBootstrap(config.scriptData);
+ messagesBootstrap.init();
+ });
+ }
+ await paypalScriptPromise;
+
+ return paypal.Buttons({fundingSource}).isEligible();
+ },
+ supports: {
+ features: features,
+ },
+ });
+ }
+ }
}