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

Conversation

@sunyatasattva
Copy link
Contributor

@sunyatasattva sunyatasattva commented May 22, 2022

This PR migrates the FeaturedItem blocks to TypeScript. I tried to keep the runtime changes at a bare minimum. A few very minor of them were required. The biggest one was the refactoring of two pieces of code that were once again duplicates and also a bit hard to reason with (especially with TypeScript). These were refactored into with-update-button-attributes.tsx, where withSelect was also updated to use the more modern useSelect hook approach.

All the rest is adding the most type safety I could muster, and working around some upstream type limitations.

Fixes #6237, #6238

Testing

Automated Tests

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

User Facing Testing

Only regression testing is needed for this PR. The changes introduced in this PR should be compared with a version without those changes and verified that no behavior has changed.

  1. Add the Featured Product block to a page
  2. Compare its functionality with the same block before these changes. Non-exhaustive list:
    • When added, it shows a full-width selection dropdown to choose the product
    • After choosing the product and clicking "Done", a loading spinner appears and the product is loaded
    • All the info are displayed correctly (default image, title, description, price, call to action)
    • The block toolbar shows the same tools (duotone, alignment, cropping/replacing, editing)
    • The block sidebar shows the same options and they all work correctly (colors, content, media settings, etc.); note that the “border” does not currently work.
    • The block appears resizable and resizing works the same way.
  3. Verify the same for the Featured Category block
  • Do not include in the Testing Notes

WooCommerce Visibility

  • WooCommerce Core
  • Feature plugin
  • Experimental

@rubikuserbot rubikuserbot requested a review from a team May 22, 2022 22:39
@github-actions
Copy link
Contributor

github-actions bot commented May 22, 2022

Size Change: +70 B (0%)

Total Size: 862 kB

Filename Size Change
build/active-filters.js 7.43 kB +6 B (0%)
build/all-products.js 33.4 kB +7 B (0%)
build/all-reviews.js 7.79 kB +2 B (0%)
build/attribute-filter.js 13.8 kB -1 B (0%)
build/cart.js 44.1 kB +10 B (0%)
build/checkout.js 45.4 kB +3 B (0%)
build/featured-category.js 13.1 kB +24 B (0%)
build/featured-product.js 13.4 kB -4 B (0%)
build/handpicked-products.js 7.39 kB -4 B (0%)
build/legacy-template.js 2.2 kB +1 B (0%)
build/mini-cart-contents.js 22.8 kB -3 B (0%)
build/mini-cart.js 6.1 kB -1 B (0%)
build/price-filter.js 8.74 kB +1 B (0%)
build/product-add-to-cart--product-button--product-image--product-title.js 2.65 kB +1 B (0%)
build/product-add-to-cart.js 6.63 kB -8 B (0%)
build/product-best-sellers.js 7.47 kB +4 B (0%)
build/product-button.js 1.09 kB -2 B (0%)
build/product-categories.js 2.78 kB +2 B (0%)
build/product-category.js 8.58 kB -1 B (0%)
build/product-new.js 7.76 kB +1 B (0%)
build/product-on-sale.js 8.08 kB +1 B (0%)
build/product-rating.js 735 B +5 B (+1%)
build/product-sale-badge.js 679 B +2 B (0%)
build/product-search.js 2.18 kB -1 B (0%)
build/product-stock-indicator.js 621 B +1 B (0%)
build/product-summary.js 916 B -1 B (0%)
build/product-top-rated.js 8 kB -1 B (0%)
build/products-by-attribute.js 8.69 kB -4 B (0%)
build/reviews-by-category.js 11.3 kB +3 B (0%)
build/reviews-by-product.js 12.4 kB +11 B (0%)
build/single-product.js 10.1 kB +7 B (0%)
build/stock-filter.js 6.95 kB +1 B (0%)
build/wc-blocks-vendors.js 59 kB +4 B (0%)
build/wc-blocks.js 2.63 kB +4 B (0%)
ℹ️ View Unchanged
Filename Size
build/active-filters-frontend.js 6.59 kB
build/all-products-frontend.js 18.1 kB
build/attribute-filter-frontend.js 17.7 kB
build/blocks-checkout.js 17.4 kB
build/cart-blocks/cart-accepted-payment-methods-frontend.js 1.16 kB
build/cart-blocks/cart-express-payment-frontend.js 5.06 kB
build/cart-blocks/cart-items-frontend.js 299 B
build/cart-blocks/cart-line-items--mini-cart-contents-block/products-table-frontend.js 5.27 kB
build/cart-blocks/cart-line-items-frontend.js 432 B
build/cart-blocks/cart-order-summary-frontend.js 1.11 kB
build/cart-blocks/cart-totals-frontend.js 322 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 2.62 kB
build/cart-blocks/order-summary-discount-frontend.js 2.13 kB
build/cart-blocks/order-summary-fee-frontend.js 273 B
build/cart-blocks/order-summary-heading-frontend.js 454 B
build/cart-blocks/order-summary-shipping--checkout-blocks/order-summary-shipping-frontend.js 6.34 kB
build/cart-blocks/order-summary-shipping-frontend.js 428 B
build/cart-blocks/order-summary-subtotal-frontend.js 273 B
build/cart-blocks/order-summary-taxes-frontend.js 433 B
build/cart-blocks/proceed-to-checkout-frontend.js 1.15 kB
build/cart-frontend.js 45.3 kB
build/checkout-blocks/actions-frontend.js 1.41 kB
build/checkout-blocks/billing-address--checkout-blocks/shipping-address-frontend.js 4.12 kB
build/checkout-blocks/billing-address-frontend.js 892 B
build/checkout-blocks/contact-information-frontend.js 2.83 kB
build/checkout-blocks/express-payment-frontend.js 5.35 kB
build/checkout-blocks/fields-frontend.js 345 B
build/checkout-blocks/order-note-frontend.js 1.07 kB
build/checkout-blocks/order-summary-cart-items-frontend.js 3.66 kB
build/checkout-blocks/order-summary-coupon-form-frontend.js 2.78 kB
build/checkout-blocks/order-summary-discount-frontend.js 2.25 kB
build/checkout-blocks/order-summary-fee-frontend.js 275 B
build/checkout-blocks/order-summary-frontend.js 1.11 kB
build/checkout-blocks/order-summary-shipping-frontend.js 603 B
build/checkout-blocks/order-summary-subtotal-frontend.js 273 B
build/checkout-blocks/order-summary-taxes-frontend.js 432 B
build/checkout-blocks/payment-frontend.js 7.67 kB
build/checkout-blocks/shipping-address-frontend.js 997 B
build/checkout-blocks/shipping-methods-frontend.js 4.71 kB
build/checkout-blocks/terms-frontend.js 1.22 kB
build/checkout-blocks/totals-frontend.js 326 B
build/checkout-frontend.js 47.5 kB
build/mini-cart-component-frontend.js 16.6 kB
build/mini-cart-contents-block/empty-cart-frontend.js 364 B
build/mini-cart-contents-block/filled-cart-frontend.js 230 B
build/mini-cart-contents-block/footer--mini-cart-contents-block/products-table-frontend.js 4.69 kB
build/mini-cart-contents-block/footer-frontend.js 5.63 kB
build/mini-cart-contents-block/items-frontend.js 225 B
build/mini-cart-contents-block/products-table-frontend.js 289 B
build/mini-cart-contents-block/shopping-button-frontend.js 287 B
build/mini-cart-contents-block/title-frontend.js 366 B
build/mini-cart-frontend.js 1.72 kB
build/price-filter-frontend.js 12.5 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 223 B
build/product-add-to-cart--product-button.js 564 B
build/product-add-to-cart-frontend.js 6.96 kB
build/product-button--product-category-list--product-image--product-price--product-rating--product-sale-b--e17c7c01.js 499 B
build/product-button-frontend.js 1.85 kB
build/product-category-list-frontend.js 923 B
build/product-category-list.js 501 B
build/product-image-frontend.js 1.84 kB
build/product-image.js 1.07 kB
build/product-price-frontend.js 1.94 kB
build/product-price.js 1.5 kB
build/product-rating-frontend.js 1.15 kB
build/product-sale-badge-frontend.js 1.09 kB
build/product-sku-frontend.js 380 B
build/product-sku.js 381 B
build/product-stock-indicator-frontend.js 1.03 kB
build/product-summary-frontend.js 1.33 kB
build/product-tag-list-frontend.js 917 B
build/product-tag-list.js 495 B
build/product-tag.js 8.12 kB
build/product-title-frontend.js 1.3 kB
build/product-title.js 910 B
build/reviews-frontend.js 7.02 kB
build/single-product-frontend.js 21.5 kB
build/stock-filter-frontend.js 6.87 kB
build/vendors--cart-blocks/cart-line-items--cart-blocks/cart-order-summary--cart-blocks/order-summary-shi--c02aad66-frontend.js 5.26 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.72 kB
build/vendors--cart-blocks/order-summary-shipping--checkout-blocks/billing-address--checkout-blocks/order--decc3dc6-frontend.js 20.5 kB
build/vendors--mini-cart-contents-block/footer-frontend.js 6.86 kB
build/vendors--product-add-to-cart-frontend.js 7.53 kB
build/wc-blocks-data.js 9.87 kB
build/wc-blocks-editor-style-rtl.css 5.04 kB
build/wc-blocks-editor-style.css 5.04 kB
build/wc-blocks-google-analytics.js 1.56 kB
build/wc-blocks-middleware.js 930 B
build/wc-blocks-registry.js 2.7 kB
build/wc-blocks-shared-context.js 1.52 kB
build/wc-blocks-shared-hocs.js 1.14 kB
build/wc-blocks-style-rtl.css 22.1 kB
build/wc-blocks-style.css 22.1 kB
build/wc-blocks-vendors-style-rtl.css 1.28 kB
build/wc-blocks-vendors-style.css 1.28 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.61 kB

compressed-size-action

@sunyatasattva sunyatasattva self-assigned this May 25, 2022
@sunyatasattva sunyatasattva added 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: featured category Issues related to the Featured Category block, block: featured product Issues related to the Featured Product block. labels May 25, 2022
@sunyatasattva sunyatasattva marked this pull request as ready for review May 25, 2022 20:17
Copy link
Contributor

@frontdevde frontdevde left a comment

Choose a reason for hiding this comment

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

When trying to follow the testing instructions and testing the Featured Product block, I immediately get an error in the editor upon block insertion. I double-checked and on trunk, appears to be working fine.

trunk branch
Screenshot 2022-05-27 at 12 03 19 Screenshot 2022-05-27 at 12 04 40

The error I'm seeing on this branch (and not on trunk):
Screenshot 2022-05-27 at 12 00 28

The HOC `withTransformSingleSelectToMultipleSelect` allows for the wrong
type to be passed to its wrapped component: if a single element is
passed, that is wrapped into an array.

This didn't play well with TypeScript which obviously complains about
the wrong type being passed to the component.

So we now allow for empty arrays to be passed and parsed as "nil".
@github-actions
Copy link
Contributor

Convert `ProductControl` to TypeScript eslint-disable-nex...

Convert `ProductControl` to TypeScript eslint-disable-next-line @typescript-eslint/ban-ts-comment @ts-ignore


// @todo Convert `ProductControl` to TypeScript
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
showVariations
onChange={ (
value: ProductResponseItem[] = []
) => {
const id = value[ 0 ] ? value[ 0 ].id : 0;
setAttributes( {
productId: id,
mediaId: 0,
mediaSrc: '',
} );
triggerUrlUpdate();
} }
/>
) }

🚀 This comment was generated by the automations bot based on a todo comment in f3bc88a in #6439. cc @sunyatasattva

@github-actions
Copy link
Contributor

Convert `ProductCategoryControl` to TypeScript eslint-dis...

Convert `ProductCategoryControl` to TypeScript eslint-disable-next-line @typescript-eslint/ban-ts-comment @ts-ignore


// @todo Convert `ProductCategoryControl` to TypeScript
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
<ProductCategoryControl
selected={ [ attributes.categoryId ] }
onChange={ (
value: WP_REST_API_Category[] = []
) => {
const id = value[ 0 ] ? value[ 0 ].id : 0;
setAttributes( {
categoryId: id,
mediaId: 0,
mediaSrc: '',
} );

🚀 This comment was generated by the automations bot based on a todo comment in f3bc88a in #6439. cc @sunyatasattva

@sunyatasattva
Copy link
Contributor Author

@frontdevde @albarin Feedback addressed!

@frontdevde
Copy link
Contributor

I'm still seeing the same block error (see above) when I'm trying to insert the Featured Product block on this branch (not on trunk). Can you reproduce that issue?

@github-actions
Copy link
Contributor

Convert `ProductCategoryControl` to TypeScript eslint-dis...

Convert `ProductCategoryControl` to TypeScript eslint-disable-next-line @typescript-eslint/ban-ts-comment @ts-ignore


// @todo Convert `ProductCategoryControl` to TypeScript
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
<ProductCategoryControl
selected={ [ attributes.categoryId ] }
onChange={ (
value: WP_REST_API_Category[] = []
) => {
const id = value[ 0 ] ? value[ 0 ].id : 0;
setAttributes( {
categoryId: id,
mediaId: 0,
mediaSrc: '',
} );

🚀 This comment was generated by the automations bot based on a todo comment in 5d280cf in #6439. cc @sunyatasattva

@github-actions
Copy link
Contributor

Convert `ProductControl` to TypeScript eslint-disable-nex...

Convert `ProductControl` to TypeScript eslint-disable-next-line @typescript-eslint/ban-ts-comment @ts-ignore


// @todo Convert `ProductControl` to TypeScript
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
showVariations
onChange={ (
value: ProductResponseItem[] = []
) => {
const id = value[ 0 ] ? value[ 0 ].id : 0;
setAttributes( {
productId: id,
mediaId: 0,
mediaSrc: '',
} );
triggerUrlUpdate();
} }
/>
) }

🚀 This comment was generated by the automations bot based on a todo comment in 5d280cf in #6439. cc @sunyatasattva

Copy link
Contributor

@frontdevde frontdevde 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 this valiant effort and for addressing the feedback!
When retesting with the most recent changes functionally everything appears to be working as expected. Let's get this in as the improvement over the status quo it is and iterate on anything else from there.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

block: featured category Issues related to the Featured Category block, block: featured product Issues related to the Featured Product 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.

Convert Featured Product Block to TypeScript

3 participants