@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,18 @@
1
+ import { Category } from "@msdyn365-commerce/retail-proxy";
2
+
3
+ /**
4
+ * Looks up the category name by id.
5
+ */
6
+ export const findCategoryNameById = (
7
+ searchCategory: number,
8
+ categories: any,
9
+ t: Function,
10
+ ) => {
11
+ if (searchCategory === 0) {
12
+ return t("Navigation.allCategoriesLabel");
13
+ }
14
+ return (
15
+ categories?.find((cat: Category) => cat.RecordId === searchCategory)
16
+ ?.Name || ""
17
+ );
18
+ };
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @module Section
3
+ */
4
+ "use client";
5
+
6
+ import Link from "next/link";
7
+ import { ReactNode } from "react";
8
+ // Mui Icon Components
9
+ import ArrowLeft from "@mui/icons-material/ArrowLeft";
10
+ import ArrowRight from "@mui/icons-material/ArrowRight";
11
+ // Local Custom Components
12
+ import { H2 } from "../../Typography";
13
+ import { FlexBetween, FlexBox } from "../../flex-box/index";
14
+ import useSettings from "../../../hooks/use-settings";
15
+
16
+ /**
17
+ * @category Sub-Component
18
+ */
19
+ export const SectionHeader = ({ children }: { children: ReactNode }) => {
20
+ return <FlexBetween mb={3}>{children}</FlexBetween>;
21
+ };
22
+
23
+ /**
24
+ * @category Props
25
+ */
26
+ export interface TitleProps {
27
+ /** Title of section */
28
+ title: string;
29
+ /** Icon to display beside title */
30
+ icon?: ReactNode;
31
+ }
32
+
33
+ /**
34
+ * @category Sub-Component
35
+ */
36
+ export const SectionHeaderTitle = ({ icon, title }: TitleProps) => (
37
+ <FlexBox alignItems="center" gap={1}>
38
+ {icon ?? null}
39
+ <H2 lineHeight={1}>{title}</H2>
40
+ </FlexBox>
41
+ );
42
+
43
+ /**
44
+ * @category Sub-Component
45
+ */
46
+ export const SectionHeaderSeeMoreLink = ({ link }: { link: string }) => {
47
+ const { settings } = useSettings();
48
+ return (
49
+ <Link href={link}>
50
+ <FlexBox alignItems="center" color="grey.600">
51
+ View all
52
+ {settings.direction === "ltr" ? (
53
+ <ArrowRight fontSize="small" color="inherit" />
54
+ ) : (
55
+ <ArrowLeft fontSize="small" color="inherit" />
56
+ )}
57
+ </FlexBox>
58
+ </Link>
59
+ );
60
+ };
61
+
62
+ SectionHeader.Title = SectionHeaderTitle;
63
+ SectionHeader.SeeMoreLink = SectionHeaderSeeMoreLink;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @module Section
3
+ */
4
+ import { ReactNode } from "react";
5
+ import Container from "@mui/material/Container";
6
+ import Box, { BoxProps } from "@mui/material/Box";
7
+ import { SectionHeader } from "./section-header";
8
+
9
+ interface Props extends BoxProps {
10
+ children: ReactNode;
11
+ }
12
+
13
+ /**
14
+ * @category Compound Component
15
+ */
16
+ export const Section = (props: Props) => {
17
+ const { children, ...others } = props;
18
+
19
+ return (
20
+ <Box mb={7.5} {...others}>
21
+ <Container className="pb-1">{children}</Container>
22
+ </Box>
23
+ );
24
+ };
25
+
26
+ Section.Header = SectionHeader;
@@ -0,0 +1 @@
1
+ export { Section } from "./compound/section";
@@ -3,8 +3,8 @@ import Drawer from "@mui/material/Drawer";
3
3
  // GLOBAL CUSTOM COMPONENT
4
4
  import Scrollbar from "@evenicanpm/storefront-core/src/components-v2/scrollbar/index";
5
5
 
6
- // ================================================================
7
6
  interface Props {
7
+ /** Optionally manage open state from parent, default is to use local state. */
8
8
  open?: boolean;
9
9
  width?: number;
10
10
  children: ReactNode;
@@ -12,7 +12,6 @@ interface Props {
12
12
  position?: "left" | "right";
13
13
  handler: (event: () => void) => ReactNode;
14
14
  }
15
- // ================================================================
16
15
 
17
16
  export default function SideNav(props: Props) {
18
17
  const {
@@ -23,10 +22,11 @@ export default function SideNav(props: Props) {
23
22
  handler,
24
23
  toggle,
25
24
  } = props;
26
-
25
+ /** If no external state, just use local. */
27
26
  const [sideNavOpen, setSideNavOpen] = useState(open);
28
27
  const handleToggleSideNav = () => setSideNavOpen(!sideNavOpen);
29
28
 
29
+ /** Keep external and local state in sync */
30
30
  useEffect(() => setSideNavOpen(open), [open]);
31
31
 
32
32
  const handleClose = toggle || handleToggleSideNav;
@@ -37,8 +37,7 @@ export default function SideNav(props: Props) {
37
37
  anchor={position}
38
38
  open={sideNavOpen}
39
39
  onClose={handleClose}
40
- SlideProps={{ style: { width } }}
41
- sx={{ zIndex: 15001 }}
40
+ slotProps={{ transition: { style: { width } } }}
42
41
  >
43
42
  <Scrollbar autoHide={false}>{children}</Scrollbar>
44
43
  </Drawer>
@@ -1 +1 @@
1
- export { default } from "./Sticky";
1
+ export { default } from "./sticky";
@@ -3,7 +3,7 @@
3
3
  import { useState } from "react";
4
4
  import { Button, ButtonProps } from "@mui/material";
5
5
  import T from "@evenicanpm/storefront-core/src/components-v2/T";
6
- import AddToWishlistDialog from "./add-to-wishlist-dialog";
6
+ import AddToWishlistDialog from "./";
7
7
  import { ProductDetails } from "@/api-manager/schemas/product.schema";
8
8
  import { Cart } from "@/api-manager/schemas/cart.schema";
9
9
 
@@ -0,0 +1,35 @@
1
+ import React, { useContext } from "react";
2
+ import { useTranslations } from "next-intl";
3
+ import { Grid, Button } from "@mui/material";
4
+ import { AddToWishListDialogContext } from "./context";
5
+
6
+ const AddToWishListBottomUI = () => {
7
+ const t = useTranslations("Account.Wishlists");
8
+ const { handleClose } = useContext(AddToWishListDialogContext);
9
+ return (
10
+ <Grid container spacing={3}>
11
+ <Grid
12
+ item
13
+ sm={12}
14
+ xs={12}
15
+ sx={{
16
+ display: "flex",
17
+ justifyContent: "flex-start",
18
+ gap: 2,
19
+ }}
20
+ >
21
+ <Button
22
+ color="primary"
23
+ variant="outlined"
24
+ size="small"
25
+ onClick={handleClose}
26
+ sx={{ height: 30.75 }}
27
+ >
28
+ {t("btnCancel")}
29
+ </Button>
30
+ </Grid>
31
+ </Grid>
32
+ );
33
+ };
34
+
35
+ export default AddToWishListBottomUI;
@@ -0,0 +1,79 @@
1
+ // EXTERNAL LIBRARIES AND REACT
2
+ import React from "react";
3
+ import { Dialog, DialogContent } from "@mui/material";
4
+ import { useSession } from "next-auth/react";
5
+
6
+ // LOCAL COMPONENTS
7
+ import DialogHeader from "./wishlist-dialog-header";
8
+ import WishlistList from "./add-to-wishlist-list";
9
+ import AddToWishListBottomUI from "./add-to-wishlist-bottom-ui";
10
+
11
+ // API AND CONTEXT
12
+ import getWishlists from "@/api-manager/services/user/queries/get-wishlists";
13
+ import { Cart } from "@evenicanpm/storefront-core/src/api-manager/schemas/cart.schema";
14
+ import { AddToWishListDialogContext } from "./context";
15
+
16
+ export interface AddToWishlistDialogProps {
17
+ open: boolean;
18
+ handleClose: () => void;
19
+ productId?: number;
20
+ cart?: Cart;
21
+ onSuccess?: () => void;
22
+ children: React.ReactNode;
23
+ }
24
+
25
+ /**
26
+ * A dialog with a list of wishlists and an action button either add or remove
27
+ * that will change depending if the selected product is in the list or not.
28
+ *
29
+ * @category Compound Component
30
+ * @example
31
+ *
32
+ * <AddToWishlistDialog
33
+ * cart={cart}
34
+ * open={open}
35
+ * handleClose={handleClose}
36
+ * productId={productId}
37
+ * >
38
+ * <AddToWishlistDialog.Header />
39
+ * <AddToWishlistDialog.List>
40
+ * <AddToWishlistDialog.List.Item />
41
+ * </AddToWishlistDialog.List>
42
+ * <AddToWishlistDialog.BottomUI />
43
+ * </AddToWishlistDialog>
44
+ *
45
+ */
46
+ export default function AddToWishlistDialog(props: AddToWishlistDialogProps) {
47
+ const { data: wishlists, isPending: isLoading } = getWishlists.useData();
48
+
49
+ const { data: session } = useSession();
50
+ const isAuthenticated = !!session;
51
+
52
+ if (isLoading) return null;
53
+
54
+ const handleClose = () => {
55
+ if (typeof props.handleClose === "function") {
56
+ props.handleClose();
57
+ }
58
+ };
59
+
60
+ return (
61
+ <AddToWishListDialogContext.Provider
62
+ value={{
63
+ wishlists,
64
+ isLoading,
65
+ props,
66
+ isAuthenticated,
67
+ handleClose,
68
+ }}
69
+ >
70
+ <Dialog open={props.open} onClose={handleClose}>
71
+ <DialogContent>{props.children}</DialogContent>
72
+ </Dialog>
73
+ </AddToWishListDialogContext.Provider>
74
+ );
75
+ }
76
+
77
+ AddToWishlistDialog.Header = DialogHeader;
78
+ AddToWishlistDialog.List = WishlistList;
79
+ AddToWishlistDialog.BottomUI = AddToWishListBottomUI;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @module Add-To-Wishlist-Dialog
3
+ */
4
+ import { useContext } from "react";
5
+
6
+ // LOCAL COMPONENTS
7
+ import WishlistItem from "./wishlist-dialog-item";
8
+ import NoRecords from "@evenicanpm/storefront-core/src/components-v2/no-records";
9
+
10
+ // API AND CONTEXT
11
+ import { AddToWishListDialogContext, WishListItemContext } from "./context";
12
+ import { Wishlist } from "@evenicanpm/storefront-core/src/api-manager/schemas/user.schema";
13
+
14
+ /**
15
+ * Maps out the list items (wishlists) or displays no records.
16
+ * @category Sub-Component
17
+ */
18
+ const WishlistList = ({ children }: { children: React.ReactNode }) => {
19
+ const { wishlists, isAuthenticated, isLoading } = useContext(
20
+ AddToWishListDialogContext,
21
+ );
22
+
23
+ if (isLoading) return;
24
+
25
+ if (!isAuthenticated) {
26
+ return <NoRecords message="Account.Wishlists.wishlistAddUnauthenticated" />;
27
+ }
28
+
29
+ if (wishlists.length === 0) {
30
+ return <NoRecords message="Account.Wishlists.noWishlists" />;
31
+ }
32
+
33
+ return wishlists?.map((wishlist: Wishlist, i: number) => (
34
+ <WishListItemContext.Provider value={{ wishlist }} key={i + wishlist.Name}>
35
+ {children}
36
+ </WishListItemContext.Provider>
37
+ ));
38
+ };
39
+
40
+ WishlistList.Item = WishlistItem;
41
+ export default WishlistList;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @module Add-To-Wishlist-Dialog
3
+ */
4
+ import { createContext } from "react";
5
+ import { Wishlist } from "@/api-manager/schemas/user.schema";
6
+ import { AddToWishlistDialogProps } from "./add-to-wishlist-dialog";
7
+
8
+ /**
9
+ * @category Context
10
+ */
11
+ export interface AddToWishlistDialogContext {
12
+ wishlists: Wishlist[];
13
+ isLoading: boolean;
14
+ props: AddToWishlistDialogProps;
15
+ isAuthenticated: boolean;
16
+ handleClose: () => void;
17
+ }
18
+
19
+ export const AddToWishListDialogContext =
20
+ createContext<AddToWishlistDialogContext>(null);
21
+
22
+ /**
23
+ * @category Context
24
+ */
25
+ export interface WishlistItemContext {
26
+ wishlist: Wishlist;
27
+ }
28
+
29
+ export const WishListItemContext = createContext<WishlistItemContext>(null);
@@ -0,0 +1,74 @@
1
+ /**
2
+ * @module Add-To-Wishlist-Dialog
3
+ */
4
+ import React from "react";
5
+ import { useSession } from "next-auth/react";
6
+ import useMediaQuery from "@mui/material/useMediaQuery";
7
+ import { useTranslations } from "next-intl";
8
+
9
+ // ICONS
10
+ import { MdFavorite } from "react-icons/md";
11
+ import { IconButton, Theme, styled } from "@mui/material";
12
+
13
+ // GLOBAL COMPONENTS
14
+ import { H2 } from "@evenicanpm/storefront-core/src/components-v2/Typography";
15
+ import FlexBox from "@evenicanpm/storefront-core/src/components-v2/flex-box/flex-box";
16
+
17
+ // LOCAL COMPONENTS
18
+ import CreateWishlistButton from "../../create-wishlist/create-wishlist-button";
19
+
20
+ // STYLED COMPONENT
21
+ const StyledBox = styled("div")(({ theme }) => ({
22
+ display: "flex",
23
+ marginTop: theme.spacing(-2),
24
+ marginBottom: theme.spacing(3),
25
+ "& .headerHold": {
26
+ flexGrow: 1,
27
+ alignItems: "center",
28
+ justifyContent: "space-between",
29
+ },
30
+ [theme.breakpoints.up("md")]: {
31
+ "& .sidenav": { display: "none" },
32
+ },
33
+ [theme.breakpoints.down("md")]: {
34
+ flexDirection: "column",
35
+ },
36
+ }));
37
+
38
+ /**
39
+ * The wishlist Diaglog header. Displays a create new list button if the
40
+ * user is authenticated. Was extracted from dashboard-header
41
+ * TODO: consider amalgamation.
42
+ * @category Sub-Components
43
+ */
44
+ export default function WishlistDialogHeader() {
45
+ const t = useTranslations();
46
+ const { data: session } = useSession();
47
+ const isAuthenticated = !!session;
48
+ const isTablet = useMediaQuery((theme: Theme) =>
49
+ theme.breakpoints.down(1025),
50
+ );
51
+
52
+ return (
53
+ <StyledBox>
54
+ <FlexBox
55
+ mt={2}
56
+ className="headerHold"
57
+ flexDirection={isTablet ? "column" : "row"}
58
+ >
59
+ <FlexBox alignItems="center" gap={0.5}>
60
+ <IconButton color="primary">
61
+ <MdFavorite />
62
+ </IconButton>
63
+ <H2 my={0} lineHeight={1} ellipsis>
64
+ {t("Account.Wishlists.heading")}
65
+ </H2>
66
+ </FlexBox>
67
+
68
+ <FlexBox className="button-container">
69
+ {isAuthenticated && <CreateWishlistButton />}
70
+ </FlexBox>
71
+ </FlexBox>
72
+ </StyledBox>
73
+ );
74
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * @module Add-To-Wishlist-Dialog
3
+ */
4
+ import { Button, CircularProgress } from "@mui/material";
5
+ import { useContext, useState } from "react";
6
+ import { AddToWishListDialogContext, WishListItemContext } from "./context";
7
+ import UseWishlist from "../hooks/use-add-to-wishlist";
8
+ import { format } from "date-fns";
9
+ import { Paragraph } from "@evenicanpm/storefront-core/src/components-v2/Typography";
10
+ import { StyledTableRow } from "../../styles";
11
+
12
+ /**
13
+ * Wishlist dialog list item. Displays info about the wishlist and
14
+ * also has a context-aware "action" button, either add or remove depending on
15
+ * if the currently selected product is in the list or not.
16
+ * @category Sub-Component
17
+ */
18
+ export default function WishlistModalItem() {
19
+ const [isDisabled, setIsDisabled] = useState(false);
20
+
21
+ const { wishlist } = useContext(WishListItemContext);
22
+ const { wishlists } = useContext(AddToWishListDialogContext);
23
+ const { props } = useContext(AddToWishListDialogContext);
24
+ const { handleAddToWishlist, handleRemoveFromWishlist, loading } =
25
+ UseWishlist();
26
+
27
+ const productInWishlist = wishlist.ProductListLines?.some(
28
+ (line) => line.ProductId === props.productId,
29
+ );
30
+
31
+ const action = productInWishlist
32
+ ? () => handleRemoveFromWishlist(wishlist.Id, props.productId)
33
+ : () => handleAddToWishlist(wishlist.Id, wishlists, props);
34
+
35
+ const buttonText = productInWishlist ? "Remove" : "Add";
36
+
37
+ return (
38
+ <StyledTableRow
39
+ sx={{
40
+ display: "grid",
41
+ gridTemplateColumns: "2fr 1fr 1fr 1fr",
42
+ alignItems: "center",
43
+ gap: 2,
44
+ padding: "10px 15px",
45
+ width: "500px",
46
+ cursor: "default",
47
+ }}
48
+ >
49
+ <Paragraph ellipsis sx={{ fontWeight: "bold" }}>
50
+ {wishlist?.Name ?? ""}
51
+ </Paragraph>
52
+ <Paragraph ellipsis>
53
+ {" "}
54
+ {format(
55
+ new Date(wishlist?.CreatedDateTime ?? wishlist?.LastUpdated ?? ""),
56
+ "MMM dd, yyyy",
57
+ )}
58
+ </Paragraph>
59
+ <Paragraph ellipsis>
60
+ {" "}
61
+ {`${wishlist?.ProductListLines?.length} products`}
62
+ </Paragraph>
63
+ <Button
64
+ onClick={() => {
65
+ // throttle to prevent race conditions
66
+ setIsDisabled(true);
67
+ action();
68
+ setTimeout(() => setIsDisabled(false), 1000);
69
+ }}
70
+ color="primary"
71
+ sx={{
72
+ bgcolor: loading ? "grey.100" : "primary.light",
73
+ height: "35px",
74
+ px: 4,
75
+ }}
76
+ disabled={isDisabled || loading}
77
+ >
78
+ {loading ? <CircularProgress size={10} /> : buttonText}
79
+ </Button>
80
+ </StyledTableRow>
81
+ );
82
+ }
@@ -0,0 +1,152 @@
1
+ /**
2
+ * @module Add-To-Wishlist-Dialog
3
+ */
4
+ // External libraries
5
+ import { useTranslations } from "next-intl";
6
+
7
+ // Core/storefront utilities
8
+ import { useNotification } from "@evenicanpm/storefront-core/src/providers/notifications/use-notification";
9
+ import {
10
+ CopyCartToWishlistInput,
11
+ ExtendedProductListLine,
12
+ WishlistLinesInput,
13
+ } from "@evenicanpm/storefront-core/src/api-manager/schemas/user.schema";
14
+
15
+ // API manager - mutations
16
+ import useAddToWishlist from "@/api-manager/services/user/mutations/add-to-wishlist";
17
+ import useCopyCartToWishlist from "@/api-manager/services/user/mutations/copy-cart-to-wishlist";
18
+ import useRemoveFromWishlist from "@/api-manager/services/user/mutations/remove-from-wishlist";
19
+
20
+ // API manager - queries and types
21
+ import getWishlists from "@/api-manager/services/user/queries/get-wishlists";
22
+ import { Wishlist } from "@/api-manager/schemas/user.schema";
23
+
24
+ // Component props
25
+ import { AddToWishlistDialogProps } from "../compound/add-to-wishlist-dialog";
26
+
27
+ /**
28
+ * Handles adding and removing products from a wishlist.
29
+ * @category Hook
30
+ */
31
+ export default function UseWishlist() {
32
+ const t = useTranslations("Account.Wishlists");
33
+ const { setNotification } = useNotification();
34
+ const { mutateAsync: addToWishlist, isPending: addPending } =
35
+ useAddToWishlist();
36
+ const { mutateAsync: copyCartToWishlist } = useCopyCartToWishlist();
37
+ const { mutateAsync: removeFromWishlist, isPending: removePending } =
38
+ useRemoveFromWishlist();
39
+ const { data: wishlists } = getWishlists.useSuspenseData();
40
+ const loading = addPending || removePending;
41
+
42
+ const handleAddToWishlist = async (
43
+ wishlistId: string,
44
+ wishlists: Wishlist[],
45
+ props: AddToWishlistDialogProps,
46
+ ) => {
47
+ if (props.productId) {
48
+ const selectedWishlist = wishlists.find((list) => list.Id === wishlistId);
49
+
50
+ const alreadyAdded = selectedWishlist.ProductListLines.some(
51
+ (product) => product.ProductId === props.productId,
52
+ );
53
+
54
+ if (alreadyAdded) {
55
+ setNotification({
56
+ message: "Product already exists in wishlist",
57
+ severity: "info",
58
+ });
59
+ return;
60
+ }
61
+
62
+ try {
63
+ const wishlistLine = [
64
+ {
65
+ ProductListId: wishlistId,
66
+ ProductId: props.productId,
67
+ Quantity: 1,
68
+ UnitOfMeasure: "ea",
69
+ },
70
+ ];
71
+
72
+ const wishlistLinesInput: WishlistLinesInput = {
73
+ Id: wishlistId,
74
+ ProductListLines: wishlistLine,
75
+ };
76
+
77
+ await addToWishlist(wishlistLinesInput);
78
+ setNotification({
79
+ message: t("wishlistLineAddSuccess"),
80
+ severity: "success",
81
+ });
82
+ if (typeof props.onSuccess === "function") {
83
+ props.onSuccess();
84
+ }
85
+ } catch (error) {
86
+ setNotification({
87
+ message: t("wishlistLineAddFailed"),
88
+ severity: "error",
89
+ });
90
+ }
91
+ } else if (props.cart) {
92
+ try {
93
+ const copyCartToWishlistInput: CopyCartToWishlistInput = {
94
+ Id: wishlistId,
95
+ CartID: props.cart.Id,
96
+ IsRewrite: false,
97
+ IsQuantityAggregate: true,
98
+ };
99
+
100
+ await copyCartToWishlist(copyCartToWishlistInput);
101
+ setNotification({
102
+ message: t("wishlistCartCopySuccess"),
103
+ severity: "success",
104
+ });
105
+ } catch (error) {
106
+ setNotification({
107
+ message: t("wishlistCartCopyFailed"),
108
+ severity: "error",
109
+ });
110
+ }
111
+ }
112
+ };
113
+
114
+ const handleRemoveFromWishlist = async (
115
+ wishlistId: string,
116
+ productId: number,
117
+ ) => {
118
+ // get the selected wishlist
119
+ const wishlist = wishlists.find((wishlist) => wishlist.Id === wishlistId);
120
+
121
+ try {
122
+ const extendedWishlistLine = wishlist.ProductListLines?.find(
123
+ (item: ExtendedProductListLine) => item.ProductId === productId,
124
+ );
125
+
126
+ if (extendedWishlistLine) {
127
+ const wishlistLinesInput: WishlistLinesInput = {
128
+ Id: wishlist.Id,
129
+ ProductListLines: [extendedWishlistLine],
130
+ };
131
+
132
+ await removeFromWishlist(wishlistLinesInput);
133
+
134
+ setNotification({
135
+ message: t("wishlistLineRemoveSuccess"),
136
+ severity: "success",
137
+ });
138
+ }
139
+ } catch (error) {
140
+ setNotification({
141
+ message: t("wishlistLineRemoveFailed"),
142
+ severity: "error",
143
+ });
144
+ }
145
+ };
146
+
147
+ return {
148
+ handleAddToWishlist,
149
+ handleRemoveFromWishlist,
150
+ loading,
151
+ };
152
+ }