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

StoreAPI: Clear all wc notice types in the cart validation context #5983

Merged
merged 1 commit into from
Mar 10, 2022

Conversation

xristos3490
Copy link
Member

Before the woocommerce_store_api_cart_errors was introduced in this PR, the system would run the woocommerce_check_cart_items at the Checkout route while processing at get_route_post_response().

This way, we could be sure to grab all legacy error notices coming from the wc_add_notice and stop the checkout process, if necessary; ditch all the others (notice types: success, notice).

After the cart validation refactor, the newly introduced CartContoller::validate_cart() is running the woocommerce_check_cart_items in order to group into the cart.errors JS state, all errors coming from the wc_add_notice; this further enchances the 3PD experience as it could create a plug-n-play situation in existing logic.

Where's the bug?

When the cart validator runs the woocommerce_check_cart_items and handles the session notices, it doesn't flush them unless there is at least one error type in them.

Therefore, when working with operations that change the JS cart state (e.g., modifying cart quantities), a new notice is added in the session every time.

The next page refresh will cause the PHP controller to deliver all stacked notices on the page. This screencast demonstrates this issue: https://d.pr/v/9WDttl

It's funny how it slipped during refactoring the validation system. I always had a wc_add_notice('error', 'error') in my code for testing, so the system would delete all notices, thus hiding this issue from me.

Moreover, this issue couldn't be replicated in a similar situation at the payments API, where the code re-calls the wc_clear_notices to ensure that no other errors were added while in process_payment.

Steps to replicate:

  • Add the following PHP snippet in your functions.php
add_action( 'woocommerce_check_cart_items', 'add_simple_notice' );
function add_simple_notice() {
    wc_add_notice( 'notice','notice' );
}
  • Add a product to the cart.
  • Navigate to the cart.
  • Make sure there aren't any error notices in the cart.
  • Refresh the page.
  • Start "toying" with the quantity and wait for each request to finish.
  • Refresh again.

Solution:
I suggest following the current path to solving this: Drop them all and keep only the errors.

cc @mikejolley

Accessibility

Testing

Automated Tests

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

Changelog

None

@github-actions
Copy link
Contributor

github-actions bot commented Mar 2, 2022

Size Change: 0 B

Total Size: 863 kB

ℹ️ View Unchanged
Filename Size
build/active-filters-frontend.js 6.27 kB
build/active-filters.js 6.94 kB
build/all-products-frontend.js 18.6 kB
build/all-products.js 33.9 kB
build/all-reviews.js 8.03 kB
build/atomic-block-components/add-to-cart--atomic-block-components/button--atomic-block-components/catego--90468e1a.js 223 B
build/atomic-block-components/add-to-cart--atomic-block-components/button--atomic-block-components/image---a7e2bb9b.js 2.65 kB
build/atomic-block-components/add-to-cart-frontend.js 7.01 kB
build/atomic-block-components/add-to-cart.js 7.49 kB
build/atomic-block-components/button--atomic-block-components/category-list--atomic-block-components/imag--f11cdc7a.js 498 B
build/atomic-block-components/button-frontend.js 2.08 kB
build/atomic-block-components/button.js 2.3 kB
build/atomic-block-components/category-list-frontend.js 920 B
build/atomic-block-components/category-list.js 501 B
build/atomic-block-components/image-frontend.js 1.86 kB
build/atomic-block-components/image.js 1.09 kB
build/atomic-block-components/price-frontend.js 1.93 kB
build/atomic-block-components/price.js 1.51 kB
build/atomic-block-components/rating-frontend.js 1.13 kB
build/atomic-block-components/rating.js 718 B
build/atomic-block-components/sale-badge-frontend.js 1.09 kB
build/atomic-block-components/sale-badge.js 683 B
build/atomic-block-components/sku-frontend.js 385 B
build/atomic-block-components/sku.js 386 B
build/atomic-block-components/stock-indicator-frontend.js 1.03 kB
build/atomic-block-components/stock-indicator.js 624 B
build/atomic-block-components/summary-frontend.js 1.34 kB
build/atomic-block-components/summary.js 923 B
build/atomic-block-components/tag-list-frontend.js 921 B
build/atomic-block-components/tag-list.js 499 B
build/atomic-block-components/title-frontend.js 1.31 kB
build/atomic-block-components/title.js 932 B
build/attribute-filter-frontend.js 16.8 kB
build/attribute-filter.js 13 kB
build/blocks-checkout.js 17.2 kB
build/cart-blocks/accepted-payment-methods-frontend.js 1.14 kB
build/cart-blocks/checkout-button-frontend.js 1.15 kB
build/cart-blocks/empty-cart-frontend.js 347 B
build/cart-blocks/express-payment-frontend.js 5.18 kB
build/cart-blocks/filled-cart-frontend.js 767 B
build/cart-blocks/items-frontend.js 299 B
build/cart-blocks/line-items-frontend.js 5.5 kB
build/cart-blocks/order-summary-frontend.js 8.88 kB
build/cart-blocks/totals-frontend.js 320 B
build/cart-frontend.js 45.2 kB
build/cart.js 43.5 kB
build/checkout-blocks/actions-frontend.js 1.41 kB
build/checkout-blocks/billing-address--checkout-blocks/shipping-address-frontend.js 4.13 kB
build/checkout-blocks/billing-address-frontend.js 891 B
build/checkout-blocks/contact-information-frontend.js 2.85 kB
build/checkout-blocks/express-payment-frontend.js 5.48 kB
build/checkout-blocks/fields-frontend.js 344 B
build/checkout-blocks/order-note-frontend.js 1.13 kB
build/checkout-blocks/order-summary-frontend.js 11.3 kB
build/checkout-blocks/payment-frontend.js 7.77 kB
build/checkout-blocks/shipping-address-frontend.js 997 B
build/checkout-blocks/shipping-methods-frontend.js 4.73 kB
build/checkout-blocks/terms-frontend.js 1.22 kB
build/checkout-blocks/totals-frontend.js 323 B
build/checkout-frontend.js 47.4 kB
build/checkout.js 44.7 kB
build/featured-category.js 8.62 kB
build/featured-product.js 9.73 kB
build/handpicked-products.js 7.1 kB
build/legacy-template.js 2.18 kB
build/mini-cart-component-frontend.js 16 kB
build/mini-cart-contents-block/empty-cart-frontend.js 363 B
build/mini-cart-contents-block/filled-cart-frontend.js 222 B
build/mini-cart-contents-block/footer--mini-cart-contents-block/products-table-frontend.js 5.33 kB
build/mini-cart-contents-block/footer-frontend.js 6.27 kB
build/mini-cart-contents-block/items-frontend.js 206 B
build/mini-cart-contents-block/products-table-frontend.js 5.33 kB
build/mini-cart-contents-block/shopping-button-frontend.js 260 B
build/mini-cart-contents-block/title-frontend.js 348 B
build/mini-cart-contents.js 24.2 kB
build/mini-cart-frontend.js 1.71 kB
build/mini-cart.js 6.39 kB
build/price-filter-frontend.js 12.5 kB
build/price-filter.js 8.47 kB
build/price-format.js 1.19 kB
build/product-best-sellers.js 7.37 kB
build/product-categories.js 3.17 kB
build/product-category.js 8.49 kB
build/product-new.js 7.67 kB
build/product-on-sale.js 7.99 kB
build/product-search.js 2.19 kB
build/product-tag.js 7.81 kB
build/product-top-rated.js 7.9 kB
build/products-by-attribute.js 8.38 kB
build/reviews-by-category.js 11.4 kB
build/reviews-by-product.js 12.6 kB
build/reviews-frontend.js 7.34 kB
build/single-product-frontend.js 22 kB
build/single-product.js 10 kB
build/stock-filter-frontend.js 6.5 kB
build/stock-filter.js 6.56 kB
build/vendors--atomic-block-components/add-to-cart--cart-blocks/order-summary--checkout-blocks/billing-ad--c5eb4dcd-frontend.js 19 kB
build/vendors--atomic-block-components/add-to-cart-frontend.js 7.51 kB
build/vendors--atomic-block-components/price--cart-blocks/line-items--cart-blocks/order-summary--checkout--194c50bf-frontend.js 5.26 kB
build/vendors--cart-blocks/line-items--checkout-blocks/order-summary--mini-cart-contents-block/products-table-frontend.js 3.14 kB
build/vendors--cart-blocks/order-summary--checkout-blocks/billing-address--checkout-blocks/order-summary---eb4d2cec-frontend.js 4.74 kB
build/vendors--mini-cart-contents-block/footer--mini-cart-contents-block/products-table-frontend.js 7.72 kB
build/wc-blocks-data.js 9.78 kB
build/wc-blocks-editor-style-rtl.css 4.84 kB
build/wc-blocks-editor-style.css 4.84 kB
build/wc-blocks-google-analytics.js 1.56 kB
build/wc-blocks-middleware.js 953 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.2 kB
build/wc-blocks-style.css 22.2 kB
build/wc-blocks-vendors-style-rtl.css 1.28 kB
build/wc-blocks-vendors-style.css 1.28 kB
build/wc-blocks-vendors.js 69.4 kB
build/wc-blocks.js 2.62 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

@Aljullu Aljullu requested review from a team and tarunvijwani and removed request for a team March 9, 2022 09:27
@Aljullu Aljullu added the block: cart Issues related to the cart block. label Mar 9, 2022
@tarunvijwani tarunvijwani requested a review from mikejolley March 9, 2022 17:40
@mikejolley mikejolley added this to the 7.2.0 milestone Mar 10, 2022
@mikejolley mikejolley added the type: bug The issue/PR concerns a confirmed bug. label Mar 10, 2022
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. type: bug The issue/PR concerns a confirmed bug.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants