From 0245fa640bd163e7a4ed92fc50ae414498924f82 Mon Sep 17 00:00:00 2001 From: Narek Zakarian Date: Mon, 27 May 2024 19:57:00 +0400 Subject: [PATCH 1/4] Determine if venmo button is clicked and do not pass shipping callback handlers --- .../resources/js/modules/Renderer/Renderer.js | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/modules/ppcp-button/resources/js/modules/Renderer/Renderer.js b/modules/ppcp-button/resources/js/modules/Renderer/Renderer.js index 895a7845b..a95621456 100644 --- a/modules/ppcp-button/resources/js/modules/Renderer/Renderer.js +++ b/modules/ppcp-button/resources/js/modules/Renderer/Renderer.js @@ -68,14 +68,6 @@ class Renderer { } } - shouldHandleShippingInPaypal = (venmoButtonClicked) => { - if (!this.defaultSettings.should_handle_shipping_in_paypal) { - return false; - } - - return !venmoButtonClicked || !this.defaultSettings.vaultingEnabled; - } - renderButtons(wrapper, style, contextConfig, hasEnabledSeparateGateways, fundingSource = null) { if (! document.querySelector(wrapper) || this.isAlreadyRendered(wrapper, fundingSource, hasEnabledSeparateGateways) ) { // Try to render registered buttons again in case they were removed from the DOM by an external source. @@ -93,7 +85,16 @@ class Renderer { const options = { style, ...contextConfig, - onClick: this.onSmartButtonClick, + onClick: (data, actions) => { + if (this.onSmartButtonClick) { + this.onSmartButtonClick(data, actions); + } + + venmoButtonClicked = false; + if (data.fundingSource === 'venmo') { + venmoButtonClicked = true; + } + }, onInit: (data, actions) => { if (this.onSmartButtonsInit) { this.onSmartButtonsInit(data, actions); @@ -103,9 +104,17 @@ class Renderer { }; // Check the condition and add the handler if needed - if (this.shouldHandleShippingInPaypal(venmoButtonClicked)) { - options.onShippingOptionsChange = (data, actions) => handleShippingOptionsChange(data, actions, this.defaultSettings); - options.onShippingAddressChange = (data, actions) => handleShippingAddressChange(data, actions, this.defaultSettings); + if (this.defaultSettings.should_handle_shipping_in_paypal) { + options.onShippingOptionsChange = (data, actions) => { + !this.isVenmoButtonClickedWhenVaultingIsEnabled(venmoButtonClicked) + ? handleShippingOptionsChange(data, actions, this.defaultSettings) + : null; + } + options.onShippingAddressChange = (data, actions) => { + !this.isVenmoButtonClickedWhenVaultingIsEnabled(venmoButtonClicked) + ? handleShippingAddressChange(data, actions, this.defaultSettings) + : null; + } } return options; @@ -139,6 +148,10 @@ class Renderer { } } + isVenmoButtonClickedWhenVaultingIsEnabled = (venmoButtonClicked) => { + return venmoButtonClicked && this.defaultSettings.vaultingEnabled; + } + isAlreadyRendered(wrapper, fundingSource) { return this.renderedSources.has(wrapper + (fundingSource ?? '')); } From 49d943e25bb6cc7abf66e25842b12da87ae17f8d Mon Sep 17 00:00:00 2001 From: Narek Zakarian Date: Mon, 27 May 2024 19:57:30 +0400 Subject: [PATCH 2/4] use funding source instead of payment source as they are same --- modules/ppcp-button/src/Endpoint/CreateOrderEndpoint.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/ppcp-button/src/Endpoint/CreateOrderEndpoint.php b/modules/ppcp-button/src/Endpoint/CreateOrderEndpoint.php index fbfb22309..868f9bf6c 100644 --- a/modules/ppcp-button/src/Endpoint/CreateOrderEndpoint.php +++ b/modules/ppcp-button/src/Endpoint/CreateOrderEndpoint.php @@ -246,7 +246,6 @@ class CreateOrderEndpoint implements EndpointInterface { $this->parsed_request_data = $data; $payment_method = $data['payment_method'] ?? ''; $funding_source = $data['funding_source'] ?? ''; - $payment_source = $data['payment_source'] ?? ''; $wc_order = null; if ( 'pay-now' === $data['context'] ) { $wc_order = wc_get_order( (int) $data['order_id'] ); @@ -262,7 +261,7 @@ class CreateOrderEndpoint implements EndpointInterface { } $this->purchase_unit = $this->purchase_unit_factory->from_wc_order( $wc_order ); } else { - $this->purchase_unit = $this->purchase_unit_factory->from_wc_cart( null, $this->should_handle_shipping_in_paypal( $payment_source ) ); + $this->purchase_unit = $this->purchase_unit_factory->from_wc_cart( null, $this->should_handle_shipping_in_paypal( $funding_source ) ); // Do not allow completion by webhooks when started via non-checkout buttons, // it is needed only for some APMs in checkout. @@ -615,16 +614,16 @@ class CreateOrderEndpoint implements EndpointInterface { /** * Checks if the shipping should be handled in PayPal popup. * - * @param string $payment_source The payment source. + * @param string $funding_source The funding source. * @return bool true if the shipping should be handled in PayPal popup, otherwise false. */ - protected function should_handle_shipping_in_paypal( string $payment_source ): bool { + protected function should_handle_shipping_in_paypal( string $funding_source ): bool { $is_vaulting_enabled = $this->settings->has( 'vault_enabled' ) && $this->settings->get( 'vault_enabled' ); if ( ! $this->handle_shipping_in_paypal ) { return false; } - return ! $is_vaulting_enabled || $payment_source !== 'venmo'; + return ! $is_vaulting_enabled || $funding_source !== 'venmo'; } } From 84616d07da5afbd0cc0f86c610eff15454f88757 Mon Sep 17 00:00:00 2001 From: Narek Zakarian Date: Mon, 27 May 2024 19:57:48 +0400 Subject: [PATCH 3/4] dont need to pass the payment source --- .../resources/js/modules/ActionHandler/CartActionHandler.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/ppcp-button/resources/js/modules/ActionHandler/CartActionHandler.js b/modules/ppcp-button/resources/js/modules/ActionHandler/CartActionHandler.js index 2b3066395..0400c8013 100644 --- a/modules/ppcp-button/resources/js/modules/ActionHandler/CartActionHandler.js +++ b/modules/ppcp-button/resources/js/modules/ActionHandler/CartActionHandler.js @@ -60,8 +60,7 @@ class CartActionHandler { funding_source: window.ppcpFundingSource, bn_code:bnCode, payer, - context:this.config.context, - payment_source: data.paymentSource + context:this.config.context }), }).then(function(res) { return res.json(); From 2cb76ed8f2fca7dea858a632c0f392460d2b5621 Mon Sep 17 00:00:00 2001 From: Narek Zakarian Date: Fri, 31 May 2024 15:36:32 +0400 Subject: [PATCH 4/4] Apply the Venmo + vaulting functionality on block pages --- .../resources/js/checkout-block.js | 47 ++++++++++++++----- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/modules/ppcp-blocks/resources/js/checkout-block.js b/modules/ppcp-blocks/resources/js/checkout-block.js index df003f494..8a158828f 100644 --- a/modules/ppcp-blocks/resources/js/checkout-block.js +++ b/modules/ppcp-blocks/resources/js/checkout-block.js @@ -23,6 +23,9 @@ import { import buttonModuleWatcher from "../../../ppcp-button/resources/js/modules/ButtonModuleWatcher"; import BlockCheckoutMessagesBootstrap from "./Bootstrap/BlockCheckoutMessagesBootstrap"; import {keysToCamelCase} from "../../../ppcp-button/resources/js/modules/Helper/Utils"; +import { + handleShippingOptionsChange +} from "../../../ppcp-button/resources/js/modules/Helper/ShippingHandler"; const config = wc.wcSettings.getSetting('ppcp-gateway_data'); window.ppcpFundingSource = config.fundingSource; @@ -146,7 +149,7 @@ const PayPalComponent = ({ shipping_address: addresses.shippingAddress, }), ]; - if (!config.finalReviewEnabled) { + if (shouldHandleShippingInPayPal()) { // set address in UI promises.push(wp.data.dispatch('wc/store/cart').setBillingAddress(addresses.billingAddress)); if (shippingData.needsShipping) { @@ -181,7 +184,7 @@ const PayPalComponent = ({ throw new Error(config.scriptData.labels.error.generic) } - if (config.finalReviewEnabled) { + if (!shouldHandleShippingInPayPal()) { location.href = getCheckoutRedirectUrl(); } else { setGotoContinuationOnError(true); @@ -220,7 +223,7 @@ const PayPalComponent = ({ shipping_address: addresses.shippingAddress, }), ]; - if (!config.finalReviewEnabled) { + if (shouldHandleShippingInPayPal()) { // set address in UI promises.push(wp.data.dispatch('wc/store/cart').setBillingAddress(addresses.billingAddress)); if (shippingData.needsShipping) { @@ -255,7 +258,7 @@ const PayPalComponent = ({ throw new Error(config.scriptData.labels.error.generic) } - if (config.finalReviewEnabled) { + if (!shouldHandleShippingInPayPal()) { location.href = getCheckoutRedirectUrl(); } else { setGotoContinuationOnError(true); @@ -297,8 +300,12 @@ const PayPalComponent = ({ onClick(); }; - const isVenmoAndVaultingEnabled = () => { - return window.ppcpFundingSource === 'venmo' && config.scriptData.vaultingEnabled; + const shouldHandleShippingInPayPal = () => { + if (config.finalReviewEnabled) { + return false; + } + + return window.ppcpFundingSource !== 'venmo' || !config.scriptData.vaultingEnabled; } let handleShippingOptionsChange = null; @@ -306,7 +313,7 @@ const PayPalComponent = ({ let handleSubscriptionShippingOptionsChange = null; let handleSubscriptionShippingAddressChange = null; - if (shippingData.needsShipping && !config.finalReviewEnabled) { + if (shippingData.needsShipping && shouldHandleShippingInPayPal()) { handleShippingOptionsChange = async (data, actions) => { try { const shippingOptionId = data.selectedShippingOption?.id; @@ -447,7 +454,7 @@ const PayPalComponent = ({ if (config.scriptData.continuation) { return true; } - if (!config.finalReviewEnabled) { + if (shouldHandleShippingInPayPal()) { location.href = getCheckoutRedirectUrl(); } return true; @@ -493,8 +500,16 @@ const PayPalComponent = ({ onError={onClose} createSubscription={createSubscription} onApprove={handleApproveSubscription} - onShippingOptionsChange={handleSubscriptionShippingOptionsChange} - onShippingAddressChange={handleSubscriptionShippingAddressChange} + onShippingOptionsChange={(data, actions) => { + shouldHandleShippingInPayPal() + ? handleSubscriptionShippingOptionsChange(data, actions) + : null; + }} + onShippingAddressChange={(data, actions) => { + shouldHandleShippingInPayPal() + ? handleSubscriptionShippingAddressChange(data, actions) + : null; + }} /> ); } @@ -508,8 +523,16 @@ const PayPalComponent = ({ onError={onClose} createOrder={createOrder} onApprove={handleApprove} - onShippingOptionsChange={handleShippingOptionsChange} - onShippingAddressChange={handleShippingAddressChange} + onShippingOptionsChange={(data, actions) => { + shouldHandleShippingInPayPal() + ? handleShippingOptionsChange(data, actions) + : null; + }} + onShippingAddressChange={(data, actions) => { + shouldHandleShippingInPayPal() + ? handleShippingAddressChange(data, actions) + : null; + }} /> ); }