Skip to content
This repository was archived by the owner on Feb 23, 2024. It is now read-only.

Refactor useForcedLayout to subscribe to store changes and to batch block insertions #7879

Merged
merged 5 commits into from
Dec 14, 2022

Conversation

opr
Copy link
Contributor

@opr opr commented Dec 7, 2022

Following on from the discussion in pca54o-4GY-p2#comment-4658 I implemented the suggestion of @jsnajdr. I altered useForcedLayout to subscribe to changes to core/block-editor in the registry. I also batched the action dispatches to that store. Whereas we previously inserted blocks individually, we now insert multiple blocks at once if necessary.

I added two new functions (the functionality already existed in the old useForcedLayout hook, I just separated it): getMissingBlocks and findBlockPosition. These functions find which registered blocks are missing from a forced layout, and find the index that these blocks should be inserted at, respectively.

Fixes #7367

Testing

Automated Tests

  • Changes in this PR are covered by Automated Tests.
    • Unit tests
    • E2E tests

Internal dev testing

  1. Add WooCommerce Gift Cards, EU VAT Number, and a new plugin generated by the @woocommerce/extend-cart-checkout-block template. (Go to plugins and exectue: npx @wordpress/create-block -t @woocommerce/extend-cart-checkout-block my-test-plugin).
  2. Activate them all, and ensure taxes are enabled in WooCommerce (go to WooCommerce -> Settings -> General -> Enable tax rates and calculations)
  3. Create a new page, add the Cart block. Ensure it loads correctly. Save the page and reload, ensure it's still there.
  4. Load this new page on the front-end. Check it renders and works correctly.
  5. Create a new page and add the Checkout block. Ensure it loads correctly. Ensure you see the I want to receive updates about products and promotions. checkbox in the Contact Information block, ensure you see the VAT Number block rendered at the bottom of the Checkout block (this is intentional).
  6. Check the Gift Card boxes appear in the totals sidebar (should see two of them, one checkbox and one "Have a gift card?" panel).
  7. Open on the front end and check the VAT Number box is there and the newsletter checkbox. You can also buy and redeem a gift card on your account and check that too, but it's not necessary as long as the "Have a gift card?" panel appears.
  8. Repeat these tests on wpcom and ensure nothing breaks!

User Facing Testing

  1. Add the Cart and Checkout blocks to two new pages.
  2. Ensure they load correctly on the editor and on the front end.
  • Do not include in the Testing Notes

WooCommerce Visibility

  • WooCommerce Core
  • Feature plugin
  • Experimental

Performance Impact

I tested the performance of my version by logging the difference in performance.now() between the start and end of the subscribe function (this is where most of the work gets done) and in the old version by logging the difference in performance.now() in the useLayoutEffect. I took an average of the values of every timestamp collected when inserting a new block and it averaged out around 10ms for both implementations.

I also took the following measurements:

Metric Trunk This branch
Number of hook calls 156 58
Subscription calls (added a subscribe to the registry just to check): 3390 434
Heap memory use Avg: 1026mb Avg: 479mb
Actions dispatched to core/block-editor store 76 67

Changelog

Skipping

@opr opr added status: needs review type: refactor The issue/PR is related to refactoring. skip-changelog PRs that you don't want to appear in the changelog. focus: blocks Specific work involving or impacting how blocks behave. block: cart Issues related to the cart block. block: checkout Issues related to the checkout block. labels Dec 7, 2022
@opr opr self-assigned this Dec 7, 2022
@rubikuserbot rubikuserbot requested review from a team and nielslange and removed request for a team December 7, 2022 21:06
@github-actions
Copy link
Contributor

github-actions bot commented Dec 7, 2022

The release ZIP for this PR is accessible via:

https://wcblocks.wpcomstaging.com/wp-content/uploads/woocommerce-gutenberg-products-block-7879.zip

@github-actions
Copy link
Contributor

github-actions bot commented Dec 7, 2022

Script Dependencies Report

There is no changed script dependency between this branch and trunk.

This comment was automatically generated by the ./github/compare-assets action.

@github-actions
Copy link
Contributor

github-actions bot commented Dec 7, 2022

TypeScript Errors Report

Files with errors: 429
Total errors: 2059

🎉 🎉 This PR does not introduce new TS errors.

@github-actions
Copy link
Contributor

github-actions bot commented Dec 7, 2022

Size Change: +174 B (0%)

Total Size: 975 kB

Filename Size Change
build/all-products.js 33.2 kB +3 B (0%)
build/blocks-checkout.js 27.3 kB +4 B (0%)
build/cart.js 46.5 kB +50 B (0%)
build/checkout.js 40.6 kB +50 B (0%)
build/mini-cart-contents.js 17.1 kB +66 B (0%)
build/single-product.js 10.1 kB +1 B (0%)
ℹ️ View Unchanged
Filename Size
build/active-filters-frontend.js 7.74 kB
build/active-filters-wrapper-frontend.js 6.01 kB
build/active-filters.js 7.32 kB
build/all-products-frontend.js 11.3 kB
build/all-reviews.js 7.79 kB
build/attribute-filter-frontend.js 22.6 kB
build/attribute-filter-wrapper-frontend.js 7.14 kB
build/attribute-filter.js 12.3 kB
build/cart-blocks/cart-accepted-payment-methods-frontend.js 1.38 kB
build/cart-blocks/cart-cross-sells-frontend.js 253 B
build/cart-blocks/cart-cross-sells-products--product-add-to-cart-frontend.js 5.48 kB
build/cart-blocks/cart-cross-sells-products-frontend.js 4.77 kB
build/cart-blocks/cart-express-payment--checkout-blocks/express-payment-frontend.js 5.04 kB
build/cart-blocks/cart-express-payment-frontend.js 778 B
build/cart-blocks/cart-items-frontend.js 299 B
build/cart-blocks/cart-line-items--mini-cart-contents-block/products-table-frontend.js 5.29 kB
build/cart-blocks/cart-line-items-frontend.js 1.07 kB
build/cart-blocks/cart-order-summary-frontend.js 1.24 kB
build/cart-blocks/cart-totals-frontend.js 319 B
build/cart-blocks/empty-cart-frontend.js 346 B
build/cart-blocks/filled-cart-frontend.js 782 B
build/cart-blocks/order-summary-coupon-form-frontend.js 1.73 kB
build/cart-blocks/order-summary-discount-frontend.js 2.15 kB
build/cart-blocks/order-summary-fee-frontend.js 273 B
build/cart-blocks/order-summary-heading-frontend.js 455 B
build/cart-blocks/order-summary-shipping-frontend.js 5.99 kB
build/cart-blocks/order-summary-subtotal-frontend.js 274 B
build/cart-blocks/order-summary-taxes-frontend.js 435 B
build/cart-blocks/proceed-to-checkout-frontend.js 1.19 kB
build/cart-frontend.js 46.2 kB
build/checkout-blocks/actions-frontend.js 1.77 kB
build/checkout-blocks/billing-address--checkout-blocks/shipping-address-frontend.js 3.9 kB
build/checkout-blocks/billing-address-frontend.js 1.09 kB
build/checkout-blocks/contact-information-frontend.js 1.87 kB
build/checkout-blocks/express-payment-frontend.js 1.13 kB
build/checkout-blocks/fields-frontend.js 343 B
build/checkout-blocks/order-note-frontend.js 1.14 kB
build/checkout-blocks/order-summary-cart-items-frontend.js 3.67 kB
build/checkout-blocks/order-summary-coupon-form-frontend.js 1.89 kB
build/checkout-blocks/order-summary-discount-frontend.js 2.28 kB
build/checkout-blocks/order-summary-fee-frontend.js 276 B
build/checkout-blocks/order-summary-frontend.js 1.24 kB
build/checkout-blocks/order-summary-shipping-frontend.js 6.04 kB
build/checkout-blocks/order-summary-subtotal-frontend.js 273 B
build/checkout-blocks/order-summary-taxes-frontend.js 436 B
build/checkout-blocks/payment-frontend.js 8.32 kB
build/checkout-blocks/shipping-address-frontend.js 1.07 kB
build/checkout-blocks/shipping-methods-frontend.js 5.01 kB
build/checkout-blocks/terms-frontend.js 1.63 kB
build/checkout-blocks/totals-frontend.js 325 B
build/checkout-frontend.js 48.3 kB
build/featured-category.js 13.2 kB
build/featured-product.js 13.4 kB
build/filter-wrapper-frontend.js 13.8 kB
build/filter-wrapper.js 2.4 kB
build/general-style-rtl.css 1.29 kB
build/general-style.css 1.29 kB
build/handpicked-products.js 7.29 kB
build/legacy-template.js 2.86 kB
build/mini-cart-component-frontend.js 20 kB
build/mini-cart-contents-block/empty-cart-frontend.js 366 B
build/mini-cart-contents-block/filled-cart-frontend.js 230 B
build/mini-cart-contents-block/footer-frontend.js 2.95 kB
build/mini-cart-contents-block/items-frontend.js 237 B
build/mini-cart-contents-block/products-table-frontend.js 591 B
build/mini-cart-contents-block/shopping-button-frontend.js 288 B
build/mini-cart-contents-block/title-frontend.js 368 B
build/mini-cart-frontend.js 1.88 kB
build/mini-cart.js 4.29 kB
build/price-filter-frontend.js 13.6 kB
build/price-filter-wrapper-frontend.js 7.02 kB
build/price-filter.js 8.39 kB
build/price-format.js 1.19 kB
build/product-add-to-cart--product-button--product-category-list--product-image--product-price--product-r--a0326d00.js 226 B
build/product-add-to-cart--product-button--product-image--product-rating--product-title.js 151 B
build/product-add-to-cart-frontend.js 1.46 kB
build/product-add-to-cart.js 8.36 kB
build/product-best-sellers.js 7.62 kB
build/product-button--product-category-list--product-image--product-price--product-rating--product-sale-b--e17c7c01.js 430 B
build/product-button--product-image--product-rating--product-sale-badge--product-title.js 301 B
build/product-button-frontend.js 2.17 kB
build/product-button.js 3.85 kB
build/product-categories.js 2.36 kB
build/product-category-list-frontend.js 1.13 kB
build/product-category-list.js 503 B
build/product-category.js 8.61 kB
build/product-image-frontend.js 2.16 kB
build/product-image.js 3.93 kB
build/product-new.js 7.62 kB
build/product-on-sale.js 7.95 kB
build/product-price-frontend.js 2.16 kB
build/product-price.js 1.54 kB
build/product-query.js 5.74 kB
build/product-rating-frontend.js 1.47 kB
build/product-rating.js 816 B
build/product-sale-badge-frontend.js 1.38 kB
build/product-sale-badge.js 811 B
build/product-search.js 2.61 kB
build/product-sku-frontend.js 629 B
build/product-sku.js 377 B
build/product-stock-indicator-frontend.js 1.26 kB
build/product-stock-indicator.js 644 B
build/product-summary-frontend.js 1.52 kB
build/product-summary.js 920 B
build/product-tag-list-frontend.js 1.12 kB
build/product-tag-list.js 497 B
build/product-tag.js 8 kB
build/product-title-frontend.js 1.57 kB
build/product-title.js 3.3 kB
build/product-top-rated.js 7.86 kB
build/products-by-attribute.js 8.54 kB
build/rating-filter-frontend.js 7.16 kB
build/rating-filter-wrapper-frontend.js 5.41 kB
build/rating-filter.js 5.8 kB
build/reviews-by-category.js 11.2 kB
build/reviews-by-product.js 12.3 kB
build/reviews-frontend.js 7.02 kB
build/single-product-frontend.js 17.5 kB
build/stock-filter-frontend.js 7.8 kB
build/stock-filter-wrapper-frontend.js 6.04 kB
build/stock-filter.js 6.71 kB
build/vendors--attribute-filter-wrapper--mini-cart-contents-block/footer--product-add-to-cart-frontend.js 6.86 kB
build/vendors--attribute-filter-wrapper-frontend.js 8.2 kB
build/vendors--cart-blocks/cart-cross-sells-products--cart-blocks/cart-line-items--cart-blocks/cart-order--671ca56f-frontend.js 5.26 kB
build/vendors--cart-blocks/cart-cross-sells-products--cart-blocks/order-summary-shipping--checkout-blocks--18f9376a-frontend.js 19.1 kB
build/vendors--cart-blocks/cart-cross-sells-products--product-add-to-cart-frontend.js 7.54 kB
build/vendors--cart-blocks/cart-line-items--checkout-blocks/order-summary-cart-items--mini-cart-contents---233ab542-frontend.js 3.14 kB
build/vendors--cart-blocks/order-summary-shipping--checkout-blocks/billing-address--checkout-blocks/order--5b8feb0b-frontend.js 4.85 kB
build/vendors--cart-blocks/order-summary-shipping--checkout-blocks/order-summary-shipping--checkout-block--dda5866c-frontend.js 8.85 kB
build/wc-blocks-data.js 18.8 kB
build/wc-blocks-editor-style-rtl.css 5.19 kB
build/wc-blocks-editor-style.css 5.19 kB
build/wc-blocks-google-analytics.js 1.56 kB
build/wc-blocks-middleware.js 934 B
build/wc-blocks-registry.js 2.92 kB
build/wc-blocks-shared-context.js 1.52 kB
build/wc-blocks-shared-hocs.js 1.72 kB
build/wc-blocks-style-rtl.css 24.2 kB
build/wc-blocks-style.css 24.2 kB
build/wc-blocks-vendors-style-rtl.css 1.95 kB
build/wc-blocks-vendors-style.css 1.95 kB
build/wc-blocks-vendors.js 62.4 kB
build/wc-blocks.js 2.63 kB
build/wc-payment-method-bacs.js 816 B
build/wc-payment-method-cheque.js 811 B
build/wc-payment-method-cod.js 909 B
build/wc-payment-method-paypal.js 837 B
build/wc-settings.js 2.6 kB

compressed-size-action

@opr opr requested a review from senadir December 8, 2022 14:35
Copy link
Contributor

@nielslange nielslange left a comment

Choose a reason for hiding this comment

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

I successfully tested this PR both using wp.org and wp.com.

I do have to say that on wp.com, I haven't been able to run npx @wordpress/create-block -t @woocommerce/extend-cart-checkout-block my-test-plugin. When trying to do that via SSH, I received the following error message:

bash: npx: command not found

Apart from that, the PR was working as expected.

@senadir
Copy link
Member

senadir commented Dec 14, 2022

I love the effort you put into testing the performance of this Thomas!

Copy link
Member

@senadir senadir left a comment

Choose a reason for hiding this comment

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

I tested this on wordpress.com and there are no regression there as well, the code looks clean, thank you for working on this Thomas!

@opr
Copy link
Contributor Author

opr commented Dec 14, 2022

I successfully tested this PR both using wp.org and wp.com.

I do have to say that on wp.com, I haven't been able to run npx @wordpress/create-block -t @woocommerce/extend-cart-checkout-block my-test-plugin. When trying to do that via SSH, I received the following error message:

bash: npx: command not found

Apart from that, the PR was working as expected.

No worries Niels, you can run that locally, cd into the new directory, run npm run build then upload the zip that gets created.

Thank you for testing @nielslange and @senadir

@opr opr merged commit 396b218 into trunk Dec 14, 2022
@opr opr deleted the refactor/use-forced-layout branch December 14, 2022 15:55
@ralucaStan
Copy link
Contributor

Great work on this @opr, hopefully we won't have any more reports of #5866

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
block: cart Issues related to the cart block. block: checkout Issues related to the checkout block. focus: blocks Specific work involving or impacting how blocks behave. skip-changelog PRs that you don't want to appear in the changelog. type: refactor The issue/PR is related to refactoring.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants