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, + }, + }); + } + } }