@salesforce/retail-react-app 1.0.0-preview.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. package/.eslintignore +7 -0
  2. package/.eslintrc.js +25 -0
  3. package/.prettierignore +4 -0
  4. package/.prettierrc.yaml +7 -0
  5. package/CHANGELOG.md +173 -0
  6. package/LICENSE +14 -0
  7. package/README.md +48 -0
  8. package/app/assets/svg/account.svg +3 -0
  9. package/app/assets/svg/alert.svg +3 -0
  10. package/app/assets/svg/basket.svg +3 -0
  11. package/app/assets/svg/brand-logo.svg +10 -0
  12. package/app/assets/svg/cc-amex.svg +7 -0
  13. package/app/assets/svg/cc-cvv.svg +8 -0
  14. package/app/assets/svg/cc-discover.svg +14 -0
  15. package/app/assets/svg/cc-mastercard.svg +8 -0
  16. package/app/assets/svg/cc-visa.svg +11 -0
  17. package/app/assets/svg/check-circle.svg +3 -0
  18. package/app/assets/svg/check.svg +3 -0
  19. package/app/assets/svg/chevron-down.svg +3 -0
  20. package/app/assets/svg/chevron-left.svg +3 -0
  21. package/app/assets/svg/chevron-right.svg +3 -0
  22. package/app/assets/svg/chevron-up.svg +3 -0
  23. package/app/assets/svg/close.svg +3 -0
  24. package/app/assets/svg/dashboard.svg +4 -0
  25. package/app/assets/svg/figma-logo.svg +14 -0
  26. package/app/assets/svg/file.svg +3 -0
  27. package/app/assets/svg/filter.svg +3 -0
  28. package/app/assets/svg/flag-ca.svg +5 -0
  29. package/app/assets/svg/flag-cn.svg +19 -0
  30. package/app/assets/svg/flag-fr.svg +19 -0
  31. package/app/assets/svg/flag-gb.svg +16 -0
  32. package/app/assets/svg/flag-it.svg +29 -0
  33. package/app/assets/svg/flag-jp.svg +10 -0
  34. package/app/assets/svg/flag-us.svg +7 -0
  35. package/app/assets/svg/github-logo.svg +40 -0
  36. package/app/assets/svg/hamburger.svg +8 -0
  37. package/app/assets/svg/heart-solid.svg +7 -0
  38. package/app/assets/svg/heart.svg +3 -0
  39. package/app/assets/svg/info.svg +3 -0
  40. package/app/assets/svg/like.svg +4 -0
  41. package/app/assets/svg/location.svg +3 -0
  42. package/app/assets/svg/lock.svg +3 -0
  43. package/app/assets/svg/paypal.svg +19 -0
  44. package/app/assets/svg/plug.svg +3 -0
  45. package/app/assets/svg/plus.svg +3 -0
  46. package/app/assets/svg/receipt.svg +3 -0
  47. package/app/assets/svg/search.svg +8 -0
  48. package/app/assets/svg/signout.svg +3 -0
  49. package/app/assets/svg/social-facebook.svg +3 -0
  50. package/app/assets/svg/social-instagram.svg +3 -0
  51. package/app/assets/svg/social-pinterest.svg +4 -0
  52. package/app/assets/svg/social-twitter.svg +3 -0
  53. package/app/assets/svg/social-youtube.svg +3 -0
  54. package/app/assets/svg/user.svg +3 -0
  55. package/app/assets/svg/visibility-off.svg +5 -0
  56. package/app/assets/svg/visibility.svg +3 -0
  57. package/app/components/_app/index.jsx +401 -0
  58. package/app/components/_app/index.test.js +85 -0
  59. package/app/components/_app/partials/above-header.jsx +10 -0
  60. package/app/components/_app-config/index.jsx +125 -0
  61. package/app/components/_app-config/index.test.js +77 -0
  62. package/app/components/_error/index.jsx +142 -0
  63. package/app/components/_error/index.test.js +25 -0
  64. package/app/components/action-card/index.jsx +75 -0
  65. package/app/components/address-display/index.jsx +30 -0
  66. package/app/components/basic-tile/index.jsx +65 -0
  67. package/app/components/basic-tile/index.test.js +23 -0
  68. package/app/components/breadcrumb/index.jsx +67 -0
  69. package/app/components/breadcrumb/index.test.js +30 -0
  70. package/app/components/confirmation-modal/index.jsx +111 -0
  71. package/app/components/confirmation-modal/index.test.js +98 -0
  72. package/app/components/drawer-menu/index.jsx +405 -0
  73. package/app/components/drawer-menu/index.test.js +33 -0
  74. package/app/components/dynamic-image/index.jsx +56 -0
  75. package/app/components/field/index.jsx +161 -0
  76. package/app/components/footer/index.jsx +269 -0
  77. package/app/components/footer/index.test.js +22 -0
  78. package/app/components/forms/address-fields.jsx +49 -0
  79. package/app/components/forms/credit-card-fields.jsx +149 -0
  80. package/app/components/forms/form-action-buttons.jsx +55 -0
  81. package/app/components/forms/login-fields.jsx +31 -0
  82. package/app/components/forms/password-requirements.jsx +99 -0
  83. package/app/components/forms/post-checkout-registration-fields.jsx +43 -0
  84. package/app/components/forms/profile-fields.jsx +36 -0
  85. package/app/components/forms/promo-code-fields.jsx +43 -0
  86. package/app/components/forms/registration-fields.jsx +42 -0
  87. package/app/components/forms/reset-password-fields.jsx +31 -0
  88. package/app/components/forms/state-province-options.jsx +75 -0
  89. package/app/components/forms/update-password-fields.jsx +49 -0
  90. package/app/components/forms/useAddressFields.jsx +196 -0
  91. package/app/components/forms/useCreditCardFields.jsx +146 -0
  92. package/app/components/forms/useLoginFields.jsx +52 -0
  93. package/app/components/forms/useProfileFields.jsx +95 -0
  94. package/app/components/forms/usePromoCodeFields.jsx +39 -0
  95. package/app/components/forms/useRegistrationFields.jsx +136 -0
  96. package/app/components/forms/useResetPasswordFields.jsx +40 -0
  97. package/app/components/forms/useUpdatePasswordFields.jsx +89 -0
  98. package/app/components/header/index.jsx +290 -0
  99. package/app/components/header/index.test.js +217 -0
  100. package/app/components/hero/index.jsx +84 -0
  101. package/app/components/hero/index.test.js +40 -0
  102. package/app/components/icons/index.jsx +158 -0
  103. package/app/components/icons/index.test.js +20 -0
  104. package/app/components/image-gallery/index.jsx +176 -0
  105. package/app/components/image-gallery/index.test.js +485 -0
  106. package/app/components/item-variant/index.jsx +33 -0
  107. package/app/components/item-variant/item-attributes.jsx +107 -0
  108. package/app/components/item-variant/item-image.jsx +73 -0
  109. package/app/components/item-variant/item-name.jsx +28 -0
  110. package/app/components/item-variant/item-price.jsx +117 -0
  111. package/app/components/link/index.jsx +32 -0
  112. package/app/components/link/index.test.js +72 -0
  113. package/app/components/links-list/index.jsx +89 -0
  114. package/app/components/links-list/index.test.js +62 -0
  115. package/app/components/list-menu/index.jsx +280 -0
  116. package/app/components/list-menu/index.test.js +44 -0
  117. package/app/components/loading-spinner/index.jsx +46 -0
  118. package/app/components/locale-selector/index.jsx +124 -0
  119. package/app/components/locale-selector/index.test.js +37 -0
  120. package/app/components/locale-text/index.jsx +97 -0
  121. package/app/components/locale-text/index.test.js +36 -0
  122. package/app/components/login/index.jsx +96 -0
  123. package/app/components/nested-accordion/index.jsx +185 -0
  124. package/app/components/nested-accordion/index.test.js +98 -0
  125. package/app/components/offline-banner/index.jsx +40 -0
  126. package/app/components/offline-banner/index.test.js +15 -0
  127. package/app/components/offline-boundary/index.jsx +104 -0
  128. package/app/components/offline-boundary/index.test.js +123 -0
  129. package/app/components/order-summary/index.jsx +331 -0
  130. package/app/components/page-action-placeholder/index.jsx +50 -0
  131. package/app/components/pagination/index.jsx +134 -0
  132. package/app/components/pagination/index.test.js +25 -0
  133. package/app/components/product-item/index.jsx +146 -0
  134. package/app/components/product-item/index.test.js +38 -0
  135. package/app/components/product-scroller/index.jsx +172 -0
  136. package/app/components/product-scroller/index.test.js +98 -0
  137. package/app/components/product-tile/index.jsx +195 -0
  138. package/app/components/product-tile/index.test.js +96 -0
  139. package/app/components/product-view/index.jsx +538 -0
  140. package/app/components/product-view/index.test.js +224 -0
  141. package/app/components/product-view-modal/index.jsx +48 -0
  142. package/app/components/product-view-modal/index.test.js +72 -0
  143. package/app/components/promo-code/index.jsx +162 -0
  144. package/app/components/promo-popover/index.jsx +83 -0
  145. package/app/components/quantity-picker/index.jsx +58 -0
  146. package/app/components/radio-card/index.jsx +75 -0
  147. package/app/components/recommended-products/index.jsx +227 -0
  148. package/app/components/register/index.jsx +114 -0
  149. package/app/components/reset-password/index.jsx +87 -0
  150. package/app/components/responsive/index.jsx +29 -0
  151. package/app/components/scroll-to-top/index.jsx +24 -0
  152. package/app/components/scroll-to-top/index.test.js +46 -0
  153. package/app/components/search/index.jsx +279 -0
  154. package/app/components/search/index.test.js +127 -0
  155. package/app/components/search/partials/recent-searches.jsx +76 -0
  156. package/app/components/search/partials/search-suggestions.jsx +45 -0
  157. package/app/components/search/partials/suggestions.jsx +43 -0
  158. package/app/components/section/index.jsx +68 -0
  159. package/app/components/seo/index.jsx +33 -0
  160. package/app/components/social-icons/index.jsx +101 -0
  161. package/app/components/social-icons/index.test.js +30 -0
  162. package/app/components/swatch-group/index.jsx +77 -0
  163. package/app/components/swatch-group/index.test.js +136 -0
  164. package/app/components/swatch-group/swatch.jsx +94 -0
  165. package/app/components/toggle-card/index.jsx +97 -0
  166. package/app/components/with-registration/index.jsx +58 -0
  167. package/app/components/with-registration/index.test.js +85 -0
  168. package/app/constants.js +109 -0
  169. package/app/contexts/index.js +92 -0
  170. package/app/hooks/einstein-mock-data.js +916 -0
  171. package/app/hooks/index.js +17 -0
  172. package/app/hooks/use-add-to-cart-modal.js +344 -0
  173. package/app/hooks/use-add-to-cart-modal.test.js +625 -0
  174. package/app/hooks/use-auth-modal.js +337 -0
  175. package/app/hooks/use-auth-modal.test.js +365 -0
  176. package/app/hooks/use-currency.js +20 -0
  177. package/app/hooks/use-currency.test.js +41 -0
  178. package/app/hooks/use-current-basket.js +39 -0
  179. package/app/hooks/use-current-customer.js +29 -0
  180. package/app/hooks/use-derived-product.js +77 -0
  181. package/app/hooks/use-derived-product.test.js +69 -0
  182. package/app/hooks/use-einstein.js +512 -0
  183. package/app/hooks/use-einstein.test.js +224 -0
  184. package/app/hooks/use-intersection-observer.js +64 -0
  185. package/app/hooks/use-limit-urls.js +31 -0
  186. package/app/hooks/use-limit-urls.test.js +40 -0
  187. package/app/hooks/use-multi-site.js +36 -0
  188. package/app/hooks/use-multi-site.test.js +53 -0
  189. package/app/hooks/use-navigation.js +37 -0
  190. package/app/hooks/use-navigation.test.js +109 -0
  191. package/app/hooks/use-page-urls.js +35 -0
  192. package/app/hooks/use-page-urls.test.js +39 -0
  193. package/app/hooks/use-pdp-search-params.js +16 -0
  194. package/app/hooks/use-pdp-search-params.test.js +52 -0
  195. package/app/hooks/use-previous.js +17 -0
  196. package/app/hooks/use-product-view-modal.js +93 -0
  197. package/app/hooks/use-product-view-modal.test.js +172 -0
  198. package/app/hooks/use-search-params.js +96 -0
  199. package/app/hooks/use-search-params.test.js +91 -0
  200. package/app/hooks/use-sort-urls.js +33 -0
  201. package/app/hooks/use-sort-urls.test.js +42 -0
  202. package/app/hooks/use-toast.js +68 -0
  203. package/app/hooks/use-toast.test.js +58 -0
  204. package/app/hooks/use-variant.js +32 -0
  205. package/app/hooks/use-variant.test.js +81 -0
  206. package/app/hooks/use-variation-attributes.js +138 -0
  207. package/app/hooks/use-variation-attributes.test.js +119 -0
  208. package/app/hooks/use-variation-params.js +31 -0
  209. package/app/hooks/use-variation-params.test.js +73 -0
  210. package/app/hooks/use-wish-list.js +42 -0
  211. package/app/main.jsx +14 -0
  212. package/app/mocks/basket-with-suit.js +146 -0
  213. package/app/mocks/empty-basket.js +39 -0
  214. package/app/mocks/mock-data.js +5632 -0
  215. package/app/mocks/product-set-winter-lookM.js +1224 -0
  216. package/app/mocks/searchResults.js +144 -0
  217. package/app/mocks/variant-750518699578M.js +434 -0
  218. package/app/page-designer/README.md +102 -0
  219. package/app/page-designer/assets/image-tile/index.jsx +51 -0
  220. package/app/page-designer/assets/image-tile/index.test.js +30 -0
  221. package/app/page-designer/assets/image-with-text/index.jsx +140 -0
  222. package/app/page-designer/assets/image-with-text/index.test.js +38 -0
  223. package/app/page-designer/assets/index.js +9 -0
  224. package/app/page-designer/index.js +10 -0
  225. package/app/page-designer/layouts/carousel/index.jsx +222 -0
  226. package/app/page-designer/layouts/carousel/index.test.js +43 -0
  227. package/app/page-designer/layouts/index.js +14 -0
  228. package/app/page-designer/layouts/mobileGrid1r1c/index.jsx +36 -0
  229. package/app/page-designer/layouts/mobileGrid1r1c/index.test.js +35 -0
  230. package/app/page-designer/layouts/mobileGrid2r1c/index.jsx +37 -0
  231. package/app/page-designer/layouts/mobileGrid2r1c/index.test.js +47 -0
  232. package/app/page-designer/layouts/mobileGrid2r2c/index.jsx +37 -0
  233. package/app/page-designer/layouts/mobileGrid2r2c/index.test.js +71 -0
  234. package/app/page-designer/layouts/mobileGrid2r3c/index.jsx +37 -0
  235. package/app/page-designer/layouts/mobileGrid2r3c/index.test.js +95 -0
  236. package/app/page-designer/layouts/mobileGrid3r1c/index.jsx +37 -0
  237. package/app/page-designer/layouts/mobileGrid3r1c/index.test.js +59 -0
  238. package/app/page-designer/layouts/mobileGrid3r2c/index.jsx +37 -0
  239. package/app/page-designer/layouts/mobileGrid3r2c/index.test.js +95 -0
  240. package/app/page-designer/utils.js +14 -0
  241. package/app/pages/account/addresses.jsx +382 -0
  242. package/app/pages/account/addresses.test.js +120 -0
  243. package/app/pages/account/constant.js +57 -0
  244. package/app/pages/account/index.jsx +237 -0
  245. package/app/pages/account/index.test.js +188 -0
  246. package/app/pages/account/order-detail.jsx +397 -0
  247. package/app/pages/account/order-history.jsx +264 -0
  248. package/app/pages/account/orders.jsx +30 -0
  249. package/app/pages/account/orders.test.js +95 -0
  250. package/app/pages/account/profile.jsx +357 -0
  251. package/app/pages/account/wishlist/index.jsx +195 -0
  252. package/app/pages/account/wishlist/index.mock.js +1481 -0
  253. package/app/pages/account/wishlist/index.test.js +56 -0
  254. package/app/pages/account/wishlist/partials/wishlist-primary-action.jsx +170 -0
  255. package/app/pages/account/wishlist/partials/wishlist-primary-action.mock.js +1623 -0
  256. package/app/pages/account/wishlist/partials/wishlist-primary-action.test.js +99 -0
  257. package/app/pages/account/wishlist/partials/wishlist-secondary-button-group.jsx +120 -0
  258. package/app/pages/account/wishlist/partials/wishlist-secondary-button-group.test.js +391 -0
  259. package/app/pages/cart/index.jsx +476 -0
  260. package/app/pages/cart/index.test.js +481 -0
  261. package/app/pages/cart/partials/cart-cta.jsx +46 -0
  262. package/app/pages/cart/partials/cart-secondary-button-group.jsx +135 -0
  263. package/app/pages/cart/partials/cart-secondary-button-group.test.js +103 -0
  264. package/app/pages/cart/partials/cart-skeleton.jsx +93 -0
  265. package/app/pages/cart/partials/cart-title.jsx +27 -0
  266. package/app/pages/cart/partials/empty-cart.jsx +86 -0
  267. package/app/pages/checkout/confirmation.jsx +541 -0
  268. package/app/pages/checkout/confirmation.mock.js +450 -0
  269. package/app/pages/checkout/confirmation.test.js +114 -0
  270. package/app/pages/checkout/index.jsx +169 -0
  271. package/app/pages/checkout/index.test.js +582 -0
  272. package/app/pages/checkout/partials/cc-radio-group.jsx +122 -0
  273. package/app/pages/checkout/partials/checkout-footer.jsx +140 -0
  274. package/app/pages/checkout/partials/checkout-footer.test.js +16 -0
  275. package/app/pages/checkout/partials/checkout-header.jsx +54 -0
  276. package/app/pages/checkout/partials/checkout-header.test.js +16 -0
  277. package/app/pages/checkout/partials/checkout-skeleton.jsx +52 -0
  278. package/app/pages/checkout/partials/contact-info.jsx +251 -0
  279. package/app/pages/checkout/partials/contact-info.test.js +43 -0
  280. package/app/pages/checkout/partials/payment-form.jsx +97 -0
  281. package/app/pages/checkout/partials/payment.jsx +276 -0
  282. package/app/pages/checkout/partials/shipping-address-selection.jsx +377 -0
  283. package/app/pages/checkout/partials/shipping-address.jsx +132 -0
  284. package/app/pages/checkout/partials/shipping-options.jsx +232 -0
  285. package/app/pages/checkout/util/checkout-context.js +94 -0
  286. package/app/pages/home/data.js +134 -0
  287. package/app/pages/home/index.jsx +301 -0
  288. package/app/pages/home/index.test.js +23 -0
  289. package/app/pages/login/index.jsx +123 -0
  290. package/app/pages/login/index.test.js +229 -0
  291. package/app/pages/login-redirect/index.jsx +23 -0
  292. package/app/pages/login-redirect/index.test.js +16 -0
  293. package/app/pages/page-not-found/index.jsx +90 -0
  294. package/app/pages/page-not-found/index.test.js +31 -0
  295. package/app/pages/product-detail/index.jsx +394 -0
  296. package/app/pages/product-detail/index.mock.js +197 -0
  297. package/app/pages/product-detail/index.test.js +162 -0
  298. package/app/pages/product-detail/partials/information-accordion.jsx +121 -0
  299. package/app/pages/product-list/index.jsx +735 -0
  300. package/app/pages/product-list/index.test.js +180 -0
  301. package/app/pages/product-list/partials/above-page-header.jsx +10 -0
  302. package/app/pages/product-list/partials/checkbox-refinements.jsx +41 -0
  303. package/app/pages/product-list/partials/checkbox-refinements.test.js +53 -0
  304. package/app/pages/product-list/partials/color-refinements.jsx +88 -0
  305. package/app/pages/product-list/partials/empty-results.jsx +118 -0
  306. package/app/pages/product-list/partials/link-refinements.jsx +38 -0
  307. package/app/pages/product-list/partials/page-header.jsx +42 -0
  308. package/app/pages/product-list/partials/radio-refinements.jsx +60 -0
  309. package/app/pages/product-list/partials/refinements.jsx +144 -0
  310. package/app/pages/product-list/partials/selected-refinements.jsx +100 -0
  311. package/app/pages/product-list/partials/size-refinements.jsx +55 -0
  312. package/app/pages/registration/index.jsx +87 -0
  313. package/app/pages/registration/index.test.jsx +132 -0
  314. package/app/pages/reset-password/index.jsx +112 -0
  315. package/app/pages/reset-password/index.test.jsx +141 -0
  316. package/app/request-processor.js +118 -0
  317. package/app/request-processor.test.js +23 -0
  318. package/app/routes.jsx +111 -0
  319. package/app/routes.test.js +13 -0
  320. package/app/ssr.js +70 -0
  321. package/app/static/ico/favicon.ico +0 -0
  322. package/app/static/img/global/app-icon-192.png +0 -0
  323. package/app/static/img/global/app-icon-512.png +0 -0
  324. package/app/static/img/global/apple-touch-icon.png +0 -0
  325. package/app/static/img/hero.png +0 -0
  326. package/app/static/manifest.json +19 -0
  327. package/app/static/robots.txt +2 -0
  328. package/app/theme/components/base/accordion.js +21 -0
  329. package/app/theme/components/base/alert.js +17 -0
  330. package/app/theme/components/base/badge.js +25 -0
  331. package/app/theme/components/base/button.js +77 -0
  332. package/app/theme/components/base/checkbox.js +30 -0
  333. package/app/theme/components/base/container.js +17 -0
  334. package/app/theme/components/base/drawer.js +26 -0
  335. package/app/theme/components/base/formLabel.js +13 -0
  336. package/app/theme/components/base/icon.js +13 -0
  337. package/app/theme/components/base/input.js +44 -0
  338. package/app/theme/components/base/modal.js +11 -0
  339. package/app/theme/components/base/popover.js +61 -0
  340. package/app/theme/components/base/radio.js +33 -0
  341. package/app/theme/components/base/select.js +15 -0
  342. package/app/theme/components/base/skeleton.js +12 -0
  343. package/app/theme/components/base/tooltip.js +19 -0
  344. package/app/theme/components/project/_app.js +25 -0
  345. package/app/theme/components/project/breadcrumb.js +25 -0
  346. package/app/theme/components/project/checkout-footer.js +35 -0
  347. package/app/theme/components/project/drawer-menu.js +66 -0
  348. package/app/theme/components/project/footer.js +84 -0
  349. package/app/theme/components/project/header.js +84 -0
  350. package/app/theme/components/project/image-gallery.js +59 -0
  351. package/app/theme/components/project/links-list.js +43 -0
  352. package/app/theme/components/project/list-menu.js +91 -0
  353. package/app/theme/components/project/locale-selector.js +42 -0
  354. package/app/theme/components/project/nested-accordion.js +26 -0
  355. package/app/theme/components/project/offline-banner.js +25 -0
  356. package/app/theme/components/project/pagination.js +22 -0
  357. package/app/theme/components/project/product-tile.js +32 -0
  358. package/app/theme/components/project/social-icons.js +52 -0
  359. package/app/theme/components/project/swatch-group.js +115 -0
  360. package/app/theme/foundations/colors.js +170 -0
  361. package/app/theme/foundations/gradients.js +9 -0
  362. package/app/theme/foundations/layerStyles.js +41 -0
  363. package/app/theme/foundations/shadows.js +9 -0
  364. package/app/theme/foundations/sizes.js +18 -0
  365. package/app/theme/foundations/space.js +9 -0
  366. package/app/theme/foundations/styles.js +21 -0
  367. package/app/theme/index.js +104 -0
  368. package/app/utils/cc-utils.js +112 -0
  369. package/app/utils/cc-utils.test.js +41 -0
  370. package/app/utils/image-groups-utils.js +62 -0
  371. package/app/utils/image-groups-utils.test.js +65 -0
  372. package/app/utils/locale.js +78 -0
  373. package/app/utils/locale.test.js +112 -0
  374. package/app/utils/password-utils.js +21 -0
  375. package/app/utils/phone-utils.js +22 -0
  376. package/app/utils/phone-utils.test.js +15 -0
  377. package/app/utils/product-utils.js +35 -0
  378. package/app/utils/product-utils.test.js +51 -0
  379. package/app/utils/responsive-image.js +198 -0
  380. package/app/utils/responsive-image.test.js +170 -0
  381. package/app/utils/routes-utils.js +111 -0
  382. package/app/utils/routes-utils.test.js +291 -0
  383. package/app/utils/site-utils.js +222 -0
  384. package/app/utils/site-utils.test.js +376 -0
  385. package/app/utils/test-utils.js +257 -0
  386. package/app/utils/url.js +291 -0
  387. package/app/utils/url.test.js +421 -0
  388. package/app/utils/utils.js +201 -0
  389. package/app/utils/utils.test.js +182 -0
  390. package/babel.config.js +7 -0
  391. package/cache-hash-config.json +8 -0
  392. package/config/default.js +64 -0
  393. package/config/mocks/default.js +131 -0
  394. package/config/sites.js +78 -0
  395. package/jest-setup.js +191 -0
  396. package/jest.config.js +50 -0
  397. package/jsconfig.json +13 -0
  398. package/package.json +105 -0
  399. package/scripts/extract-default-messages.js +92 -0
  400. package/tests/lighthouserc.js +37 -0
  401. package/translations/README.md +127 -0
  402. package/translations/compiled/de-DE.json +3212 -0
  403. package/translations/compiled/en-GB.json +3212 -0
  404. package/translations/compiled/en-US.json +3212 -0
  405. package/translations/compiled/en-XA.json +6948 -0
  406. package/translations/compiled/es-MX.json +3216 -0
  407. package/translations/compiled/fr-FR.json +3216 -0
  408. package/translations/compiled/it-IT.json +3188 -0
  409. package/translations/compiled/ja-JP.json +3200 -0
  410. package/translations/compiled/ko-KR.json +3180 -0
  411. package/translations/compiled/pt-BR.json +3220 -0
  412. package/translations/compiled/zh-CN.json +3212 -0
  413. package/translations/compiled/zh-TW.json +3208 -0
  414. package/translations/de-DE.json +1417 -0
  415. package/translations/en-GB.json +1417 -0
  416. package/translations/en-US.json +1417 -0
  417. package/translations/es-MX.json +1417 -0
  418. package/translations/fr-FR.json +1417 -0
  419. package/translations/it-IT.json +1417 -0
  420. package/translations/ja-JP.json +1417 -0
  421. package/translations/ko-KR.json +1417 -0
  422. package/translations/pt-BR.json +1417 -0
  423. package/translations/zh-CN.json +1417 -0
  424. package/translations/zh-TW.json +1417 -0
  425. package/worker/main.js +36 -0
@@ -0,0 +1,99 @@
1
+ /*
2
+ * Copyright (c) 2021, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ import React from 'react'
8
+ import {mockWishListDetails} from '@salesforce/retail-react-app/app/pages/account/wishlist/partials/wishlist-primary-action.mock'
9
+ import ItemVariantProvider from '@salesforce/retail-react-app/app/components/item-variant'
10
+ import {renderWithProviders} from '@salesforce/retail-react-app/app/utils/test-utils'
11
+ import WishlistPrimaryAction from '@salesforce/retail-react-app/app/pages/account/wishlist/partials/wishlist-primary-action'
12
+ import {screen, waitFor} from '@testing-library/react'
13
+ import PropTypes from 'prop-types'
14
+ import {rest} from 'msw'
15
+ import {basketWithProductSet} from '@salesforce/retail-react-app/app/pages/product-detail/index.mock'
16
+
17
+ const MockedComponent = ({variant}) => {
18
+ return (
19
+ <ItemVariantProvider variant={variant}>
20
+ <WishlistPrimaryAction />
21
+ </ItemVariantProvider>
22
+ )
23
+ }
24
+ MockedComponent.propTypes = {
25
+ variant: PropTypes.object
26
+ }
27
+
28
+ jest.mock('../../../../hooks/use-current-basket', () => {
29
+ return {
30
+ useCurrentBasket: () => {
31
+ return {
32
+ data: {basketId: 'basket_id'},
33
+ derivedData: {totalItems: 5}
34
+ }
35
+ }
36
+ }
37
+ })
38
+
39
+ beforeEach(() => {
40
+ jest.resetModules()
41
+
42
+ global.server.use(
43
+ // For adding items to basket
44
+ rest.post('*/baskets/:basketId/items', (req, res, ctx) => {
45
+ return res(ctx.json(basketWithProductSet))
46
+ })
47
+ )
48
+ })
49
+
50
+ test('the Add To Cart button', async () => {
51
+ const variant = mockWishListDetails.data[3]
52
+ const {user} = renderWithProviders(<MockedComponent variant={variant} />)
53
+
54
+ const addToCartButton = await screen.findByRole('button', {
55
+ name: /add to cart/i
56
+ })
57
+ await user.click(addToCartButton)
58
+
59
+ await waitFor(() => {
60
+ expect(screen.getByText(/1 item added to cart/i)).toBeInTheDocument()
61
+ })
62
+ })
63
+
64
+ test('the Add Set To Cart button', async () => {
65
+ const productSetWithoutVariants = mockWishListDetails.data[1]
66
+ const {user} = renderWithProviders(<MockedComponent variant={productSetWithoutVariants} />)
67
+
68
+ const button = await screen.findByRole('button', {name: /add set to cart/i})
69
+ await user.click(button)
70
+
71
+ await waitFor(() => {
72
+ expect(screen.getByText(/2 items added to cart/i)).toBeInTheDocument()
73
+ })
74
+ })
75
+
76
+ test('the View Full Details button', async () => {
77
+ const productSetWithVariants = mockWishListDetails.data[0]
78
+ renderWithProviders(<MockedComponent variant={productSetWithVariants} />)
79
+
80
+ const link = await screen.findByRole('link', {name: /view full details/i})
81
+ expect(link).toBeInTheDocument()
82
+ })
83
+
84
+ test('the View Options button', async () => {
85
+ const masterProduct = mockWishListDetails.data[2]
86
+ const {user} = renderWithProviders(<MockedComponent variant={masterProduct} />)
87
+
88
+ const button = await screen.findByRole('button', {name: /view options/i})
89
+ await user.click(button)
90
+
91
+ await waitFor(
92
+ () => {
93
+ const modal = screen.getByTestId('product-view-modal')
94
+ expect(modal).toBeVisible()
95
+ },
96
+ // Seems like rendering the modal takes a bit more time
97
+ {timeout: 5000}
98
+ )
99
+ }, 30000)
@@ -0,0 +1,120 @@
1
+ /*
2
+ * Copyright (c) 2021, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ import React from 'react'
8
+ import PropTypes from 'prop-types'
9
+ import {Button, ButtonGroup, useDisclosure} from '@chakra-ui/react'
10
+ import {useIntl, defineMessage, FormattedMessage} from 'react-intl'
11
+ import {useShopperCustomersMutation} from '@salesforce/commerce-sdk-react'
12
+
13
+ import {useToast} from '@salesforce/retail-react-app/app/hooks/use-toast'
14
+ import {useCurrentCustomer} from '@salesforce/retail-react-app/app/hooks/use-current-customer'
15
+ import {useWishList} from '@salesforce/retail-react-app/app/hooks/use-wish-list'
16
+
17
+ import ConfirmationModal from '@salesforce/retail-react-app/app/components/confirmation-modal/index'
18
+ import {useItemVariant} from '@salesforce/retail-react-app/app/components/item-variant'
19
+ import {noop} from '@salesforce/retail-react-app/app/utils/utils'
20
+ import {API_ERROR_MESSAGE} from '@salesforce/retail-react-app/app/constants'
21
+
22
+ export const REMOVE_WISHLIST_ITEM_CONFIRMATION_DIALOG_CONFIG = {
23
+ dialogTitle: defineMessage({
24
+ defaultMessage: 'Confirm Remove Item',
25
+ id: 'confirmation_modal.remove_wishlist_item.title.confirm_remove'
26
+ }),
27
+ confirmationMessage: defineMessage({
28
+ defaultMessage: 'Are you sure you want to remove this item from your wishlist?',
29
+ id: 'confirmation_modal.remove_wishlist_item.message.sure_to_remove'
30
+ }),
31
+ primaryActionLabel: defineMessage({
32
+ defaultMessage: 'Yes, remove item',
33
+ id: 'confirmation_modal.remove_wishlist_item.action.yes'
34
+ }),
35
+ alternateActionLabel: defineMessage({
36
+ defaultMessage: 'No, keep item',
37
+ id: 'confirmation_modal.remove_wishlist_item.action.no'
38
+ }),
39
+ onPrimaryAction: noop
40
+ }
41
+
42
+ /**
43
+ * Renders secondary actions on a product-item card in the form of a button group.
44
+ * Represents other actions you want the user to perform with the product-item (eg.: Remove or Edit)
45
+ */
46
+ const WishlistSecondaryButtonGroup = ({productListItemId, onClick = noop}) => {
47
+ const variant = useItemVariant()
48
+ const {data: customer} = useCurrentCustomer()
49
+ const {data: wishList} = useWishList()
50
+ const modalProps = useDisclosure()
51
+ const toast = useToast()
52
+ const {formatMessage} = useIntl()
53
+
54
+ const showRemoveItemConfirmation = () => {
55
+ modalProps.onOpen()
56
+ }
57
+
58
+ const deleteCustomerProductListItem = useShopperCustomersMutation(
59
+ 'deleteCustomerProductListItem'
60
+ )
61
+
62
+ const handleItemRemove = async () => {
63
+ try {
64
+ const promise = deleteCustomerProductListItem.mutateAsync({
65
+ parameters: {
66
+ customerId: customer.customerId,
67
+ listId: wishList?.id,
68
+ itemId: productListItemId
69
+ }
70
+ })
71
+ onClick(variant.id, promise)
72
+
73
+ await promise
74
+
75
+ toast({
76
+ title: formatMessage({
77
+ defaultMessage: 'Item removed from wishlist',
78
+ id: 'wishlist_secondary_button_group.info.item_removed'
79
+ }),
80
+ status: 'success'
81
+ })
82
+ } catch {
83
+ toast({title: formatMessage(API_ERROR_MESSAGE), status: 'error'})
84
+ }
85
+ }
86
+
87
+ return (
88
+ <>
89
+ <ButtonGroup spacing="6">
90
+ <Button
91
+ variant="link"
92
+ size="sm"
93
+ onClick={showRemoveItemConfirmation}
94
+ data-testid={`sf-wishlist-remove-${productListItemId}`}
95
+ >
96
+ <FormattedMessage
97
+ defaultMessage="Remove"
98
+ id="wishlist_secondary_button_group.action.remove"
99
+ />
100
+ </Button>
101
+ {/* <Button variant="link" size="sm" onClick={onItemEdit}>
102
+ <FormattedMessage defaultMessage="Edit" />
103
+ </Button> */}
104
+ </ButtonGroup>
105
+
106
+ <ConfirmationModal
107
+ {...REMOVE_WISHLIST_ITEM_CONFIRMATION_DIALOG_CONFIG}
108
+ onPrimaryAction={handleItemRemove}
109
+ {...modalProps}
110
+ />
111
+ </>
112
+ )
113
+ }
114
+
115
+ WishlistSecondaryButtonGroup.propTypes = {
116
+ productListItemId: PropTypes.string,
117
+ onClick: PropTypes.func
118
+ }
119
+
120
+ export default WishlistSecondaryButtonGroup
@@ -0,0 +1,391 @@
1
+ /*
2
+ * Copyright (c) 2021, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ import React from 'react'
8
+ import ItemVariantProvider from '@salesforce/retail-react-app/app/components/item-variant'
9
+ import {renderWithProviders} from '@salesforce/retail-react-app/app/utils/test-utils'
10
+ import WishlistSecondaryButtonGroup from '@salesforce/retail-react-app/app/pages/account/wishlist/partials/wishlist-secondary-button-group'
11
+ import {screen, waitFor} from '@testing-library/react'
12
+ import user from '@testing-library/user-event'
13
+ import {rest} from 'msw'
14
+ import {
15
+ mockedProductLists,
16
+ mockedWishListProducts
17
+ } from '@salesforce/retail-react-app/app/pages/account/wishlist/index.mock'
18
+
19
+ const mockData = {
20
+ creationDate: '2021-09-13T23:29:23.396Z',
21
+ customerProductListItems: [
22
+ {
23
+ id: '98ca9a3a9c8ee803543dc45cdc',
24
+ priority: 1,
25
+ productId: '25518837M',
26
+ public: false,
27
+ purchasedQuantity: 0,
28
+ quantity: 4,
29
+ type: 'product',
30
+ product: {
31
+ currency: 'GBP',
32
+ id: '25518837M',
33
+ imageGroups: [
34
+ {
35
+ images: [
36
+ {
37
+ alt: 'Ruffle Front V-Neck Cardigan, , large',
38
+ disBaseLink:
39
+ 'https://edge.disstg.commercecloud.salesforce.com/dw/image/v2/ZZRF_001/on/demandware.static/-/Sites-apparel-m-catalog/default/dw4cd0a798/images/large/PG.10216885.JJ169XX.PZ.jpg',
40
+ link: 'https://zzrf-001.dx.commercecloud.salesforce.com/on/demandware.static/-/Sites-apparel-m-catalog/default/dw4cd0a798/images/large/PG.10216885.JJ169XX.PZ.jpg',
41
+ title: 'Ruffle Front V-Neck Cardigan, '
42
+ },
43
+ {
44
+ alt: 'Ruffle Front V-Neck Cardigan, , large',
45
+ disBaseLink:
46
+ 'https://edge.disstg.commercecloud.salesforce.com/dw/image/v2/ZZRF_001/on/demandware.static/-/Sites-apparel-m-catalog/default/dwf67d39ef/images/large/PG.10216885.JJ169XX.BZ.jpg',
47
+ link: 'https://zzrf-001.dx.commercecloud.salesforce.com/on/demandware.static/-/Sites-apparel-m-catalog/default/dwf67d39ef/images/large/PG.10216885.JJ169XX.BZ.jpg',
48
+ title: 'Ruffle Front V-Neck Cardigan, '
49
+ }
50
+ ],
51
+ viewType: 'large'
52
+ },
53
+ {
54
+ images: [
55
+ {
56
+ alt: 'Ruffle Front V-Neck Cardigan, , medium',
57
+ disBaseLink:
58
+ 'https://edge.disstg.commercecloud.salesforce.com/dw/image/v2/ZZRF_001/on/demandware.static/-/Sites-apparel-m-catalog/default/dwc31527c1/images/medium/PG.10216885.JJ169XX.PZ.jpg',
59
+ link: 'https://zzrf-001.dx.commercecloud.salesforce.com/on/demandware.static/-/Sites-apparel-m-catalog/default/dwc31527c1/images/medium/PG.10216885.JJ169XX.PZ.jpg',
60
+ title: 'Ruffle Front V-Neck Cardigan, '
61
+ },
62
+ {
63
+ alt: 'Ruffle Front V-Neck Cardigan, , medium',
64
+ disBaseLink:
65
+ 'https://edge.disstg.commercecloud.salesforce.com/dw/image/v2/ZZRF_001/on/demandware.static/-/Sites-apparel-m-catalog/default/dw3b11511c/images/medium/PG.10216885.JJ169XX.BZ.jpg',
66
+ link: 'https://zzrf-001.dx.commercecloud.salesforce.com/on/demandware.static/-/Sites-apparel-m-catalog/default/dw3b11511c/images/medium/PG.10216885.JJ169XX.BZ.jpg',
67
+ title: 'Ruffle Front V-Neck Cardigan, '
68
+ }
69
+ ],
70
+ viewType: 'medium'
71
+ },
72
+ {
73
+ images: [
74
+ {
75
+ alt: 'Ruffle Front V-Neck Cardigan, , small',
76
+ disBaseLink:
77
+ 'https://edge.disstg.commercecloud.salesforce.com/dw/image/v2/ZZRF_001/on/demandware.static/-/Sites-apparel-m-catalog/default/dw4ada76e4/images/small/PG.10216885.JJ169XX.PZ.jpg',
78
+ link: 'https://zzrf-001.dx.commercecloud.salesforce.com/on/demandware.static/-/Sites-apparel-m-catalog/default/dw4ada76e4/images/small/PG.10216885.JJ169XX.PZ.jpg',
79
+ title: 'Ruffle Front V-Neck Cardigan, '
80
+ },
81
+ {
82
+ alt: 'Ruffle Front V-Neck Cardigan, , small',
83
+ disBaseLink:
84
+ 'https://edge.disstg.commercecloud.salesforce.com/dw/image/v2/ZZRF_001/on/demandware.static/-/Sites-apparel-m-catalog/default/dw5c3e4bf4/images/small/PG.10216885.JJ169XX.BZ.jpg',
85
+ link: 'https://zzrf-001.dx.commercecloud.salesforce.com/on/demandware.static/-/Sites-apparel-m-catalog/default/dw5c3e4bf4/images/small/PG.10216885.JJ169XX.BZ.jpg',
86
+ title: 'Ruffle Front V-Neck Cardigan, '
87
+ }
88
+ ],
89
+ viewType: 'small'
90
+ }
91
+ ],
92
+ inventory: {
93
+ ats: 1597,
94
+ backorderable: false,
95
+ id: 'inventory_m',
96
+ orderable: true,
97
+ preorderable: false,
98
+ stockLevel: 1597
99
+ },
100
+ longDescription:
101
+ "This flirty ruffle cardigan can take you from day to night. Don't leave home with out a great pair of Commerce Cloud Store earrings.",
102
+ master: {
103
+ masterId: '25518837M',
104
+ orderable: true,
105
+ price: 26.23
106
+ },
107
+ minOrderQuantity: 1,
108
+ name: 'Ruffle Front V-Neck Cardigan',
109
+ pageDescription:
110
+ "This flirty ruffle cardigan can take you from day to night. Don't leave home with out a great pair of Commerce Cloud Store earrings.",
111
+ pageTitle: 'Ruffle Front V-Neck Cardigan',
112
+ price: 26.23,
113
+ pricePerUnit: 26.23,
114
+ primaryCategoryId: 'womens-clothing-tops',
115
+ productPromotions: [
116
+ {
117
+ calloutMsg: '$50 Fixed Products Amount Above 100',
118
+ promotionId: '$50FixedProductsAmountAbove100'
119
+ },
120
+ {
121
+ calloutMsg: 'Buy one Long Center Seam Skirt and get 2 tops',
122
+ promotionId: 'ChoiceOfBonusProdect-ProductLevel-ruleBased'
123
+ }
124
+ ],
125
+ shortDescription:
126
+ "This flirty ruffle cardigan can take you from day to night. Don't leave home with out a great pair of Commerce Cloud Store earrings.",
127
+ stepQuantity: 1,
128
+ type: {
129
+ master: true
130
+ },
131
+ validFrom: {
132
+ default: '2010-11-18T05:00:00.000Z'
133
+ },
134
+ variants: [
135
+ {
136
+ orderable: true,
137
+ price: 26.23,
138
+ productId: '701642873211M',
139
+ variationValues: {
140
+ color: 'JJ169XX',
141
+ size: '9LG'
142
+ }
143
+ },
144
+ {
145
+ orderable: true,
146
+ price: 26.23,
147
+ productId: '701642873334M',
148
+ variationValues: {
149
+ color: 'JJ908XX',
150
+ size: '9LG'
151
+ }
152
+ },
153
+ {
154
+ orderable: true,
155
+ price: 26.23,
156
+ productId: '701642873297M',
157
+ variationValues: {
158
+ color: 'JJ8UTXX',
159
+ size: '9LG'
160
+ }
161
+ },
162
+ {
163
+ orderable: true,
164
+ price: 26.23,
165
+ productId: '701642873372M',
166
+ variationValues: {
167
+ color: 'JJI15XX',
168
+ size: '9LG'
169
+ }
170
+ },
171
+ {
172
+ orderable: true,
173
+ price: 26.23,
174
+ productId: '701642873402M',
175
+ variationValues: {
176
+ color: 'JJI15XX',
177
+ size: '9XL'
178
+ }
179
+ },
180
+ {
181
+ orderable: true,
182
+ price: 26.23,
183
+ productId: '701642873303M',
184
+ variationValues: {
185
+ color: 'JJ8UTXX',
186
+ size: '9MD'
187
+ }
188
+ },
189
+ {
190
+ orderable: true,
191
+ price: 26.23,
192
+ productId: '701642873310M',
193
+ variationValues: {
194
+ color: 'JJ8UTXX',
195
+ size: '9SM'
196
+ }
197
+ },
198
+ {
199
+ orderable: true,
200
+ price: 26.23,
201
+ productId: '701642873228M',
202
+ variationValues: {
203
+ color: 'JJ169XX',
204
+ size: '9MD'
205
+ }
206
+ },
207
+ {
208
+ orderable: true,
209
+ price: 26.23,
210
+ productId: '701642873235M',
211
+ variationValues: {
212
+ color: 'JJ169XX',
213
+ size: '9SM'
214
+ }
215
+ },
216
+ {
217
+ orderable: true,
218
+ price: 26.23,
219
+ productId: '701642873396M',
220
+ variationValues: {
221
+ color: 'JJI15XX',
222
+ size: '9SM'
223
+ }
224
+ },
225
+ {
226
+ orderable: true,
227
+ price: 26.23,
228
+ productId: '701642873389M',
229
+ variationValues: {
230
+ color: 'JJI15XX',
231
+ size: '9MD'
232
+ }
233
+ },
234
+ {
235
+ orderable: true,
236
+ price: 26.23,
237
+ productId: '701642873327M',
238
+ variationValues: {
239
+ color: 'JJ8UTXX',
240
+ size: '9XL'
241
+ }
242
+ },
243
+ {
244
+ orderable: true,
245
+ price: 26.23,
246
+ productId: '701642873341M',
247
+ variationValues: {
248
+ color: 'JJ908XX',
249
+ size: '9MD'
250
+ }
251
+ },
252
+ {
253
+ orderable: true,
254
+ price: 26.23,
255
+ productId: '701642873358M',
256
+ variationValues: {
257
+ color: 'JJ908XX',
258
+ size: '9SM'
259
+ }
260
+ },
261
+ {
262
+ orderable: true,
263
+ price: 26.23,
264
+ productId: '701642873365M',
265
+ variationValues: {
266
+ color: 'JJ908XX',
267
+ size: '9XL'
268
+ }
269
+ },
270
+ {
271
+ orderable: true,
272
+ price: 26.23,
273
+ productId: '701642873242M',
274
+ variationValues: {
275
+ color: 'JJ169XX',
276
+ size: '9XL'
277
+ }
278
+ }
279
+ ],
280
+ variationAttributes: [
281
+ {
282
+ id: 'color',
283
+ name: 'Colour',
284
+ values: [
285
+ {
286
+ name: 'Black',
287
+ orderable: true,
288
+ value: 'JJ169XX'
289
+ },
290
+ {
291
+ name: 'Icy Mint',
292
+ orderable: true,
293
+ value: 'JJ8UTXX'
294
+ },
295
+ {
296
+ name: 'Grey Heather',
297
+ orderable: true,
298
+ value: 'JJ908XX'
299
+ },
300
+ {
301
+ name: 'White',
302
+ orderable: true,
303
+ value: 'JJI15XX'
304
+ }
305
+ ]
306
+ },
307
+ {
308
+ id: 'size',
309
+ name: 'Size',
310
+ values: [
311
+ {
312
+ name: 'S',
313
+ orderable: true,
314
+ value: '9SM'
315
+ },
316
+ {
317
+ name: 'M',
318
+ orderable: true,
319
+ value: '9MD'
320
+ },
321
+ {
322
+ name: 'L',
323
+ orderable: true,
324
+ value: '9LG'
325
+ },
326
+ {
327
+ name: 'XL',
328
+ orderable: true,
329
+ value: '9XL'
330
+ }
331
+ ]
332
+ }
333
+ ],
334
+ c_isNewtest: true,
335
+ c_isSale: true
336
+ }
337
+ }
338
+ ],
339
+ event: {},
340
+ id: 'eba7a6682031bfa931949708d7',
341
+ lastModified: '2021-09-14T00:47:12.612Z',
342
+ name: 'PWA wishlist',
343
+ public: false,
344
+ type: 'wish_list'
345
+ }
346
+
347
+ const MockedComponent = (props) => {
348
+ const product = mockData.customerProductListItems[0].product
349
+ return (
350
+ <ItemVariantProvider variant={{...product, productName: product.name}}>
351
+ <WishlistSecondaryButtonGroup productListItemId="some_id" {...props} />
352
+ </ItemVariantProvider>
353
+ )
354
+ }
355
+
356
+ beforeEach(() => {
357
+ jest.resetModules()
358
+
359
+ global.server.use(
360
+ // For `useWishList`
361
+ rest.get('*/products', (req, res, ctx) => {
362
+ return res(ctx.delay(0), ctx.status(200), ctx.json(mockedWishListProducts))
363
+ }),
364
+ rest.get('*/customers/:customerId/product-lists', (req, res, ctx) => {
365
+ return res(ctx.delay(0), ctx.status(200), ctx.json(mockedProductLists))
366
+ }),
367
+ rest.delete(
368
+ '*/customers/:customerId/product-lists/:listId/items/:itemId',
369
+ (req, res, ctx) => {
370
+ return res(ctx.delay(0), ctx.status(204))
371
+ }
372
+ )
373
+ )
374
+ })
375
+
376
+ test('can remove item', async () => {
377
+ const mockedHandler = jest.fn()
378
+ renderWithProviders(<MockedComponent onClick={mockedHandler} />)
379
+
380
+ const removeButton = await screen.findByRole('button', {
381
+ name: /remove/i
382
+ })
383
+ user.click(removeButton)
384
+
385
+ const confirmButton = await screen.findByRole('button', {name: /yes, remove item/i})
386
+ user.click(confirmButton)
387
+
388
+ await waitFor(() => {
389
+ expect(mockedHandler).toHaveBeenCalled()
390
+ })
391
+ })