@evenicanpm/storefront-core 1.0.2 → 1.0.3

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 (524) hide show
  1. package/package.json +1 -1
  2. package/src/api-manager/README.md +30 -22
  3. package/src/api-manager/datasources/e4/{e4-address.datasource.ts → address/e4-address.datasource.ts} +10 -10
  4. package/src/api-manager/datasources/e4/address/e4-address.remaps.ts +70 -0
  5. package/src/api-manager/datasources/e4/address/e4-address.translator.ts +98 -0
  6. package/src/api-manager/datasources/e4/{e4-cart.datasource.ts → cart/e4-cart.datasource.ts} +17 -16
  7. package/src/api-manager/datasources/e4/cart/e4-cart.remaps.ts +94 -0
  8. package/src/api-manager/datasources/e4/cart/e4-cart.translator.ts +23 -0
  9. package/src/api-manager/datasources/e4/categories/e4-categories.datasource.ts +38 -0
  10. package/src/api-manager/datasources/e4/categories/e4-categories.translator.ts +161 -0
  11. package/src/api-manager/datasources/e4/e4.datasource.ts +8 -39
  12. package/src/api-manager/datasources/e4/{e4-order.datasource.ts → order/e4-order.datasource.ts} +3 -3
  13. package/src/api-manager/datasources/e4/order/e4-order.remaps.ts +101 -0
  14. package/src/api-manager/datasources/e4/{e4-organization.datasource.ts → organization/e4-organization.datasource.ts} +1 -1
  15. package/src/api-manager/datasources/e4/{e4-product.datasource.ts → product/e4-product.datasource.ts} +13 -11
  16. package/src/api-manager/datasources/e4/product/e4-product.remaps.ts +88 -0
  17. package/src/api-manager/datasources/e4/{e4.translator.ts → product/e4-product.translator.ts} +9 -329
  18. package/src/api-manager/datasources/e4/{e4-session.datasource.ts → session/e4-session.datasource.ts} +3 -3
  19. package/src/api-manager/datasources/e4/session/e4-session.translator.ts +18 -0
  20. package/src/api-manager/datasources/e4/user/e4-user.datasource.ts +13 -6
  21. package/src/api-manager/datasources/e4/user/e4-user.remaps.ts +49 -0
  22. package/src/api-manager/datasources/e4/user/e4-user.translator.ts +23 -2
  23. package/src/api-manager/datasources/e4/utils/unwrap-e4-variants.ts +1 -1
  24. package/src/api-manager/index.ts +11 -6
  25. package/src/api-manager/schemas/user.schema.ts +3 -1
  26. package/src/api-manager/services/cart/mutations/add-to-cart.ts +1 -1
  27. package/src/api-manager/services/cart/mutations/checkout.ts +1 -2
  28. package/src/api-manager/services/product/server/product.server.ts +4 -1
  29. package/src/api-manager/types/Datasource.ts +1 -5
  30. package/src/cms/blocks/BlockManager.tsx +67 -0
  31. package/src/cms/blocks/Components/BrandLogosScroller.tsx +72 -0
  32. package/src/cms/blocks/Components/CategoryCard.tsx +47 -0
  33. package/src/cms/blocks/Components/CategoryCarousel/index.tsx +60 -0
  34. package/src/cms/blocks/Components/FeaturePill.tsx +99 -0
  35. package/src/cms/blocks/Components/FeaturedCategories.tsx +41 -0
  36. package/src/cms/blocks/Components/FeaturedProducts.tsx +41 -0
  37. package/src/cms/blocks/Components/Footer/data/index.ts +32 -0
  38. package/src/cms/blocks/Components/Footer/index.tsx +88 -0
  39. package/src/cms/blocks/Components/Footer/interfaces.ts +37 -0
  40. package/src/cms/blocks/Components/Footer/sections/FooterAppStore.tsx +45 -0
  41. package/src/cms/blocks/Components/Footer/sections/FooterContact.tsx +36 -0
  42. package/src/cms/blocks/Components/Footer/sections/FooterLinks.tsx +30 -0
  43. package/src/cms/blocks/Components/Footer/sections/FooterLogo.tsx +26 -0
  44. package/src/cms/blocks/Components/Footer/sections/FooterSocialLinks.tsx +70 -0
  45. package/src/cms/blocks/Components/Footer/styles/index.ts +39 -0
  46. package/src/cms/blocks/Components/Footer.tsx +77 -0
  47. package/src/cms/blocks/Components/Hero.tsx +73 -0
  48. package/src/cms/blocks/Components/HeroCarousel/index.tsx +42 -0
  49. package/src/cms/blocks/Components/Image.tsx +39 -0
  50. package/src/cms/blocks/Components/MediaCard.tsx +41 -0
  51. package/src/cms/blocks/Components/ProductCarousel/index.tsx +82 -0
  52. package/src/cms/blocks/Components/ProductSectionFullWidth/index.tsx +103 -0
  53. package/src/cms/blocks/Components/RichText.tsx +19 -0
  54. package/src/cms/blocks/Components/Seo/index.tsx +48 -0
  55. package/src/cms/blocks/Components/Services/index.tsx +21 -0
  56. package/src/cms/blocks/Components/Services/service-card.tsx +73 -0
  57. package/src/cms/blocks/Components/shared/featured-product-card.tsx +29 -0
  58. package/src/cms/blocks/Components/shared/product-category-item.tsx +49 -0
  59. package/src/cms/blocks/Components/shared/product-grid.tsx +48 -0
  60. package/src/cms/blocks/Components/shared/top-categories-card.tsx +66 -0
  61. package/src/cms/blocks/Components/shared/top-rating-product-card.tsx +66 -0
  62. package/src/cms/blocks/Icons/Components/Category.tsx +14 -0
  63. package/src/cms/blocks/Icons/Components/DottedStar.tsx +40 -0
  64. package/src/cms/blocks/Icons/Components/FallbackIcon.tsx +33 -0
  65. package/src/cms/blocks/Icons/Components/GiftBox.tsx +18 -0
  66. package/src/cms/blocks/Icons/Components/Light.tsx +13 -0
  67. package/src/cms/blocks/Icons/Components/NewArrival.tsx +18 -0
  68. package/src/cms/blocks/Icons/Components/RankBadge.tsx +39 -0
  69. package/src/cms/blocks/Icons/index.ts +32 -0
  70. package/src/cms/blocks/index.tsx +16 -0
  71. package/src/cms/blocks/interfaces.ts +240 -0
  72. package/src/components/Notifications/README.md +1 -1
  73. package/src/components/Notifications/notification-context.tsx +1 -1
  74. package/src/components/README.md +3 -8
  75. package/src/components/_components/MiniCartClient.tsx +1 -1
  76. package/src/components/_components/navbar/category-based-menu/components/categories.tsx +1 -1
  77. package/src/components/_components/navbar/mega-menu/mega-menu.tsx +1 -1
  78. package/src/components/_components/navbar/nav-list/nav-item-child.tsx +2 -2
  79. package/src/components/_components/product-cards/product-card-1/product-card-1-wrapper.tsx +1 -1
  80. package/src/components/_components/products-view/product-view-dialog.tsx +1 -1
  81. package/src/components/_components/settings/setting.tsx +1 -1
  82. package/src/components/_components/wishlist/add-to-wishlist-dialog.tsx +1 -1
  83. package/src/components/_components/wishlist/components/create-new-list.tsx +1 -1
  84. package/src/components/_components/wishlist/remove-from-wishlist-dialog.tsx +1 -1
  85. package/src/components/_components/wishlist-modal/add-to-wishlist-dialog.tsx +1 -1
  86. package/src/components/_components/wishlist-modal/remove-from-wishlist-dialog.tsx +1 -1
  87. package/src/components/countries-input.tsx +0 -1
  88. package/src/components-v2/BazaarCard.tsx +21 -0
  89. package/src/components-v2/BazaarImage.tsx +12 -0
  90. package/src/components-v2/BazaarMenu.tsx +47 -0
  91. package/src/components-v2/BazaarSwitch.tsx +37 -0
  92. package/src/components-v2/BazaarTextField.tsx +73 -0
  93. package/src/components-v2/BoxShadowCard.tsx +16 -0
  94. package/src/components-v2/DropZone.tsx +86 -0
  95. package/src/components-v2/HoverBox.tsx +22 -0
  96. package/src/components-v2/Image.tsx +5 -0
  97. package/src/components-v2/ImageWithFallback.tsx +51 -0
  98. package/src/components-v2/LazyImage.tsx +12 -0
  99. package/src/components-v2/Loading.tsx +36 -0
  100. package/src/components-v2/MiniCartClient.tsx +65 -0
  101. package/src/components-v2/README.md +4 -0
  102. package/src/components-v2/SearchInput.tsx +28 -0
  103. package/src/components-v2/SnackbarProvider.tsx +32 -0
  104. package/src/components-v2/T/index.tsx +15 -0
  105. package/src/components-v2/Typography.tsx +227 -0
  106. package/src/components-v2/WhiteButton.tsx +20 -0
  107. package/src/components-v2/accordion/accordion-header.tsx +43 -0
  108. package/src/components-v2/accordion/index.ts +1 -0
  109. package/src/components-v2/bazaar-types.ts +84 -0
  110. package/src/components-v2/carousel/carousel.tsx +72 -0
  111. package/src/components-v2/carousel/components/carousel-arrows.tsx +60 -0
  112. package/src/components-v2/carousel/components/carousel-dots.tsx +21 -0
  113. package/src/components-v2/carousel/index.ts +3 -0
  114. package/src/components-v2/carousel/styles/index.ts +93 -0
  115. package/src/components-v2/carousel-cards/carousel-card-1/carousel-card-1.tsx +64 -0
  116. package/src/components-v2/carousel-cards/carousel-card-1/index.ts +1 -0
  117. package/src/components-v2/carousel-cards/carousel-card-1/styles.ts +34 -0
  118. package/src/components-v2/carousel-cards/carousel-card-2/carousel-card-2.tsx +78 -0
  119. package/src/components-v2/carousel-cards/carousel-card-2/index.ts +1 -0
  120. package/src/components-v2/carousel-cards/carousel-card-2/styles.ts +26 -0
  121. package/src/components-v2/carousel-cards/carousel-card-3/carousel-card-3.tsx +37 -0
  122. package/src/components-v2/carousel-cards/carousel-card-3/index.ts +1 -0
  123. package/src/components-v2/carousel-cards/carousel-card-3/styles.ts +28 -0
  124. package/src/components-v2/carousel-cards/carousel-card-4/carousel-card-4.tsx +81 -0
  125. package/src/components-v2/carousel-cards/carousel-card-4/index.ts +1 -0
  126. package/src/components-v2/carousel-cards/carousel-card-4/styles.ts +27 -0
  127. package/src/components-v2/categories/category-list/category-list.tsx +59 -0
  128. package/src/components-v2/categories/category-list/index.ts +1 -0
  129. package/src/components-v2/categories/category-list/styles.ts +29 -0
  130. package/src/components-v2/categories/category-list/types.ts +4 -0
  131. package/src/components-v2/categories/category-list-item/category-menu-item.tsx +37 -0
  132. package/src/components-v2/categories/category-list-item/index.ts +1 -0
  133. package/src/components-v2/categories/category-list-item/styles.ts +35 -0
  134. package/src/components-v2/categories/category-menu.tsx +51 -0
  135. package/src/components-v2/categories/mega-menu/banner.tsx +60 -0
  136. package/src/components-v2/categories/mega-menu/column-list.tsx +70 -0
  137. package/src/components-v2/categories/mega-menu/mega-menu-1.tsx +37 -0
  138. package/src/components-v2/categories/mega-menu/mega-menu-2.tsx +37 -0
  139. package/src/components-v2/categories/mega-menu/styles.ts +25 -0
  140. package/src/components-v2/categories/types.ts +16 -0
  141. package/src/components-v2/category-cards/category-card-1/category-card-1.tsx +21 -0
  142. package/src/components-v2/category-cards/category-card-1/index.ts +1 -0
  143. package/src/components-v2/category-cards/category-card-1/styles.ts +37 -0
  144. package/src/components-v2/countdown/count-box.tsx +19 -0
  145. package/src/components-v2/countdown/count-down.tsx +24 -0
  146. package/src/components-v2/countdown/index.tsx +2 -0
  147. package/src/components-v2/countdown/useCountDown.ts +41 -0
  148. package/src/components-v2/countries-input.tsx +73 -0
  149. package/src/components-v2/data-table/index.ts +2 -0
  150. package/src/components-v2/data-table/table-header.tsx +91 -0
  151. package/src/components-v2/data-table/table-pagination.tsx +36 -0
  152. package/src/components-v2/flex-box/flex-between.tsx +14 -0
  153. package/src/components-v2/flex-box/flex-box.tsx +9 -0
  154. package/src/components-v2/flex-box/flex-row-center.tsx +9 -0
  155. package/src/components-v2/flex-box/index.ts +5 -0
  156. package/src/components-v2/footer/components/about-links.tsx +23 -0
  157. package/src/components-v2/footer/components/app-store.tsx +38 -0
  158. package/src/components-v2/footer/components/customer-care-links.tsx +21 -0
  159. package/src/components-v2/footer/components/logo.tsx +23 -0
  160. package/src/components-v2/footer/components/social-links.tsx +43 -0
  161. package/src/components-v2/footer/data/index.ts +54 -0
  162. package/src/components-v2/footer/footer-1.tsx +62 -0
  163. package/src/components-v2/footer/footer-2.tsx +57 -0
  164. package/src/components-v2/footer/footer-3.tsx +53 -0
  165. package/src/components-v2/footer/footer-4.tsx +71 -0
  166. package/src/components-v2/footer/index.ts +4 -0
  167. package/src/components-v2/footer/styles/index.ts +42 -0
  168. package/src/components-v2/header/components/categories-menu.tsx +23 -0
  169. package/src/components-v2/header/components/mobile-header.tsx +75 -0
  170. package/src/components-v2/header/components/user.test.tsx +200 -0
  171. package/src/components-v2/header/components/user.tsx +204 -0
  172. package/src/components-v2/header/header.tsx +63 -0
  173. package/src/components-v2/header/hooks/use-header.ts +13 -0
  174. package/src/components-v2/header/index.ts +1 -0
  175. package/src/components-v2/header/sticky-header.tsx +17 -0
  176. package/src/components-v2/header/styles/index.ts +24 -0
  177. package/src/components-v2/icons/cart-bag.tsx +13 -0
  178. package/src/components-v2/icons/category-outline.tsx +29 -0
  179. package/src/components-v2/icons/category.tsx +12 -0
  180. package/src/components-v2/icons/home.tsx +19 -0
  181. package/src/components-v2/icons/search.tsx +13 -0
  182. package/src/components-v2/icons/shopping-bag-outlined.tsx +13 -0
  183. package/src/components-v2/icons/up-down.tsx +21 -0
  184. package/src/components-v2/icons/user.tsx +13 -0
  185. package/src/components-v2/icons/user2.tsx +14 -0
  186. package/src/components-v2/mini-cart/__tests__/cart-item.test.tsx +174 -0
  187. package/src/components-v2/mini-cart/__tests__/mini-cart.test.tsx +121 -0
  188. package/src/components-v2/mini-cart/__tests__/test-cart-empty.json +84 -0
  189. package/src/components-v2/mini-cart/__tests__/test-cart-with-item.json +244 -0
  190. package/src/components-v2/mini-cart/components/bottom-actions.tsx +27 -0
  191. package/src/components-v2/mini-cart/components/cart-item.tsx +147 -0
  192. package/src/components-v2/mini-cart/components/empty-view.tsx +29 -0
  193. package/src/components-v2/mini-cart/components/top-header.tsx +37 -0
  194. package/src/components-v2/mini-cart/index.ts +1 -0
  195. package/src/components-v2/mini-cart/mini-cart.tsx +107 -0
  196. package/src/components-v2/mobile-navigation/index.ts +3 -0
  197. package/src/components-v2/mobile-navigation/mobile-navigation-bar.tsx +73 -0
  198. package/src/components-v2/mobile-navigation/styles/index.ts +63 -0
  199. package/src/components-v2/nav-link/index.ts +5 -0
  200. package/src/components-v2/nav-link/nav-link-2.tsx +32 -0
  201. package/src/components-v2/nav-link/nav-link-3.tsx +67 -0
  202. package/src/components-v2/nav-link/nav-link.tsx +53 -0
  203. package/src/components-v2/navbar/categories.tsx +27 -0
  204. package/src/components-v2/navbar/category-based-menu/category-based-menu.tsx +52 -0
  205. package/src/components-v2/navbar/category-based-menu/components/categories.tsx +44 -0
  206. package/src/components-v2/navbar/category-based-menu/components/category-item.tsx +31 -0
  207. package/src/components-v2/navbar/category-based-menu/components/child-categories.tsx +38 -0
  208. package/src/components-v2/navbar/category-based-menu/index.ts +1 -0
  209. package/src/components-v2/navbar/category-based-menu/styles.ts +81 -0
  210. package/src/components-v2/navbar/category-based-menu/types.ts +18 -0
  211. package/src/components-v2/navbar/index.ts +1 -0
  212. package/src/components-v2/navbar/mega-menu/category-list.tsx +29 -0
  213. package/src/components-v2/navbar/mega-menu/index.ts +1 -0
  214. package/src/components-v2/navbar/mega-menu/mega-menu.tsx +71 -0
  215. package/src/components-v2/navbar/mega-menu/styles.ts +43 -0
  216. package/src/components-v2/navbar/mobile-menu/index.ts +1 -0
  217. package/src/components-v2/navbar/mobile-menu/mobile-menu.tsx +70 -0
  218. package/src/components-v2/navbar/mobile-menu/render-levels.test.tsx +71 -0
  219. package/src/components-v2/navbar/mobile-menu/render-levels.tsx +62 -0
  220. package/src/components-v2/navbar/nav-list/cms-nav.test.tsx +84 -0
  221. package/src/components-v2/navbar/nav-list/index.ts +1 -0
  222. package/src/components-v2/navbar/nav-list/nav-item-child.tsx +66 -0
  223. package/src/components-v2/navbar/nav-list/nav-list.tsx +119 -0
  224. package/src/components-v2/navbar/navbar.tsx +43 -0
  225. package/src/components-v2/navbar/styles.ts +90 -0
  226. package/src/components-v2/navbar/utils/transform-nav.test.ts +209 -0
  227. package/src/components-v2/navbar/utils/transform-nav.ts +43 -0
  228. package/src/components-v2/newsletter/index.ts +1 -0
  229. package/src/components-v2/newsletter/newsletter.tsx +112 -0
  230. package/src/components-v2/newsletter/social-icons.tsx +35 -0
  231. package/src/components-v2/newsletter/styles.ts +65 -0
  232. package/src/components-v2/page-sidenav/grocery-side-nav/components/link-item.tsx +21 -0
  233. package/src/components-v2/page-sidenav/grocery-side-nav/components/list-item.tsx +27 -0
  234. package/src/components-v2/page-sidenav/grocery-side-nav/components/nav-accordion.tsx +36 -0
  235. package/src/components-v2/page-sidenav/grocery-side-nav/components/render-child.tsx +26 -0
  236. package/src/components-v2/page-sidenav/grocery-side-nav/grocery-side-nav.tsx +32 -0
  237. package/src/components-v2/page-sidenav/grocery-side-nav/index.ts +1 -0
  238. package/src/components-v2/page-sidenav/grocery-side-nav/styles/index.ts +11 -0
  239. package/src/components-v2/page-sidenav/health-beauty-side-nav/components/list-item.tsx +27 -0
  240. package/src/components-v2/page-sidenav/health-beauty-side-nav/components/nav-accordion.tsx +44 -0
  241. package/src/components-v2/page-sidenav/health-beauty-side-nav/components/render-child.tsx +20 -0
  242. package/src/components-v2/page-sidenav/health-beauty-side-nav/health-beauty-side-nav.tsx +43 -0
  243. package/src/components-v2/page-sidenav/health-beauty-side-nav/index.ts +1 -0
  244. package/src/components-v2/page-sidenav/health-beauty-side-nav/styles/index.ts +27 -0
  245. package/src/components-v2/page-sidenav/side-navbar/components/list-item.tsx +25 -0
  246. package/src/components-v2/page-sidenav/side-navbar/components/nav-accordion.tsx +46 -0
  247. package/src/components-v2/page-sidenav/side-navbar/components/render-child.tsx +20 -0
  248. package/src/components-v2/page-sidenav/side-navbar/index.ts +1 -0
  249. package/src/components-v2/page-sidenav/side-navbar/side-nav-bar.tsx +77 -0
  250. package/src/components-v2/page-sidenav/side-navbar/styles/index.ts +73 -0
  251. package/src/components-v2/page-sidenav/side-navbar-2/components/button-content.tsx +32 -0
  252. package/src/components-v2/page-sidenav/side-navbar-2/components/sidebar-accordion.tsx +66 -0
  253. package/src/components-v2/page-sidenav/side-navbar-2/index.ts +1 -0
  254. package/src/components-v2/page-sidenav/side-navbar-2/side-navbar-2.tsx +63 -0
  255. package/src/components-v2/page-sidenav/side-navbar-2/styles/index.ts +68 -0
  256. package/src/components-v2/product-cards/discount-chip.tsx +43 -0
  257. package/src/components-v2/product-cards/product-card-1/components/hover-actions.tsx +37 -0
  258. package/src/components-v2/product-cards/product-card-1/components/quantity-buttons.tsx +65 -0
  259. package/src/components-v2/product-cards/product-card-1/index.ts +1 -0
  260. package/src/components-v2/product-cards/product-card-1/product-card-1-wrapper.tsx +304 -0
  261. package/src/components-v2/product-cards/product-card-1/product-card.tsx +107 -0
  262. package/src/components-v2/product-cards/product-card-1/styles/index.ts +46 -0
  263. package/src/components-v2/product-cards/product-card-10/index.ts +1 -0
  264. package/src/components-v2/product-cards/product-card-10/product-card.tsx +128 -0
  265. package/src/components-v2/product-cards/product-card-10/styles/index.ts +38 -0
  266. package/src/components-v2/product-cards/product-card-11/index.ts +1 -0
  267. package/src/components-v2/product-cards/product-card-11/product-card.tsx +66 -0
  268. package/src/components-v2/product-cards/product-card-11/styles/index.ts +16 -0
  269. package/src/components-v2/product-cards/product-card-12/index.ts +1 -0
  270. package/src/components-v2/product-cards/product-card-12/product-card.tsx +42 -0
  271. package/src/components-v2/product-cards/product-card-12/styles/index.ts +16 -0
  272. package/src/components-v2/product-cards/product-card-13/index.ts +1 -0
  273. package/src/components-v2/product-cards/product-card-13/product-card.tsx +48 -0
  274. package/src/components-v2/product-cards/product-card-13/styles/index.ts +25 -0
  275. package/src/components-v2/product-cards/product-card-14/index.ts +1 -0
  276. package/src/components-v2/product-cards/product-card-14/product-card.tsx +125 -0
  277. package/src/components-v2/product-cards/product-card-14/styles/index.ts +40 -0
  278. package/src/components-v2/product-cards/product-card-15/index.ts +1 -0
  279. package/src/components-v2/product-cards/product-card-15/product-card.tsx +121 -0
  280. package/src/components-v2/product-cards/product-card-15/styles/index.ts +57 -0
  281. package/src/components-v2/product-cards/product-card-16/components/quantity-buttons.tsx +54 -0
  282. package/src/components-v2/product-cards/product-card-16/index.ts +1 -0
  283. package/src/components-v2/product-cards/product-card-16/product-card.tsx +116 -0
  284. package/src/components-v2/product-cards/product-card-16/styles/index.ts +18 -0
  285. package/src/components-v2/product-cards/product-card-2/components/favorite-button.tsx +29 -0
  286. package/src/components-v2/product-cards/product-card-2/components/product-price.tsx +26 -0
  287. package/src/components-v2/product-cards/product-card-2/index.ts +1 -0
  288. package/src/components-v2/product-cards/product-card-2/product-card.tsx +70 -0
  289. package/src/components-v2/product-cards/product-card-3/components/hover-actions.tsx +83 -0
  290. package/src/components-v2/product-cards/product-card-3/index.ts +1 -0
  291. package/src/components-v2/product-cards/product-card-3/product-card.tsx +110 -0
  292. package/src/components-v2/product-cards/product-card-3/styles/index.ts +89 -0
  293. package/src/components-v2/product-cards/product-card-4/components/hover-actions.tsx +50 -0
  294. package/src/components-v2/product-cards/product-card-4/index.ts +1 -0
  295. package/src/components-v2/product-cards/product-card-4/product-card.tsx +128 -0
  296. package/src/components-v2/product-cards/product-card-4/styles/index.ts +66 -0
  297. package/src/components-v2/product-cards/product-card-5/components/button-actions.tsx +49 -0
  298. package/src/components-v2/product-cards/product-card-5/components/hover-actions.tsx +50 -0
  299. package/src/components-v2/product-cards/product-card-5/index.ts +1 -0
  300. package/src/components-v2/product-cards/product-card-5/product-card.tsx +137 -0
  301. package/src/components-v2/product-cards/product-card-5/styles/index.ts +94 -0
  302. package/src/components-v2/product-cards/product-card-6/components/hover-actions.tsx +50 -0
  303. package/src/components-v2/product-cards/product-card-6/index.ts +1 -0
  304. package/src/components-v2/product-cards/product-card-6/product-card.tsx +121 -0
  305. package/src/components-v2/product-cards/product-card-6/styles/index.ts +63 -0
  306. package/src/components-v2/product-cards/product-card-7/components/product-status.tsx +18 -0
  307. package/src/components-v2/product-cards/product-card-7/components/quantity-buttons.tsx +47 -0
  308. package/src/components-v2/product-cards/product-card-7/index.ts +1 -0
  309. package/src/components-v2/product-cards/product-card-7/product-card.tsx +139 -0
  310. package/src/components-v2/product-cards/product-card-7/styles/index.ts +98 -0
  311. package/src/components-v2/product-cards/product-card-8/index.ts +1 -0
  312. package/src/components-v2/product-cards/product-card-8/product-card.tsx +151 -0
  313. package/src/components-v2/product-cards/product-card-8/styles/index.ts +61 -0
  314. package/src/components-v2/product-cards/product-card-9/components/add-to-cart.tsx +63 -0
  315. package/src/components-v2/product-cards/product-card-9/components/favorite-button.tsx +27 -0
  316. package/src/components-v2/product-cards/product-card-9/components/tags.tsx +33 -0
  317. package/src/components-v2/product-cards/product-card-9/index.ts +1 -0
  318. package/src/components-v2/product-cards/product-card-9/product-card.tsx +169 -0
  319. package/src/components-v2/product-cards/product-card-wishlist/components/hover-actions.tsx +37 -0
  320. package/src/components-v2/product-cards/product-card-wishlist/index.ts +1 -0
  321. package/src/components-v2/product-cards/product-card-wishlist/product-card.tsx +118 -0
  322. package/src/components-v2/product-cards/product-card-wishlist/styles/index.ts +53 -0
  323. package/src/components-v2/product-cards/product-price.tsx +26 -0
  324. package/src/components-v2/product-cards/product-rating.tsx +28 -0
  325. package/src/components-v2/product-cards/product-title.tsx +24 -0
  326. package/src/components-v2/product-cards/use-product.ts +35 -0
  327. package/src/components-v2/product-dimensions/components/dimensions-group-error.tsx +46 -0
  328. package/src/components-v2/product-dimensions/components/dimensions-group-label.tsx +27 -0
  329. package/src/components-v2/product-dimensions/components/dimensions-group-list-chip.tsx +78 -0
  330. package/src/components-v2/product-dimensions/components/dimensions-group-list.tsx +24 -0
  331. package/src/components-v2/product-dimensions/components/dimensions-group.tsx +55 -0
  332. package/src/components-v2/product-dimensions/components/dimensions.tsx +84 -0
  333. package/src/components-v2/product-dimensions/index.tsx +38 -0
  334. package/src/components-v2/product-dimensions/utils/has-selected-dimension.ts +20 -0
  335. package/src/components-v2/product-quantity-buttons/product-quantity-buttons.tsx +88 -0
  336. package/src/components-v2/products-view/product-view-dialog.tsx +218 -0
  337. package/src/components-v2/products-view/products-grid-view.tsx +52 -0
  338. package/src/components-v2/products-view/products-list-view.tsx +49 -0
  339. package/src/components-v2/progress/index.ts +1 -0
  340. package/src/components-v2/progress/progress.tsx +77 -0
  341. package/src/components-v2/scrollbar/index.ts +1 -0
  342. package/src/components-v2/scrollbar/scrollbar.tsx +27 -0
  343. package/src/components-v2/scrollbar/styles.ts +15 -0
  344. package/src/components-v2/search-box/__test__/search-input-category.test.tsx +110 -0
  345. package/src/components-v2/search-box/__test__/search-input.test.tsx +137 -0
  346. package/src/components-v2/search-box/__test__/search-results.json +165 -0
  347. package/src/components-v2/search-box/components/category-dropdown.tsx +61 -0
  348. package/src/components-v2/search-box/components/search-result.tsx +86 -0
  349. package/src/components-v2/search-box/hooks/use-search.ts +63 -0
  350. package/src/components-v2/search-box/index.ts +2 -0
  351. package/src/components-v2/search-box/search-input-category.test.tsx +110 -0
  352. package/src/components-v2/search-box/search-input-category.tsx +203 -0
  353. package/src/components-v2/search-box/search-input.test.tsx +41 -0
  354. package/src/components-v2/search-box/search-input.tsx +66 -0
  355. package/src/components-v2/search-box/styles/index.ts +47 -0
  356. package/src/components-v2/section-header/index.ts +2 -0
  357. package/src/components-v2/section-header/section-creator.tsx +29 -0
  358. package/src/components-v2/section-header/section-header.tsx +44 -0
  359. package/src/components-v2/service-cards/icon-component.tsx +18 -0
  360. package/src/components-v2/service-cards/service-card-1/index.ts +1 -0
  361. package/src/components-v2/service-cards/service-card-1/service-card-1.tsx +42 -0
  362. package/src/components-v2/service-cards/service-card-2/index.ts +1 -0
  363. package/src/components-v2/service-cards/service-card-2/service-card-2.tsx +37 -0
  364. package/src/components-v2/service-cards/service-card-3/index.ts +1 -0
  365. package/src/components-v2/service-cards/service-card-3/service-card-3.tsx +28 -0
  366. package/src/components-v2/service-cards/service-card-3/styles.ts +23 -0
  367. package/src/components-v2/settings/index.ts +1 -0
  368. package/src/components-v2/settings/setting.tsx +141 -0
  369. package/src/components-v2/settings/styles.ts +57 -0
  370. package/src/components-v2/shop-card/index.ts +1 -0
  371. package/src/components-v2/shop-card/shop-card.tsx +152 -0
  372. package/src/components-v2/shop-card/styles.ts +33 -0
  373. package/src/components-v2/side-nav/index.ts +1 -0
  374. package/src/components-v2/side-nav/side-nav.tsx +49 -0
  375. package/src/components-v2/site-logo.tsx +17 -0
  376. package/src/components-v2/sticky/Sticky.tsx +62 -0
  377. package/src/components-v2/sticky/index.ts +1 -0
  378. package/src/components-v2/sticky/styles.ts +38 -0
  379. package/src/components-v2/sticky-wrapper/index.ts +1 -0
  380. package/src/components-v2/sticky-wrapper/sticky-wrapper.tsx +21 -0
  381. package/src/components-v2/sticky-wrapper/styles.ts +25 -0
  382. package/src/components-v2/stories/story-content/index.ts +1 -0
  383. package/src/components-v2/stories/story-content/story-content.tsx +28 -0
  384. package/src/components-v2/stories/story-content/styles.ts +22 -0
  385. package/src/components-v2/stories/story-item/index.ts +1 -0
  386. package/src/components-v2/stories/story-item/story-item.tsx +24 -0
  387. package/src/components-v2/stories/story-item/styles.ts +11 -0
  388. package/src/components-v2/stories/story-viewer/index.ts +1 -0
  389. package/src/components-v2/stories/story-viewer/story-viewer.tsx +44 -0
  390. package/src/components-v2/stories/story-viewer/styles.ts +15 -0
  391. package/src/components-v2/subscribe-input/index.ts +1 -0
  392. package/src/components-v2/subscribe-input/styles.ts +14 -0
  393. package/src/components-v2/subscribe-input/subscribe-input.tsx +43 -0
  394. package/src/components-v2/topbar/index.ts +1 -0
  395. package/src/components-v2/topbar/styles.ts +55 -0
  396. package/src/components-v2/topbar/top-bar.tsx +115 -0
  397. package/src/components-v2/utils/constants.ts +8 -0
  398. package/src/components-v2/wishlist/add-to-wishlist-dialog.tsx +161 -0
  399. package/src/components-v2/wishlist/components/create-new-list.tsx +167 -0
  400. package/src/components-v2/wishlist/components/create-wishlist-button.tsx +40 -0
  401. package/src/components-v2/wishlist/components/dashboard-header.tsx +123 -0
  402. package/src/components-v2/wishlist/components/navigation.tsx +87 -0
  403. package/src/components-v2/wishlist/components/no-records.tsx +20 -0
  404. package/src/components-v2/wishlist/components/wishlist-modal-item.tsx +66 -0
  405. package/src/components-v2/wishlist/remove-from-wishlist-dialog.tsx +175 -0
  406. package/src/components-v2/wishlist/styles.ts +61 -0
  407. package/src/components-v2/wishlist-modal/TODO.md +10 -0
  408. package/src/components-v2/wishlist-modal/add-to-wishlist-button.tsx +69 -0
  409. package/src/components-v2/wishlist-modal/add-to-wishlist-dialog.tsx +161 -0
  410. package/src/components-v2/wishlist-modal/remove-from-wishlist-dialog.tsx +174 -0
  411. package/src/components-v2/wishlist-modal/wishlist-modal-item.tsx +65 -0
  412. package/src/pages/README.md +4 -0
  413. package/src/pages/product-details/product-intro/product-intro.tsx +3 -1
  414. package/src/pages/product-list/quick-view-dialog-content.tsx +4 -2
  415. package/src/pages-v2/README.md +4 -0
  416. package/src/pages-v2/account/addresses/address-form.tsx +289 -0
  417. package/src/pages-v2/account/addresses/address-item.tsx +104 -0
  418. package/src/pages-v2/account/dashboard-header.tsx +123 -0
  419. package/src/pages-v2/account/navigation.tsx +87 -0
  420. package/src/pages-v2/account/no-records.tsx +20 -0
  421. package/src/pages-v2/account/orders/icons/delivery.tsx +14 -0
  422. package/src/pages-v2/account/orders/icons/package-box.tsx +13 -0
  423. package/src/pages-v2/account/orders/icons/truck-filled.tsx +14 -0
  424. package/src/pages-v2/account/orders/order-progress.tsx +114 -0
  425. package/src/pages-v2/account/orders/order-row.tsx +64 -0
  426. package/src/pages-v2/account/orders/order-summary.tsx +87 -0
  427. package/src/pages-v2/account/orders/ordered-products.tsx +121 -0
  428. package/src/pages-v2/account/profile/profile-button.test.tsx +59 -0
  429. package/src/pages-v2/account/profile/profile-button.tsx +50 -0
  430. package/src/pages-v2/account/profile/user-info.tsx +62 -0
  431. package/src/pages-v2/account/styles.ts +32 -0
  432. package/src/pages-v2/account/table-row.tsx +19 -0
  433. package/src/pages-v2/account/wishlist/create-new-list.tsx +167 -0
  434. package/src/pages-v2/account/wishlist/create-wishlist-button.tsx +40 -0
  435. package/src/pages-v2/account/wishlist/wishlist-item.tsx +82 -0
  436. package/src/pages-v2/blog/pagination.tsx +38 -0
  437. package/src/pages-v2/cart/cart-item.tsx +312 -0
  438. package/src/pages-v2/cart/checkout-form.tsx +122 -0
  439. package/src/pages-v2/cart/coupon-entry.tsx +90 -0
  440. package/src/pages-v2/cart/estimate-shipping.tsx +183 -0
  441. package/src/pages-v2/cart/wrapper.tsx +30 -0
  442. package/src/pages-v2/checkout/checkout-alt-form/address-card.tsx +76 -0
  443. package/src/pages-v2/checkout/checkout-alt-form/checkout-form.tsx +131 -0
  444. package/src/pages-v2/checkout/checkout-alt-form/checkout-step.tsx +120 -0
  445. package/src/pages-v2/checkout/checkout-alt-form/customer-information.tsx +94 -0
  446. package/src/pages-v2/checkout/checkout-alt-form/delivery-address.tsx +174 -0
  447. package/src/pages-v2/checkout/checkout-alt-form/delivery-date.tsx +114 -0
  448. package/src/pages-v2/checkout/checkout-alt-form/delivery-options.tsx +190 -0
  449. package/src/pages-v2/checkout/checkout-alt-form/edit-address-form.tsx +130 -0
  450. package/src/pages-v2/checkout/checkout-alt-form/heading.tsx +50 -0
  451. package/src/pages-v2/checkout/checkout-alt-form/index.ts +1 -0
  452. package/src/pages-v2/checkout/checkout-alt-form/new-address-form.tsx +299 -0
  453. package/src/pages-v2/checkout/checkout-alt-form/node.tsx +9 -0
  454. package/src/pages-v2/checkout/checkout-alt-form/payment-details.tsx +347 -0
  455. package/src/pages-v2/checkout/checkout-alt-form/safe-card-preview-data.tsx +36 -0
  456. package/src/pages-v2/checkout/checkout-alt-form/types.ts +20 -0
  457. package/src/pages-v2/checkout/checkout-alt-summary/cart-item.tsx +42 -0
  458. package/src/pages-v2/checkout/checkout-alt-summary/checkout-alt-summary.tsx +42 -0
  459. package/src/pages-v2/checkout/checkout-alt-summary/index.ts +1 -0
  460. package/src/pages-v2/checkout/checkout-alt-summary/list-item.tsx +31 -0
  461. package/src/pages-v2/confirmation/address.tsx +25 -0
  462. package/src/pages-v2/confirmation/confirmation-summary.tsx +55 -0
  463. package/src/pages-v2/confirmation/ordered-products.tsx +115 -0
  464. package/src/pages-v2/product-details/available-shops.tsx +48 -0
  465. package/src/pages-v2/product-details/bopis/find-in-store-button.tsx +63 -0
  466. package/src/pages-v2/product-details/bopis/find-in-store-modal.tsx +257 -0
  467. package/src/pages-v2/product-details/bopis/pickup-option-select.tsx +127 -0
  468. package/src/pages-v2/product-details/bopis/search-header.tsx +69 -0
  469. package/src/pages-v2/product-details/checkbox-label.tsx +20 -0
  470. package/src/pages-v2/product-details/currency.ts +64 -0
  471. package/src/pages-v2/product-details/frequently-bought.tsx +97 -0
  472. package/src/pages-v2/product-details/frequently-product-card.tsx +63 -0
  473. package/src/pages-v2/product-details/product-comment.tsx +49 -0
  474. package/src/pages-v2/product-details/product-description.tsx +22 -0
  475. package/src/pages-v2/product-details/product-filter-card.tsx +265 -0
  476. package/src/pages-v2/product-details/product-intro/product-intro-images.tsx +90 -0
  477. package/src/pages-v2/product-details/product-intro/product-intro.tsx +256 -0
  478. package/src/pages-v2/product-details/product-review.tsx +131 -0
  479. package/src/pages-v2/product-details/product-tabs.tsx +51 -0
  480. package/src/pages-v2/product-details/related-products.tsx +42 -0
  481. package/src/pages-v2/product-details/types.ts +11 -0
  482. package/src/pages-v2/product-list/breadcrumbs.tsx +39 -0
  483. package/src/pages-v2/product-list/checkbox-label.tsx +20 -0
  484. package/src/pages-v2/product-list/facet-group.tsx +125 -0
  485. package/src/pages-v2/product-list/facet.tsx +36 -0
  486. package/src/pages-v2/product-list/list-filter.tsx +43 -0
  487. package/src/pages-v2/product-list/pagination.tsx +80 -0
  488. package/src/pages-v2/product-list/product-list-context.tsx +302 -0
  489. package/src/pages-v2/product-list/product-list-state.ts +187 -0
  490. package/src/pages-v2/product-list/product-rating.tsx +16 -0
  491. package/src/pages-v2/product-list/quick-view-dialog-content.tsx +207 -0
  492. package/src/pages-v2/product-list/quick-view-dialog.tsx +54 -0
  493. package/src/pages-v2/product-list/range-filter.tsx +125 -0
  494. package/src/pages-v2/product-list/scrollbar.tsx +38 -0
  495. package/src/pages-v2/product-list/search-bar.tsx +162 -0
  496. package/src/pages-v2/product-list/selected-facets.tsx +80 -0
  497. package/src/pages-v2/product-list/side-nav.tsx +49 -0
  498. package/src/pages-v2/product-list/swatch.tsx +80 -0
  499. package/src/pages-v2/product-list/types.ts +18 -0
  500. package/src/pages-v2/product-list/use-product-list.ts +12 -0
  501. package/src/pages-v2/product-list/useCategoryFilter.tsx +26 -0
  502. package/src/pages-v2/product-list/utils/facet-helpers.ts +5 -0
  503. package/src/pages-v2/product-list/utils/generate-breadcrumbs.ts +30 -0
  504. package/src/pages-v2/product-list/utils/getCategoryFilterFromSlug.ts +153 -0
  505. package/src/pages-v2/product-list/utils/product-list-helper.ts +111 -0
  506. package/src/pages-v2/product-list/utils/product-list-types.ts +41 -0
  507. package/src/pages-v2/product-list/utils/search-for-category.ts +76 -0
  508. package/src/pages-v2/product-list/utils/sort-options.ts +44 -0
  509. package/src/pages-v2/product-list/utils/use-previous-refiners.ts +14 -0
  510. package/src/pages-v2/quickorder/order-upload.tsx +150 -0
  511. package/src/pages-v2/quickorder/quick-order-form.tsx +346 -0
  512. package/src/pages-v2/quickorder/quick-order-row.tsx +144 -0
  513. package/src/providers/nav-provider/index.tsx +59 -0
  514. package/src/providers/nav-provider/utils/createLink.ts +15 -0
  515. package/src/providers/notifications/README.md +15 -0
  516. package/src/providers/notifications/notification-context.tsx +82 -0
  517. package/src/providers/notifications/use-notification.ts +12 -0
  518. package/tsconfig.json +3 -2
  519. package/typedoc.js +10 -0
  520. package/src/api-manager/api-manager.config.json +0 -12
  521. package/src/api-manager/datasources/e4/e4.remaps.ts +0 -355
  522. package/src/api-manager/datasources/e4/e4.translator.test.ts +0 -202
  523. /package/src/hooks/{use-cart.tsx → use-cart.ts} +0 -0
  524. /package/src/hooks/{use-variants.tsx → use-variants.ts} +0 -0
@@ -1,45 +1,26 @@
1
- // Schemas
2
- import { extendedCartSchema, Cart } from "@/api-manager/schemas/cart.schema";
1
+ import getGraphqlClient from "../../../lib/get-graphql-client";
3
2
  import {
4
3
  productSchema,
5
4
  ProductDetails,
6
5
  SearchByCriteriaInput,
7
6
  ProductPrice,
8
7
  } from "@/api-manager/schemas/product.schema";
9
- import { Address } from "@/api-manager/schemas/address.schema";
10
- import { User } from "@/api-manager/schemas/user.schema";
11
- import { Session } from "@/api-manager/schemas/session.schema";
12
- import { merge } from "object-mapper";
13
- import getGraphqlClient from "../../lib/get-graphql-client";
14
- // Interfaces
15
- import {
16
- UserInput,
17
- AddressInput,
18
- Attribute,
19
- Category as E4Category,
20
- Country,
21
- Shipping,
22
- Cart as E4Cart,
23
- Product,
24
- Session as E4Session,
25
- } from "./graphqlRequestSdk";
8
+ import { productPriceSchema } from "@/api-manager/schemas/d365.schema";
26
9
  import {
27
- Category,
28
10
  ProductRefinerValue,
29
11
  ProductSearchResult,
30
12
  } from "@msdyn365-commerce/retail-proxy";
31
13
  import {
32
- cartMap,
14
+ Attribute,
15
+ Category as E4Category,
16
+ Product,
17
+ } from "../graphqlRequestSdk";
18
+ import { merge } from "object-mapper";
19
+ import {
33
20
  productDetailsMap,
34
21
  productMap,
35
22
  productPricesMap,
36
- addressReverseMap,
37
- countriesMap,
38
- countryMap,
39
- deliveryOptionsMap,
40
- } from "./e4.remaps";
41
- import { CategoryHierarchy } from "@/lib/category-helpers";
42
- import { productPriceSchema } from "@/api-manager/schemas/d365.schema";
23
+ } from "./e4-product.remaps";
43
24
 
44
25
  interface TransformedRefinerValue {
45
26
  RefinerRecordId: number;
@@ -302,25 +283,6 @@ export const refinersTransformValidate = (
302
283
  * required fields, create a custom schema with only frontend required fields
303
284
  */
304
285
 
305
- /**
306
- * Transforms the E4 AddToCart response to a Cart retail-proxy object
307
- * Add parameters to transform model as needed
308
- *
309
- * @param data the E4 Cart object
310
- * @returns the transformed cart object
311
- */
312
- export const cartTransformValidate = (cart: E4Cart): Cart => {
313
- if (!(cart && cart?.id)) throw new Error("Not a valid cart");
314
- const transformedData = merge(cart, cartMap);
315
- try {
316
- extendedCartSchema.parse(transformedData);
317
- } catch (e) {
318
- console.warn("Cart data does not match retail-proxy schema", e);
319
- }
320
-
321
- return transformedData as Cart;
322
- };
323
-
324
286
  /**
325
287
  * Transforms the E4 Product response to a Product retail-proxy object
326
288
  * @param productData the E4 Product object
@@ -382,285 +344,3 @@ export const productWithCategoryTransformValidate = (
382
344
 
383
345
  return productTransform;
384
346
  };
385
-
386
- export const userTransformInput = (user: User): UserInput => {
387
- let formattedUser = {};
388
-
389
- if (user.FirstName && user.LastName) {
390
- formattedUser = {
391
- firstName: user?.FirstName,
392
- lastName: user?.LastName,
393
- };
394
- }
395
-
396
- if (user?.DefaultShippingAddressId) {
397
- const shippingInfo = {
398
- defaultShippingAddressId: user?.DefaultShippingAddressId,
399
- };
400
- formattedUser = { ...formattedUser, ...shippingInfo };
401
- }
402
-
403
- return formattedUser;
404
- };
405
-
406
- /**
407
- * Transforms the e4 API session data to Session schema.
408
- */
409
- export const sessionTransformValidate = (data: E4Session): Session => {
410
- const formattedSession: Session = {
411
- Id: data?.id,
412
- User: {
413
- AccountNumber: data?.user?.accountId ?? "",
414
- FirstName: data?.user?.firstName ?? "",
415
- LastName: data?.user?.lastName ?? "",
416
- Email: data?.user?.email ?? "",
417
- // Add other required fields with defaults if needed
418
- },
419
- };
420
- return formattedSession;
421
- };
422
-
423
- /**
424
- * Transforms the Address schema to e4 API address
425
- */
426
- export const addressTransform = async (address: Address) => {
427
- const countryId = await getCountryId(address?.ThreeLetterISORegionName ?? "");
428
- const stateId = await getStateId(address?.State ?? "", countryId ?? "");
429
-
430
- const formattedAddress: AddressInput = merge(address, addressReverseMap);
431
- formattedAddress.firstName = "";
432
- formattedAddress.lastName = "";
433
- formattedAddress.address2 = "";
434
- formattedAddress.stateId = stateId;
435
- formattedAddress.countryId = countryId;
436
- formattedAddress.addressTypeId = 1; // We only create and update shipping addresses.
437
-
438
- return formattedAddress;
439
- };
440
-
441
- export const countriesTransformValidate = (countries: Country[]) => {
442
- if (Array.isArray(countries) && countries.length) {
443
- return countries.map((country) => merge(country, countriesMap));
444
- }
445
- return [];
446
- };
447
-
448
- export const countryTransformValidate = (country: Country) => {
449
- if (country?.state && country?.state.length) {
450
- return merge(country, countryMap);
451
- }
452
- return [];
453
- };
454
-
455
- const countriesCache = new Map<string, Country[]>();
456
- const countryCache = new Map<string, Country>();
457
-
458
- /**
459
- * For d365 country id and value are 'USA' but for e4 it is '80175021088166' and 'USA'.
460
- * So use countryId, to map the codes back to ids before API calls.
461
- */
462
- export const getCountryId = async (code: string) => {
463
- const cacheKey = "countries";
464
- let countries: Country[] = [];
465
-
466
- if (countriesCache.has(cacheKey)) {
467
- countries = countriesCache.get(cacheKey) ?? countries;
468
- } else {
469
- const e4Api = await getGraphqlClient();
470
- const { data } = await e4Api.e4CountryList();
471
- countriesCache.set(cacheKey, data?.countries as Country[]);
472
- countries = data?.countries as Country[];
473
- }
474
- const country = countries.find(
475
- (c: { isoAlpha3Code: string }) => c?.isoAlpha3Code === code,
476
- );
477
-
478
- return country?.id;
479
- };
480
-
481
- const getStateId = async (stateCode: string, countryId: string) => {
482
- const cacheKey = `states-${countryId}`;
483
- let country: Country = {
484
- id: "",
485
- isoAlpha2Code: "",
486
- isoAlpha3Code: "",
487
- name: "",
488
- };
489
-
490
- if (countryCache.has(cacheKey)) {
491
- country = countryCache.get(cacheKey) ?? country;
492
- } else {
493
- const e4Api = await getGraphqlClient();
494
- const { data } = await e4Api.e4Country({ id: countryId });
495
- country = data?.country as Country;
496
- countryCache.set(cacheKey, country);
497
- }
498
-
499
- const state = country?.state?.find((s) => s?.code === stateCode);
500
-
501
- return state?.id;
502
- };
503
-
504
- export const deliveryOptionsTransformValidate = (options: Shipping[]) => {
505
- if (Array.isArray(options) && options.length) {
506
- return options.map((option) => merge(option, deliveryOptionsMap));
507
- }
508
- return [];
509
- };
510
-
511
- interface TransformedCategoryNode extends Category {
512
- Slug: string;
513
- Url: string;
514
- NeutralizedName: string;
515
- Children?: TransformedCategoryNode[];
516
- ParentCategory?: number;
517
- }
518
-
519
- export const categoryTransformValidate = (
520
- rawCategories: E4Category[],
521
- rootParentId = 1,
522
- urlPrefix = "e4",
523
- ): CategoryHierarchy[] => {
524
- function generateSlug(name: string): string {
525
- if (!name) return "";
526
- return name
527
- .toLowerCase()
528
- .replace(/\s+/g, "-")
529
- .replace(/[^\w-]+/g, "")
530
- .replace(/--+/g, "-")
531
- .replace(/^-+/, "")
532
- .replace(/-+$/, "");
533
- }
534
-
535
- function createTransformedNode(
536
- rawCategory: E4Category,
537
- ): TransformedCategoryNode | null {
538
- let recordIdNum: number;
539
- try {
540
- recordIdNum = parseInt(String(rawCategory.id), 10);
541
- if (isNaN(recordIdNum)) throw new Error("Invalid RecordId");
542
- } catch (e) {
543
- console.warn(`Skipping category due to invalid id:`, rawCategory);
544
- return null;
545
- }
546
-
547
- const categoryName = rawCategory.name || "Unnamed Category";
548
- const slug = generateSlug(categoryName);
549
- let parentIdNum: number | undefined = undefined;
550
- if (rawCategory.parentId != null) {
551
- const parsedParentId = parseInt(String(rawCategory.parentId), 10);
552
- if (!isNaN(parsedParentId)) parentIdNum = parsedParentId;
553
- else
554
- console.warn(
555
- `Invalid parentId format for id ${recordIdNum}:`,
556
- rawCategory.parentId,
557
- );
558
- }
559
-
560
- const node: TransformedCategoryNode = {
561
- RecordId: recordIdNum,
562
- Name: categoryName,
563
- ParentCategory: parentIdNum,
564
- DisplayOrder: 0,
565
- LocalizedDescription: categoryName,
566
- Images: [
567
- {
568
- Uri: `Categories/${categoryName}.png`,
569
- IsDefault: false,
570
- IsSelfHosted: false,
571
- Priority: 0,
572
- IsAdditionalMedia: false,
573
- MediaTypeValue: 0,
574
- DisplayOrder: 0,
575
- IsApplicableForChildEntities: false,
576
- ExtensionProperties: [],
577
- },
578
- ],
579
- NameTranslations: [
580
- { Language: "en-us", Text: categoryName, ExtensionProperties: [] },
581
- ],
582
- ExtensionProperties: [],
583
- NeutralizedName: categoryName,
584
- Slug: slug,
585
- Url: "",
586
- Children: [],
587
- };
588
- return node;
589
- }
590
-
591
- function calculateUrls(
592
- categoryNode: TransformedCategoryNode,
593
- basePath: string,
594
- prefix: string,
595
- ): void {
596
- const currentPath = basePath
597
- ? `${basePath}/${categoryNode.Slug}`
598
- : `${prefix}/${categoryNode.Slug}`;
599
- categoryNode.Url = `${currentPath}/${categoryNode.RecordId}`;
600
- // Check if Children exists before iterating
601
- if (categoryNode?.Children && categoryNode?.Children?.length > 0) {
602
- categoryNode.Children.forEach((child: TransformedCategoryNode) =>
603
- calculateUrls(child, currentPath, prefix),
604
- );
605
- }
606
- }
607
-
608
- function removeEmptyChildren(node: TransformedCategoryNode): void {
609
- if (node.Children) {
610
- if (node.Children.length === 0) {
611
- delete node.Children;
612
- } else {
613
- node.Children.forEach(removeEmptyChildren);
614
- }
615
- }
616
- }
617
-
618
- if (!rawCategories || !Array.isArray(rawCategories)) {
619
- console.error(
620
- "Invalid input received by categoryTransformValidate: must be an array.",
621
- rawCategories,
622
- );
623
- return [];
624
- }
625
-
626
- const categoryMap = new Map<number, TransformedCategoryNode>();
627
- const rootNodes: TransformedCategoryNode[] = [];
628
-
629
- rawCategories.forEach((rawCat: E4Category) => {
630
- const transformedNode = createTransformedNode(rawCat);
631
- if (transformedNode)
632
- categoryMap.set(transformedNode.RecordId, transformedNode);
633
- });
634
-
635
- categoryMap.forEach((node: TransformedCategoryNode) => {
636
- const parentId = node.ParentCategory;
637
- if (parentId === rootParentId) rootNodes.push(node);
638
- else if (parentId !== undefined && categoryMap.has(parentId)) {
639
- const parentNode = categoryMap.get(parentId);
640
- if (parentNode) {
641
- if (!parentNode.Children) {
642
- parentNode.Children = [];
643
- }
644
- parentNode.Children.push(node);
645
- parentNode.Children.sort(
646
- (a, b) =>
647
- (a.DisplayOrder ?? 0) - (b.DisplayOrder ?? 0) ||
648
- (a.Name ?? "").localeCompare(b.Name ?? ""),
649
- );
650
- }
651
- }
652
- });
653
-
654
- rootNodes.forEach((rootNode: TransformedCategoryNode) =>
655
- calculateUrls(rootNode, "", urlPrefix),
656
- );
657
- rootNodes.sort(
658
- (a, b) =>
659
- (a.DisplayOrder ?? 0) - (b.DisplayOrder ?? 0) ||
660
- (a.Name ?? "").localeCompare(b.Name ?? ""),
661
- );
662
-
663
- rootNodes.forEach(removeEmptyChildren);
664
-
665
- return rootNodes as CategoryHierarchy[];
666
- };
@@ -1,9 +1,9 @@
1
- import getGraphqlClient from "../../lib/get-graphql-client";
1
+ import getGraphqlClient from "../../../lib/get-graphql-client";
2
2
  import {
3
3
  Session,
4
4
  SessionInitInput,
5
5
  } from "@/api-manager/schemas/session.schema";
6
- import * as translator from "./e4.translator";
6
+ import * as sessionTranslator from "./e4-session.translator";
7
7
 
8
8
  const session = {
9
9
  async sessionInit(input: SessionInitInput): Promise<Session> {
@@ -19,7 +19,7 @@ const session = {
19
19
  throw new Error("Error adding user to e4 session");
20
20
  }
21
21
 
22
- return translator.sessionTransformValidate(
22
+ return sessionTranslator.sessionTransformValidate(
23
23
  data?.customerInitSession ?? { id: "" },
24
24
  );
25
25
  },
@@ -0,0 +1,18 @@
1
+ import { Session } from "@/api-manager/schemas/session.schema";
2
+ import { Session as E4Session } from "../graphqlRequestSdk";
3
+ /**
4
+ * Transforms the e4 API session data to Session schema.
5
+ */
6
+ export const sessionTransformValidate = (data: E4Session): Session => {
7
+ const formattedSession: Session = {
8
+ Id: data?.id,
9
+ User: {
10
+ AccountNumber: data?.user?.accountId ?? "",
11
+ FirstName: data?.user?.firstName ?? "",
12
+ LastName: data?.user?.lastName ?? "",
13
+ Email: data?.user?.email ?? "",
14
+ // Add other required fields with defaults if needed
15
+ },
16
+ };
17
+ return formattedSession;
18
+ };
@@ -7,9 +7,10 @@ import {
7
7
  WishlistCreateInput,
8
8
  WishlistDetailInput,
9
9
  WishlistLinesInput,
10
+ ExtendedWishlist,
10
11
  } from "@/api-manager/schemas/user.schema";
11
- import * as translator from "../e4.translator";
12
- import { userMap } from "../e4.remaps";
12
+ import * as userTranslator from "./e4-user.translator";
13
+ import { userMap } from "./e4-user.remaps";
13
14
  import { merge } from "object-mapper";
14
15
  import { UserApi } from "@/api-manager/types/Datasource";
15
16
  import { translateWishList } from "./e4-user.translator";
@@ -18,7 +19,7 @@ const user: UserApi = {
18
19
  async updateUser(user: User): Promise<User> {
19
20
  const e4Api = await getGraphqlClient(true);
20
21
 
21
- const userInput = translator.userTransformInput(user);
22
+ const userInput = userTranslator.userTransformInput(user);
22
23
 
23
24
  const { data, errors } = await e4Api.e4UserUpdateMD({
24
25
  user: userInput,
@@ -66,7 +67,9 @@ const user: UserApi = {
66
67
  return translateWishList(data);
67
68
  },
68
69
 
69
- async getWishlistDetails(input: WishlistDetailInput): Promise<Wishlist> {
70
+ async getWishlistDetails(
71
+ input: WishlistDetailInput,
72
+ ): Promise<ExtendedWishlist> {
70
73
  const e4Api = await getGraphqlClient(true);
71
74
 
72
75
  const { data, errors } = await e4Api.e4WishListReadMD({ id: input.Id });
@@ -109,29 +112,33 @@ const user: UserApi = {
109
112
  throw new Error("No wishlist found");
110
113
  }
111
114
 
112
- return wishList as Wishlist;
115
+ return wishList as unknown as Wishlist;
113
116
  },
114
117
  async deleteWishlist(input: WishlistDetailInput): Promise<void> {
115
118
  const e4Api = await getGraphqlClient(true);
116
119
 
117
- const { data, errors } = await e4Api.deleteWishList({ id: input.Id });
120
+ const { errors } = await e4Api.deleteWishList({ id: input.Id });
118
121
 
119
122
  if (errors) {
120
123
  throw new Error("Error creating wishlist");
121
124
  }
122
125
  },
126
+ // @ts-ignore
123
127
  async updateWishlist(input: WishlistLinesInput): Promise<Wishlist> {
124
128
  throw new Error("updateWishlist not implemented");
125
129
  },
126
130
 
131
+ // @ts-ignore
127
132
  async addProductsToWishlist(input: WishlistLinesInput): Promise<Wishlist> {
128
133
  throw new Error("addProductsToWishlist not implemented");
129
134
  },
130
135
 
136
+ // @ts-ignore
131
137
  async removeProductsFromWishlist(input: WishlistLinesInput): Promise<void> {
132
138
  throw new Error("removeProductsFromWishlist not implemented");
133
139
  },
134
140
 
141
+ // @ts-ignore
135
142
  async copyCartToWishlist(input: CopyCartToWishlistInput): Promise<Wishlist> {
136
143
  throw new Error("copyCartToWishlist not implemented");
137
144
  },
@@ -1,3 +1,52 @@
1
+ /**
2
+ * Maps E4 API responses to the D365 data structure.
3
+ *
4
+ * This file uses the `object-mapper` library to transform
5
+ * API responses into a format compatible with D365.
6
+ *
7
+ * https://github.com/wankdanker/node-object-mapper
8
+ *
9
+ */
10
+
11
+ import { Address } from "@msdyn365-commerce/retail-proxy";
12
+ import { merge } from "object-mapper";
13
+ import { Address as E4Address, Me } from "../graphqlRequestSdk";
14
+ import { addressMap } from "../address/e4-address.remaps";
15
+
16
+ export const userMap = {
17
+ id: {
18
+ key: "RecordId",
19
+ transform: (id: string) => {
20
+ return Number(id);
21
+ },
22
+ },
23
+ code: {
24
+ // we don't need AccountNumber in e4 storefront,
25
+ // if we need it bring account data and map accountId here.
26
+ key: "AccountNumber",
27
+ transform: () => {
28
+ return "";
29
+ },
30
+ },
31
+ firstName: "FirstName",
32
+ lastName: "LastName",
33
+ email: "Email",
34
+ defaultShippingAddressId: "DefaultShippingAddressId",
35
+ addresses: {
36
+ key: "Addresses",
37
+ transform: (addresses: E4Address[], source: Me) => {
38
+ if (!(addresses && addresses?.length)) return [];
39
+ const mapped = merge(addresses || [], addressMap) as Address[];
40
+ return mapped.map((address: Address) => ({
41
+ ...address,
42
+ IsPrimary:
43
+ address?.IsPrimary ||
44
+ address?.Id === source?.defaultShippingAddressId,
45
+ }));
46
+ },
47
+ },
48
+ };
49
+
1
50
  export const wishListMap = {
2
51
  "[].id": "[].Id",
3
52
  "[].name": "[].Name",
@@ -1,10 +1,31 @@
1
- import { E4WishListListSmQuery } from "../graphqlRequestSdk";
1
+ import { User } from "@/api-manager/schemas/user.schema";
2
+ import { E4WishListListSmQuery, UserInput } from "../graphqlRequestSdk";
2
3
  import { merge } from "object-mapper";
3
4
  import { wishListMap } from "./e4-user.remaps";
4
5
  import { Wishlist } from "@/api-manager/schemas/user.schema";
5
6
 
7
+ export const userTransformInput = (user: User): UserInput => {
8
+ let formattedUser = {};
9
+
10
+ if (user.FirstName && user.LastName) {
11
+ formattedUser = {
12
+ firstName: user?.FirstName,
13
+ lastName: user?.LastName,
14
+ };
15
+ }
16
+
17
+ if (user?.DefaultShippingAddressId) {
18
+ const shippingInfo = {
19
+ defaultShippingAddressId: user?.DefaultShippingAddressId,
20
+ };
21
+ formattedUser = { ...formattedUser, ...shippingInfo };
22
+ }
23
+
24
+ return formattedUser;
25
+ };
26
+
6
27
  export const translateWishList = (data: E4WishListListSmQuery) => {
7
- const e4WishList = data.wishlistList.nodes;
28
+ const e4WishList = data?.wishlistList?.nodes || [];
8
29
  const translatedData = merge(e4WishList, wishListMap) as Wishlist[];
9
30
  return translatedData;
10
31
  };
@@ -1,6 +1,6 @@
1
1
  import { merge } from "object-mapper";
2
2
  import { Attributes, Maybe, Variants } from "../graphqlRequestSdk";
3
- import { dimensionMap } from "../e4.remaps";
3
+ import { dimensionMap } from "../product/e4-product.remaps";
4
4
 
5
5
  type DimensionValue = {
6
6
  Value: string;
@@ -1,7 +1,8 @@
1
+ // @ts-ignore - this will be picked up by webpack
2
+ import rawConfig from "@api-manager-config";
1
3
  import { Datasource, DatasourceApis } from "./types/Datasource";
2
4
  import E4Datasource from "./datasources/e4/e4.datasource";
3
5
  import { D365Datasource } from "./datasources/d365/index";
4
- import rawConfig from "./api-manager.config.json";
5
6
  import { z } from "zod";
6
7
  import { getContextFromCookie } from "./datasources/d365/utils/get-context-cookie";
7
8
 
@@ -30,6 +31,7 @@ const CORE_DATASOURCES = [
30
31
  "address",
31
32
  "organization",
32
33
  ];
34
+
33
35
  /**
34
36
  * Loads up all specified apis/datasources based on parsed config
35
37
  * and returns the ApiManager object. Also handles "project" overrides
@@ -38,6 +40,9 @@ const CORE_DATASOURCES = [
38
40
  * that from api-manager.
39
41
  *
40
42
  * In this way, we have two levels of configuration of the api-manager.
43
+ * 1. actual JSON config
44
+ * 2. overrides from storefront
45
+ *
41
46
  * @returns ApiManager object.
42
47
  */
43
48
  async function createApiManager() {
@@ -84,7 +89,7 @@ async function createApiManager() {
84
89
 
85
90
  const getDatasource = (entityName: EntityNames) => {
86
91
  // Project-Level Overrides
87
- let projectOverrides = {};
92
+ let projectOverrides: { [key: string]: any } = {};
88
93
  if (storefrontOverrides?.[OVERRIDES_FILE]?.["default"]?.[entityName]) {
89
94
  projectOverrides =
90
95
  storefrontOverrides[OVERRIDES_FILE]["default"][entityName];
@@ -94,7 +99,7 @@ async function createApiManager() {
94
99
  const override = config?.overrides?.[entityName];
95
100
 
96
101
  // Build the base entity from api-manager config settings
97
- let baseEntity = {};
102
+ let baseEntity: { [key: string]: any } = {};
98
103
  if (override) {
99
104
  baseEntity =
100
105
  secondaryDatasources.find((ds) => ds.name === override) ??
@@ -111,18 +116,18 @@ async function createApiManager() {
111
116
  return baseEntity;
112
117
  };
113
118
 
114
- const datasources = {};
119
+ const datasources: { [key: string]: any } = {};
115
120
 
116
121
  CORE_DATASOURCES.forEach((entityName) => {
117
122
  const datasource = getDatasource(entityName as EntityNames);
118
- datasources[entityName] = datasource[entityName];
123
+ datasources[entityName] = datasource[entityName as keyof Datasource];
119
124
  });
120
125
 
121
126
  storefrontOverrides[OVERRIDES_FILE]?.default &&
122
127
  Object.keys(storefrontOverrides[OVERRIDES_FILE]["default"]).forEach(
123
128
  (key) => {
124
129
  if (!CORE_DATASOURCES.includes(key)) {
125
- datasources[key] =
130
+ datasources[key as keyof Datasource] =
126
131
  storefrontOverrides[OVERRIDES_FILE]["default"][key];
127
132
  }
128
133
  },
@@ -26,7 +26,9 @@ export const extendedProductListLineSchema = productListLineSchema.extend({
26
26
 
27
27
  export const extendedWishlistSchema = productListSchema
28
28
  .omit({ ProductListLines: true })
29
- .extend({ ProductListLines: extendedProductListLineSchema.array() });
29
+ .extend({
30
+ ProductListLines: extendedProductListLineSchema.array().optional(),
31
+ });
30
32
 
31
33
  const wishlistBaseInput = z.object({
32
34
  Id: z.string(),
@@ -1,5 +1,5 @@
1
1
  import { AddToCartInput, Cart } from "@/api-manager/schemas/cart.schema";
2
- import { useNotification } from "@/components/Notifications/use-notification";
2
+ import { useNotification } from "@evenicanpm/storefront-core/src/providers/notifications/use-notification";
3
3
  import { useTranslations } from "next-intl";
4
4
  import { useCreateMutation } from "../../create-mutation";
5
5
  import getCart from "../queries/get-cart";
@@ -2,7 +2,6 @@ import { Cart, CheckoutInput } from "@/api-manager/schemas/cart.schema";
2
2
  import { createApiPath } from "../../create-query";
3
3
  import { useCreateMutation } from "../../create-mutation";
4
4
  import { deleteCartCookie } from "@/api-manager/lib/cart-cookie-handler";
5
- import getCart from "../queries/get-cart";
6
5
  import { useQueryClient } from "@tanstack/react-query";
7
6
 
8
7
  const apiPath = createApiPath("cart", "checkout");
@@ -10,7 +9,7 @@ const apiPath = createApiPath("cart", "checkout");
10
9
  const useCheckout = () => {
11
10
  const queryClient = useQueryClient();
12
11
  return useCreateMutation<CheckoutInput, Cart>(apiPath, {
13
- onSuccess: async (_data, variables) => {
12
+ onSuccess: async (_data) => {
14
13
  // Delete old cart cookie
15
14
  await deleteCartCookie();
16
15
 
@@ -9,5 +9,8 @@ export const searchProductsServer = async (
9
9
  input: searchProductsInput,
10
10
  ): Promise<ProductSearchResult[]> => {
11
11
  const apiManager = await createApiManager();
12
- return parseObject(apiManager.product.searchProducts(input));
12
+ let searchProducts = apiManager.product.searchProducts
13
+ ? apiManager.product.searchProducts(input)
14
+ : Promise.reject("product.searchProducts() is not defined");
15
+ return parseObject(searchProducts);
13
16
  };