* Add requireExactMatch prop to ComboBox & only run onChange if value matches
* Set requireExactMatch to true for Country and State inputs
* Add unit tests for ComboBox
* Update expected value for onChange call
* Re-add autocomplete option to country input
* Use correct case for autoComplete in country input
* Add `Fixed` and `Repeated` background controls to `Featured Product`
* Add `Repeated background` feature when the toggle is activated
* Extract `get_image_url` function
* Add the styles for rendering the repeated image on the frontend
* Add `hasParallax` and `isRepeated` to the `block.json` file
* Adjust styles
* Remove unused function, improve phpdoc
* Use alt and product name
Fix error rebasing master
* Hide alt if isRepeat is true
When isRepeated is true, the image is a background so it does not
make sense to have an alt attribute.
* Add `Fixed image` behaviour
* Remove unnecessary single quotes
* Remove duplicated const due to rebasing
* Fix focal point getting lost after enabling Fixed bg
* Fix duotone for fixed and repeated images
* Fix duotone for fixed and repeated images on the front end
* Don't allow alt if the image is a bg not an img element
* wip
* set editor using env var instead
* fix attribute missing issue when watching the test
* wip php templates test
* Add E2E tests for the Filter Products By Price Block woocommerce/woocommerce-blocks#6363
add E2E tests for the Filter Products By Price Block
* Add E2E tests for the Filter Products By Price Block woocommerce/woocommerce-blocks#6363
add E2E tests for the Filter Products By Price Block
* create clickLink util
* Add E2E tests for the Active Filters Block woocommerce/woocommerce-blocks#6377
add E2E tests for the Active Filters Block
* Add E2E tests for the Filter Products By Attribute Block woocommerce/woocommerce-blocks#6322
add E2E tests for the Filter Products By Attribute Block
* Add E2E tests for the Filter Products By Stock Block woocommerce/woocommerce-blocks#6323
add E2E tests for the Filter Products By Stock Block
* improve checks
* improve checks
* improve checks
* remove globals.d.ts file
* replace waitForTimeout
* create clickLint utils
Co-authored-by: Tung Du <dinhtungdu@gmail.com>
* Start using the `block.json` metadata file for `Handpicked products`
* Add the `properties` attribute to properly parse booleans
* Remove comment
* Add schema, delete version
* Add E2E tests for the Filter Products By Price Block woocommerce/woocommerce-blocks#6363
add E2E tests for the Filter Products By Price Block
* Add E2E tests for the Filter Products By Attribute Block woocommerce/woocommerce-blocks#6322
add E2E tests for the Filter Products By Attribute Block
* Add E2E tests for the Filter Products By Stock Block woocommerce/woocommerce-blocks#6323
add E2E tests for the Filter Products By Stock Block
* improve checks
* improve checks
* remove globals.d.ts file
* replace waitForTimeout
* Add E2E tests for the Filter Products By Attribute Block woocommerce/woocommerce-blocks#6322
add E2E tests for the Filter Products By Attribute Block
* Add E2E tests for the Filter Products By Stock Block woocommerce/woocommerce-blocks#6323
add E2E tests for the Filter Products By Stock Block
* improve checks
* improve checks
* remove globals.d.ts file
* Add E2E tests for the Filter Products By Attribute Block woocommerce/woocommerce-blocks#6322
add E2E tests for the Filter Products By Attribute Block
* improve checks
* Empty commit for release pull request
* Bump version numbers and add changelog
* Add testing notes
* Add correct list of blocks to 6302 notes
* Bumping version strings to new version.
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Thomas Roberts <thomas.roberts@automattic.com>
Co-authored-by: Thomas Roberts <5656702+opr@users.noreply.github.com>
* Parse categories coming from the back-end as a json array
The category ids that come from php are in json array format (e.g. '[40,41]'),
so it's necessary to parse them and convert them into a js array before
processing them. Otherwise the api request will fail.
* Only parse category ids if not undefined
This PR adds image editing controls to the Featured Product block. In particular, user can now:
* Rotate the image
* Crop the image
* Change the aspect ratio of the image
* Zoom the image
Each edit gets saved in the database as a new image.
* Try to fix account.test.js
* Remove language installations for woo core and wp core and take screenshots
* Upload screenshots to artifacts
* npm install instead of npm ci
* Upload artifacts not matter what
* fsdf
* fsdfsf
* remove screenshoting from account.test.js and only run checkout-terms.test.js
* Print NODE_ENV
* Better handling of overriding wp-env.json
* Run all tests
* Re-enable translations for WP and Woo
* Wait for Cart & Checkout blocks to load before moving on
* Uncomment github actions
* Try to fix shipping test
* fill checkout before placing order, duuuh
* Wait until networkidel0 instead of domcontentloaded for page navigations
* Fix account.test.js
* change visitBlockPage() to use Promise.all()
* Remove screenshot taking
* I think Promise.all() is being funny and not throwing properly, testing
* wait for checkbox to be visible before clicking
* Remove try catch around Promise.all()
* Fix linting issues
* Remove screenshot dir
* Raluca feedback:
* Timeout back to 30000
* Login to merhcant before changing settings
* merchant.logout()
* Updates to release checklist to clarify testers, blockers, etc.
* Specify that commits related to failing PRs need to be reverted
* Update PR & Release templates
Release template
- the Write testing notes has been moved to the PR template, and removed from the release checklist
- mention that common functionality should be tested by both porters
- update the instructions on how to create the WC PR's changelog
Pull request template
- better visibility for the feature flag/experimental changes
- add before/after table for screenshots
- add WooCommerce Visibility to help with the changelog of the WC PR
- add an extra check to not include a PR in The testing notes
* Remove duplication on pinging porters for testing
* Clarify PR author is the responsible to fix failing PRs
* Update .github/patch-initial-checklist.md
Co-authored-by: Raluca Stan <ralucastn@gmail.com>
* Update .github/release-initial-checklist.md
Co-authored-by: Raluca Stan <ralucastn@gmail.com>
* Include information about testing the Store API
* Add information about logging issues that appear during testing
* Fix punctuation
* Remove Manual Testing section from PR template
* Close milestones when creating the release branch
* Add create a milestone for the next version step
Co-authored-by: Raluca Stan <ralucastn@gmail.com>
* Start using the `block.json` metadata file for the `Featured Category` block
* Get default attributes from the `block.json` file
* Remove unnecessary `get_block_metadata_defaults` function
* Add alt attribute to the block.json file
* Remove unused imports
* Start using the `block.json` metadata file for the `Feature Product` block
* Get default attributes from the block.json file
* Add removed comment
* Remove unnecessary `get_block_metadata_defaults` function
* Add alt default to block.json
* Add new `alt` attribute to Media Settings
Allow to define an alt text for the Feature Product block
* Simplify on change
* Improve alt description and use name instead of short description
Short description can contain html and images, so it's not adequate to use on the alt attribute
* Transform object for woocommerce_price_filter legacy widget to be replaced with block alternative
* Filter products by price transform
* Price Filter formatting
* Set set_filterable_product_data data on the widgets screen
* Prevent rendering the Price Filter block if there are no products to filter
* Prevent Classic Price Filter Widget from being available as a widget
* Transform layered nav classic widget to attribute filter block
* Allow Filter Products by Stock block to be added as a widget
* Allow Active Filters widget to be transformed to Active Filters block
* Set showFilterButton to true and showInputFields to false in the transform of Price Filter to minic widgets more
* Change displayStyle property to be display_type instead of incorrectly using title
* mock @woocommerce/settings for has_filterable_products setting
* try: add All Products block to render that filter on the front end
* Revert "try: add All Products block to render that filter on the front end"
This reverts commit 5ad09e964b77e5c6499b4134cf58d7a6c226424d.
* try: add all product block to bypass has_filterable_products check
* fix: backend e2e test for attribute filter
Co-authored-by: Tung Du <dinhtungdu@gmail.com>
* Add test to check if T&C and Privacy links are visible
* Fix filling wrong type of form error
With a virtual product we shouldn't need to fill the shipping details
We need to fill the billing instead
* Fix undefined 'termsCheckbox' bug
* Fix terms checkbox name
* Activate test case
* Replace static URL with dynamic one
* Convert external plugin into mock
* Fix JS linting issue
Co-authored-by: Saad Tarhi <saad.trh@gmail.com>
* make active filters block work with PHP templates
* use getSettingWithCoercion
* redirect to the base url when clicking Clear All link
* fix: eslint error and warning
* Move redirect logic to its own callback
* Update comment for updateAttributeFilter
* Remove condition for updating state for active filters only when filter button is not available
* Replace onSubmit with updateAttributeFilter
* Update logic lost in merge
* Replace checked stateful data with activeFilters data from URL
* Remove catalog_visibility from filteredCounts useCollectionData query for PHP templates
* Set the min and max price from the URL to make the active filters work with PHP templates
* Extract price formatting into a separate function
* Rename the `hasSetPriceDefault` variable and improve comments
Co-authored-by: Tomasz Tunik <tomasztunik@gmail.com>
* Enable Attribute Filter block to work with the PHP rendered Classic Template block
* Check for presence of option before rendering it
* improve filter product by attribute
* fix pagination problem
* fix check when two filter block with same attribute are used
* fix filter by stock for PHP templates
* fix naming and comment
* Update filter key in ClassicTemplate
* Update stock filter block for PHP templates when the filter button is enabled
* Remove unused useEffect and fix ESLint error
* Set active stock filter and track using local state
* ESLint fix
* Remove unncessary dependencies from useEffect
Co-authored-by: tjcafferkey <tjcafferkey@gmail.com>
* Enable more options for the Featured Category block
* Fix the focal point picker
* Fix the resizeable handle
* Fix the overlay and move to own section
* Enable gradient and duotone
* Add padding and fix min height
* Export ConstrainedResizeable from Featured Product
* Wrap duotone in feature plugin flag
* Add support for `border-radius`
* Change prop order
* Add SSR for new options on Featured Category block
* Optional chaining on border radius
Co-authored-by: Tom Cafferkey <tjcafferkey@gmail.com>
* Add default to overlay and height
* Optional chaining on border radius for Featured Product block
* Fix gradient persistence and default overlay discrepacies
* Explicitly add box-sizing to the featured-product/category wrapper
Co-authored-by: Tom Cafferkey <tjcafferkey@gmail.com>
If the Featured Product block was added but not modified at all,
the block would not match the editor on the front end.
This was due to the fact that, on the frontend, the
block is SSR and was missing some defaults which
were present in JS.
* Cart & Checkout translations test use the already installed language nl_NL
* Extra timeout when checking for shipping and billing addresses
* wait for selector instead of increase timeout
* Change waitForSelector selector:
* Clean up
* Increase idleTime for waitForNetworkRequest
* Fix random timeouts and increase timeout of verifying shipping option
* feedack
* Add has_filterable_products data to the AllProducts block to be used by product filter blocks
* Add has_filterable_products data to the ClassicTemplate block to be used by product filter blocks
* Add ClassicTemplatesCompatibility class which will add necessary data to the front-end of core PHP templates of Classic Themes for filter blocks being used as widgets.
* Update comment of set_php_template_data method on ClassicTemplatesCompatibility class
* Move conditional checking if the current theme is a block theme in ClassicTemplatesCompatibility class
* Add correct context to checkout and cart errors from API
* Correct typo in add-to-cart context
* Add correct context in add to cart form
* Add correct context in add to cart form
* Add correct context in Checkout State
* Enable Attribute Filter block to work with the PHP rendered Classic Template block
* Check for presence of option before rendering it
* improve filter product by attribute
* fix pagination problem
* fix check when two filter block with same attribute are used
Co-authored-by: Luigi <gigitux@gmail.com>
* Empty commit for release pull request
* Add Changelog to readme.txt
* Update WC tested and required versions
* Add testing notes
* Register missing C&C inner blocks and update fallback template for older C& C versions (https://github.com/woocommerce/woocommerce-blocks/pull/6195)
* Register missing C & C inner blocks and update fallback template for older C & C versions
This will fix the issues with missing order summary inner blocks: Coupons (both in C & C blocks) and the Cart header. The issue was happening because, for example, for Cart the coupons were registred on the on frontend, but it just wasn't forced in the attributes. Because it also wasn't added to the PHP fallback layout, the render function didn't include it. For the Checkout block the coupons inner block wasn't registered at all.
* Revert changes to Checkout.php, we don't need to test for inner blocks
* Revert "Revert changes to Checkout.php, we don't need to test for inner blocks"
This reverts commit fc39535f8476d02e35353374d9434a8723458cfa.
* Fix the returned template for older Checkout block iterations
* Fix Cart and Checkout templates to accommodate the Summary order inner blocks
* Hide coupon form div from inner blocks if coubons are not enabled
* Fix checkout coupon tests in checkout
They have been written for logged in user
* Fix Order Summary Heading inner block's default text
* Update comments with better wording
* Revert "Hide coupon form div from inner blocks if coubons are not enabled"
This reverts commit ab09021b923fad4218b3016e47760ad07f6bc960.
(cherry picked from commit 0b18ff59bd)
* Update the zip file link
* Update testing instructions
* Remove experimental build related PR from testing notes
* Fix/order summary sidebar css (https://github.com/woocommerce/woocommerce-blocks/pull/6231)
* Add box sizing to Totals item
* Add some unit tests for Order summary blocks
* Fix Proceed to checkout button size
(cherry picked from commit d22ce7cd0b)
* Update the WC required/tested versions
* Mini Cart Contents: Use block pattern to make the empty cart message translatable (https://github.com/woocommerce/woocommerce-blocks/pull/6248)
* try: use block pattern to make empty cart message translatable
* Update src/BlockTypes/MiniCart.php
Co-authored-by: Albert Juhé Lluveras <contact@albertjuhe.com>
* rename function
Co-authored-by: Albert Juhé Lluveras <contact@albertjuhe.com>
Co-authored-by: Luigi <gigitux@gmail.com>
(cherry picked from commit 93ad72f6ff)
* Update the release's ZIP file
* Update testing notes
In woocommerce/woocommerce-blocks#6065, for Cart only Order Summary Heading & Coupon form can
be removed, and for Checkout only the Coupon form.
* Update the testing notes
Remove woocommerce/woocommerce-blocks#5870 testing notes because they can't be tested as a user
* Update Testing notes
Add screenshots to the woocommerce/woocommerce-blocks#5967 testing notes
* Remove woocommerce/woocommerce-blocks#6166 testing instructions
We reverted this PR
* Revert (https://github.com/woocommerce/woocommerce-blocks/pull/6166) (https://github.com/woocommerce/woocommerce-blocks/pull/6253)
Revert "Prevent Featured Product block from breaking when product is out of stock + hidden
from catalog (https://github.com/woocommerce/woocommerce-blocks/pull/6166)"
This reverts commit 92387e2
(cherry picked from commit c586b1a5f3)
* Bumping version strings to new version.
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: Saad Tarhi <saad.trh@gmail.com>
Co-authored-by: Raluca Stan <ralucastn@gmail.com>
Co-authored-by: Luigi Teschio <gigitux@gmail.com>
Co-authored-by: Tung Du <dinhtungdu@gmail.com>
* try: use block pattern to make empty cart message translatable
* Update src/BlockTypes/MiniCart.php
Co-authored-by: Albert Juhé Lluveras <contact@albertjuhe.com>
* rename function
Co-authored-by: Albert Juhé Lluveras <contact@albertjuhe.com>
Co-authored-by: Luigi <gigitux@gmail.com>
* Add support for overlay color and duotone
* Add support for custom inner padding
* Wrap all block experimental features in `isFeaturePluginBuild`
* Fix resizable container min height
The container now resizes if, e.g., padding is increased, and can't be resized down
with the handle to a height lower than it's minimum size determined by content and
padding box.
* Fix resizable handle not being fully visible
Previously, `overflow: hidden` was needed because the height constraint and
padding could push the content out of the container. Now this should not be
possible.
* Add an option to the block to decide how is the image fitted to the container
* Register missing C & C inner blocks and update fallback template for older C & C versions
This will fix the issues with missing order summary inner blocks: Coupons (both in C & C blocks) and the Cart header. The issue was happening because, for example, for Cart the coupons were registred on the on frontend, but it just wasn't forced in the attributes. Because it also wasn't added to the PHP fallback layout, the render function didn't include it. For the Checkout block the coupons inner block wasn't registered at all.
* Revert changes to Checkout.php, we don't need to test for inner blocks
* Revert "Revert changes to Checkout.php, we don't need to test for inner blocks"
This reverts commit fc39535f8476d02e35353374d9434a8723458cfa.
* Fix the returned template for older Checkout block iterations
* Fix Cart and Checkout templates to accommodate the Summary order inner blocks
* Hide coupon form div from inner blocks if coubons are not enabled
* Fix checkout coupon tests in checkout
They have been written for logged in user
* Fix Order Summary Heading inner block's default text
* Update comments with better wording
* Revert "Hide coupon form div from inner blocks if coubons are not enabled"
This reverts commit ab09021b923fad4218b3016e47760ad07f6bc960.
* Remove the ToggleButtonControl in favor of ToggleGroupControl
* Remove ESLint errors. Use experimental feature as this is low risk
* Fix the 'Expected preceding comment block' ESLint error
Co-authored-by: Luigi Teschio <gigitux@gmail.com>
* rename some things
* Refactor e2e tests
* remove only from checkout test
* Typo in test
* Add --testPathIgnorePatterns performance back into package.json
* Niels feedback and fix a test
* Update import from utils
* Increase timeout of translations test to 30000
* Wait for network idle in goToCart and goToCheckout
* Increase timeout to 30000
* fix E2E tests
* try fix
* test
* test
* test
* another test
* fix test
* 60s timeout
* test
* Update product constants
* Simplify orderSummary check
* Go back to page.$
Co-authored-by: Luigi <gigitux@gmail.com>
* Make useStoreNotices interact directly with the store
* Get/set error notices directly in store in paymentMethodDataContext
* Add hasNoticesOfType util
* Remove useStoreNotices and interact directly with data store
* Create/remove notices directly in store
* Remove tests for useStoreNotices
* Add tests for notices util
* Use setIsSuppressed from useStoreNoticesContext
* remove useStoreNotices hook
* Update context typedef to define only isSuppressed and setIsSuppressed
* Remove all values from StoreNoticesContext besides setIsSuppressed
* Wrap Cart and Checkout blocks in StoreNoticesProvider (for isSuppressed)
* Make StoreNoticesContainer a named export
This is required so we can import it from @wooommerce/base-context
* Change addErrorNotice to createErrorNotice to match store action
* Remove unnecessary StoreNoticeProviders and pass only context to container
* Accept a context in StoreNoticesContainer
* Pass relevant context to StoreNoticesContainer
* Add function to remove notices by status
* Prevent checkout from breaking when removing notices during processing
* Prevent TS error about not included path
* Add StoreNoticesContainer to single product block
* Add StoreNoticesContainer to All Products Block
* Ensure errors are shown when using All Products & Single Product Blocks
* Add a context arg to removeNoticesByStatus
* Use correct contexts for all products and single product block
* Update tests to reflect new context argument
* Re-add missing block file for order-summary
* Remove block file for order-summary
* Send context to useStoreCartCoupons to show errors correctly
* Check for performance file existence before running
* check reports/performance-report.json file exists on setup
Co-authored-by: Alex Florisca <alex.florisca@automattic.com>
* Add performance script to measure load times of cart and checkout blocks
* Temp commit
* Temp commit
* Temp commit
* Remove specific test from performance e2e command
* Add performance reporter
* Add step to clean performance file before running tests
* Add test report constant & average and logPerformanceResult test utils
* Update uses of product name constant
* Add cart coupon performance test
* Check if report file is empty before parsing
* Limit performance tests to only ones in performance directory
* Round the averages and add a linebreak after each entry in the log
* Fix formatting of report and only output after all tests
* Log each loading metric as an individual data point
* Improve formatting
* Get load times in ms from profiler
* Revert changes to fixtures
* Remove trace.json from git
* Remove checkout test file (tests not implemented)
* Check performance log file exists before truncating it
* Fix checkout coupon test
* Remove console logs
* Revert to use virtual products after rename of constant
* Ignore performance tests when running regular e2e tests
* Feedback changes
* Tidy up
* Fix packag-log.json:
Co-authored-by: Alex Florisca <alex.florisca@automattic.com>
* Rename `Product Title` `Content` panel to `Link settings`
* Rename toggle `Link to Product Page` to `Make title a link`
* Remove help text
* Add `rel` and `linkTarget` to the `Product Title` settings
* Add `rel` and `linkTarget` to the `Product Title` block
* Only add the `target` attribute if the title is rendered as a link
* Keep the `nofollow` in rel as it was before
* Make `linkTarget` and `rel` optional
To not change the html generated for other components also using `ProductName`
* Add tests fotr the `Title` component
* Improve rel condition
* Extract `linkRel` variable
* Remove unnecessary undefined
* Remove the default value for `linkTarget`
Since it is the default behavior of the browsers, we don't need it.
* Remove the `nofollow` rel value
It was decided to remove it since it's a link to internal pages.
See the PR discussion for more context.
* Remove the `rel` option
It does not have much sense to have it since it's always an internal link.
See the PR discussion for more context.
* Clean-up `rel` related code
* Add "single-use" coupon to the fixture data
* Create a first draft of the coupon e2e test
* Create single use coupon code constant
* Create "applyCouponFromCheckout" function
* Remove the "single-use" coupon from the fixture data
* Setup coupon creation using Woo's Rest API
* Add single-use coupon E2E test
* Move discount XPath definition to the expressions file
* Clean comments
* Remove unnecessary delay function
* Refactor to a more human friendly check
* Clear the setup in the afterAll branch (delete coupon)
Co-authored-by: Saad Tarhi <saad.tarhi@automattic.com>
* Sub/Total/Fee inner blocks
* Row blocks within the inner block
* Update icons
* Resolve stying issues
* Remove old block
* Pin totals row
* Locking logic update
* Heading inner block
* Refactor where inner blocks are defined
* Add todos
* Todo for Consider deprecating OrderMetaSlotFill and DiscountSlotFill in favour of inner block areas.
* Improve frontend registration of components using new entrypoint
* Experiment- external block context
* Revert "Experiment- external block context"
This reverts commit 4b75668ec7eb62f065c6a488cd942a666e26204f.
* Duplicate inner blocks to avoid conflicts with context
* Remove todo
* Rename block dir
* Some test fixes
* Fix import
* fix import
* linting
* Remove unused attributes
* Optional classname
* fix coupons import
* fix shipping mocks
* Styling
* Fix selectors in e2e tests
* Add back the wc-block-components-totals-wrapper class that was used for each segment in the totals Order summary
Because, removing them was:
- a breaking change for the old structure
- was making it harder to target the inner blocks. Before the class was used to target each segment
- it was making the wc-block-components-totals-item behave as a child or parent depending on the inner block, inconsitency
* Reuse the TotalsWrapper component for C& C blocks inner blocks
This component was removed in this PR, but we wrap components in the Cart and Checkout sidebar in a TotalsWrapper. This will ensure consistent spacing and borders are applied to items in the sidebar.
Co-authored-by: Nadir Seghir <nadir.seghir@gmail.com>
Co-authored-by: Raluca Stan <ralucastn@gmail.com>
* Add tests for the Mini Cart Block when it is added on the FSE editor woocommerce/woocommerce-blocks#5727
Add tests for the Mini Cart Block when it is added on the FSE editor
* not hardcoding selectors
* fix typo
* restore old searchForBlock function
* add export
* Revert "restore old searchForBlock function"
This reverts commit 7049ad85bc2752ad33933eec00da9682943ec35a.
* use searchForBlock from package only for FSE pages
* add fix for GB
* Cleanup e2e jest config from moduleFileExtensions
moduleFileExtensions by default support js, ts, tsx etc.
* convert legacy-template-blocks e2e test to TS
* clean up jest.config.json moduleFileExtensions
unnecessary defaults override
* Prevent accessing the first element of the `parentProduct` array if empty
* Include all products regardless of their `stock_status`
By default, the `/wc/store/v1/products` endpoint does not return products with
`outofstock` stock status. We want the users to be able to select any product
regardless of its stock status, we need to explicitly request them using the
`stock_status` query param.
* Use the optional chaining operator
Co-authored-by: Tomasz Tunik <tomasztunik@gmail.com>
* Shopper can have different shipping and billing addresses
* Shopper can have different shipping and billing addresses
* Shopper can have different shipping and billing addresses
* Correct billing field IDs
* Remove unused variable
* Remove unused timeout
* Remove unused commands
* Activate company field using setCheckbox
* Deactivate company field using unsetCheckbox
* Remove obsolete command
* Empty cart before and after each test
* Remove obsolete import
* Check billing and shipping company
* Remove manual code with unsetCheckbox
* Fill company if field exist
* Get checkbox ID from label
* Remove duplicate company field toFill method
Co-authored-by: Saad Tarhi <saad.trh@gmail.com>
Co-authored-by: Saad Tarhi <saad.tarhi@automattic.com>