@evenicanpm/storefront-core 1.0.3 → 1.0.4

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 (319) hide show
  1. package/docs.tsconfig.json +35 -0
  2. package/package.json +6 -3
  3. package/src/api-manager/schemas/product.schema.ts +0 -1
  4. package/src/api-manager/services/create-query.ts +10 -0
  5. package/src/api-manager/services/product/queries/get-product-availability.ts +1 -1
  6. package/src/api-manager/services/user/mutations/add-to-wishlist.ts +23 -3
  7. package/src/api-manager/services/user/mutations/remove-from-wishlist.ts +23 -0
  8. package/src/cms/blocks/Components/CategoryCarousel/index.tsx +6 -7
  9. package/src/cms/blocks/Components/HeroCarousel/index.tsx +25 -19
  10. package/src/cms/blocks/Components/ProductCarousel/index.tsx +44 -38
  11. package/src/cms/blocks/Components/ProductSectionFullWidth/index.tsx +7 -3
  12. package/src/cms/blocks/Components/shared/product-grid.tsx +38 -23
  13. package/src/components/_components/wishlist/add-to-wishlist-dialog.tsx +1 -1
  14. package/src/components/_components/wishlist/remove-from-wishlist-dialog.tsx +1 -1
  15. package/src/components/_components/wishlist-modal/add-to-wishlist-dialog.tsx +1 -1
  16. package/src/components/_components/wishlist-modal/remove-from-wishlist-dialog.tsx +1 -1
  17. package/src/components-v2/carousel/carousel.tsx +69 -35
  18. package/src/components-v2/carousel/components/carousel-arrows.tsx +40 -46
  19. package/src/components-v2/carousel/components/carousel-dots.tsx +10 -13
  20. package/src/components-v2/carousel/index.ts +0 -2
  21. package/src/components-v2/carousel-cards/carousel-card-1/carousel-card-1.tsx +68 -49
  22. package/src/components-v2/categories/category-list/category-list.tsx +83 -41
  23. package/src/components-v2/categories/category-list/styles.ts +7 -1
  24. package/src/components-v2/categories/category-menu.tsx +2 -0
  25. package/src/components-v2/categories/mega-menu/banner.tsx +68 -37
  26. package/src/components-v2/categories/mega-menu/column-list.tsx +59 -52
  27. package/src/components-v2/categories/mega-menu/mega-menu-1.tsx +19 -1
  28. package/src/components-v2/categories/mega-menu/mega-menu-2.tsx +32 -2
  29. package/src/components-v2/header/components/mobile-header.tsx +119 -46
  30. package/src/components-v2/header/components/user.tsx +163 -117
  31. package/src/components-v2/header/header.tsx +62 -42
  32. package/src/components-v2/header/sticky-header.tsx +34 -2
  33. package/src/components-v2/mini-cart/components/bottom-actions.tsx +71 -17
  34. package/src/components-v2/mini-cart/components/cart-item.tsx +159 -101
  35. package/src/components-v2/mini-cart/components/empty-view.tsx +59 -19
  36. package/src/components-v2/mini-cart/components/top-header.tsx +61 -22
  37. package/src/components-v2/mini-cart/mini-cart-trigger.tsx +99 -0
  38. package/src/components-v2/mini-cart/mini-cart.tsx +111 -43
  39. package/src/components-v2/mobile-navigation/mobile-navigation-bar.tsx +93 -48
  40. package/src/components-v2/navbar/categories.tsx +70 -16
  41. package/src/components-v2/navbar/category-based-menu/category-based-menu.tsx +135 -41
  42. package/src/components-v2/navbar/mega-menu/mega-menu.tsx +115 -48
  43. package/src/components-v2/navbar/mobile-menu/mobile-menu.test.tsx +111 -0
  44. package/src/components-v2/navbar/mobile-menu/mobile-menu.tsx +127 -56
  45. package/src/components-v2/navbar/nav-list/nav-list.tsx +125 -103
  46. package/src/components-v2/navbar/navbar.tsx +72 -20
  47. package/src/components-v2/product-cards/{product-card-1 → product-card}/components/quantity-buttons.tsx +1 -1
  48. package/src/components-v2/product-cards/product-card/product-card.tsx +410 -0
  49. package/src/components-v2/product-cards/{product-card-1 → product-card}/styles/index.ts +6 -0
  50. package/src/components-v2/product-cards/product-card-plp/product-card.tsx +161 -0
  51. package/src/components-v2/product-cards/product-card-plp-list/index.ts +1 -0
  52. package/src/components-v2/product-cards/product-card-plp-list/product-card.tsx +219 -0
  53. package/src/components-v2/product-cards/product-card-search/product-card.tsx +166 -0
  54. package/src/components-v2/product-dialog/compound/product-dialog.tsx +225 -0
  55. package/src/components-v2/product-dialog/index.tsx +29 -0
  56. package/src/components-v2/product-dimensions/{components → compound}/dimensions-group-error.tsx +1 -1
  57. package/src/components-v2/product-dimensions/{components → compound}/dimensions-group-label.tsx +1 -1
  58. package/src/components-v2/product-dimensions/{components → compound}/dimensions-group-list-chip.tsx +1 -1
  59. package/src/components-v2/product-dimensions/{components → compound}/dimensions-group-list.tsx +1 -1
  60. package/src/components-v2/product-dimensions/{components → compound}/dimensions-group.tsx +1 -1
  61. package/src/components-v2/product-dimensions/{components → compound}/dimensions.tsx +0 -3
  62. package/src/components-v2/product-dimensions/index.tsx +1 -1
  63. package/src/components-v2/product-quantity-buttons/compound/quantity-buttons-root.tsx +181 -0
  64. package/src/components-v2/product-quantity-buttons/index.tsx +22 -0
  65. package/src/components-v2/product-quantity-variants/index.tsx +90 -0
  66. package/src/components-v2/products-view/compound/context.ts +25 -0
  67. package/src/components-v2/products-view/compound/products-grid-view.tsx +109 -0
  68. package/src/components-v2/products-view/compound/products-list-view.tsx +98 -0
  69. package/src/components-v2/products-view/compound/types.ts +12 -0
  70. package/src/components-v2/products-view/index.tsx +45 -0
  71. package/src/components-v2/products-view/products-grid-view.tsx +24 -11
  72. package/src/components-v2/products-view/products-list-view.tsx +29 -12
  73. package/src/components-v2/search-bar/compound/context.ts +31 -0
  74. package/src/components-v2/search-bar/compound/results-item-lg.tsx +43 -0
  75. package/src/components-v2/search-bar/compound/results-item-sm.tsx +48 -0
  76. package/src/components-v2/search-bar/compound/results-suspense.tsx +49 -0
  77. package/src/components-v2/search-bar/compound/results.tsx +42 -0
  78. package/src/components-v2/search-bar/compound/search-bar-root.tsx +64 -0
  79. package/src/components-v2/search-bar/compound/textfield-adornment-button.tsx +22 -0
  80. package/src/components-v2/{search-box/components/category-dropdown.tsx → search-bar/compound/textfield-adornment-category.tsx} +29 -7
  81. package/src/components-v2/search-bar/compound/textfield-adornment-search-icon.tsx +34 -0
  82. package/src/components-v2/search-bar/compound/textfield.tsx +58 -0
  83. package/src/components-v2/search-bar/hooks/use-click-outside.ts +20 -0
  84. package/src/components-v2/search-bar/hooks/use-search.ts +63 -0
  85. package/src/components-v2/search-bar/index.tsx +36 -0
  86. package/src/components-v2/{search-box → search-bar}/styles/index.ts +5 -3
  87. package/src/components-v2/search-bar/utils/findCategoryNameById.ts +18 -0
  88. package/src/components-v2/section/compound/section-header.tsx +63 -0
  89. package/src/components-v2/section/compound/section.tsx +26 -0
  90. package/src/components-v2/section/index.ts +1 -0
  91. package/src/components-v2/side-nav/side-nav.tsx +4 -5
  92. package/src/components-v2/sticky/index.ts +1 -1
  93. package/src/components-v2/{wishlist-modal → wishlist-dialogs/add-to-wishlist}/add-to-wishlist-button.tsx +1 -1
  94. package/src/components-v2/wishlist-dialogs/add-to-wishlist/compound/add-to-wishlist-bottom-ui.tsx +35 -0
  95. package/src/components-v2/wishlist-dialogs/add-to-wishlist/compound/add-to-wishlist-dialog.tsx +79 -0
  96. package/src/components-v2/wishlist-dialogs/add-to-wishlist/compound/add-to-wishlist-list.tsx +41 -0
  97. package/src/components-v2/wishlist-dialogs/add-to-wishlist/compound/context.ts +29 -0
  98. package/src/components-v2/wishlist-dialogs/add-to-wishlist/compound/wishlist-dialog-header.tsx +74 -0
  99. package/src/components-v2/wishlist-dialogs/add-to-wishlist/compound/wishlist-dialog-item.tsx +82 -0
  100. package/src/components-v2/wishlist-dialogs/add-to-wishlist/hooks/use-add-to-wishlist.ts +152 -0
  101. package/src/components-v2/wishlist-dialogs/add-to-wishlist/index.tsx +39 -0
  102. package/src/components-v2/wishlist-dialogs/create-wishlist/compound/context.ts +2 -0
  103. package/src/components-v2/wishlist-dialogs/create-wishlist/compound/create-wishlist-bottom-ui.tsx +42 -0
  104. package/src/components-v2/wishlist-dialogs/create-wishlist/compound/create-wishlist-dialog.tsx +92 -0
  105. package/src/components-v2/wishlist-dialogs/create-wishlist/compound/create-wishlist-form.tsx +96 -0
  106. package/src/components-v2/{wishlist/components → wishlist-dialogs/create-wishlist}/create-wishlist-button.tsx +5 -3
  107. package/src/components-v2/wishlist-dialogs/create-wishlist/index.tsx +22 -0
  108. package/src/hooks/use-cart.ts +29 -23
  109. package/src/hooks/use-variants.ts +106 -53
  110. package/src/lib/build-detail-url.ts +2 -1
  111. package/src/pages/product-details/product-intro/product-intro.tsx +26 -23
  112. package/src/pages/product-list/quick-view-dialog-content.tsx +18 -9
  113. package/src/pages-v2/product-details/bopis/find-in-store-button.tsx +9 -8
  114. package/src/pages-v2/product-details/bopis/find-in-store-modal.tsx +2 -2
  115. package/src/{components-v2/shop-card → pages-v2/product-details/bopis/store-card}/shop-card.tsx +17 -48
  116. package/src/pages-v2/product-details/bopis/store-card/utils/convertSecondsToTime.ts +8 -0
  117. package/src/pages-v2/product-details/bopis/store-card/utils/getDaysResources.ts +25 -0
  118. package/src/pages-v2/product-details/product-intro/compound/context.ts +52 -0
  119. package/src/pages-v2/product-details/product-intro/compound/product-info.tsx +231 -0
  120. package/src/pages-v2/product-details/product-intro/compound/product-intro-images.tsx +124 -0
  121. package/src/pages-v2/product-details/product-intro/compound/product-intro.tsx +49 -0
  122. package/src/pages-v2/product-details/product-intro/compound/thumbnail-with-skeleton.tsx +28 -0
  123. package/src/pages-v2/product-details/product-intro/utils.ts +42 -0
  124. package/src/pages-v2/product-details/product-tabs.tsx +87 -21
  125. package/src/pages-v2/product-details/related-products.tsx +26 -12
  126. package/src/pages-v2/product-list/quick-view-dialog-content.tsx +17 -10
  127. package/typedoc.js +3 -1
  128. package/src/components-v2/MiniCartClient.tsx +0 -65
  129. package/src/components-v2/carousel-cards/carousel-card-2/carousel-card-2.tsx +0 -78
  130. package/src/components-v2/carousel-cards/carousel-card-2/index.ts +0 -1
  131. package/src/components-v2/carousel-cards/carousel-card-2/styles.ts +0 -26
  132. package/src/components-v2/carousel-cards/carousel-card-3/carousel-card-3.tsx +0 -37
  133. package/src/components-v2/carousel-cards/carousel-card-3/index.ts +0 -1
  134. package/src/components-v2/carousel-cards/carousel-card-3/styles.ts +0 -28
  135. package/src/components-v2/carousel-cards/carousel-card-4/carousel-card-4.tsx +0 -81
  136. package/src/components-v2/carousel-cards/carousel-card-4/index.ts +0 -1
  137. package/src/components-v2/carousel-cards/carousel-card-4/styles.ts +0 -27
  138. package/src/components-v2/category-cards/category-card-1/category-card-1.tsx +0 -21
  139. package/src/components-v2/category-cards/category-card-1/index.ts +0 -1
  140. package/src/components-v2/category-cards/category-card-1/styles.ts +0 -37
  141. package/src/components-v2/countdown/count-box.tsx +0 -19
  142. package/src/components-v2/countdown/count-down.tsx +0 -24
  143. package/src/components-v2/countdown/index.tsx +0 -2
  144. package/src/components-v2/countdown/useCountDown.ts +0 -41
  145. package/src/components-v2/data-table/index.ts +0 -2
  146. package/src/components-v2/data-table/table-header.tsx +0 -91
  147. package/src/components-v2/data-table/table-pagination.tsx +0 -36
  148. package/src/components-v2/footer/components/about-links.tsx +0 -23
  149. package/src/components-v2/footer/components/app-store.tsx +0 -38
  150. package/src/components-v2/footer/components/customer-care-links.tsx +0 -21
  151. package/src/components-v2/footer/components/logo.tsx +0 -23
  152. package/src/components-v2/footer/components/social-links.tsx +0 -43
  153. package/src/components-v2/footer/data/index.ts +0 -54
  154. package/src/components-v2/footer/footer-1.tsx +0 -62
  155. package/src/components-v2/footer/footer-2.tsx +0 -57
  156. package/src/components-v2/footer/footer-3.tsx +0 -53
  157. package/src/components-v2/footer/footer-4.tsx +0 -71
  158. package/src/components-v2/footer/index.ts +0 -4
  159. package/src/components-v2/footer/styles/index.ts +0 -42
  160. package/src/components-v2/navbar/category-based-menu/components/categories.tsx +0 -44
  161. package/src/components-v2/navbar/category-based-menu/components/category-item.tsx +0 -31
  162. package/src/components-v2/navbar/category-based-menu/components/child-categories.tsx +0 -38
  163. package/src/components-v2/navbar/mega-menu/category-list.tsx +0 -29
  164. package/src/components-v2/navbar/mobile-menu/render-levels.test.tsx +0 -71
  165. package/src/components-v2/navbar/mobile-menu/render-levels.tsx +0 -62
  166. package/src/components-v2/newsletter/index.ts +0 -1
  167. package/src/components-v2/newsletter/newsletter.tsx +0 -112
  168. package/src/components-v2/newsletter/social-icons.tsx +0 -35
  169. package/src/components-v2/newsletter/styles.ts +0 -65
  170. package/src/components-v2/page-sidenav/grocery-side-nav/components/link-item.tsx +0 -21
  171. package/src/components-v2/page-sidenav/grocery-side-nav/components/list-item.tsx +0 -27
  172. package/src/components-v2/page-sidenav/grocery-side-nav/components/nav-accordion.tsx +0 -36
  173. package/src/components-v2/page-sidenav/grocery-side-nav/components/render-child.tsx +0 -26
  174. package/src/components-v2/page-sidenav/grocery-side-nav/grocery-side-nav.tsx +0 -32
  175. package/src/components-v2/page-sidenav/grocery-side-nav/index.ts +0 -1
  176. package/src/components-v2/page-sidenav/grocery-side-nav/styles/index.ts +0 -11
  177. package/src/components-v2/page-sidenav/health-beauty-side-nav/components/list-item.tsx +0 -27
  178. package/src/components-v2/page-sidenav/health-beauty-side-nav/components/nav-accordion.tsx +0 -44
  179. package/src/components-v2/page-sidenav/health-beauty-side-nav/components/render-child.tsx +0 -20
  180. package/src/components-v2/page-sidenav/health-beauty-side-nav/health-beauty-side-nav.tsx +0 -43
  181. package/src/components-v2/page-sidenav/health-beauty-side-nav/index.ts +0 -1
  182. package/src/components-v2/page-sidenav/health-beauty-side-nav/styles/index.ts +0 -27
  183. package/src/components-v2/page-sidenav/side-navbar/components/list-item.tsx +0 -25
  184. package/src/components-v2/page-sidenav/side-navbar/components/nav-accordion.tsx +0 -46
  185. package/src/components-v2/page-sidenav/side-navbar/components/render-child.tsx +0 -20
  186. package/src/components-v2/page-sidenav/side-navbar/index.ts +0 -1
  187. package/src/components-v2/page-sidenav/side-navbar/side-nav-bar.tsx +0 -77
  188. package/src/components-v2/page-sidenav/side-navbar/styles/index.ts +0 -73
  189. package/src/components-v2/page-sidenav/side-navbar-2/components/button-content.tsx +0 -32
  190. package/src/components-v2/page-sidenav/side-navbar-2/components/sidebar-accordion.tsx +0 -66
  191. package/src/components-v2/page-sidenav/side-navbar-2/index.ts +0 -1
  192. package/src/components-v2/page-sidenav/side-navbar-2/side-navbar-2.tsx +0 -63
  193. package/src/components-v2/page-sidenav/side-navbar-2/styles/index.ts +0 -68
  194. package/src/components-v2/product-cards/product-card-1/index.ts +0 -1
  195. package/src/components-v2/product-cards/product-card-1/product-card-1-wrapper.tsx +0 -304
  196. package/src/components-v2/product-cards/product-card-1/product-card.tsx +0 -107
  197. package/src/components-v2/product-cards/product-card-10/index.ts +0 -1
  198. package/src/components-v2/product-cards/product-card-10/product-card.tsx +0 -128
  199. package/src/components-v2/product-cards/product-card-10/styles/index.ts +0 -38
  200. package/src/components-v2/product-cards/product-card-11/index.ts +0 -1
  201. package/src/components-v2/product-cards/product-card-11/product-card.tsx +0 -66
  202. package/src/components-v2/product-cards/product-card-11/styles/index.ts +0 -16
  203. package/src/components-v2/product-cards/product-card-12/index.ts +0 -1
  204. package/src/components-v2/product-cards/product-card-12/product-card.tsx +0 -42
  205. package/src/components-v2/product-cards/product-card-12/styles/index.ts +0 -16
  206. package/src/components-v2/product-cards/product-card-13/index.ts +0 -1
  207. package/src/components-v2/product-cards/product-card-13/product-card.tsx +0 -48
  208. package/src/components-v2/product-cards/product-card-13/styles/index.ts +0 -25
  209. package/src/components-v2/product-cards/product-card-14/index.ts +0 -1
  210. package/src/components-v2/product-cards/product-card-14/product-card.tsx +0 -125
  211. package/src/components-v2/product-cards/product-card-14/styles/index.ts +0 -40
  212. package/src/components-v2/product-cards/product-card-15/index.ts +0 -1
  213. package/src/components-v2/product-cards/product-card-15/product-card.tsx +0 -121
  214. package/src/components-v2/product-cards/product-card-15/styles/index.ts +0 -57
  215. package/src/components-v2/product-cards/product-card-16/product-card.tsx +0 -116
  216. package/src/components-v2/product-cards/product-card-2/components/favorite-button.tsx +0 -29
  217. package/src/components-v2/product-cards/product-card-2/components/product-price.tsx +0 -26
  218. package/src/components-v2/product-cards/product-card-2/index.ts +0 -1
  219. package/src/components-v2/product-cards/product-card-2/product-card.tsx +0 -70
  220. package/src/components-v2/product-cards/product-card-3/components/hover-actions.tsx +0 -83
  221. package/src/components-v2/product-cards/product-card-3/index.ts +0 -1
  222. package/src/components-v2/product-cards/product-card-3/product-card.tsx +0 -110
  223. package/src/components-v2/product-cards/product-card-3/styles/index.ts +0 -89
  224. package/src/components-v2/product-cards/product-card-4/components/hover-actions.tsx +0 -50
  225. package/src/components-v2/product-cards/product-card-4/index.ts +0 -1
  226. package/src/components-v2/product-cards/product-card-4/product-card.tsx +0 -128
  227. package/src/components-v2/product-cards/product-card-4/styles/index.ts +0 -66
  228. package/src/components-v2/product-cards/product-card-5/components/button-actions.tsx +0 -49
  229. package/src/components-v2/product-cards/product-card-5/components/hover-actions.tsx +0 -50
  230. package/src/components-v2/product-cards/product-card-5/index.ts +0 -1
  231. package/src/components-v2/product-cards/product-card-5/product-card.tsx +0 -137
  232. package/src/components-v2/product-cards/product-card-5/styles/index.ts +0 -94
  233. package/src/components-v2/product-cards/product-card-6/components/hover-actions.tsx +0 -50
  234. package/src/components-v2/product-cards/product-card-6/index.ts +0 -1
  235. package/src/components-v2/product-cards/product-card-6/product-card.tsx +0 -121
  236. package/src/components-v2/product-cards/product-card-6/styles/index.ts +0 -63
  237. package/src/components-v2/product-cards/product-card-7/components/product-status.tsx +0 -18
  238. package/src/components-v2/product-cards/product-card-7/components/quantity-buttons.tsx +0 -47
  239. package/src/components-v2/product-cards/product-card-7/index.ts +0 -1
  240. package/src/components-v2/product-cards/product-card-7/product-card.tsx +0 -139
  241. package/src/components-v2/product-cards/product-card-7/styles/index.ts +0 -98
  242. package/src/components-v2/product-cards/product-card-8/product-card.tsx +0 -151
  243. package/src/components-v2/product-cards/product-card-9/index.ts +0 -1
  244. package/src/components-v2/product-cards/product-card-9/product-card.tsx +0 -169
  245. package/src/components-v2/product-cards/product-card-wishlist/components/hover-actions.tsx +0 -37
  246. package/src/components-v2/product-cards/product-card-wishlist/product-card.tsx +0 -118
  247. package/src/components-v2/product-cards/product-card-wishlist/styles/index.ts +0 -53
  248. package/src/components-v2/product-quantity-buttons/product-quantity-buttons.tsx +0 -88
  249. package/src/components-v2/products-view/product-view-dialog.tsx +0 -218
  250. package/src/components-v2/search-box/__test__/search-input-category.test.tsx +0 -110
  251. package/src/components-v2/search-box/__test__/search-input.test.tsx +0 -137
  252. package/src/components-v2/search-box/__test__/search-results.json +0 -165
  253. package/src/components-v2/search-box/components/search-result.tsx +0 -86
  254. package/src/components-v2/search-box/hooks/use-search.ts +0 -63
  255. package/src/components-v2/search-box/index.ts +0 -2
  256. package/src/components-v2/search-box/search-input-category.test.tsx +0 -110
  257. package/src/components-v2/search-box/search-input-category.tsx +0 -203
  258. package/src/components-v2/search-box/search-input.test.tsx +0 -41
  259. package/src/components-v2/search-box/search-input.tsx +0 -66
  260. package/src/components-v2/section-header/index.ts +0 -2
  261. package/src/components-v2/section-header/section-creator.tsx +0 -29
  262. package/src/components-v2/section-header/section-header.tsx +0 -44
  263. package/src/components-v2/service-cards/icon-component.tsx +0 -18
  264. package/src/components-v2/service-cards/service-card-1/index.ts +0 -1
  265. package/src/components-v2/service-cards/service-card-1/service-card-1.tsx +0 -42
  266. package/src/components-v2/service-cards/service-card-2/index.ts +0 -1
  267. package/src/components-v2/service-cards/service-card-2/service-card-2.tsx +0 -37
  268. package/src/components-v2/service-cards/service-card-3/index.ts +0 -1
  269. package/src/components-v2/service-cards/service-card-3/service-card-3.tsx +0 -28
  270. package/src/components-v2/service-cards/service-card-3/styles.ts +0 -23
  271. package/src/components-v2/settings/index.ts +0 -1
  272. package/src/components-v2/settings/setting.tsx +0 -141
  273. package/src/components-v2/settings/styles.ts +0 -57
  274. package/src/components-v2/sticky-wrapper/index.ts +0 -1
  275. package/src/components-v2/sticky-wrapper/sticky-wrapper.tsx +0 -21
  276. package/src/components-v2/sticky-wrapper/styles.ts +0 -25
  277. package/src/components-v2/stories/story-content/index.ts +0 -1
  278. package/src/components-v2/stories/story-content/story-content.tsx +0 -28
  279. package/src/components-v2/stories/story-content/styles.ts +0 -22
  280. package/src/components-v2/stories/story-item/index.ts +0 -1
  281. package/src/components-v2/stories/story-item/story-item.tsx +0 -24
  282. package/src/components-v2/stories/story-item/styles.ts +0 -11
  283. package/src/components-v2/stories/story-viewer/index.ts +0 -1
  284. package/src/components-v2/stories/story-viewer/story-viewer.tsx +0 -44
  285. package/src/components-v2/stories/story-viewer/styles.ts +0 -15
  286. package/src/components-v2/subscribe-input/index.ts +0 -1
  287. package/src/components-v2/subscribe-input/styles.ts +0 -14
  288. package/src/components-v2/subscribe-input/subscribe-input.tsx +0 -43
  289. package/src/components-v2/topbar/index.ts +0 -1
  290. package/src/components-v2/topbar/styles.ts +0 -55
  291. package/src/components-v2/topbar/top-bar.tsx +0 -115
  292. package/src/components-v2/wishlist/add-to-wishlist-dialog.tsx +0 -161
  293. package/src/components-v2/wishlist/components/create-new-list.tsx +0 -167
  294. package/src/components-v2/wishlist/components/dashboard-header.tsx +0 -123
  295. package/src/components-v2/wishlist/components/navigation.tsx +0 -87
  296. package/src/components-v2/wishlist/components/no-records.tsx +0 -20
  297. package/src/components-v2/wishlist/components/wishlist-modal-item.tsx +0 -66
  298. package/src/components-v2/wishlist/remove-from-wishlist-dialog.tsx +0 -175
  299. package/src/components-v2/wishlist-modal/TODO.md +0 -10
  300. package/src/components-v2/wishlist-modal/add-to-wishlist-dialog.tsx +0 -161
  301. package/src/components-v2/wishlist-modal/remove-from-wishlist-dialog.tsx +0 -174
  302. package/src/components-v2/wishlist-modal/wishlist-modal-item.tsx +0 -65
  303. package/src/pages-v2/product-details/product-intro/product-intro-images.tsx +0 -90
  304. package/src/pages-v2/product-details/product-intro/product-intro.tsx +0 -256
  305. /package/src/{pages-v2/account → components-v2}/no-records.tsx +0 -0
  306. /package/src/components-v2/product-cards/{product-card-1 → product-card}/components/hover-actions.tsx +0 -0
  307. /package/src/components-v2/product-cards/{product-card-16 → product-card}/index.ts +0 -0
  308. /package/src/components-v2/product-cards/{product-card-16 → product-card-plp}/components/quantity-buttons.tsx +0 -0
  309. /package/src/components-v2/product-cards/{product-card-wishlist → product-card-plp}/index.ts +0 -0
  310. /package/src/components-v2/product-cards/{product-card-16 → product-card-plp}/styles/index.ts +0 -0
  311. /package/src/components-v2/product-cards/{product-card-9 → product-card-plp-list}/components/add-to-cart.tsx +0 -0
  312. /package/src/components-v2/product-cards/{product-card-9 → product-card-plp-list}/components/favorite-button.tsx +0 -0
  313. /package/src/components-v2/product-cards/{product-card-9 → product-card-plp-list}/components/tags.tsx +0 -0
  314. /package/src/components-v2/product-cards/{product-card-8 → product-card-search}/index.ts +0 -0
  315. /package/src/components-v2/product-cards/{product-card-8 → product-card-search}/styles/index.ts +0 -0
  316. /package/src/components-v2/sticky/{Sticky.tsx → sticky.tsx} +0 -0
  317. /package/src/components-v2/{wishlist → wishlist-dialogs}/styles.ts +0 -0
  318. /package/src/{components-v2/shop-card → pages-v2/product-details/bopis/store-card}/index.ts +0 -0
  319. /package/src/{components-v2/shop-card → pages-v2/product-details/bopis/store-card}/styles.ts +0 -0
@@ -0,0 +1,39 @@
1
+ import AddToWishlistDialog from "./compound/add-to-wishlist-dialog";
2
+ import { Cart } from "@evenicanpm/storefront-core/src/api-manager/schemas/cart.schema";
3
+
4
+ interface Props {
5
+ open: boolean;
6
+ handleClose: () => void;
7
+ productId?: number;
8
+ cart?: Cart;
9
+ onSuccess?: () => void;
10
+ }
11
+
12
+ /**
13
+ * @category Implementation
14
+ */
15
+ const AddToWishListDialog1 = ({
16
+ cart,
17
+ open,
18
+ handleClose,
19
+ productId,
20
+ }: Props) => {
21
+ return (
22
+ <>
23
+ <AddToWishlistDialog
24
+ cart={cart}
25
+ open={open}
26
+ handleClose={handleClose}
27
+ productId={productId}
28
+ >
29
+ <AddToWishlistDialog.Header />
30
+ <AddToWishlistDialog.List>
31
+ <AddToWishlistDialog.List.Item />
32
+ </AddToWishlistDialog.List>
33
+ <AddToWishlistDialog.BottomUI />
34
+ </AddToWishlistDialog>
35
+ </>
36
+ );
37
+ };
38
+
39
+ export default AddToWishListDialog1;
@@ -0,0 +1,2 @@
1
+ import { createContext } from "react";
2
+ export const CreateNewWishlistContext = createContext(null);
@@ -0,0 +1,42 @@
1
+ import React, { useContext } from "react";
2
+ import { useTranslations } from "next-intl";
3
+ import { Button } from "@mui/material";
4
+ import Grid from "@mui/material/Grid2";
5
+ import { CreateNewWishlistContext } from "./context";
6
+
7
+ function BottomUI() {
8
+ const t = useTranslations("Account.Wishlists");
9
+ const { handleClose } = useContext(CreateNewWishlistContext);
10
+ return (
11
+ <Grid
12
+ size={{ sm: 6, xs: 12 }}
13
+ sx={{
14
+ display: "flex",
15
+ justifyContent: "flex-end",
16
+ alignItems: "center",
17
+ gap: 2,
18
+ }}
19
+ >
20
+ <Button
21
+ color="primary"
22
+ variant="contained"
23
+ size="small"
24
+ type="submit"
25
+ sx={{ height: 30.75 }}
26
+ >
27
+ {t("btnSave")}
28
+ </Button>
29
+ <Button
30
+ color="primary"
31
+ variant="outlined"
32
+ size="small"
33
+ onClick={handleClose}
34
+ sx={{ height: 30.75 }}
35
+ >
36
+ {t("btnCancel")}
37
+ </Button>
38
+ </Grid>
39
+ );
40
+ }
41
+
42
+ export default BottomUI;
@@ -0,0 +1,92 @@
1
+ import React from "react";
2
+ import isFunction from "lodash/isFunction";
3
+ import { useTranslations } from "next-intl";
4
+ import { Dialog, DialogContent, CircularProgress } from "@mui/material";
5
+ // Global Custom components
6
+ import { H5 } from "@evenicanpm/storefront-core/src/components-v2/Typography";
7
+ import { useNotification } from "@evenicanpm/storefront-core/src/providers/notifications/use-notification";
8
+ // Forms
9
+ import { useFormik } from "formik";
10
+ import { z } from "zod";
11
+ import { withZodSchema } from "formik-validator-zod";
12
+ // API
13
+ import useCreateWishlist from "@evenicanpm/storefront-core/src/api-manager/services/user/mutations/create-wishlist";
14
+ import { CreateNewWishlistContext } from "./context";
15
+ import CreateNewWishlistForm from "./create-wishlist-form";
16
+
17
+ interface Props {
18
+ open: boolean;
19
+ handleClose: () => void;
20
+ children: React.ReactNode;
21
+ }
22
+
23
+ export default function CreateNewList(props: Props) {
24
+ const { children } = props;
25
+ const t = useTranslations("Account.Wishlists");
26
+ const { setNotification } = useNotification();
27
+
28
+ const { mutateAsync: createWishlist } = useCreateWishlist();
29
+
30
+ const FormSchema = z.object({
31
+ Id: z.string(),
32
+ Name: z.string().nonempty(t("Validation.required", { field: t("name") })),
33
+ Comment: z.string().optional(),
34
+ IsPublic: z.boolean().optional(),
35
+ });
36
+
37
+ type FormSchemaType = z.infer<typeof FormSchema>;
38
+
39
+ const handleSubmit = async (values: FormSchemaType) => {
40
+ try {
41
+ await createWishlist({ ...values, IsPublic: !values.IsPublic });
42
+ handleClose();
43
+ setNotification({
44
+ message: t("wishlistSuccess"),
45
+ severity: "success",
46
+ });
47
+ } catch (error) {
48
+ setNotification({
49
+ message: t("wishlistFailed"),
50
+ severity: "error",
51
+ });
52
+ }
53
+ };
54
+
55
+ const formik = useFormik<FormSchemaType>({
56
+ initialValues: {
57
+ Id: "",
58
+ Name: "",
59
+ Comment: "",
60
+ IsPublic: false,
61
+ },
62
+ onSubmit: handleSubmit,
63
+ validate: withZodSchema(FormSchema),
64
+ });
65
+
66
+ const { resetForm, isSubmitting } = formik;
67
+
68
+ const handleClose = () => {
69
+ if (isFunction(props.handleClose)) {
70
+ props.handleClose();
71
+ resetForm();
72
+ }
73
+ };
74
+
75
+ return (
76
+ <CreateNewWishlistContext.Provider value={{ formik, handleClose }}>
77
+ <Dialog open={props.open} onClose={handleClose}>
78
+ <DialogContent>
79
+ {isSubmitting ? <CircularProgress /> : children}
80
+ </DialogContent>
81
+ </Dialog>
82
+ </CreateNewWishlistContext.Provider>
83
+ );
84
+ }
85
+
86
+ const FormTitle = () => {
87
+ const t = useTranslations("Account.Wishlists");
88
+ return <H5 mb={4}>{t("formTitle")}</H5>;
89
+ };
90
+
91
+ CreateNewList.Title = FormTitle;
92
+ CreateNewList.Form = CreateNewWishlistForm;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * @module Create-Wishlist-Dialog
3
+ */
4
+ import React, { useContext } from "react";
5
+ import { useTranslations } from "next-intl";
6
+ import { Box, TextField, FormControlLabel, Checkbox } from "@mui/material";
7
+ import Grid from "@mui/material/Grid2";
8
+ // Global Custom components
9
+ import BottomUI from "./create-wishlist-bottom-ui";
10
+ import { CreateNewWishlistContext } from "./context";
11
+
12
+ /*
13
+ * @category Sub-Component
14
+ */
15
+ const CreateNewWishlistForm = ({ children }: { children: React.ReactNode }) => {
16
+ const { formik } = useContext(CreateNewWishlistContext);
17
+ return (
18
+ <Box component="form" onSubmit={formik.handleSubmit}>
19
+ <Grid container spacing={3}>
20
+ {children}
21
+ </Grid>
22
+ </Box>
23
+ );
24
+ };
25
+
26
+ /*
27
+ * @category Sub-Component
28
+ */
29
+ function NameTextField() {
30
+ const t = useTranslations("Account.Wishlists");
31
+ const { formik } = useContext(CreateNewWishlistContext);
32
+ return (
33
+ <Grid size={{ sm: 6, xs: 12 }}>
34
+ <TextField
35
+ name="Name"
36
+ fullWidth
37
+ label={t("name")}
38
+ value={formik.values.Name}
39
+ onChange={formik.handleChange}
40
+ onBlur={formik.handleBlur}
41
+ error={formik.touched.Name && Boolean(formik.errors.Name)}
42
+ helperText={formik.touched.Name && formik.errors.Name}
43
+ required
44
+ />
45
+ </Grid>
46
+ );
47
+ }
48
+
49
+ /*
50
+ * @category Sub-Component
51
+ */
52
+ function DescriptionTextField() {
53
+ const t = useTranslations("Account.Wishlists");
54
+ const { formik } = useContext(CreateNewWishlistContext);
55
+ return (
56
+ <Grid size={{ sm: 6, xs: 12 }}>
57
+ <TextField
58
+ name="Comment"
59
+ fullWidth
60
+ label={t("comment")}
61
+ value={formik.values.Comment}
62
+ onChange={formik.handleChange}
63
+ onBlur={formik.handleBlur}
64
+ error={formik.touched.Comment && Boolean(formik.errors.Comment)}
65
+ helperText={formik.touched.Comment && formik.errors.Comment}
66
+ />
67
+ </Grid>
68
+ );
69
+ }
70
+
71
+ function IsPrivateCheckbox() {
72
+ const t = useTranslations("Account.Wishlists");
73
+ const { formik } = useContext(CreateNewWishlistContext);
74
+ return (
75
+ <Grid size={{ sm: 6, xs: 12 }}>
76
+ <FormControlLabel
77
+ control={
78
+ <Checkbox
79
+ name="IsPublic"
80
+ checked={formik.values.IsPublic}
81
+ onChange={formik.handleChange}
82
+ onBlur={formik.handleBlur}
83
+ />
84
+ }
85
+ label={t("private")}
86
+ />
87
+ </Grid>
88
+ );
89
+ }
90
+
91
+ CreateNewWishlistForm.BottomUI = BottomUI;
92
+ CreateNewWishlistForm.NameTextField = NameTextField;
93
+ CreateNewWishlistForm.IsPrivateCheckBox = IsPrivateCheckbox;
94
+ CreateNewWishlistForm.DescriptionTextField = DescriptionTextField;
95
+
96
+ export default CreateNewWishlistForm;
@@ -3,13 +3,15 @@
3
3
  import { useState } from "react";
4
4
  import { Button } from "@mui/material";
5
5
  import T from "@evenicanpm/storefront-core/src/components-v2/T";
6
- import CreateNewListDialog from "./create-new-list";
6
+ import CreateNewListDialog from "./";
7
7
 
8
8
  interface Props {
9
- path: string;
9
+ path?: string;
10
10
  }
11
11
 
12
- const CreateWishlistButton = ({ path }: Props) => {
12
+ const CreateWishlistButton = ({
13
+ path = "Account.Wishlists.btnCreateNewList",
14
+ }: Props) => {
13
15
  const [openCreateListDialog, setOpenCreateListDialog] = useState(false);
14
16
 
15
17
  const handleCloseDialog = () => {
@@ -0,0 +1,22 @@
1
+ import CreateNewList from "./compound/create-wishlist-dialog";
2
+
3
+ interface Props {
4
+ open: boolean;
5
+ handleClose: () => void;
6
+ }
7
+
8
+ const CreateNewWishlistDialog = ({ open, handleClose }: Props) => {
9
+ return (
10
+ <CreateNewList open={open} handleClose={handleClose}>
11
+ <CreateNewList.Title />
12
+ <CreateNewList.Form>
13
+ <CreateNewList.Form.NameTextField />
14
+ <CreateNewList.Form.DescriptionTextField />
15
+ <CreateNewList.Form.IsPrivateCheckBox />
16
+ <CreateNewList.Form.BottomUI />
17
+ </CreateNewList.Form>
18
+ </CreateNewList>
19
+ );
20
+ };
21
+
22
+ export default CreateNewWishlistDialog;
@@ -1,25 +1,29 @@
1
- import useDeleteCartLine from "@/api-manager/services/cart/mutations/delete-cart-line";
2
- import useAddToCart from "@/api-manager/services/cart/mutations/add-to-cart";
3
- import useUpdateCartLines from "@/api-manager/services/cart/mutations/update-cart-lines";
4
- import { Cart } from "@/api-manager/schemas/cart.schema";
5
- import { CartLine } from "@msdyn365-commerce/retail-proxy";
6
-
7
- type UseCartProps = {
8
- cart: Cart;
9
- selectVariantId: number | undefined;
10
- recordId: number;
11
- };
12
-
13
- export type AddToCartBopisInput = {
1
+ "use client";
2
+ import useDeleteCartLine from "@evenicanpm/storefront-core/src/api-manager/services/cart/mutations/delete-cart-line";
3
+ import useAddToCart from "@evenicanpm/storefront-core/src/api-manager/services/cart/mutations/add-to-cart";
4
+ import useUpdateCartLines from "@evenicanpm/storefront-core/src/api-manager/services/cart/mutations/update-cart-lines";
5
+ import getCart from "@evenicanpm/storefront-core/src/api-manager/services/cart/queries/get-cart";
6
+ /**
7
+ * Optional input for BOPIS
8
+ */
9
+ export interface AddToCartBopisInput {
14
10
  deliveryMode: string;
15
11
  warehouseId: string;
16
- };
12
+ }
17
13
 
18
- export default function useCart({
19
- cart,
20
- selectVariantId,
21
- recordId,
22
- }: UseCartProps) {
14
+ /**
15
+ * TODO: Why does this take variant id and record id.... no need. just take a single ID
16
+ *
17
+ * Handles adding and changing product in cart. To be re-used across the app.
18
+ * @param selectVariantId the variant id of the product's cartline.
19
+ * @param recordId the record id of the product's cartline to modify.
20
+ *
21
+ */
22
+ export default function useCart(
23
+ recordId: number,
24
+ selectVariantId?: number | undefined,
25
+ ) {
26
+ const { data: cart } = getCart.useData();
23
27
  const { mutate: deleteCartLine, isPending: deletePending } =
24
28
  useDeleteCartLine();
25
29
  const { mutate: updateCartLine, isPending: updatePending } =
@@ -28,10 +32,11 @@ export default function useCart({
28
32
 
29
33
  const loading = deletePending || updatePending || addPending;
30
34
 
31
- const handleCartAmountChange = (
32
- amount: number,
33
- currentCartLine?: CartLine,
34
- ) => {
35
+ const currentCartLine = cart?.CartLines?.find((item) => {
36
+ return item?.ProductId === (Number(selectVariantId) || recordId);
37
+ });
38
+
39
+ const handleCartAmountChange = (amount: number) => {
35
40
  if (amount === 0) {
36
41
  deleteCartLine({
37
42
  cartId: cart.Id,
@@ -78,5 +83,6 @@ export default function useCart({
78
83
  loading,
79
84
  handleCartAmountChange,
80
85
  handleAddToCart,
86
+ currentCartLine,
81
87
  };
82
88
  }
@@ -1,85 +1,138 @@
1
1
  "use client";
2
- import { useState } from "react";
2
+ // react and react-query
3
+ import { useReducer } from "react";
4
+ import { QueryClient, useQueryClient } from "@tanstack/react-query";
3
5
 
4
- // CUSTOM UTILS LIBRARY FUNCTION
6
+ // Types
5
7
  import { ProductDetails } from "@/api-manager/schemas/product.schema";
6
8
  import { ProductDimensionValueInventoryAvailability } from "@msdyn365-commerce/retail-proxy";
7
- import getProductById from "@/api-manager/services/product/queries/get-product-by-id";
8
9
 
9
- //=========================================
10
- type Props = {
11
- product: ProductDetails;
12
- };
10
+ // Data fetching
11
+ import getProductById from "@/api-manager/services/product/queries/get-product-by-id";
12
+ import getProductPrices from "@/api-manager/services/product/queries/get-product-prices";
13
+ import getProductAvailability from "@/api-manager/services/product/queries/get-product-availability";
13
14
 
14
- type SelectedDimension = Record<
15
+ // Define Types for Hook
16
+ export type SelectedDimensions = Record<
15
17
  number,
16
18
  ProductDimensionValueInventoryAvailability
17
19
  >;
18
- //========================================
20
+
21
+ type VariantState = {
22
+ selectDimensions: SelectedDimensions;
23
+ selectedVariantRecordId: number | undefined;
24
+ };
25
+
26
+ type VariantAction = {
27
+ type: "SELECT_DIMENSION";
28
+ dimensionValue: ProductDimensionValueInventoryAvailability;
29
+ totalDimensions: number;
30
+ };
19
31
 
20
32
  /**
21
33
  * This Hook handles the product variant selection and updates the selected variant id
22
34
  * based on the selected dimensions.
23
35
  */
24
- export default function useVariants({ product }: Props) {
36
+ export default function useVariants(product: ProductDetails) {
25
37
  const { DimensionValues } = product;
38
+ const queryClient = useQueryClient();
39
+ const [state, dispatch] = useReducer(variantReducer, {
40
+ selectDimensions: {},
41
+ selectedVariantRecordId: undefined,
42
+ });
26
43
 
27
- const [selectVariantId, setSelectVariantId] = useState<number>();
28
- const [selectDimensions, setSelectDimensions] = useState<SelectedDimension>(
29
- {},
30
- );
44
+ // Query is disabled if no variant selected
45
+ const { data: selectedVariant, isLoading: variantPending } =
46
+ getProductById.useData({ id: state.selectedVariantRecordId });
31
47
 
32
- const { data: productVariant, isPending: variantPending } =
33
- getProductById.useData({ id: selectVariantId });
34
-
35
- // HELPERS
36
- const allDimensionsSelected = (currentDimensions: SelectedDimension) =>
37
- Object.keys(currentDimensions).length === DimensionValues.length;
48
+ const allDimensionsSelected =
49
+ Object.keys(state.selectDimensions).length === DimensionValues.length;
38
50
 
39
51
  /**
40
52
  * Adds selected dimension to the current selectDimensions state
41
53
  * Updates the selectVariantId if all dimensions are selected
42
- * @param dimensionValue dimension that was last change to trigger this function
54
+ * @param dimensionValue dimension that was last changed to trigger this function
43
55
  */
44
- const handleChangeVariant = async (
56
+ const handleSelectDimension = async (
45
57
  dimensionValue: ProductDimensionValueInventoryAvailability,
46
58
  ) => {
47
- // Wrap the selection logic inside the callback
48
- // to ensure we have the correct current value of state
49
- setSelectDimensions((state) => {
50
- if (!dimensionValue?.DimensionTypeValue) {
51
- console.error("DimensionTypeValue is missing");
52
- return state;
53
- }
54
-
55
- const newDimensionsState = {
56
- ...state,
57
- [dimensionValue?.DimensionTypeValue]: dimensionValue,
58
- };
59
-
60
- if (!allDimensionsSelected(newDimensionsState)) return newDimensionsState;
61
-
62
- const dimensionsArray = Object.values(newDimensionsState);
63
-
64
- // DEDUCE PRODUCT ID FROM SELECTED DIMENSIONS
65
- const selectedVariantId = dimensionsArray.reduce(
66
- (intersectedIds: number[], { ProductIds }) => {
67
- return intersectedIds.filter((id) => ProductIds?.includes(id));
68
- },
69
- dimensionsArray[0]?.ProductIds || [],
70
- );
71
-
72
- setSelectVariantId(selectedVariantId[0]);
73
- return newDimensionsState;
59
+ prefetchPDPData(dimensionValue, queryClient);
60
+ dispatch({
61
+ type: "SELECT_DIMENSION",
62
+ dimensionValue,
63
+ totalDimensions: DimensionValues.length,
74
64
  });
75
65
  };
76
66
 
77
67
  return {
78
68
  allDimensionsSelected,
79
- handleChangeVariant,
80
- productVariant,
81
- selectVariantId,
69
+ handleChangeVariant: handleSelectDimension,
70
+ selectedVariant,
71
+ selectDimensions: state.selectDimensions,
82
72
  variantPending,
83
- selectDimensions,
84
73
  };
85
74
  }
75
+
76
+ /**
77
+ * To minimize loading time for the PDP dimensions.
78
+ */
79
+ const prefetchPDPData = (
80
+ dimensionValue: ProductDimensionValueInventoryAvailability,
81
+ queryClient: QueryClient,
82
+ ) => {
83
+ dimensionValue.ProductIds.map((id) => {
84
+ getProductById.prefetchData(queryClient, { id: id });
85
+ getProductPrices.prefetchData(queryClient, {
86
+ productIds: [id],
87
+ });
88
+
89
+ const shippingInventorySearchCriteria = {
90
+ searchCriteria: {
91
+ defaultWarehouseOnly: true,
92
+ productIds: [id],
93
+ },
94
+ };
95
+
96
+ getProductAvailability.prefetchData(
97
+ queryClient,
98
+ shippingInventorySearchCriteria,
99
+ );
100
+ });
101
+ };
102
+
103
+ /**
104
+ * Reducer synchronizes selected dimensions and variant ID
105
+ */
106
+ const variantReducer = (state: VariantState, action: VariantAction) => {
107
+ switch (action.type) {
108
+ case "SELECT_DIMENSION":
109
+ const newDimensionsState: SelectedDimensions = {
110
+ ...state.selectDimensions,
111
+ [action.dimensionValue?.DimensionTypeValue]: action.dimensionValue,
112
+ };
113
+
114
+ const allDimensionsSelected =
115
+ Object.keys(newDimensionsState).length === action.totalDimensions;
116
+
117
+ // We cannot select a variant until all dimensions are selected
118
+ if (!allDimensionsSelected)
119
+ return {
120
+ ...state,
121
+ selectDimensions: newDimensionsState,
122
+ selectedVariantRecordId: undefined,
123
+ };
124
+
125
+ const dimensionsArray = Object.values(newDimensionsState);
126
+
127
+ // Deduce product id from selected dimensions
128
+ const intersectedVariantIds = dimensionsArray.reduce((ids, dimension) => {
129
+ return ids.filter((id) => dimension.ProductIds?.includes(id));
130
+ }, dimensionsArray[0]?.ProductIds || []);
131
+
132
+ return {
133
+ ...state,
134
+ selectDimensions: newDimensionsState,
135
+ selectedVariantRecordId: intersectedVariantIds[0], // There can be only one!
136
+ };
137
+ }
138
+ };
@@ -3,6 +3,7 @@ import { PageSlug } from "./page-slugs";
3
3
  const buildDetailUrl = (name: string, id: number) =>
4
4
  `/${PageSlug.ProductDetail}/${normalizeName(name)}/${id}`;
5
5
 
6
- const normalizeName = (name: string) => name.toLowerCase().replace(/ /g, "-");
6
+ const normalizeName = (name: string) =>
7
+ name ? name.toLowerCase().replace(/ /g, "-") : "";
7
8
 
8
9
  export default buildDetailUrl;