Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add the WooPay Direct Checkout flow to the classic mini cart widget #8903

Merged
merged 5 commits into from
Jun 6, 2024

Conversation

cesarcosta99
Copy link
Contributor

Fixes https://github.com/Automattic/woopay/issues/2688

Changes proposed in this Pull Request

This PR adds the WooPay direct checkout flow to the classic mini cart widget.

image

It also enqueues the direct checkout scripts if the current page has the wc-cart-fragments script enqueued. I expand more on this in the comment below.

Testing instructions

Setup

  1. Ensure the WooPay direct checkout feature flag _wcpay_feature_woopay_direct_checkout is set to 1.
  2. Switch to this branch and run npm run build:client.

Regression test: Ensure the direct checkout flow works from classic and blocks carts

  1. As a shopper, add a product to the cart.
  2. Ensure the direct checkout flow works from classic and blocks carts:
  • If the user is logged in on WooPay, the user is redirected to WooPay.
  • If the user is logged out from WooPay, the user is redirected to the merchant checkout.
  • Please test with third party cookies enabled and disabled.

Test: Ensure the direct checkout scripts are enqueued in the right pages

  1. As a shopper, add a product to the cart.
  2. Navigate to any page where the mini cart widget is available. The only exceptions here are likely the cart and checkout pages.
  3. Ensure the WCPAY_WOOPAY_DIRECT_CHECKOUT script is enqueued in the page source.

Test: Ensure the direct checkout flow works from the mini cart

  1. As a shopper, add a product to the cart.
  2. Navigate to any page where the mini cart is visible (any page besides the cart or the checkout).
  3. Click on the mini cart "Checkout" button.
  4. Ensure the direct checkout flow works as expected:
  • If the user is logged in on WooPay, the user is redirected to WooPay.
  • If the user is logged out from WooPay, the user is redirected to the merchant checkout.
  • Please test with third party cookies enabled and disabled.

  • Run npm run changelog to add a changelog file, choose patch to leave it empty if the change is not significant. You can add multiple changelog files in one PR by running this command a few times.
  • Covered with tests (or have a good reason not to test in description ☝️)
  • Tested on mobile (or does not apply)

Post merge

@cesarcosta99 cesarcosta99 requested review from a team and rafaelzaleski and removed request for a team June 4, 2024 15:25
@botwoo
Copy link
Collaborator

botwoo commented Jun 4, 2024

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 8903 or branch name add/2688-woopay-direct-checkout-to-mini-cart in your-test.site/wp-admin/admin.php?page=jetpack-beta&plugin=woocommerce-payments

Option 2. Jurassic Ninja - available for logged-in A12s

🚀 Launch a JN site with this branch 🚀

ℹ️ Install this Tampermonkey script to get more options.


Build info:

  • Latest commit: 8be13dc
  • Build time: 2024-06-05 23:18:01 UTC

Note: the build is updated when a new commit is pushed to this PR.

Copy link
Contributor

github-actions bot commented Jun 4, 2024

Size Change: +20.2 kB (+2%)

Total Size: 1.25 MB

Filename Size Change
release/woocommerce-payments/dist/blocks-checkout.js 51 kB +10 B (0%)
release/woocommerce-payments/dist/cart.js 4.5 kB +30 B (+1%)
release/woocommerce-payments/dist/checkout.js 31.4 kB +13 B (0%)
release/woocommerce-payments/dist/index.js 293 kB +8 B (0%)
release/woocommerce-payments/dist/woopay-direct-checkout.js 4.86 kB +30 B (+1%)
release/woocommerce-payments/dist/plugins-page-rtl.css 388 B +388 B (new file) 🆕
release/woocommerce-payments/dist/plugins-page.css 388 B +388 B (new file) 🆕
release/woocommerce-payments/dist/plugins-page.js 19.3 kB +19.3 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size
release/woocommerce-payments/assets/css/admin.css 1.08 kB
release/woocommerce-payments/assets/css/admin.rtl.css 1.08 kB
release/woocommerce-payments/assets/css/success.css 172 B
release/woocommerce-payments/assets/css/success.rtl.css 172 B
release/woocommerce-payments/dist/blocks-checkout-rtl.css 2.07 kB
release/woocommerce-payments/dist/blocks-checkout.css 2.07 kB
release/woocommerce-payments/dist/bnpl-announcement-rtl.css 530 B
release/woocommerce-payments/dist/bnpl-announcement.css 531 B
release/woocommerce-payments/dist/bnpl-announcement.js 20 kB
release/woocommerce-payments/dist/cart-block.js 15.3 kB
release/woocommerce-payments/dist/checkout-rtl.css 599 B
release/woocommerce-payments/dist/checkout.css 599 B
release/woocommerce-payments/dist/express-checkout-rtl.css 155 B
release/woocommerce-payments/dist/express-checkout.css 155 B
release/woocommerce-payments/dist/express-checkout.js 3.59 kB
release/woocommerce-payments/dist/index-rtl.css 40.7 kB
release/woocommerce-payments/dist/index.css 40.7 kB
release/woocommerce-payments/dist/multi-currency-analytics.js 1.05 kB
release/woocommerce-payments/dist/multi-currency-rtl.css 3.28 kB
release/woocommerce-payments/dist/multi-currency-switcher-block.js 59.5 kB
release/woocommerce-payments/dist/multi-currency.css 3.29 kB
release/woocommerce-payments/dist/multi-currency.js 54.7 kB
release/woocommerce-payments/dist/order-rtl.css 733 B
release/woocommerce-payments/dist/order.css 735 B
release/woocommerce-payments/dist/order.js 41.8 kB
release/woocommerce-payments/dist/payment-gateways-rtl.css 1.21 kB
release/woocommerce-payments/dist/payment-gateways.css 1.21 kB
release/woocommerce-payments/dist/payment-gateways.js 38.6 kB
release/woocommerce-payments/dist/payment-request-rtl.css 155 B
release/woocommerce-payments/dist/payment-request.css 155 B
release/woocommerce-payments/dist/payment-request.js 5.91 kB
release/woocommerce-payments/dist/product-details-rtl.css 398 B
release/woocommerce-payments/dist/product-details.css 402 B
release/woocommerce-payments/dist/product-details.js 11.2 kB
release/woocommerce-payments/dist/settings-rtl.css 11 kB
release/woocommerce-payments/dist/settings.css 10.9 kB
release/woocommerce-payments/dist/settings.js 201 kB
release/woocommerce-payments/dist/subscription-edit-page.js 669 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal-rtl.css 527 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.css 527 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.js 19.4 kB
release/woocommerce-payments/dist/subscription-product-onboarding-toast.js 693 B
release/woocommerce-payments/dist/subscriptions-empty-state-rtl.css 120 B
release/woocommerce-payments/dist/subscriptions-empty-state.css 120 B
release/woocommerce-payments/dist/subscriptions-empty-state.js 18.5 kB
release/woocommerce-payments/dist/tokenized-payment-request-rtl.css 155 B
release/woocommerce-payments/dist/tokenized-payment-request.css 155 B
release/woocommerce-payments/dist/tokenized-payment-request.js 6.29 kB
release/woocommerce-payments/dist/tos-rtl.css 235 B
release/woocommerce-payments/dist/tos.css 236 B
release/woocommerce-payments/dist/tos.js 21 kB
release/woocommerce-payments/dist/woopay-express-button-rtl.css 155 B
release/woocommerce-payments/dist/woopay-express-button.css 155 B
release/woocommerce-payments/dist/woopay-express-button.js 15.1 kB
release/woocommerce-payments/dist/woopay-rtl.css 4.25 kB
release/woocommerce-payments/dist/woopay.css 4.22 kB
release/woocommerce-payments/dist/woopay.js 69.4 kB
release/woocommerce-payments/includes/subscriptions/assets/css/plugin-page.css 622 B
release/woocommerce-payments/includes/subscriptions/assets/js/plugin-page.js 815 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/i18n-loader.js 2.44 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/i18n-loader.js 1.01 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.css 196 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.js 20 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.rtl.css 196 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.css 627 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.js 20 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.rtl.css 628 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-users.js 390 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-ajax.js 522 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-callables.js 581 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-admin-create-user.css 214 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-admin-create-user.js 523 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.css 722 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.js 408 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-users.js 517 B
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/babel.config.js 160 B
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.css 2.36 kB
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.js 13.5 kB
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.rtl.css 2.36 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/about.css 1.03 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-empty-state.css 291 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-order-statuses.css 403 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin.css 3.6 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/checkout.css 299 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/modal.css 742 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/view-subscription.css 572 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/wcs-upgrade.css 411 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin-pointers.js 544 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin.js 9.4 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.js 6.8 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.min.js 3.83 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-coupon.js 544 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-subscription.js 2.52 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.js 22.1 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.min.js 11.6 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/payment-method-restrictions.js 1.29 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/wcs-meta-boxes-order.js 502 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/payment-methods.js 355 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/single-product.js 429 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/view-subscription.js 1.38 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/wcs-cart.js 781 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/modal.js 1.1 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/wcs-upgrade.js 1.27 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.css 392 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.js 3.05 kB

compressed-size-action

// Enqueue the WCPay common config script only if it hasn't been enqueued yet.
// This may happen when Direct Checkout is being enqueued on pages that are not the cart page,
// such as the home and shop pages.
if ( did_filter( 'wcpay_payment_fields_js_config' ) === 0 ) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this filter (ref) isn't applied, wcpayConfig won't be registered in the frontend and will be evaluated to undefined. Therefore, we need to enqueue it so that the direct checkout flow doesn't break.

Comment on lines +135 to +137
return $this->is_cart_page()
|| did_action( 'woocommerce_blocks_cart_enqueue_data' ) > 0
|| ( wp_script_is( 'wc-cart-fragments', 'enqueued' ) && ! $this->is_checkout_page() );
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This entire condition could probably be turned into ! $this->is_checkout_page, however, I didn't want to leave it too loose because we don't know what kind of customizations the merchants are applying to their themes. I went for a safer approach and added a condition to check whether the wc-cart-fragments is enqueued (ref) and it's not the checkout page.

I also tried a similar approach used for the Blocks mini cart by doing did_action( 'woocommerce_widget_shopping_cart_buttons' ) > 0 (ref) but that always return 0 since that action is not fired before the wp_footer hook.

Copy link
Contributor

@rafaelzaleski rafaelzaleski left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Regression test: Ensure the direct checkout flow works from classic and blocks carts
✅ Test: Ensure the direct checkout scripts are enqueued in the right pages
✅ Test: Ensure the direct checkout flow works from the mini cart

The implementation looks good, and the functionality is working as expected. However, I believe we should remove the code duplication to improve future maintainability.

Comment on lines 89 to 104
wp_register_script( 'WCPAY_WOOPAY_COMMON_CONFIG', '', [], WCPAY_VERSION_NUMBER, false );
wp_localize_script(
'WCPAY_WOOPAY_COMMON_CONFIG',
'wcpayConfig',
[
'woopayHost' => WooPay_Utilities::get_woopay_url(),
'testMode' => $is_test_mode,
'wcAjaxUrl' => WC_AJAX::get_endpoint( '%%endpoint%%' ),
'woopaySessionNonce' => wp_create_nonce( 'woopay_session_nonce' ),
'isWooPayDirectCheckoutEnabled' => WC_Payments_Features::is_woopay_direct_checkout_enabled(),
'platformTrackerNonce' => wp_create_nonce( 'platform_tracks_nonce' ),
'ajaxUrl' => admin_url( 'admin-ajax.php' ),
'woopayMinimumSessionData' => WooPay_Session::get_woopay_minimum_session_data(),
]
);
wp_enqueue_script( 'WCPAY_WOOPAY_COMMON_CONFIG' );
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this section is a copy of existing code, can we extract it into a static method and use it in both places? This would help avoid duplication in the codebase.

Copy link
Contributor Author

@cesarcosta99 cesarcosta99 Jun 5, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call! I applied this change in 8be13dc. Can you please re-test it?

*
* @return void
*/
public static function enqueue_woopay_common_config_script() {
public static function validate_and_enqueue_woopay_common_config_script() {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't like the name of this function much, however I was a bit out of options since maybe_enqueue_woopay_common_config_script is taken.

For clarity, it's not possible to move this check to the maybe_enqueue_woopay_common_config_script function because it generates a warning saying is_page was called incorrectly. That's why I needed to keep this logic separate.

@cesarcosta99 cesarcosta99 enabled auto-merge June 5, 2024 23:30
Copy link
Contributor

@rafaelzaleski rafaelzaleski left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Regression test: Ensure the direct checkout flow works from classic and blocks carts
✅ Test: Ensure the direct checkout scripts are enqueued in the right pages
✅ Test: Ensure the direct checkout flow works from the mini cart

Everything is working and the code looks good. Thank you for implementing the suggested refactoring.

@cesarcosta99 cesarcosta99 added this pull request to the merge queue Jun 6, 2024
Merged via the queue into develop with commit 3bb0caa Jun 6, 2024
23 checks passed
@cesarcosta99 cesarcosta99 deleted the add/2688-woopay-direct-checkout-to-mini-cart branch June 6, 2024 14:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants