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

Implement loading state to WooPay express checkout button #7366

Merged
merged 7 commits into from
Oct 6, 2023

Conversation

ricardo
Copy link
Member

@ricardo ricardo commented Oct 4, 2023

Fixes #7295

Changes proposed in this Pull Request

  • Add loading and disabled state to WooPay express checkout button.

Demo

demo.mov

Theme preview

Dark

dark.mov

Light

light.mov

Outline

outline.mov

Testing instructions

  1. Ensure you're using the feature flag _wcpay_feature_woopay_first_party_auth. There should be no loading indicator without it.
  2. Navigate to the product, cart or checkout pages and click the WooPay button. Ensure there's a loading spinner like in the demo video, and that the button is disabled after click.
  3. Experiment with tweaking the button appearance settings (CTA, size, theme) and ensure everything looks as expected.

  • 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 Oct 4, 2023

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 7366 or branch name add/7295-loading-state-to-woopay-button 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: 1c86598
  • Build time: 2023-10-05 17:33:20 UTC

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

@github-actions
Copy link
Contributor

github-actions bot commented Oct 4, 2023

Size Change: +2.24 kB (0%)

Total Size: 1.42 MB

Filename Size Change
release/woocommerce-payments/assets/css/admin.css 1.04 kB +10 B (+1%)
release/woocommerce-payments/dist/blocks-checkout-rtl.css 1.57 kB +53 B (+4%)
release/woocommerce-payments/dist/blocks-checkout.css 1.56 kB +52 B (+3%)
release/woocommerce-payments/dist/blocks-checkout.js 74.9 kB +319 B (0%)
release/woocommerce-payments/dist/index.js 284 kB +549 B (0%)
release/woocommerce-payments/dist/multi-currency-switcher-block.js 60.2 kB +13 B (0%)
release/woocommerce-payments/dist/multi-currency.js 54.9 kB +79 B (0%)
release/woocommerce-payments/dist/order.js 41.1 kB +22 B (0%)
release/woocommerce-payments/dist/payment-gateways.js 38.5 kB +92 B (0%)
release/woocommerce-payments/dist/settings.js 234 kB +267 B (0%)
release/woocommerce-payments/dist/upe_checkout.js 34.1 kB +13 B (0%)
release/woocommerce-payments/dist/upe_split_checkout.js 34.6 kB +26 B (0%)
release/woocommerce-payments/dist/upe_with_deferred_intent_creation_checkout.js 36.8 kB +122 B (0%)
release/woocommerce-payments/dist/upe-blocks-checkout-rtl.css 1.57 kB +53 B (+4%)
release/woocommerce-payments/dist/upe-blocks-checkout.css 1.56 kB +52 B (+3%)
release/woocommerce-payments/dist/upe-blocks-checkout.js 39.6 kB +12 B (0%)
release/woocommerce-payments/dist/upe-split-blocks-checkout-rtl.css 1.57 kB +53 B (+4%)
release/woocommerce-payments/dist/upe-split-blocks-checkout.css 1.56 kB +52 B (+3%)
release/woocommerce-payments/dist/upe-split-blocks-checkout.js 41 kB +26 B (0%)
release/woocommerce-payments/dist/woopay-express-button.js 52 kB +375 B (+1%)
ℹ️ View Unchanged
Filename Size
release/woocommerce-payments/assets/css/success.css 158 B
release/woocommerce-payments/dist/checkout-rtl.css 440 B
release/woocommerce-payments/dist/checkout.css 441 B
release/woocommerce-payments/dist/checkout.js 28.8 kB
release/woocommerce-payments/dist/index-rtl.css 36.4 kB
release/woocommerce-payments/dist/index.css 36.4 kB
release/woocommerce-payments/dist/multi-currency-analytics.js 1.05 kB
release/woocommerce-payments/dist/multi-currency-rtl.css 2.88 kB
release/woocommerce-payments/dist/multi-currency.css 2.88 kB
release/woocommerce-payments/dist/order-rtl.css 676 B
release/woocommerce-payments/dist/order.css 679 B
release/woocommerce-payments/dist/payment-gateways-rtl.css 690 B
release/woocommerce-payments/dist/payment-gateways.css 692 B
release/woocommerce-payments/dist/payment-request-rtl.css 146 B
release/woocommerce-payments/dist/payment-request.css 146 B
release/woocommerce-payments/dist/payment-request.js 11.8 kB
release/woocommerce-payments/dist/product-details.js 898 B
release/woocommerce-payments/dist/settings-rtl.css 8.93 kB
release/woocommerce-payments/dist/settings.css 8.94 kB
release/woocommerce-payments/dist/subscription-edit-page.js 669 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal-rtl.css 519 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.css 519 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.js 20.3 kB
release/woocommerce-payments/dist/subscription-product-onboarding-toast.js 693 B
release/woocommerce-payments/dist/subscriptions-empty-state-rtl.css 117 B
release/woocommerce-payments/dist/subscriptions-empty-state.css 117 B
release/woocommerce-payments/dist/subscriptions-empty-state.js 19.5 kB
release/woocommerce-payments/dist/tos-rtl.css 230 B
release/woocommerce-payments/dist/tos.css 231 B
release/woocommerce-payments/dist/tos.js 21.9 kB
release/woocommerce-payments/dist/upe_checkout-rtl.css 440 B
release/woocommerce-payments/dist/upe_checkout.css 441 B
release/woocommerce-payments/dist/upe_split_checkout-rtl.css 440 B
release/woocommerce-payments/dist/upe_split_checkout.css 441 B
release/woocommerce-payments/dist/woopay-express-button-rtl.css 146 B
release/woocommerce-payments/dist/woopay-express-button.css 146 B
release/woocommerce-payments/dist/woopay-rtl.css 3.85 kB
release/woocommerce-payments/dist/woopay.css 3.85 kB
release/woocommerce-payments/dist/woopay.js 71.6 kB
release/woocommerce-payments/includes/subscriptions/assets/css/plugin-page.css 622 B
release/woocommerce-payments/includes/subscriptions/assets/js/plugin-page.js 814 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/i18n-loader.js 2.43 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/i18n-loader.js 1.01 kB
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-identity-crisis/babel.config.js 160 B
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.css 2.32 kB
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.js 13.8 kB
release/woocommerce-payments/vendor/automattic/jetpack-identity-crisis/build/index.rtl.css 2.32 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/about.css 1.2 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.56 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.63 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.38 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.06 kB

compressed-size-action

@ricardo
Copy link
Member Author

ricardo commented Oct 4, 2023

@stephendharmadi please take a look at the demo video and LMK if you have any suggestions.

I took advantage of the available WC blocks spinner class – also available in the email input loading state:

email-input-loading-spinner.mov

The color of the spinner is the same as the font color of the button theme.

When it's disabled, it's styled with a 50% opacity, which is easier than defining new colors for the different button themes (dark, light, outline) and a not-allowed cursor.

Comment on lines 319 to 332
useEffect( () => {
const handlePageShow = ( event ) => {
// Re-enable the button after navigating back/forward to the page if bfcache is used.
if ( event?.persisted ) {
setIsLoading( false );
}
};

window.addEventListener( 'pageshow', handlePageShow );

return () => {
window.removeEventListener( 'pageshow', handlePageShow );
};
}, [] );
Copy link
Member Author

@ricardo ricardo Oct 4, 2023

Choose a reason for hiding this comment

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

Without this, and if back-forward cache is enabled in chrome://flags. The button is kept in its loading state after clicking the browser's back button.

Similar issue: #5113

@ricardo ricardo requested review from a team and rafaelzaleski and removed request for a team October 4, 2023 19:50
@ricardo
Copy link
Member Author

ricardo commented Oct 4, 2023

Also cc'ing @nikkivias in case Stephen doesn't see this.

We need a design feedback around midday Thursday, Oct 5th, to be able to merge this before WooPayments code freeze. Apologies for the short notice.

@ricardo ricardo requested a review from nikkivias October 4, 2023 19:58
} );
}
};
} );

return iframe;
}, [ isProductPage, context, isPreview, listenForCartChanges ] );
}, [ isProductPage, isPreview, isLoading, context, listenForCartChanges ] );
Copy link
Contributor

Choose a reason for hiding this comment

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

@ricardo, I just wanted to jump in here and highlight that by adding isLoading here, we inadvertently introduce a regression. For example, once we click the WooPay button, the isLoading state is updated to true, which in turn calls the const newIframe = useCallback(), which ultimately calls the useEffect() that appends the iFrame to the UI. This means we end up with duplicate iFrames in the UI. Once the isLoading state returns to false (for any given reason), we add another iFrame to the UI.

I suggest maintaining the isLoadingRef alongside isLoading and removing the isLoading dependency from const newIframe = useCallback(). Although not the ideal solution, this will prevent a newIframe from being created and added to the UI each time isLoading state updates. We may also want to add a note about this potential regression next to the dependencies.

Copy link
Member Author

Choose a reason for hiding this comment

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

Thanks for pointing this out. I didn't notice the duplicate iframe when testing.

Indeed it doesn't seem ideal to keep both the isLoading state and isLoadingRef, but I also don't have a better suggestion.

Fixed in 6b351fc.

@lovo-h Not suggesting any changes, but just wondering, could the iframe be rendered as a React component inside the button perhaps? To avoid these non-react DOM manipulations.

Copy link
Contributor

Choose a reason for hiding this comment

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

@lovo-h Not suggesting any changes, but just wondering, could the iframe be rendered as a React component inside the button perhaps? To avoid these non-react DOM manipulations.

In other places, we compose the iframe like we do here. But I think that if we render the iframe like a React component, that would address these issues. Good call.

@stephendharmadi
Copy link

stephendharmadi commented Oct 5, 2023

Hi @ricardo, thanks for reaching out.

Could you follow these button specifications? It covers the loading and disabled state of the WooPay express checkout button for different button styles (Dark, Light, Light with Outline).

Button Specifications - Dark Buttons

Button Specifications - Light Buttons

Button Specifications - Light with outline

@stephendharmadi
Copy link

The color of the spinner is the same as the font color of the button theme.

It looks good! @ricardo

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.

LGTM and tests well. The button is looking great 💯

@ricardo ricardo requested a review from rafaelzaleski October 5, 2023 17:29
@ricardo
Copy link
Member Author

ricardo commented Oct 5, 2023

@stephendharmadi the Figma you shared appears to be out-of-date with the screenshots attached in your #7366 (comment) (dark colors are different).

I had assumed we would merge both "Disabled" and "Loading" styles, but now if I understand correctly, the loading state should not have lighter colors as in the disabled style. Right?

So, here's what the updated demo looks like:

demo-2.mov

That way we simply keep the same colors as the "Resting" button, but technically the button is disabled while in its "Loading" state (It's not clickable, doesn't change when hovered, and has a not-allowed cursor).

I'll wait for your confirmation on the above by Friday.

@stephendharmadi
Copy link

stephendharmadi commented Oct 6, 2023

@stephendharmadi the Figma you shared appears to be out-of-date with the screenshots attached in your #7366 (comment) (dark colors are different).

The artboard mode was accidentally switched. You can check again.

I had assumed we would merge both "Disabled" and "Loading" styles, but now if I understand correctly, the loading state should not have lighter colors as in the disabled style. Right?

Yes, the color will be the same as the default state.

@ricardo ricardo added this pull request to the merge queue Oct 6, 2023
Merged via the queue into develop with commit 74d9de8 Oct 6, 2023
26 of 27 checks passed
@ricardo ricardo deleted the add/7295-loading-state-to-woopay-button branch October 6, 2023 17:49
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.

Add loading state to WooPay button
5 participants