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

Product Price block: add support to the Single Product Template #8609

Conversation

gigitux
Copy link
Contributor

@gigitux gigitux commented Mar 2, 2023

This PR added support to the Product Price block to Single Product Template.

Fixes #8479

On the implementation level, the main issue is that the atomic blocks support several contexts:

  • Inside All Products Block -> withProductDataContext HOC
  • Inside Products Block -> Gutenberg Context
  • Inside Single Product Template -> Gutenberg Context
  • Without any parent -> WithSelector and withProductDataContext HOCs

withProductDataContext

The HOC withProductDataContext servers pass the select product object to the block.

With Selector

The HOC withSelector, when the ProductDataContext isn't defined, renders a modal for selecting the product and setting the product id in the context. In this way, the block can fetch the right data.

We added the support to different contexts at different times, so the code isn't in the best shape, which influenced the work for this PR.

It was necessary to create a component identical to the ´WithSelector` HOC. There is no need to show the selector product modal when the block is inside the Single Product template. Using a component, we can easily distinguish the two cases.

In any case, we should refactor all the atomic blocks and create a common logic easily to check and with great type safety: should we put it as a cooldown task?

image

Testing

User Facing Testing

  1. Switch to the TT3 theme.
  2. Go to the Site Editor, and edit the Single Product Template.
  3. Add the Product Price. It should have a price of 50.00 with the currency set in WC options. Save.
  4. On the front end, click a product and check that the block shows the right price.
  • Do not include in the Testing Notes

WooCommerce Visibility

  • WooCommerce Core
  • Feature plugin
  • Experimental

Changelog

Product Price block: add support to the Single Product Template.

@gigitux gigitux linked an issue Mar 2, 2023 that may be closed by this pull request
@woocommercebot woocommercebot requested review from a team and imanish003 and removed request for a team March 2, 2023 17:58
@github-actions
Copy link
Contributor

github-actions bot commented Mar 2, 2023

The release ZIP for this PR is accessible via:

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

Script Dependencies Report

The compare-assets action has detected some changed script dependencies between this branch and trunk. Please review and confirm the following are correct before merging.

Script Handle Added Removed
reviews-frontend.js wc-settings, wp-a11y, wp-api-fetch, wp-compose, wp-element, wp-i18n, wp-is-shallow-equal, wp-polyfill ⚠️
active-filters-frontend.js lodash, wc-blocks-data-store, wc-price-format, wc-settings, wp-data, wp-element, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-polyfill, wp-primitives, wp-url ⚠️
all-products-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-blocks-registry, wc-blocks-shared-context, wc-blocks-shared-hocs, wc-price-format, wc-settings, wp-a11y, wp-api-fetch, wp-autop, wp-block-editor, wp-blocks, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-hooks, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-polyfill, wp-primitives, wp-url, wp-warning, wp-wordcount ⚠️
attribute-filter-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-settings, wp-a11y, wp-block-editor, wp-blocks, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-keycodes, wp-polyfill, wp-primitives, wp-url, wp-warning ⚠️
cart-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-blocks-registry, wc-blocks-shared-context, wc-blocks-shared-hocs, wc-price-format, wc-settings, wp-a11y, wp-api-fetch, wp-autop, wp-block-editor, wp-blocks, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-hooks, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-keycodes, wp-plugins, wp-polyfill, wp-primitives, wp-url, wp-warning, wp-wordcount ⚠️
checkout-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-blocks-registry, wc-blocks-shared-hocs, wc-price-format, wc-settings, wp-a11y, wp-api-fetch, wp-autop, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-hooks, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-keycodes, wp-plugins, wp-polyfill, wp-primitives, wp-url, wp-warning, wp-wordcount ⚠️
filter-wrapper-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-blocks-registry, wc-price-format, wc-settings, wp-a11y, wp-block-editor, wp-blocks, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-keycodes, wp-polyfill, wp-primitives, wp-url, wp-warning ⚠️
mini-cart-frontend.js wc-settings, wp-polyfill ⚠️
price-filter-frontend.js lodash, react, wc-blocks-data-store, wc-price-format, wc-settings, wp-data, wp-element, wp-i18n, wp-is-shallow-equal, wp-polyfill, wp-url ⚠️
rating-filter-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-settings, wp-a11y, wp-block-editor, wp-blocks, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-i18n, wp-is-shallow-equal, wp-keycodes, wp-polyfill, wp-primitives, wp-url, wp-warning ⚠️
single-product-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-blocks-registry, wc-blocks-shared-context, wc-blocks-shared-hocs, wc-price-format, wc-settings, wp-api-fetch, wp-autop, wp-block-editor, wp-blocks, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-hooks, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-polyfill, wp-primitives, wp-url, wp-warning, wp-wordcount ⚠️
stock-filter-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-settings, wp-a11y, wp-block-editor, wp-blocks, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-keycodes, wp-polyfill, wp-primitives, wp-url, wp-warning ⚠️
mini-cart-component-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-blocks-registry, wc-price-format, wc-settings, wp-a11y, wp-autop, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-hooks, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-keycodes, wp-polyfill, wp-primitives, wp-url, wp-warning, wp-wordcount ⚠️

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

TypeScript Errors Report

  • Files with errors: 486
  • Total errors: 2313

⚠️ ⚠️ This PR introduces new TS errors on 3 files:

assets/js/atomic/blocks/product-elements/price/edit.tsx

assets/js/atomic/blocks/product-elements/price/index.tsx

assets/js/atomic/blocks/product-elements/shared/product-selector.tsx

comments-aggregator

@gigitux gigitux force-pushed the 8479-product-price-block-add-support-to-the-single-product-template branch 3 times, most recently from dc25b45 to 3d8a090 Compare March 2, 2023 18:04
@github-actions
Copy link
Contributor

github-actions bot commented Mar 2, 2023

Size Change: +392 B (0%)

Total Size: 1.1 MB

Filename Size Change
build/active-filters.js 7.31 kB -1 B (0%)
build/all-products-frontend.js 11.7 kB +3 B (0%)
build/all-products.js 36.8 kB +344 B (+1%)
build/attribute-filter.js 12.4 kB +1 B (0%)
build/cart-blocks/cart-cross-sells-products-frontend.js 9.75 kB +60 B (+1%)
build/cart-frontend.js 28.9 kB -2 B (0%)
build/cart.js 47.5 kB +74 B (0%)
build/checkout.js 44.2 kB +1 B (0%)
build/featured-category.js 13.3 kB -153 B (-1%)
build/featured-product.js 13.6 kB -86 B (-1%)
build/handpicked-products.js 7.24 kB +1 B (0%)
build/legacy-template.js 5.28 kB -1 B (0%)
build/mini-cart-contents.js 16.6 kB -1 B (0%)
build/mini-cart.js 4.29 kB -1 B (0%)
build/price-filter.js 8.38 kB +2 B (0%)
build/product-add-to-cart.js 8.61 kB +12 B (0%)
build/product-button.js 3.99 kB +2 B (0%)
build/product-category-list.js 501 B -1 B (0%)
build/product-image.js 4.09 kB +4 B (0%)
build/product-new.js 7.59 kB +1 B (0%)
build/product-on-sale.js 7.91 kB -1 B (0%)
build/product-price-frontend.js 2.38 kB +62 B (+3%)
build/product-price.js 1.64 kB +59 B (+4%)
build/product-query.js 6.6 kB +1 B (0%)
build/product-sale-badge.js 818 B +2 B (0%)
build/rating-filter.js 7.42 kB +1 B (0%)
build/reviews-by-category.js 11.2 kB -1 B (0%)
build/reviews-by-product.js 12.3 kB -29 B (0%)
build/single-product-frontend.js 17.9 kB +3 B (0%)
build/single-product.js 9.97 kB +34 B (0%)
build/stock-filter.js 8.14 kB +3 B (0%)
build/wc-blocks-vendors.js 64.4 kB -1 B (0%)
ℹ️ View Unchanged
Filename Size
build/active-filters-frontend.js 7.97 kB
build/active-filters-wrapper-frontend.js 5.98 kB
build/all-reviews.js 7.65 kB
build/attribute-filter-frontend.js 22.4 kB
build/attribute-filter-wrapper--stock-filter-wrapper-frontend.js 3.36 kB
build/attribute-filter-wrapper-frontend.js 4.46 kB
build/blocks-checkout.js 41.2 kB
build/breadcrumbs.js 2.04 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-express-payment--checkout-blocks/express-payment-frontend.js 5.19 kB
build/cart-blocks/cart-express-payment-frontend.js 719 B
build/cart-blocks/cart-items-frontend.js 302 B
build/cart-blocks/cart-line-items--mini-cart-contents-block/products-table-frontend.js 5.36 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 308 B
build/cart-blocks/empty-cart-frontend.js 345 B
build/cart-blocks/filled-cart-frontend.js 655 B
build/cart-blocks/order-summary-coupon-form-frontend.js 1.62 kB
build/cart-blocks/order-summary-discount-frontend.js 2.12 kB
build/cart-blocks/order-summary-fee-frontend.js 274 B
build/cart-blocks/order-summary-heading-frontend.js 455 B
build/cart-blocks/order-summary-shipping-frontend.js 14.8 kB
build/cart-blocks/order-summary-subtotal-frontend.js 275 B
build/cart-blocks/order-summary-taxes-frontend.js 434 B
build/cart-blocks/proceed-to-checkout-frontend.js 1.24 kB
build/catalog-sorting.js 1.7 kB
build/checkout-blocks/actions-frontend.js 1.85 kB
build/checkout-blocks/billing-address--checkout-blocks/shipping-address-frontend.js 3.92 kB
build/checkout-blocks/billing-address-frontend.js 1.18 kB
build/checkout-blocks/contact-information-frontend.js 2.05 kB
build/checkout-blocks/express-payment-frontend.js 1.13 kB
build/checkout-blocks/fields-frontend.js 331 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.79 kB
build/checkout-blocks/order-summary-discount-frontend.js 2.29 kB
build/checkout-blocks/order-summary-fee-frontend.js 277 B
build/checkout-blocks/order-summary-frontend.js 1.24 kB
build/checkout-blocks/order-summary-shipping-frontend.js 14.9 kB
build/checkout-blocks/order-summary-subtotal-frontend.js 275 B
build/checkout-blocks/order-summary-taxes-frontend.js 435 B
build/checkout-blocks/payment-frontend.js 8.42 kB
build/checkout-blocks/pickup-options-frontend.js 2.8 kB
build/checkout-blocks/shipping-address-frontend.js 1.14 kB
build/checkout-blocks/shipping-method-frontend.js 2.28 kB
build/checkout-blocks/shipping-methods-frontend.js 4.58 kB
build/checkout-blocks/terms-frontend.js 1.56 kB
build/checkout-blocks/totals-frontend.js 310 B
build/checkout-frontend.js 30.4 kB
build/customer-account.js 3.17 kB
build/filter-wrapper-frontend.js 14.1 kB
build/filter-wrapper.js 2.39 kB
build/general-style-rtl.css 1.31 kB
build/general-style.css 1.31 kB
build/mini-cart-component-frontend.js 28 kB
build/mini-cart-contents-block/empty-cart-frontend.js 360 B
build/mini-cart-contents-block/filled-cart-frontend.js 268 B
build/mini-cart-contents-block/footer-frontend.js 2.86 kB
build/mini-cart-contents-block/items-frontend.js 237 B
build/mini-cart-contents-block/products-table-frontend.js 588 B
build/mini-cart-contents-block/shopping-button-frontend.js 575 B
build/mini-cart-contents-block/title-frontend.js 367 B
build/mini-cart-frontend.js 2 kB
build/price-filter-frontend.js 13.9 kB
build/price-filter-wrapper-frontend.js 6.99 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 253 B
build/product-add-to-cart--product-button--product-image--product-rating--product-title.js 151 B
build/product-add-to-cart-frontend.js 6.7 kB
build/product-best-sellers.js 7.6 kB
build/product-button--product-category-list--product-image--product-price--product-rating--product-sale-b--e17c7c01.js 500 B
build/product-button--product-image--product-price--product-rating--product-sale-badge--product-title.js 262 B
build/product-button-frontend.js 2.22 kB
build/product-categories.js 2.36 kB
build/product-category-list-frontend.js 1.19 kB
build/product-category.js 8.58 kB
build/product-image-frontend.js 2.23 kB
build/product-rating-frontend.js 1.65 kB
build/product-rating.js 920 B
build/product-results-count.js 1.65 kB
build/product-sale-badge-frontend.js 1.45 kB
build/product-search.js 2.63 kB
build/product-sku-frontend.js 629 B
build/product-sku.js 376 B
build/product-stock-indicator-frontend.js 1.31 kB
build/product-stock-indicator.js 645 B
build/product-summary-frontend.js 1.58 kB
build/product-summary.js 920 B
build/product-tag-list-frontend.js 1.18 kB
build/product-tag-list.js 497 B
build/product-tag.js 8.07 kB
build/product-title-frontend.js 1.65 kB
build/product-title.js 3.46 kB
build/product-top-rated.js 7.82 kB
build/products-by-attribute.js 8.53 kB
build/rating-filter-frontend.js 20.9 kB
build/rating-filter-wrapper-frontend.js 5.61 kB
build/reviews-frontend.js 7.12 kB
build/stock-filter-frontend.js 21.1 kB
build/stock-filter-wrapper-frontend.js 3.15 kB
build/store-notices.js 1.69 kB
build/vendors--attribute-filter-wrapper--cart-blocks/cart-cross-sells-products--cart-blocks/order-summary--82e4ed06-frontend.js 6.86 kB
build/vendors--attribute-filter-wrapper--rating-filter-wrapper--stock-filter-wrapper-frontend.js 7.69 kB
build/vendors--cart-blocks/cart-cross-sells-products--cart-blocks/cart-line-items--cart-blocks/cart-order--3c5fe802-frontend.js 5.26 kB
build/vendors--cart-blocks/cart-cross-sells-products--cart-blocks/order-summary-shipping--checkout-blocks--18f9376a-frontend.js 19.4 kB
build/vendors--cart-blocks/cart-cross-sells-products--product-add-to-cart-frontend.js 7.25 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.83 kB
build/vendors--checkout-blocks/shipping-method-frontend.js 12 kB
build/vendors--checkout-blocks/shipping-methods-frontend.js 8.84 kB
build/wc-blocks-data.js 21.5 kB
build/wc-blocks-editor-style-rtl.css 5.74 kB
build/wc-blocks-editor-style.css 5.75 kB
build/wc-blocks-google-analytics.js 1.56 kB
build/wc-blocks-middleware.js 933 B
build/wc-blocks-registry.js 3.15 kB
build/wc-blocks-shared-context.js 1.52 kB
build/wc-blocks-shared-hocs.js 1.73 kB
build/wc-blocks-style-rtl.css 26.8 kB
build/wc-blocks-style.css 26.7 kB
build/wc-blocks-vendors-style-rtl.css 1.96 kB
build/wc-blocks-vendors-style.css 1.96 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
build/wc-shipping-method-pickup-location.js 29.7 kB
build/woo-directives-runtime.js 2.73 kB
build/woo-directives-vendors.js 7.91 kB

compressed-size-action

@gigitux gigitux force-pushed the 8479-product-price-block-add-support-to-the-single-product-template branch from 3d8a090 to 5205f52 Compare March 2, 2023 18:25
@gigitux gigitux self-assigned this Mar 2, 2023
@gigitux gigitux added type: enhancement The issue is a request for an enhancement. skip-changelog PRs that you don't want to appear in the changelog. labels Mar 2, 2023
@gigitux gigitux changed the title Product price block: add support to the single product template Product Price block: add support to the Single Product Template Mar 2, 2023
Copy link
Contributor

@thealexandrelara thealexandrelara left a comment

Choose a reason for hiding this comment

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

Great work! I added a comment in the code to check your opinion about it, but I'm pre-approving it.

One thing that I noticed is that the font-size for the Product Price seems smaller than the original one (in the Classic template), just want to confirm if this is expected or not:

Classic Current
image image

regularPrice={
isDescendentOfSingleProductTemplate
? pricePreview
: prices.price
Copy link
Contributor

Choose a reason for hiding this comment

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

I'm wondering if since the lines 94-96 are using the same logic as these lines, if it would be better to store the logic in a variable/function. Just a precaution to prevent from someone from changing only one of them and forgot to change the other piece of the code in the future. Maybe something like this would work:

const price = isDescendentOfSingleProductTemplate
					? pricePreview
					: prices.price
...
return (
  <ProductPrice
    ...
    price={price}
    ...
    regularPrice={price}
   />
)

What do you think?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Good point, but for the regular price props, it is necessary to use .regular_price. I updated the code!

@github-actions github-actions bot added this to the 9.8.0 milestone Mar 2, 2023
Copy link
Contributor

@imanish003 imanish003 left a comment

Choose a reason for hiding this comment

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

Hi @gigitux, Well done! Except for minor things, everything else looks great to me 🙌🏻

I have left some minor suggestions but I don't have strong opinion about all of those 🙂

assets/js/atomic/blocks/product-elements/shared/config.tsx Outdated Show resolved Hide resolved
assets/js/atomic/blocks/product-elements/price/index.tsx Outdated Show resolved Hide resolved
assets/js/atomic/blocks/product-elements/price/edit.tsx Outdated Show resolved Hide resolved
assets/js/atomic/blocks/product-elements/price/edit.tsx Outdated Show resolved Hide resolved
assets/js/atomic/blocks/product-elements/price/block.tsx Outdated Show resolved Hide resolved
@gigitux
Copy link
Contributor Author

gigitux commented Mar 3, 2023

Thanks folks, for your great comments!

@imanish003 I addressed all your feedback! 💪

One thing that I noticed is that the font-size for the Product Price seems smaller than the original one (in the Classic template), just want to confirm if this is expected or not:

Yep, the goal is to use the Global Styles to change the dimension of the text. By default, we will set Global Styles in the default HTML template. So, it will be necessary to update #8515

Copy link
Contributor

@thealexandrelara thealexandrelara left a comment

Choose a reason for hiding this comment

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

Nice! Thank you for addressing all the raised points! LGTM! 🚀

Yep, the goal is to use the Global Styles to change the dimension of the text. By default, we will set Global Styles in the default HTML template. So, it will be necessary to update #8515

Cool, so after we merge this one I'll add it to the Default HTML Template

Copy link
Contributor

@imanish003 imanish003 left a comment

Choose a reason for hiding this comment

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

Thank you for making the changes according to my suggestions. The updated code looks good to me. However, I have a minor question that I'd like to clarify, but it isn't a blocker for merging this pull request. So, I'm pre-approving the PR now. 🚀🙌🏻

onClick={ () => setIsEditing( true ) }
>
{ __(
'Switch product…',
Copy link
Contributor

Choose a reason for hiding this comment

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

May I know if there is any reason behind adding ... for Switch product…' text?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@gigitux gigitux merged commit 84af82c into trunk Mar 6, 2023
@gigitux gigitux deleted the 8479-product-price-block-add-support-to-the-single-product-template branch March 6, 2023 14:14
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
skip-changelog PRs that you don't want to appear in the changelog. type: enhancement The issue is a request for an enhancement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Product Price block: add support to the Single Product Template
3 participants