diff --git a/modules/ppcp-blocks/resources/js/Helper/Address.js b/modules/ppcp-blocks/resources/js/Helper/Address.js index 6a999f141..2c3e9eae1 100644 --- a/modules/ppcp-blocks/resources/js/Helper/Address.js +++ b/modules/ppcp-blocks/resources/js/Helper/Address.js @@ -76,8 +76,8 @@ export const paypalShippingToWc = (shipping) => { * @returns {Object} */ export const paypalPayerToWc = (payer) => { - const firstName = payer.name.given_name; - const lastName = payer.name.surname; + const firstName = payer?.name?.given_name ?? ''; + const lastName = payer?.name?.surname ?? ''; const address = payer.address ? paypalAddressToWc(payer.address) : {}; return { ...address, @@ -100,10 +100,12 @@ export const paypalOrderToWcShippingAddress = (order) => { const res = paypalShippingToWc(shipping); // use the name from billing if the same, to avoid possible mistakes when splitting full_name - const billingAddress = paypalPayerToWc(order.payer); - if (`${res.first_name} ${res.last_name}` === `${billingAddress.first_name} ${billingAddress.last_name}`) { - res.first_name = billingAddress.first_name; - res.last_name = billingAddress.last_name; + if (order.payer) { + const billingAddress = paypalPayerToWc(order.payer); + if (`${res.first_name} ${res.last_name}` === `${billingAddress.first_name} ${billingAddress.last_name}`) { + res.first_name = billingAddress.first_name; + res.last_name = billingAddress.last_name; + } } return res; @@ -116,10 +118,13 @@ export const paypalOrderToWcShippingAddress = (order) => { */ export const paypalOrderToWcAddresses = (order) => { const shippingAddress = paypalOrderToWcShippingAddress(order); - let billingAddress = paypalPayerToWc(order.payer); - // no billing address, such as if billing address retrieval is not allowed in the merchant account - if (!billingAddress.address_line_1) { - billingAddress = {...shippingAddress, ...paypalPayerToWc(order.payer)}; + let billingAddress = shippingAddress; + if (order.payer) { + billingAddress = paypalPayerToWc(order.payer); + // no billing address, such as if billing address retrieval is not allowed in the merchant account + if (!billingAddress.address_line_1) { + billingAddress = {...shippingAddress, ...paypalPayerToWc(order.payer)}; + } } return {billingAddress, shippingAddress}; diff --git a/modules/ppcp-blocks/resources/js/checkout-block.js b/modules/ppcp-blocks/resources/js/checkout-block.js index 215e92a35..c93f3094e 100644 --- a/modules/ppcp-blocks/resources/js/checkout-block.js +++ b/modules/ppcp-blocks/resources/js/checkout-block.js @@ -39,12 +39,17 @@ const PayPalComponent = ({ if (!config.scriptData.continuation || !config.scriptData.continuation.order || window.ppcpContinuationFilled) { return; } - const paypalAddresses = paypalOrderToWcAddresses(config.scriptData.continuation.order); - const wcAddresses = wp.data.select('wc/store/cart').getCustomerData(); - const addresses = mergeWcAddress(wcAddresses, paypalAddresses); - wp.data.dispatch('wc/store/cart').setBillingAddress(addresses.billingAddress); - if (shippingData.needsShipping) { - wp.data.dispatch('wc/store/cart').setShippingAddress(addresses.shippingAddress); + try { + const paypalAddresses = paypalOrderToWcAddresses(config.scriptData.continuation.order); + const wcAddresses = wp.data.select('wc/store/cart').getCustomerData(); + const addresses = mergeWcAddress(wcAddresses, paypalAddresses); + wp.data.dispatch('wc/store/cart').setBillingAddress(addresses.billingAddress); + if (shippingData.needsShipping) { + wp.data.dispatch('wc/store/cart').setShippingAddress(addresses.shippingAddress); + } + } catch (err) { + // sometimes the PayPal address is missing, skip in this case. + console.log(err); } // this useEffect should run only once, but adding this in case of some kind of full re-rendering window.ppcpContinuationFilled = true; @@ -321,11 +326,19 @@ const PayPalComponent = ({ const features = ['products']; if ((config.addPlaceOrderMethod || config.usePlaceOrder) && !config.scriptData.continuation) { + let descriptionElement =
; + if (config.placeOrderButtonDescription) { + descriptionElement =
+

+

+
; + } + registerPaymentMethod({ name: config.id, label:
, - content:
, - edit:
, + content: descriptionElement, + edit: descriptionElement, placeOrderButtonLabel: config.placeOrderButtonText, ariaLabel: config.title, canMakePayment: () => config.enabled, diff --git a/modules/ppcp-blocks/services.php b/modules/ppcp-blocks/services.php index 8ccd41724..e2fb01b64 100644 --- a/modules/ppcp-blocks/services.php +++ b/modules/ppcp-blocks/services.php @@ -38,6 +38,7 @@ return array( $container->get( 'blocks.add-place-order-method' ), $container->get( 'wcgateway.use-place-order-button' ), $container->get( 'wcgateway.place-order-button-text' ), + $container->get( 'wcgateway.place-order-button-description' ), $container->get( 'wcgateway.all-funding-sources' ) ); }, diff --git a/modules/ppcp-blocks/src/PayPalPaymentMethod.php b/modules/ppcp-blocks/src/PayPalPaymentMethod.php index fe0a381c6..1f43d26a1 100644 --- a/modules/ppcp-blocks/src/PayPalPaymentMethod.php +++ b/modules/ppcp-blocks/src/PayPalPaymentMethod.php @@ -108,6 +108,13 @@ class PayPalPaymentMethod extends AbstractPaymentMethodType { */ protected $place_order_button_text; + /** + * The text for additional "Place order" description. + * + * @var string + */ + protected $place_order_button_description; + /** * All existing funding sources for PayPal buttons. * @@ -130,6 +137,7 @@ class PayPalPaymentMethod extends AbstractPaymentMethodType { * @param bool $add_place_order_method Whether to create a non-express method with the standard "Place order" button. * @param bool $use_place_order Whether to use the standard "Place order" button instead of PayPal buttons. * @param string $place_order_button_text The text for the standard "Place order" button. + * @param string $place_order_button_description The text for additional "Place order" description. * @param array $all_funding_sources All existing funding sources for PayPal buttons. */ public function __construct( @@ -145,22 +153,24 @@ class PayPalPaymentMethod extends AbstractPaymentMethodType { bool $add_place_order_method, bool $use_place_order, string $place_order_button_text, + string $place_order_button_description, array $all_funding_sources ) { - $this->name = PayPalGateway::ID; - $this->module_url = $module_url; - $this->version = $version; - $this->smart_button = $smart_button; - $this->plugin_settings = $plugin_settings; - $this->settings_status = $settings_status; - $this->gateway = $gateway; - $this->final_review_enabled = $final_review_enabled; - $this->cancellation_view = $cancellation_view; - $this->session_handler = $session_handler; - $this->add_place_order_method = $add_place_order_method; - $this->use_place_order = $use_place_order; - $this->place_order_button_text = $place_order_button_text; - $this->all_funding_sources = $all_funding_sources; + $this->name = PayPalGateway::ID; + $this->module_url = $module_url; + $this->version = $version; + $this->smart_button = $smart_button; + $this->plugin_settings = $plugin_settings; + $this->settings_status = $settings_status; + $this->gateway = $gateway; + $this->final_review_enabled = $final_review_enabled; + $this->cancellation_view = $cancellation_view; + $this->session_handler = $session_handler; + $this->add_place_order_method = $add_place_order_method; + $this->use_place_order = $use_place_order; + $this->place_order_button_text = $place_order_button_text; + $this->place_order_button_description = $place_order_button_description; + $this->all_funding_sources = $all_funding_sources; } /** @@ -214,7 +224,7 @@ class PayPalPaymentMethod extends AbstractPaymentMethodType { } } - $disabled_funding_sources = explode( ',', $script_data['url_params']['disable-funding'] ) ?: array(); + $disabled_funding_sources = explode( ',', $script_data['url_params']['disable-funding'] ?? '' ) ?: array(); $funding_sources = array_values( array_diff( array_keys( $this->all_funding_sources ), @@ -223,23 +233,24 @@ class PayPalPaymentMethod extends AbstractPaymentMethodType { ); return array( - 'id' => $this->gateway->id, - 'title' => $this->gateway->title, - 'description' => $this->gateway->description, - 'enabled' => $this->settings_status->is_smart_button_enabled_for_location( $script_data['context'] ), - 'fundingSource' => $this->session_handler->funding_source(), - 'finalReviewEnabled' => $this->final_review_enabled, - 'addPlaceOrderMethod' => $this->add_place_order_method, - 'usePlaceOrder' => $this->use_place_order, - 'placeOrderButtonText' => $this->place_order_button_text, - 'enabledFundingSources' => $funding_sources, - 'ajax' => array( + 'id' => $this->gateway->id, + 'title' => $this->gateway->title, + 'description' => $this->gateway->description, + 'enabled' => $this->settings_status->is_smart_button_enabled_for_location( $script_data['context'] ), + 'fundingSource' => $this->session_handler->funding_source(), + 'finalReviewEnabled' => $this->final_review_enabled, + 'addPlaceOrderMethod' => $this->add_place_order_method, + 'usePlaceOrder' => $this->use_place_order, + 'placeOrderButtonText' => $this->place_order_button_text, + 'placeOrderButtonDescription' => $this->place_order_button_description, + 'enabledFundingSources' => $funding_sources, + 'ajax' => array( 'update_shipping' => array( 'endpoint' => WC_AJAX::get_endpoint( UpdateShippingEndpoint::ENDPOINT ), 'nonce' => wp_create_nonce( UpdateShippingEndpoint::nonce() ), ), ), - 'scriptData' => $script_data, + 'scriptData' => $script_data, ); } } diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php index 047109b60..62a84a733 100644 --- a/modules/ppcp-wc-gateway/services.php +++ b/modules/ppcp-wc-gateway/services.php @@ -1180,7 +1180,16 @@ return array( */ return apply_filters( 'woocommerce_paypal_payments_place_order_button_text', - __( 'Pay with PayPal', 'woocommerce-paypal-payments' ) + __( 'Proceed to PayPal', 'woocommerce-paypal-payments' ) + ); + }, + 'wcgateway.place-order-button-description' => function ( ContainerInterface $container ) : string { + /** + * The text for additional description, when the "Place order" button mode is enabled. + */ + return apply_filters( + 'woocommerce_paypal_payments_place_order_button_description', + __( 'Clicking "Proceed to PayPal" will redirect you to PayPal to complete your purchase.', 'woocommerce-paypal-payments' ) ); },