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 blocks mini cart widget #8795

Merged
merged 19 commits into from May 16, 2024

Conversation

ricardo
Copy link
Member

@ricardo ricardo commented May 7, 2024

Fixes 2647-gh-Automattic/woopay

Changes proposed in this Pull Request

  • Enqueue the direct checkout scripts if the current page has triggered the woocommerce_blocks_cart_enqueue_data action, which is used by the blocks mini cart and cart as widgets (src).
  • Handle the opening of the mini cart through JavaScript and add the direct checkout event listeners to the "Go to checkout" button.

Note: In this PR we are not adding support for the legacy mini cart woocommerce_mini_cart() yet.

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.
  3. As a merchant, navigate to wp-admin > Appearance > Widgets.
  4. Add the "Mini-cart" widget to any available section and hit "Update".

Test 1: 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.
  3. Ensure the WCPAY_WOOPAY_DIRECT_CHECKOUT script is enqueued in the page source.
  4. As a merchant, remove the Mini-cart widget temporarily.
  5. Navigate to any page besides the cart and ensure the WCPAY_WOOPAY_DIRECT_CHECKOUT script is NOT enqueued in the page source.

Test 2: Ensure the direct checkout flow works in 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 the mini cart "Go to checkout" button.
  4. Ensure the direct checkout flow works as expected:
  • If the user is logged in to 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 vs. disabled.

Test 3: Ensure the direct checkout flow works from classic and blocks checkout

  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 to 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 vs. 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

@botwoo
Copy link
Collaborator

botwoo commented May 7, 2024

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 8795 or branch name add/woopay-direct-checkout-to-minicart 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: 5ce2d84
  • Build time: 2024-05-15 02:22:55 UTC

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

Copy link
Contributor

github-actions bot commented May 7, 2024

Size Change: +317 B (0%)

Total Size: 1.25 MB

Filename Size Change
release/woocommerce-payments/dist/cart.js 4.44 kB +53 B (+1%)
release/woocommerce-payments/dist/woopay-direct-checkout.js 4.81 kB +264 B (+6%) 🔍
ℹ️ 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.06 kB
release/woocommerce-payments/dist/blocks-checkout.css 2.07 kB
release/woocommerce-payments/dist/blocks-checkout.js 56.1 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 21.4 kB
release/woocommerce-payments/dist/checkout-rtl.css 599 B
release/woocommerce-payments/dist/checkout.css 599 B
release/woocommerce-payments/dist/checkout.js 37.2 kB
release/woocommerce-payments/dist/index-rtl.css 40.7 kB
release/woocommerce-payments/dist/index.css 40.7 kB
release/woocommerce-payments/dist/index.js 293 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.6 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.9 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.7 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 12 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 17.2 kB
release/woocommerce-payments/dist/settings-rtl.css 11.1 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/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 21 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 202 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 230 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

@ricardo ricardo marked this pull request as ready for review May 8, 2024 06:24
@ricardo ricardo requested review from a team and lovo-h and removed request for a team May 8, 2024 06:24
Copy link
Contributor

@lovo-h lovo-h left a comment

Choose a reason for hiding this comment

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

The code changes look good and have test well.

There were just a few, minor details I wanted to confirm before merging.

Testing Instructions

  • ✅ Test 1: Ensure the direct checkout scripts are enqueued in the right pages.
  • ✅ Test 2: Ensure the direct checkout flow works in the mini cart.
  • ✅ Test 3: Ensure the direct checkout flow works from classic and blocks checkout.
  • npm run test:js.

client/checkout/woopay/direct-checkout/index.js Outdated Show resolved Hide resolved
client/checkout/woopay/direct-checkout/index.js Outdated Show resolved Hide resolved
! WooPayDirectCheckout.isWooPayDirectCheckoutEnabled() ||
shouldSkipWooPay()
) {
if ( shouldSkipWooPay() ) {
Copy link
Contributor

Choose a reason for hiding this comment

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

This is not related to this PR but am I correct in my thinking that we may want to add similar logic (early exit when shouldSkipWooPay()) to the following functions, below:

  • addItemCallback().
  • debounceSetItemQtyCallback().
  • removeItemCallback().

Otherwise, we will be prefetching encrypted session data that will not be used.

Copy link
Member Author

Choose a reason for hiding this comment

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

I agree.

Instead of checking for shouldSkipWooPay, I added the hooks in the load window event listener and after isWooPayThirdPartyCookiesEnabled() in 5ce2d84. LMK what you think.

@lovo-h – I tested this by adding a console.log to each callback and going to the blocks cart and adding, removing and setting the quantity of an item, however I wasn't able to hit the action hook when adding a new item from the suggestions list after the cart is emptied, am I testing this wrong? What's one way to hit the experimental__woocommerce_blocks-cart-add-item?

Copy link
Contributor

Choose a reason for hiding this comment

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

Instead of checking for shouldSkipWooPay, I added the hooks in the load window event listener and after isWooPayThirdPartyCookiesEnabled() in 5ce2d84. LMK what you think.

I think this approach looks cleaner. Good call.

I wasn't able to hit the action hook when adding a new item from the suggestions list after the cart is emptied, am I testing this wrong? What's one way to hit the experimental__woocommerce_blocks-cart-add-item?

Good catch.

I also wasn't able to trigger this callback either. It appears like it was removed in WooCommerce:

If I recall correctly, this hook was added when wcBlocks was an independent plugin from WooCommerce. In wcBlocks, it looks like the experimental__woocommerce_blocks-cart-add-item hook still exists.

One solution would be to replace the experimental__woocommerce_blocks-cart-add-item hook with wc-blocks_added_to_cart:

document.body.addEventListener(
  'wc-blocks_added_to_cart',
  addItemCallback
);

However, this is an unrelated issue to this PR. So, we can create a separate GH issue.

Copy link
Member Author

Choose a reason for hiding this comment

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

Created an issue. Feel free to look into this if you have the availability.

#8831

@ricardo ricardo requested a review from lovo-h May 15, 2024 02:27
Copy link
Contributor

@lovo-h lovo-h left a comment

Choose a reason for hiding this comment

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

Code changes look good and test well 👍

Testing Instructions

  • ✅ Test 1: Ensure the direct checkout scripts are enqueued in the right pages.
  • ✅ Test 2: Ensure the direct checkout flow works in the mini cart.
  • ✅ Test 3: Ensure the direct checkout flow works from classic and blocks checkout.
  • npm run test:js.

@ricardo ricardo added this pull request to the merge queue May 16, 2024
Merged via the queue into develop with commit f78e96c May 16, 2024
23 checks passed
@ricardo ricardo deleted the add/woopay-direct-checkout-to-minicart branch May 16, 2024 15:06
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.

None yet

3 participants