@evenicanpm/storefront-core 1.0.1 → 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.
- package/package.json +1 -1
- package/src/api-manager/README.md +30 -22
- package/src/api-manager/datasources/e4/{e4-address.datasource.ts → address/e4-address.datasource.ts} +10 -10
- package/src/api-manager/datasources/e4/address/e4-address.remaps.ts +70 -0
- package/src/api-manager/datasources/e4/address/e4-address.translator.ts +98 -0
- package/src/api-manager/datasources/e4/{e4-cart.datasource.ts → cart/e4-cart.datasource.ts} +17 -16
- package/src/api-manager/datasources/e4/cart/e4-cart.remaps.ts +94 -0
- package/src/api-manager/datasources/e4/cart/e4-cart.translator.ts +23 -0
- package/src/api-manager/datasources/e4/categories/e4-categories.datasource.ts +38 -0
- package/src/api-manager/datasources/e4/categories/e4-categories.translator.ts +161 -0
- package/src/api-manager/datasources/e4/e4.datasource.ts +8 -39
- package/src/api-manager/datasources/e4/graphqlRequestSdk.ts +8427 -0
- package/src/api-manager/datasources/e4/{e4-order.datasource.ts → order/e4-order.datasource.ts} +3 -3
- package/src/api-manager/datasources/e4/order/e4-order.remaps.ts +101 -0
- package/src/api-manager/datasources/e4/{e4-organization.datasource.ts → organization/e4-organization.datasource.ts} +1 -1
- package/src/api-manager/datasources/e4/{e4-product.datasource.ts → product/e4-product.datasource.ts} +13 -11
- package/src/api-manager/datasources/e4/product/e4-product.remaps.ts +88 -0
- package/src/api-manager/datasources/e4/{e4.translator.ts → product/e4-product.translator.ts} +9 -329
- package/src/api-manager/datasources/e4/{e4-session.datasource.ts → session/e4-session.datasource.ts} +3 -3
- package/src/api-manager/datasources/e4/session/e4-session.translator.ts +18 -0
- package/src/api-manager/datasources/e4/user/e4-user.datasource.ts +13 -6
- package/src/api-manager/datasources/e4/user/e4-user.remaps.ts +49 -0
- package/src/api-manager/datasources/e4/user/e4-user.translator.ts +23 -2
- package/src/api-manager/datasources/e4/utils/unwrap-e4-variants.ts +1 -1
- package/src/api-manager/index.ts +11 -6
- package/src/api-manager/schemas/user.schema.ts +3 -1
- package/src/api-manager/services/cart/mutations/add-to-cart.ts +1 -1
- package/src/api-manager/services/cart/mutations/checkout.ts +1 -2
- package/src/api-manager/services/product/server/product.server.ts +4 -1
- package/src/api-manager/types/Datasource.ts +1 -5
- package/src/cms/blocks/BlockManager.tsx +67 -0
- package/src/cms/blocks/Components/BrandLogosScroller.tsx +72 -0
- package/src/cms/blocks/Components/CategoryCard.tsx +47 -0
- package/src/cms/blocks/Components/CategoryCarousel/index.tsx +60 -0
- package/src/cms/blocks/Components/FeaturePill.tsx +99 -0
- package/src/cms/blocks/Components/FeaturedCategories.tsx +41 -0
- package/src/cms/blocks/Components/FeaturedProducts.tsx +41 -0
- package/src/cms/blocks/Components/Footer/data/index.ts +32 -0
- package/src/cms/blocks/Components/Footer/index.tsx +88 -0
- package/src/cms/blocks/Components/Footer/interfaces.ts +37 -0
- package/src/cms/blocks/Components/Footer/sections/FooterAppStore.tsx +45 -0
- package/src/cms/blocks/Components/Footer/sections/FooterContact.tsx +36 -0
- package/src/cms/blocks/Components/Footer/sections/FooterLinks.tsx +30 -0
- package/src/cms/blocks/Components/Footer/sections/FooterLogo.tsx +26 -0
- package/src/cms/blocks/Components/Footer/sections/FooterSocialLinks.tsx +70 -0
- package/src/cms/blocks/Components/Footer/styles/index.ts +39 -0
- package/src/cms/blocks/Components/Footer.tsx +77 -0
- package/src/cms/blocks/Components/Hero.tsx +73 -0
- package/src/cms/blocks/Components/HeroCarousel/index.tsx +42 -0
- package/src/cms/blocks/Components/Image.tsx +39 -0
- package/src/cms/blocks/Components/MediaCard.tsx +41 -0
- package/src/cms/blocks/Components/ProductCarousel/index.tsx +82 -0
- package/src/cms/blocks/Components/ProductSectionFullWidth/index.tsx +103 -0
- package/src/cms/blocks/Components/RichText.tsx +19 -0
- package/src/cms/blocks/Components/Seo/index.tsx +48 -0
- package/src/cms/blocks/Components/Services/index.tsx +21 -0
- package/src/cms/blocks/Components/Services/service-card.tsx +73 -0
- package/src/cms/blocks/Components/shared/featured-product-card.tsx +29 -0
- package/src/cms/blocks/Components/shared/product-category-item.tsx +49 -0
- package/src/cms/blocks/Components/shared/product-grid.tsx +48 -0
- package/src/cms/blocks/Components/shared/top-categories-card.tsx +66 -0
- package/src/cms/blocks/Components/shared/top-rating-product-card.tsx +66 -0
- package/src/cms/blocks/Icons/Components/Category.tsx +14 -0
- package/src/cms/blocks/Icons/Components/DottedStar.tsx +40 -0
- package/src/cms/blocks/Icons/Components/FallbackIcon.tsx +33 -0
- package/src/cms/blocks/Icons/Components/GiftBox.tsx +18 -0
- package/src/cms/blocks/Icons/Components/Light.tsx +13 -0
- package/src/cms/blocks/Icons/Components/NewArrival.tsx +18 -0
- package/src/cms/blocks/Icons/Components/RankBadge.tsx +39 -0
- package/src/cms/blocks/Icons/index.ts +32 -0
- package/src/cms/blocks/index.tsx +16 -0
- package/src/cms/blocks/interfaces.ts +240 -0
- package/src/components/Notifications/README.md +1 -1
- package/src/components/Notifications/notification-context.tsx +1 -1
- package/src/components/README.md +3 -8
- package/src/components/_components/MiniCartClient.tsx +1 -1
- package/src/components/_components/navbar/category-based-menu/components/categories.tsx +1 -1
- package/src/components/_components/navbar/mega-menu/mega-menu.tsx +1 -1
- package/src/components/_components/navbar/nav-list/nav-item-child.tsx +2 -2
- package/src/components/_components/product-cards/product-card-1/product-card-1-wrapper.tsx +1 -1
- package/src/components/_components/products-view/product-view-dialog.tsx +1 -1
- package/src/components/_components/settings/setting.tsx +1 -1
- package/src/components/_components/wishlist/add-to-wishlist-dialog.tsx +1 -1
- package/src/components/_components/wishlist/components/create-new-list.tsx +1 -1
- package/src/components/_components/wishlist/remove-from-wishlist-dialog.tsx +1 -1
- package/src/components/_components/wishlist-modal/add-to-wishlist-dialog.tsx +1 -1
- package/src/components/_components/wishlist-modal/remove-from-wishlist-dialog.tsx +1 -1
- package/src/components/countries-input.tsx +0 -1
- package/src/components-v2/BazaarCard.tsx +21 -0
- package/src/components-v2/BazaarImage.tsx +12 -0
- package/src/components-v2/BazaarMenu.tsx +47 -0
- package/src/components-v2/BazaarSwitch.tsx +37 -0
- package/src/components-v2/BazaarTextField.tsx +73 -0
- package/src/components-v2/BoxShadowCard.tsx +16 -0
- package/src/components-v2/DropZone.tsx +86 -0
- package/src/components-v2/HoverBox.tsx +22 -0
- package/src/components-v2/Image.tsx +5 -0
- package/src/components-v2/ImageWithFallback.tsx +51 -0
- package/src/components-v2/LazyImage.tsx +12 -0
- package/src/components-v2/Loading.tsx +36 -0
- package/src/components-v2/MiniCartClient.tsx +65 -0
- package/src/components-v2/README.md +4 -0
- package/src/components-v2/SearchInput.tsx +28 -0
- package/src/components-v2/SnackbarProvider.tsx +32 -0
- package/src/components-v2/T/index.tsx +15 -0
- package/src/components-v2/Typography.tsx +227 -0
- package/src/components-v2/WhiteButton.tsx +20 -0
- package/src/components-v2/accordion/accordion-header.tsx +43 -0
- package/src/components-v2/accordion/index.ts +1 -0
- package/src/components-v2/bazaar-types.ts +84 -0
- package/src/components-v2/carousel/carousel.tsx +72 -0
- package/src/components-v2/carousel/components/carousel-arrows.tsx +60 -0
- package/src/components-v2/carousel/components/carousel-dots.tsx +21 -0
- package/src/components-v2/carousel/index.ts +3 -0
- package/src/components-v2/carousel/styles/index.ts +93 -0
- package/src/components-v2/carousel-cards/carousel-card-1/carousel-card-1.tsx +64 -0
- package/src/components-v2/carousel-cards/carousel-card-1/index.ts +1 -0
- package/src/components-v2/carousel-cards/carousel-card-1/styles.ts +34 -0
- package/src/components-v2/carousel-cards/carousel-card-2/carousel-card-2.tsx +78 -0
- package/src/components-v2/carousel-cards/carousel-card-2/index.ts +1 -0
- package/src/components-v2/carousel-cards/carousel-card-2/styles.ts +26 -0
- package/src/components-v2/carousel-cards/carousel-card-3/carousel-card-3.tsx +37 -0
- package/src/components-v2/carousel-cards/carousel-card-3/index.ts +1 -0
- package/src/components-v2/carousel-cards/carousel-card-3/styles.ts +28 -0
- package/src/components-v2/carousel-cards/carousel-card-4/carousel-card-4.tsx +81 -0
- package/src/components-v2/carousel-cards/carousel-card-4/index.ts +1 -0
- package/src/components-v2/carousel-cards/carousel-card-4/styles.ts +27 -0
- package/src/components-v2/categories/category-list/category-list.tsx +59 -0
- package/src/components-v2/categories/category-list/index.ts +1 -0
- package/src/components-v2/categories/category-list/styles.ts +29 -0
- package/src/components-v2/categories/category-list/types.ts +4 -0
- package/src/components-v2/categories/category-list-item/category-menu-item.tsx +37 -0
- package/src/components-v2/categories/category-list-item/index.ts +1 -0
- package/src/components-v2/categories/category-list-item/styles.ts +35 -0
- package/src/components-v2/categories/category-menu.tsx +51 -0
- package/src/components-v2/categories/mega-menu/banner.tsx +60 -0
- package/src/components-v2/categories/mega-menu/column-list.tsx +70 -0
- package/src/components-v2/categories/mega-menu/mega-menu-1.tsx +37 -0
- package/src/components-v2/categories/mega-menu/mega-menu-2.tsx +37 -0
- package/src/components-v2/categories/mega-menu/styles.ts +25 -0
- package/src/components-v2/categories/types.ts +16 -0
- package/src/components-v2/category-cards/category-card-1/category-card-1.tsx +21 -0
- package/src/components-v2/category-cards/category-card-1/index.ts +1 -0
- package/src/components-v2/category-cards/category-card-1/styles.ts +37 -0
- package/src/components-v2/countdown/count-box.tsx +19 -0
- package/src/components-v2/countdown/count-down.tsx +24 -0
- package/src/components-v2/countdown/index.tsx +2 -0
- package/src/components-v2/countdown/useCountDown.ts +41 -0
- package/src/components-v2/countries-input.tsx +73 -0
- package/src/components-v2/data-table/index.ts +2 -0
- package/src/components-v2/data-table/table-header.tsx +91 -0
- package/src/components-v2/data-table/table-pagination.tsx +36 -0
- package/src/components-v2/flex-box/flex-between.tsx +14 -0
- package/src/components-v2/flex-box/flex-box.tsx +9 -0
- package/src/components-v2/flex-box/flex-row-center.tsx +9 -0
- package/src/components-v2/flex-box/index.ts +5 -0
- package/src/components-v2/footer/components/about-links.tsx +23 -0
- package/src/components-v2/footer/components/app-store.tsx +38 -0
- package/src/components-v2/footer/components/customer-care-links.tsx +21 -0
- package/src/components-v2/footer/components/logo.tsx +23 -0
- package/src/components-v2/footer/components/social-links.tsx +43 -0
- package/src/components-v2/footer/data/index.ts +54 -0
- package/src/components-v2/footer/footer-1.tsx +62 -0
- package/src/components-v2/footer/footer-2.tsx +57 -0
- package/src/components-v2/footer/footer-3.tsx +53 -0
- package/src/components-v2/footer/footer-4.tsx +71 -0
- package/src/components-v2/footer/index.ts +4 -0
- package/src/components-v2/footer/styles/index.ts +42 -0
- package/src/components-v2/header/components/categories-menu.tsx +23 -0
- package/src/components-v2/header/components/mobile-header.tsx +75 -0
- package/src/components-v2/header/components/user.test.tsx +200 -0
- package/src/components-v2/header/components/user.tsx +204 -0
- package/src/components-v2/header/header.tsx +63 -0
- package/src/components-v2/header/hooks/use-header.ts +13 -0
- package/src/components-v2/header/index.ts +1 -0
- package/src/components-v2/header/sticky-header.tsx +17 -0
- package/src/components-v2/header/styles/index.ts +24 -0
- package/src/components-v2/icons/cart-bag.tsx +13 -0
- package/src/components-v2/icons/category-outline.tsx +29 -0
- package/src/components-v2/icons/category.tsx +12 -0
- package/src/components-v2/icons/home.tsx +19 -0
- package/src/components-v2/icons/search.tsx +13 -0
- package/src/components-v2/icons/shopping-bag-outlined.tsx +13 -0
- package/src/components-v2/icons/up-down.tsx +21 -0
- package/src/components-v2/icons/user.tsx +13 -0
- package/src/components-v2/icons/user2.tsx +14 -0
- package/src/components-v2/mini-cart/__tests__/cart-item.test.tsx +174 -0
- package/src/components-v2/mini-cart/__tests__/mini-cart.test.tsx +121 -0
- package/src/components-v2/mini-cart/__tests__/test-cart-empty.json +84 -0
- package/src/components-v2/mini-cart/__tests__/test-cart-with-item.json +244 -0
- package/src/components-v2/mini-cart/components/bottom-actions.tsx +27 -0
- package/src/components-v2/mini-cart/components/cart-item.tsx +147 -0
- package/src/components-v2/mini-cart/components/empty-view.tsx +29 -0
- package/src/components-v2/mini-cart/components/top-header.tsx +37 -0
- package/src/components-v2/mini-cart/index.ts +1 -0
- package/src/components-v2/mini-cart/mini-cart.tsx +107 -0
- package/src/components-v2/mobile-navigation/index.ts +3 -0
- package/src/components-v2/mobile-navigation/mobile-navigation-bar.tsx +73 -0
- package/src/components-v2/mobile-navigation/styles/index.ts +63 -0
- package/src/components-v2/nav-link/index.ts +5 -0
- package/src/components-v2/nav-link/nav-link-2.tsx +32 -0
- package/src/components-v2/nav-link/nav-link-3.tsx +67 -0
- package/src/components-v2/nav-link/nav-link.tsx +53 -0
- package/src/components-v2/navbar/categories.tsx +27 -0
- package/src/components-v2/navbar/category-based-menu/category-based-menu.tsx +52 -0
- package/src/components-v2/navbar/category-based-menu/components/categories.tsx +44 -0
- package/src/components-v2/navbar/category-based-menu/components/category-item.tsx +31 -0
- package/src/components-v2/navbar/category-based-menu/components/child-categories.tsx +38 -0
- package/src/components-v2/navbar/category-based-menu/index.ts +1 -0
- package/src/components-v2/navbar/category-based-menu/styles.ts +81 -0
- package/src/components-v2/navbar/category-based-menu/types.ts +18 -0
- package/src/components-v2/navbar/index.ts +1 -0
- package/src/components-v2/navbar/mega-menu/category-list.tsx +29 -0
- package/src/components-v2/navbar/mega-menu/index.ts +1 -0
- package/src/components-v2/navbar/mega-menu/mega-menu.tsx +71 -0
- package/src/components-v2/navbar/mega-menu/styles.ts +43 -0
- package/src/components-v2/navbar/mobile-menu/index.ts +1 -0
- package/src/components-v2/navbar/mobile-menu/mobile-menu.tsx +70 -0
- package/src/components-v2/navbar/mobile-menu/render-levels.test.tsx +71 -0
- package/src/components-v2/navbar/mobile-menu/render-levels.tsx +62 -0
- package/src/components-v2/navbar/nav-list/cms-nav.test.tsx +84 -0
- package/src/components-v2/navbar/nav-list/index.ts +1 -0
- package/src/components-v2/navbar/nav-list/nav-item-child.tsx +66 -0
- package/src/components-v2/navbar/nav-list/nav-list.tsx +119 -0
- package/src/components-v2/navbar/navbar.tsx +43 -0
- package/src/components-v2/navbar/styles.ts +90 -0
- package/src/components-v2/navbar/utils/transform-nav.test.ts +209 -0
- package/src/components-v2/navbar/utils/transform-nav.ts +43 -0
- package/src/components-v2/newsletter/index.ts +1 -0
- package/src/components-v2/newsletter/newsletter.tsx +112 -0
- package/src/components-v2/newsletter/social-icons.tsx +35 -0
- package/src/components-v2/newsletter/styles.ts +65 -0
- package/src/components-v2/page-sidenav/grocery-side-nav/components/link-item.tsx +21 -0
- package/src/components-v2/page-sidenav/grocery-side-nav/components/list-item.tsx +27 -0
- package/src/components-v2/page-sidenav/grocery-side-nav/components/nav-accordion.tsx +36 -0
- package/src/components-v2/page-sidenav/grocery-side-nav/components/render-child.tsx +26 -0
- package/src/components-v2/page-sidenav/grocery-side-nav/grocery-side-nav.tsx +32 -0
- package/src/components-v2/page-sidenav/grocery-side-nav/index.ts +1 -0
- package/src/components-v2/page-sidenav/grocery-side-nav/styles/index.ts +11 -0
- package/src/components-v2/page-sidenav/health-beauty-side-nav/components/list-item.tsx +27 -0
- package/src/components-v2/page-sidenav/health-beauty-side-nav/components/nav-accordion.tsx +44 -0
- package/src/components-v2/page-sidenav/health-beauty-side-nav/components/render-child.tsx +20 -0
- package/src/components-v2/page-sidenav/health-beauty-side-nav/health-beauty-side-nav.tsx +43 -0
- package/src/components-v2/page-sidenav/health-beauty-side-nav/index.ts +1 -0
- package/src/components-v2/page-sidenav/health-beauty-side-nav/styles/index.ts +27 -0
- package/src/components-v2/page-sidenav/side-navbar/components/list-item.tsx +25 -0
- package/src/components-v2/page-sidenav/side-navbar/components/nav-accordion.tsx +46 -0
- package/src/components-v2/page-sidenav/side-navbar/components/render-child.tsx +20 -0
- package/src/components-v2/page-sidenav/side-navbar/index.ts +1 -0
- package/src/components-v2/page-sidenav/side-navbar/side-nav-bar.tsx +77 -0
- package/src/components-v2/page-sidenav/side-navbar/styles/index.ts +73 -0
- package/src/components-v2/page-sidenav/side-navbar-2/components/button-content.tsx +32 -0
- package/src/components-v2/page-sidenav/side-navbar-2/components/sidebar-accordion.tsx +66 -0
- package/src/components-v2/page-sidenav/side-navbar-2/index.ts +1 -0
- package/src/components-v2/page-sidenav/side-navbar-2/side-navbar-2.tsx +63 -0
- package/src/components-v2/page-sidenav/side-navbar-2/styles/index.ts +68 -0
- package/src/components-v2/product-cards/discount-chip.tsx +43 -0
- package/src/components-v2/product-cards/product-card-1/components/hover-actions.tsx +37 -0
- package/src/components-v2/product-cards/product-card-1/components/quantity-buttons.tsx +65 -0
- package/src/components-v2/product-cards/product-card-1/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-1/product-card-1-wrapper.tsx +304 -0
- package/src/components-v2/product-cards/product-card-1/product-card.tsx +107 -0
- package/src/components-v2/product-cards/product-card-1/styles/index.ts +46 -0
- package/src/components-v2/product-cards/product-card-10/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-10/product-card.tsx +128 -0
- package/src/components-v2/product-cards/product-card-10/styles/index.ts +38 -0
- package/src/components-v2/product-cards/product-card-11/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-11/product-card.tsx +66 -0
- package/src/components-v2/product-cards/product-card-11/styles/index.ts +16 -0
- package/src/components-v2/product-cards/product-card-12/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-12/product-card.tsx +42 -0
- package/src/components-v2/product-cards/product-card-12/styles/index.ts +16 -0
- package/src/components-v2/product-cards/product-card-13/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-13/product-card.tsx +48 -0
- package/src/components-v2/product-cards/product-card-13/styles/index.ts +25 -0
- package/src/components-v2/product-cards/product-card-14/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-14/product-card.tsx +125 -0
- package/src/components-v2/product-cards/product-card-14/styles/index.ts +40 -0
- package/src/components-v2/product-cards/product-card-15/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-15/product-card.tsx +121 -0
- package/src/components-v2/product-cards/product-card-15/styles/index.ts +57 -0
- package/src/components-v2/product-cards/product-card-16/components/quantity-buttons.tsx +54 -0
- package/src/components-v2/product-cards/product-card-16/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-16/product-card.tsx +116 -0
- package/src/components-v2/product-cards/product-card-16/styles/index.ts +18 -0
- package/src/components-v2/product-cards/product-card-2/components/favorite-button.tsx +29 -0
- package/src/components-v2/product-cards/product-card-2/components/product-price.tsx +26 -0
- package/src/components-v2/product-cards/product-card-2/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-2/product-card.tsx +70 -0
- package/src/components-v2/product-cards/product-card-3/components/hover-actions.tsx +83 -0
- package/src/components-v2/product-cards/product-card-3/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-3/product-card.tsx +110 -0
- package/src/components-v2/product-cards/product-card-3/styles/index.ts +89 -0
- package/src/components-v2/product-cards/product-card-4/components/hover-actions.tsx +50 -0
- package/src/components-v2/product-cards/product-card-4/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-4/product-card.tsx +128 -0
- package/src/components-v2/product-cards/product-card-4/styles/index.ts +66 -0
- package/src/components-v2/product-cards/product-card-5/components/button-actions.tsx +49 -0
- package/src/components-v2/product-cards/product-card-5/components/hover-actions.tsx +50 -0
- package/src/components-v2/product-cards/product-card-5/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-5/product-card.tsx +137 -0
- package/src/components-v2/product-cards/product-card-5/styles/index.ts +94 -0
- package/src/components-v2/product-cards/product-card-6/components/hover-actions.tsx +50 -0
- package/src/components-v2/product-cards/product-card-6/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-6/product-card.tsx +121 -0
- package/src/components-v2/product-cards/product-card-6/styles/index.ts +63 -0
- package/src/components-v2/product-cards/product-card-7/components/product-status.tsx +18 -0
- package/src/components-v2/product-cards/product-card-7/components/quantity-buttons.tsx +47 -0
- package/src/components-v2/product-cards/product-card-7/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-7/product-card.tsx +139 -0
- package/src/components-v2/product-cards/product-card-7/styles/index.ts +98 -0
- package/src/components-v2/product-cards/product-card-8/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-8/product-card.tsx +151 -0
- package/src/components-v2/product-cards/product-card-8/styles/index.ts +61 -0
- package/src/components-v2/product-cards/product-card-9/components/add-to-cart.tsx +63 -0
- package/src/components-v2/product-cards/product-card-9/components/favorite-button.tsx +27 -0
- package/src/components-v2/product-cards/product-card-9/components/tags.tsx +33 -0
- package/src/components-v2/product-cards/product-card-9/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-9/product-card.tsx +169 -0
- package/src/components-v2/product-cards/product-card-wishlist/components/hover-actions.tsx +37 -0
- package/src/components-v2/product-cards/product-card-wishlist/index.ts +1 -0
- package/src/components-v2/product-cards/product-card-wishlist/product-card.tsx +118 -0
- package/src/components-v2/product-cards/product-card-wishlist/styles/index.ts +53 -0
- package/src/components-v2/product-cards/product-price.tsx +26 -0
- package/src/components-v2/product-cards/product-rating.tsx +28 -0
- package/src/components-v2/product-cards/product-title.tsx +24 -0
- package/src/components-v2/product-cards/use-product.ts +35 -0
- package/src/components-v2/product-dimensions/components/dimensions-group-error.tsx +46 -0
- package/src/components-v2/product-dimensions/components/dimensions-group-label.tsx +27 -0
- package/src/components-v2/product-dimensions/components/dimensions-group-list-chip.tsx +78 -0
- package/src/components-v2/product-dimensions/components/dimensions-group-list.tsx +24 -0
- package/src/components-v2/product-dimensions/components/dimensions-group.tsx +55 -0
- package/src/components-v2/product-dimensions/components/dimensions.tsx +84 -0
- package/src/components-v2/product-dimensions/index.tsx +38 -0
- package/src/components-v2/product-dimensions/utils/has-selected-dimension.ts +20 -0
- package/src/components-v2/product-quantity-buttons/product-quantity-buttons.tsx +88 -0
- package/src/components-v2/products-view/product-view-dialog.tsx +218 -0
- package/src/components-v2/products-view/products-grid-view.tsx +52 -0
- package/src/components-v2/products-view/products-list-view.tsx +49 -0
- package/src/components-v2/progress/index.ts +1 -0
- package/src/components-v2/progress/progress.tsx +77 -0
- package/src/components-v2/scrollbar/index.ts +1 -0
- package/src/components-v2/scrollbar/scrollbar.tsx +27 -0
- package/src/components-v2/scrollbar/styles.ts +15 -0
- package/src/components-v2/search-box/__test__/search-input-category.test.tsx +110 -0
- package/src/components-v2/search-box/__test__/search-input.test.tsx +137 -0
- package/src/components-v2/search-box/__test__/search-results.json +165 -0
- package/src/components-v2/search-box/components/category-dropdown.tsx +61 -0
- package/src/components-v2/search-box/components/search-result.tsx +86 -0
- package/src/components-v2/search-box/hooks/use-search.ts +63 -0
- package/src/components-v2/search-box/index.ts +2 -0
- package/src/components-v2/search-box/search-input-category.test.tsx +110 -0
- package/src/components-v2/search-box/search-input-category.tsx +203 -0
- package/src/components-v2/search-box/search-input.test.tsx +41 -0
- package/src/components-v2/search-box/search-input.tsx +66 -0
- package/src/components-v2/search-box/styles/index.ts +47 -0
- package/src/components-v2/section-header/index.ts +2 -0
- package/src/components-v2/section-header/section-creator.tsx +29 -0
- package/src/components-v2/section-header/section-header.tsx +44 -0
- package/src/components-v2/service-cards/icon-component.tsx +18 -0
- package/src/components-v2/service-cards/service-card-1/index.ts +1 -0
- package/src/components-v2/service-cards/service-card-1/service-card-1.tsx +42 -0
- package/src/components-v2/service-cards/service-card-2/index.ts +1 -0
- package/src/components-v2/service-cards/service-card-2/service-card-2.tsx +37 -0
- package/src/components-v2/service-cards/service-card-3/index.ts +1 -0
- package/src/components-v2/service-cards/service-card-3/service-card-3.tsx +28 -0
- package/src/components-v2/service-cards/service-card-3/styles.ts +23 -0
- package/src/components-v2/settings/index.ts +1 -0
- package/src/components-v2/settings/setting.tsx +141 -0
- package/src/components-v2/settings/styles.ts +57 -0
- package/src/components-v2/shop-card/index.ts +1 -0
- package/src/components-v2/shop-card/shop-card.tsx +152 -0
- package/src/components-v2/shop-card/styles.ts +33 -0
- package/src/components-v2/side-nav/index.ts +1 -0
- package/src/components-v2/side-nav/side-nav.tsx +49 -0
- package/src/components-v2/site-logo.tsx +17 -0
- package/src/components-v2/sticky/Sticky.tsx +62 -0
- package/src/components-v2/sticky/index.ts +1 -0
- package/src/components-v2/sticky/styles.ts +38 -0
- package/src/components-v2/sticky-wrapper/index.ts +1 -0
- package/src/components-v2/sticky-wrapper/sticky-wrapper.tsx +21 -0
- package/src/components-v2/sticky-wrapper/styles.ts +25 -0
- package/src/components-v2/stories/story-content/index.ts +1 -0
- package/src/components-v2/stories/story-content/story-content.tsx +28 -0
- package/src/components-v2/stories/story-content/styles.ts +22 -0
- package/src/components-v2/stories/story-item/index.ts +1 -0
- package/src/components-v2/stories/story-item/story-item.tsx +24 -0
- package/src/components-v2/stories/story-item/styles.ts +11 -0
- package/src/components-v2/stories/story-viewer/index.ts +1 -0
- package/src/components-v2/stories/story-viewer/story-viewer.tsx +44 -0
- package/src/components-v2/stories/story-viewer/styles.ts +15 -0
- package/src/components-v2/subscribe-input/index.ts +1 -0
- package/src/components-v2/subscribe-input/styles.ts +14 -0
- package/src/components-v2/subscribe-input/subscribe-input.tsx +43 -0
- package/src/components-v2/topbar/index.ts +1 -0
- package/src/components-v2/topbar/styles.ts +55 -0
- package/src/components-v2/topbar/top-bar.tsx +115 -0
- package/src/components-v2/utils/constants.ts +8 -0
- package/src/components-v2/wishlist/add-to-wishlist-dialog.tsx +161 -0
- package/src/components-v2/wishlist/components/create-new-list.tsx +167 -0
- package/src/components-v2/wishlist/components/create-wishlist-button.tsx +40 -0
- package/src/components-v2/wishlist/components/dashboard-header.tsx +123 -0
- package/src/components-v2/wishlist/components/navigation.tsx +87 -0
- package/src/components-v2/wishlist/components/no-records.tsx +20 -0
- package/src/components-v2/wishlist/components/wishlist-modal-item.tsx +66 -0
- package/src/components-v2/wishlist/remove-from-wishlist-dialog.tsx +175 -0
- package/src/components-v2/wishlist/styles.ts +61 -0
- package/src/components-v2/wishlist-modal/TODO.md +10 -0
- package/src/components-v2/wishlist-modal/add-to-wishlist-button.tsx +69 -0
- package/src/components-v2/wishlist-modal/add-to-wishlist-dialog.tsx +161 -0
- package/src/components-v2/wishlist-modal/remove-from-wishlist-dialog.tsx +174 -0
- package/src/components-v2/wishlist-modal/wishlist-modal-item.tsx +65 -0
- package/src/pages/README.md +4 -0
- package/src/pages/product-details/product-intro/product-intro.tsx +3 -1
- package/src/pages/product-list/quick-view-dialog-content.tsx +4 -2
- package/src/pages-v2/README.md +4 -0
- package/src/pages-v2/account/addresses/address-form.tsx +289 -0
- package/src/pages-v2/account/addresses/address-item.tsx +104 -0
- package/src/pages-v2/account/dashboard-header.tsx +123 -0
- package/src/pages-v2/account/navigation.tsx +87 -0
- package/src/pages-v2/account/no-records.tsx +20 -0
- package/src/pages-v2/account/orders/icons/delivery.tsx +14 -0
- package/src/pages-v2/account/orders/icons/package-box.tsx +13 -0
- package/src/pages-v2/account/orders/icons/truck-filled.tsx +14 -0
- package/src/pages-v2/account/orders/order-progress.tsx +114 -0
- package/src/pages-v2/account/orders/order-row.tsx +64 -0
- package/src/pages-v2/account/orders/order-summary.tsx +87 -0
- package/src/pages-v2/account/orders/ordered-products.tsx +121 -0
- package/src/pages-v2/account/profile/profile-button.test.tsx +59 -0
- package/src/pages-v2/account/profile/profile-button.tsx +50 -0
- package/src/pages-v2/account/profile/user-info.tsx +62 -0
- package/src/pages-v2/account/styles.ts +32 -0
- package/src/pages-v2/account/table-row.tsx +19 -0
- package/src/pages-v2/account/wishlist/create-new-list.tsx +167 -0
- package/src/pages-v2/account/wishlist/create-wishlist-button.tsx +40 -0
- package/src/pages-v2/account/wishlist/wishlist-item.tsx +82 -0
- package/src/pages-v2/blog/pagination.tsx +38 -0
- package/src/pages-v2/cart/cart-item.tsx +312 -0
- package/src/pages-v2/cart/checkout-form.tsx +122 -0
- package/src/pages-v2/cart/coupon-entry.tsx +90 -0
- package/src/pages-v2/cart/estimate-shipping.tsx +183 -0
- package/src/pages-v2/cart/wrapper.tsx +30 -0
- package/src/pages-v2/checkout/checkout-alt-form/address-card.tsx +76 -0
- package/src/pages-v2/checkout/checkout-alt-form/checkout-form.tsx +131 -0
- package/src/pages-v2/checkout/checkout-alt-form/checkout-step.tsx +120 -0
- package/src/pages-v2/checkout/checkout-alt-form/customer-information.tsx +94 -0
- package/src/pages-v2/checkout/checkout-alt-form/delivery-address.tsx +174 -0
- package/src/pages-v2/checkout/checkout-alt-form/delivery-date.tsx +114 -0
- package/src/pages-v2/checkout/checkout-alt-form/delivery-options.tsx +190 -0
- package/src/pages-v2/checkout/checkout-alt-form/edit-address-form.tsx +130 -0
- package/src/pages-v2/checkout/checkout-alt-form/heading.tsx +50 -0
- package/src/pages-v2/checkout/checkout-alt-form/index.ts +1 -0
- package/src/pages-v2/checkout/checkout-alt-form/new-address-form.tsx +299 -0
- package/src/pages-v2/checkout/checkout-alt-form/node.tsx +9 -0
- package/src/pages-v2/checkout/checkout-alt-form/payment-details.tsx +347 -0
- package/src/pages-v2/checkout/checkout-alt-form/safe-card-preview-data.tsx +36 -0
- package/src/pages-v2/checkout/checkout-alt-form/types.ts +20 -0
- package/src/pages-v2/checkout/checkout-alt-summary/cart-item.tsx +42 -0
- package/src/pages-v2/checkout/checkout-alt-summary/checkout-alt-summary.tsx +42 -0
- package/src/pages-v2/checkout/checkout-alt-summary/index.ts +1 -0
- package/src/pages-v2/checkout/checkout-alt-summary/list-item.tsx +31 -0
- package/src/pages-v2/confirmation/address.tsx +25 -0
- package/src/pages-v2/confirmation/confirmation-summary.tsx +55 -0
- package/src/pages-v2/confirmation/ordered-products.tsx +115 -0
- package/src/pages-v2/product-details/available-shops.tsx +48 -0
- package/src/pages-v2/product-details/bopis/find-in-store-button.tsx +63 -0
- package/src/pages-v2/product-details/bopis/find-in-store-modal.tsx +257 -0
- package/src/pages-v2/product-details/bopis/pickup-option-select.tsx +127 -0
- package/src/pages-v2/product-details/bopis/search-header.tsx +69 -0
- package/src/pages-v2/product-details/checkbox-label.tsx +20 -0
- package/src/pages-v2/product-details/currency.ts +64 -0
- package/src/pages-v2/product-details/frequently-bought.tsx +97 -0
- package/src/pages-v2/product-details/frequently-product-card.tsx +63 -0
- package/src/pages-v2/product-details/product-comment.tsx +49 -0
- package/src/pages-v2/product-details/product-description.tsx +22 -0
- package/src/pages-v2/product-details/product-filter-card.tsx +265 -0
- package/src/pages-v2/product-details/product-intro/product-intro-images.tsx +90 -0
- package/src/pages-v2/product-details/product-intro/product-intro.tsx +256 -0
- package/src/pages-v2/product-details/product-review.tsx +131 -0
- package/src/pages-v2/product-details/product-tabs.tsx +51 -0
- package/src/pages-v2/product-details/related-products.tsx +42 -0
- package/src/pages-v2/product-details/types.ts +11 -0
- package/src/pages-v2/product-list/breadcrumbs.tsx +39 -0
- package/src/pages-v2/product-list/checkbox-label.tsx +20 -0
- package/src/pages-v2/product-list/facet-group.tsx +125 -0
- package/src/pages-v2/product-list/facet.tsx +36 -0
- package/src/pages-v2/product-list/list-filter.tsx +43 -0
- package/src/pages-v2/product-list/pagination.tsx +80 -0
- package/src/pages-v2/product-list/product-list-context.tsx +302 -0
- package/src/pages-v2/product-list/product-list-state.ts +187 -0
- package/src/pages-v2/product-list/product-rating.tsx +16 -0
- package/src/pages-v2/product-list/quick-view-dialog-content.tsx +207 -0
- package/src/pages-v2/product-list/quick-view-dialog.tsx +54 -0
- package/src/pages-v2/product-list/range-filter.tsx +125 -0
- package/src/pages-v2/product-list/scrollbar.tsx +38 -0
- package/src/pages-v2/product-list/search-bar.tsx +162 -0
- package/src/pages-v2/product-list/selected-facets.tsx +80 -0
- package/src/pages-v2/product-list/side-nav.tsx +49 -0
- package/src/pages-v2/product-list/swatch.tsx +80 -0
- package/src/pages-v2/product-list/types.ts +18 -0
- package/src/pages-v2/product-list/use-product-list.ts +12 -0
- package/src/pages-v2/product-list/useCategoryFilter.tsx +26 -0
- package/src/pages-v2/product-list/utils/facet-helpers.ts +5 -0
- package/src/pages-v2/product-list/utils/generate-breadcrumbs.ts +30 -0
- package/src/pages-v2/product-list/utils/getCategoryFilterFromSlug.ts +153 -0
- package/src/pages-v2/product-list/utils/product-list-helper.ts +111 -0
- package/src/pages-v2/product-list/utils/product-list-types.ts +41 -0
- package/src/pages-v2/product-list/utils/search-for-category.ts +76 -0
- package/src/pages-v2/product-list/utils/sort-options.ts +44 -0
- package/src/pages-v2/product-list/utils/use-previous-refiners.ts +14 -0
- package/src/pages-v2/quickorder/order-upload.tsx +150 -0
- package/src/pages-v2/quickorder/quick-order-form.tsx +346 -0
- package/src/pages-v2/quickorder/quick-order-row.tsx +144 -0
- package/src/providers/nav-provider/index.tsx +59 -0
- package/src/providers/nav-provider/utils/createLink.ts +15 -0
- package/src/providers/notifications/README.md +15 -0
- package/src/providers/notifications/notification-context.tsx +82 -0
- package/src/providers/notifications/use-notification.ts +12 -0
- package/tsconfig.json +3 -2
- package/typedoc.js +10 -0
- package/src/api-manager/api-manager.config.json +0 -12
- package/src/api-manager/datasources/e4/e4.remaps.ts +0 -355
- package/src/api-manager/datasources/e4/e4.translator.test.ts +0 -202
- /package/src/hooks/{use-cart.tsx → use-cart.ts} +0 -0
- /package/src/hooks/{use-variants.tsx → use-variants.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,38 +1,46 @@
|
|
|
1
|
-
# Api Manager
|
|
1
|
+
# Api Manager
|
|
2
2
|
|
|
3
3
|
- All data fetching will originate from this layer
|
|
4
|
-
- Eg. a server action will call the ApiManager to interact with external systems, api, etc.
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
## User Guide
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
### 1. Setup the Api Manager config file
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
1. Add a `@api-manager-config` webpack alias in your storefront next.config.js
|
|
11
10
|
|
|
12
|
-
|
|
11
|
+
```js
|
|
12
|
+
"@api-manager-config": path.resolve(
|
|
13
|
+
process.cwd(),
|
|
14
|
+
"api-manager.config.ts",
|
|
15
|
+
)
|
|
16
|
+
```
|
|
13
17
|
|
|
14
|
-
|
|
15
|
-
-
|
|
18
|
+
2. Create a JS file that exports the config object as the default.
|
|
19
|
+
3. Storefront-core will read this alias when creating api manager.
|
|
16
20
|
|
|
17
|
-
|
|
21
|
+
### 2. Add a new method to the `ApiManager`
|
|
18
22
|
|
|
19
|
-
-
|
|
23
|
+
1. If the entity does not have a `entity.model.ts` file in `src/app/data-access/models`, add one and create schemas for input types eg. `addToCartInput`
|
|
24
|
+
2. Add usecase to `data-access/Datasource.ts` interface
|
|
25
|
+
3. Add the same usecase to `data-access/ApiManager.ts` class methods
|
|
26
|
+
4. Finally, add method to the relevant data source, eg. `/src/app/data-access/datasources/E4.datasource.ts`
|
|
27
|
+
5. You are now able to call the method from the `ApiManager.`
|
|
20
28
|
|
|
21
|
-
##
|
|
29
|
+
## Folder Structure
|
|
22
30
|
|
|
23
|
-
|
|
31
|
+
### Datasources
|
|
32
|
+
|
|
33
|
+
- External API's
|
|
24
34
|
|
|
25
|
-
|
|
35
|
+
### Schemas
|
|
26
36
|
|
|
27
|
-
-
|
|
28
|
-
-
|
|
37
|
+
- input/output types for all datasource
|
|
38
|
+
- D365 is base type, all other datasources should translate to this model
|
|
29
39
|
|
|
30
|
-
|
|
40
|
+
### Lib
|
|
31
41
|
|
|
32
|
-
|
|
42
|
+
- Utilities and helpers that instantiate api manager etc.
|
|
33
43
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
4. Finally, add method to the relevant data source, eg. `/src/app/data-access/datasources/E4.datasource.ts`
|
|
38
|
-
5. You are now able to call the method from the `ApiManager.`
|
|
44
|
+
### Services
|
|
45
|
+
|
|
46
|
+
- React-query **cache** layer
|
package/src/api-manager/datasources/e4/{e4-address.datasource.ts → address/e4-address.datasource.ts}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import getGraphqlClient from "
|
|
1
|
+
import getGraphqlClient from "../../../lib/get-graphql-client";
|
|
2
2
|
import {
|
|
3
3
|
Address,
|
|
4
4
|
GetDeliveryOptionsInput,
|
|
@@ -9,9 +9,9 @@ import {
|
|
|
9
9
|
DeliveryOption,
|
|
10
10
|
StateProvinceInfo,
|
|
11
11
|
} from "@msdyn365-commerce/retail-proxy";
|
|
12
|
-
import { Shipping } from "
|
|
13
|
-
import * as
|
|
14
|
-
import { addressMap } from "./e4.remaps";
|
|
12
|
+
import { Shipping } from "../graphqlRequestSdk";
|
|
13
|
+
import * as addressTranslator from "./e4-address.translator";
|
|
14
|
+
import { addressMap } from "./e4-address.remaps";
|
|
15
15
|
import { merge } from "object-mapper";
|
|
16
16
|
|
|
17
17
|
const address = {
|
|
@@ -22,12 +22,12 @@ const address = {
|
|
|
22
22
|
throw new Error("Error getting countries");
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
return
|
|
25
|
+
return addressTranslator.countriesTransformValidate(data?.countries ?? []);
|
|
26
26
|
},
|
|
27
27
|
async getStates(input: GetStatesInput): Promise<StateProvinceInfo[]> {
|
|
28
28
|
const e4Api = await getGraphqlClient();
|
|
29
29
|
const { data, errors } = await e4Api.e4Country({
|
|
30
|
-
id: (await
|
|
30
|
+
id: (await addressTranslator.getCountryId(input?.countryId || "")) ?? "",
|
|
31
31
|
});
|
|
32
32
|
if (errors) {
|
|
33
33
|
throw new Error("Error getting states");
|
|
@@ -40,7 +40,7 @@ const address = {
|
|
|
40
40
|
isoAlpha3Code: "",
|
|
41
41
|
state: [],
|
|
42
42
|
};
|
|
43
|
-
const result =
|
|
43
|
+
const result = addressTranslator.countryTransformValidate(countryData);
|
|
44
44
|
return Array.isArray(result) ? result : [];
|
|
45
45
|
},
|
|
46
46
|
async getDeliveryOptions(
|
|
@@ -56,13 +56,13 @@ const address = {
|
|
|
56
56
|
throw new Error("Error getting shipping methods");
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
return
|
|
59
|
+
return addressTranslator.deliveryOptionsTransformValidate(
|
|
60
60
|
(data?.shippingbyCarrier as Shipping[]) ?? [],
|
|
61
61
|
) as DeliveryOption[];
|
|
62
62
|
},
|
|
63
63
|
async createAddress(address: Address): Promise<Address> {
|
|
64
64
|
const e4Api = await getGraphqlClient(true);
|
|
65
|
-
const e4Address = await
|
|
65
|
+
const e4Address = await addressTranslator.addressTransform(address);
|
|
66
66
|
const { data, errors } = await e4Api.e4AddressCreate({
|
|
67
67
|
address: e4Address,
|
|
68
68
|
});
|
|
@@ -79,7 +79,7 @@ const address = {
|
|
|
79
79
|
},
|
|
80
80
|
async updateAddress(address: Address): Promise<Address> {
|
|
81
81
|
const e4Api = await getGraphqlClient(true);
|
|
82
|
-
const e4Address = await
|
|
82
|
+
const e4Address = await addressTranslator.addressTransform(address);
|
|
83
83
|
const { data, errors } = await e4Api.e4AddressUpdate({
|
|
84
84
|
address: e4Address,
|
|
85
85
|
});
|
|
@@ -0,0 +1,70 @@
|
|
|
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
|
+
import { Address as E4Address } from "../graphqlRequestSdk";
|
|
11
|
+
import { Address } from "@msdyn365-commerce/retail-proxy";
|
|
12
|
+
|
|
13
|
+
export const addressMap = {
|
|
14
|
+
"[].id": [
|
|
15
|
+
{ key: "[].Id" },
|
|
16
|
+
{
|
|
17
|
+
key: "[].RecordId",
|
|
18
|
+
transform: (id: string) => {
|
|
19
|
+
if (id !== null) return parseInt(id);
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
"[].name": "[].Name",
|
|
24
|
+
"[].isPrimary": "[].IsPrimary",
|
|
25
|
+
"[].addressType.id": {
|
|
26
|
+
key: "[].AddressTypeValue",
|
|
27
|
+
transform: (id: string) => {
|
|
28
|
+
if (id !== null) return parseInt(id);
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
"[].address1": "[].Street",
|
|
32
|
+
"[].city": "[].City",
|
|
33
|
+
"[].stateName": "[].State",
|
|
34
|
+
"[].countryName": "[].ThreeLetterISORegionName",
|
|
35
|
+
"[].postalCode": "[].ZipCode",
|
|
36
|
+
"[].phoneNumber": "[].Phone",
|
|
37
|
+
"[].address2": {
|
|
38
|
+
key: "[].FullAddress",
|
|
39
|
+
transform: (_val: string, _src: E4Address[], dest: Address) => {
|
|
40
|
+
return `${dest?.Street}, ${dest?.City} ${dest?.State} ${dest?.ZipCode}, ${dest?.ThreeLetterISORegionName}`;
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const addressReverseMap = {
|
|
46
|
+
Name: "name",
|
|
47
|
+
Street: "address1",
|
|
48
|
+
City: "city",
|
|
49
|
+
ZipCode: "postalCode",
|
|
50
|
+
Phone: "phoneNumber",
|
|
51
|
+
Id: "id",
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const countriesMap = {
|
|
55
|
+
isoAlpha3Code: "CountryRegionId",
|
|
56
|
+
isoAlpha2Code: "ISOCode",
|
|
57
|
+
name: "ShortName",
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export const countryMap = {
|
|
61
|
+
"state[].code": "[].StateId",
|
|
62
|
+
"state[].name": "[].StateName",
|
|
63
|
+
isoAlpha3Code: "[].CountryRegionId",
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const deliveryOptionsMap = {
|
|
67
|
+
id: ["Code", "RecordId"],
|
|
68
|
+
name: "Description",
|
|
69
|
+
total: "TotalChargeAmount",
|
|
70
|
+
};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import getGraphqlClient from "../../../lib/get-graphql-client";
|
|
2
|
+
import { AddressInput, Country, Shipping } from "../graphqlRequestSdk";
|
|
3
|
+
import { Address } from "@/api-manager/schemas/address.schema";
|
|
4
|
+
import { merge } from "object-mapper";
|
|
5
|
+
import {
|
|
6
|
+
addressReverseMap,
|
|
7
|
+
countriesMap,
|
|
8
|
+
countryMap,
|
|
9
|
+
deliveryOptionsMap,
|
|
10
|
+
} from "./e4-address.remaps";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Transforms the Address schema to e4 API address
|
|
14
|
+
*/
|
|
15
|
+
export const addressTransform = async (address: Address) => {
|
|
16
|
+
const countryId = await getCountryId(address?.ThreeLetterISORegionName ?? "");
|
|
17
|
+
const stateId = await getStateId(address?.State ?? "", countryId ?? "");
|
|
18
|
+
|
|
19
|
+
const formattedAddress: AddressInput = merge(address, addressReverseMap);
|
|
20
|
+
formattedAddress.firstName = "";
|
|
21
|
+
formattedAddress.lastName = "";
|
|
22
|
+
formattedAddress.address2 = "";
|
|
23
|
+
formattedAddress.stateId = stateId;
|
|
24
|
+
formattedAddress.countryId = countryId;
|
|
25
|
+
formattedAddress.addressTypeId = 1; // We only create and update shipping addresses.
|
|
26
|
+
|
|
27
|
+
return formattedAddress;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const countriesCache = new Map<string, Country[]>();
|
|
31
|
+
const countryCache = new Map<string, Country>();
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* For d365 country id and value are 'USA' but for e4 it is '80175021088166' and 'USA'.
|
|
35
|
+
* So use countryId, to map the codes back to ids before API calls.
|
|
36
|
+
*/
|
|
37
|
+
export const getCountryId = async (code: string) => {
|
|
38
|
+
const cacheKey = "countries";
|
|
39
|
+
let countries: Country[] = [];
|
|
40
|
+
|
|
41
|
+
if (countriesCache.has(cacheKey)) {
|
|
42
|
+
countries = countriesCache.get(cacheKey) ?? countries;
|
|
43
|
+
} else {
|
|
44
|
+
const e4Api = await getGraphqlClient();
|
|
45
|
+
const { data } = await e4Api.e4CountryList();
|
|
46
|
+
countriesCache.set(cacheKey, data?.countries as Country[]);
|
|
47
|
+
countries = data?.countries as Country[];
|
|
48
|
+
}
|
|
49
|
+
const country = countries.find(
|
|
50
|
+
(c: { isoAlpha3Code: string }) => c?.isoAlpha3Code === code,
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
return country?.id;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const getStateId = async (stateCode: string, countryId: string) => {
|
|
57
|
+
const cacheKey = `states-${countryId}`;
|
|
58
|
+
let country: Country = {
|
|
59
|
+
id: "",
|
|
60
|
+
isoAlpha2Code: "",
|
|
61
|
+
isoAlpha3Code: "",
|
|
62
|
+
name: "",
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
if (countryCache.has(cacheKey)) {
|
|
66
|
+
country = countryCache.get(cacheKey) ?? country;
|
|
67
|
+
} else {
|
|
68
|
+
const e4Api = await getGraphqlClient();
|
|
69
|
+
const { data } = await e4Api.e4Country({ id: countryId });
|
|
70
|
+
country = data?.country as Country;
|
|
71
|
+
countryCache.set(cacheKey, country);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const state = country?.state?.find((s) => s?.code === stateCode);
|
|
75
|
+
|
|
76
|
+
return state?.id;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const countriesTransformValidate = (countries: Country[]) => {
|
|
80
|
+
if (Array.isArray(countries) && countries.length) {
|
|
81
|
+
return countries.map((country) => merge(country, countriesMap));
|
|
82
|
+
}
|
|
83
|
+
return [];
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const countryTransformValidate = (country: Country) => {
|
|
87
|
+
if (country?.state && country?.state.length) {
|
|
88
|
+
return merge(country, countryMap);
|
|
89
|
+
}
|
|
90
|
+
return [];
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export const deliveryOptionsTransformValidate = (options: Shipping[]) => {
|
|
94
|
+
if (Array.isArray(options) && options.length) {
|
|
95
|
+
return options.map((option) => merge(option, deliveryOptionsMap));
|
|
96
|
+
}
|
|
97
|
+
return [];
|
|
98
|
+
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import getGraphqlClient from "
|
|
2
|
-
import * as cartSchema from "
|
|
3
|
-
import { Cart } from "
|
|
4
|
-
import * as
|
|
1
|
+
import getGraphqlClient from "../../../lib/get-graphql-client";
|
|
2
|
+
import * as cartSchema from "../../../schemas/cart.schema";
|
|
3
|
+
import { Cart } from "../../../schemas/cart.schema";
|
|
4
|
+
import * as cartTranslator from "./e4-cart.translator";
|
|
5
|
+
import * as addressTranslator from "../address/e4-address.translator";
|
|
5
6
|
|
|
6
7
|
import {
|
|
7
8
|
CardPaymentAcceptPoint,
|
|
@@ -9,8 +10,8 @@ import {
|
|
|
9
10
|
LineDeliverySpecification,
|
|
10
11
|
ProductWarehouseInventoryInformation,
|
|
11
12
|
} from "@msdyn365-commerce/retail-proxy";
|
|
12
|
-
import { CartApi } from "
|
|
13
|
-
import { Cart as E4Cart } from "
|
|
13
|
+
import { CartApi } from "../../../types/Datasource";
|
|
14
|
+
import { Cart as E4Cart } from "../graphqlRequestSdk";
|
|
14
15
|
import { SalesOrder } from "@/api-manager/schemas/order.schema";
|
|
15
16
|
|
|
16
17
|
const cart: CartApi = {
|
|
@@ -24,7 +25,7 @@ const cart: CartApi = {
|
|
|
24
25
|
throw new Error("Error reading cart");
|
|
25
26
|
}
|
|
26
27
|
|
|
27
|
-
const transformedData =
|
|
28
|
+
const transformedData = cartTranslator.cartTransformValidate(
|
|
28
29
|
data?.cart as E4Cart,
|
|
29
30
|
);
|
|
30
31
|
return transformedData;
|
|
@@ -47,7 +48,7 @@ const cart: CartApi = {
|
|
|
47
48
|
throw new Error("Error adding to cart");
|
|
48
49
|
}
|
|
49
50
|
|
|
50
|
-
const transformedData =
|
|
51
|
+
const transformedData = cartTranslator.cartTransformValidate(
|
|
51
52
|
data?.addToCart?.cart as E4Cart,
|
|
52
53
|
);
|
|
53
54
|
return transformedData;
|
|
@@ -73,7 +74,7 @@ const cart: CartApi = {
|
|
|
73
74
|
if (cart.ShippingAddress) {
|
|
74
75
|
const address = cart.ShippingAddress;
|
|
75
76
|
const createAddress = await e4Api.e4CreateCartAddress({
|
|
76
|
-
address: await
|
|
77
|
+
address: await addressTranslator.addressTransform(address),
|
|
77
78
|
});
|
|
78
79
|
|
|
79
80
|
if (createAddress.errors) {
|
|
@@ -89,7 +90,7 @@ const cart: CartApi = {
|
|
|
89
90
|
throw new Error("Error getting cart information");
|
|
90
91
|
}
|
|
91
92
|
|
|
92
|
-
const transformedData =
|
|
93
|
+
const transformedData = cartTranslator.cartTransformValidate(
|
|
93
94
|
data?.cart as E4Cart,
|
|
94
95
|
);
|
|
95
96
|
return transformedData;
|
|
@@ -118,7 +119,7 @@ const cart: CartApi = {
|
|
|
118
119
|
cart = data.updateCartLine;
|
|
119
120
|
}
|
|
120
121
|
|
|
121
|
-
const transformedData =
|
|
122
|
+
const transformedData = cartTranslator.cartTransformValidate(
|
|
122
123
|
cart?.cart as E4Cart,
|
|
123
124
|
);
|
|
124
125
|
return transformedData;
|
|
@@ -142,7 +143,7 @@ const cart: CartApi = {
|
|
|
142
143
|
throw new Error("Error updating cart");
|
|
143
144
|
}
|
|
144
145
|
|
|
145
|
-
const transformedData =
|
|
146
|
+
const transformedData = cartTranslator.cartTransformValidate(
|
|
146
147
|
data?.deleteCartLine?.cart as E4Cart,
|
|
147
148
|
);
|
|
148
149
|
return transformedData;
|
|
@@ -157,7 +158,7 @@ const cart: CartApi = {
|
|
|
157
158
|
throw new Error("Error reading cart");
|
|
158
159
|
}
|
|
159
160
|
|
|
160
|
-
const transformedData =
|
|
161
|
+
const transformedData = cartTranslator.cartTransformValidate(
|
|
161
162
|
data?.cart as E4Cart,
|
|
162
163
|
);
|
|
163
164
|
return transformedData;
|
|
@@ -192,7 +193,7 @@ const cart: CartApi = {
|
|
|
192
193
|
);
|
|
193
194
|
}
|
|
194
195
|
|
|
195
|
-
return
|
|
196
|
+
return cartTranslator.cartTransformValidate(
|
|
196
197
|
data?.setOrderShipping?.cart as E4Cart,
|
|
197
198
|
);
|
|
198
199
|
},
|
|
@@ -244,11 +245,11 @@ const cart: CartApi = {
|
|
|
244
245
|
SalesLines: [],
|
|
245
246
|
};
|
|
246
247
|
},
|
|
247
|
-
getCartLinesInventory: function(
|
|
248
|
+
getCartLinesInventory: function (
|
|
248
249
|
_input: cartSchema.InventorySearchCartLinesCriteriaInput,
|
|
249
250
|
): Promise<ProductWarehouseInventoryInformation> {
|
|
250
251
|
throw new Error("Function not implemented.");
|
|
251
252
|
},
|
|
252
253
|
};
|
|
253
254
|
|
|
254
|
-
export
|
|
255
|
+
export default cart;
|
|
@@ -0,0 +1,94 @@
|
|
|
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
|
+
import {
|
|
11
|
+
Address,
|
|
12
|
+
Product as DynProduct,
|
|
13
|
+
} from "@msdyn365-commerce/retail-proxy";
|
|
14
|
+
import { Product, CartLine, Address as E4Address } from "../graphqlRequestSdk";
|
|
15
|
+
import { merge } from "object-mapper";
|
|
16
|
+
import { productMap } from "../product/e4-product.remaps";
|
|
17
|
+
import { addressMap } from "../address/e4-address.remaps";
|
|
18
|
+
|
|
19
|
+
/* CART REMAPS */
|
|
20
|
+
export const cartLineMap = {
|
|
21
|
+
"[].product": {
|
|
22
|
+
key: "[].Product?",
|
|
23
|
+
transform: (product: Product) => {
|
|
24
|
+
// If cart is empty, prevents CartLines[] from having entries
|
|
25
|
+
if (!product) return;
|
|
26
|
+
|
|
27
|
+
// For some reason transform is run multiple times. This prevents merge from running multiple times and overwriting translation.
|
|
28
|
+
const translated = merge(product, productMap) as DynProduct & {
|
|
29
|
+
ProductTypeValue?: number;
|
|
30
|
+
};
|
|
31
|
+
if (!translated.RecordId) return product;
|
|
32
|
+
translated.ProductTypeValue = 4; // default for now. Type = Standalone
|
|
33
|
+
return translated;
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
"[].id": "[].LineId",
|
|
37
|
+
"[].product.id": {
|
|
38
|
+
key: "[].ProductId",
|
|
39
|
+
transform: (id: string) => {
|
|
40
|
+
if (id !== null) return parseInt(id);
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
"[].product.code": "[].ItemId",
|
|
44
|
+
"[].product.name": "[].Product.Name",
|
|
45
|
+
"[].quantity": "[].Quantity",
|
|
46
|
+
"[].price": [
|
|
47
|
+
{ key: "[].Price", default: 0 },
|
|
48
|
+
{ key: "[].Product.Price", default: 0 },
|
|
49
|
+
{ key: "[].Product.BasePrice", default: 0 },
|
|
50
|
+
{ key: "[].Product.AdjustedPrice", default: 0 },
|
|
51
|
+
],
|
|
52
|
+
"[].amount": [{ key: "[].TotalAmount" }, { key: "[].NetPrice" }],
|
|
53
|
+
"[].uom.name": {
|
|
54
|
+
key: "[].UnitOfMeasureSymbol",
|
|
55
|
+
transform: (name: string) => {
|
|
56
|
+
if (name !== null) {
|
|
57
|
+
if (name === "Each") return "ea";
|
|
58
|
+
return name;
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
"[].product.productType": {
|
|
63
|
+
key: "[].Product.ProductTypeValue",
|
|
64
|
+
default: 4,
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export const cartMap = {
|
|
69
|
+
id: "Id",
|
|
70
|
+
itemCount: "TotalItems",
|
|
71
|
+
|
|
72
|
+
lines: {
|
|
73
|
+
key: "CartLines",
|
|
74
|
+
transform: (lines: CartLine[]) => {
|
|
75
|
+
if (lines.length === 0) return [];
|
|
76
|
+
return merge(lines, cartLineMap);
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
subtotal: "SubtotalAmountWithoutTax",
|
|
81
|
+
freightTotal: "ShippingChargeAmount",
|
|
82
|
+
taxTotal: "TaxAmount",
|
|
83
|
+
total: "TotalAmount",
|
|
84
|
+
email: "ReceiptEmail",
|
|
85
|
+
|
|
86
|
+
addresses: {
|
|
87
|
+
key: "ShippingAddress",
|
|
88
|
+
transform: (addresses: E4Address[]) => {
|
|
89
|
+
if (addresses.length === 0) return undefined;
|
|
90
|
+
const translated = merge(addresses, addressMap) as Address[];
|
|
91
|
+
return translated[addresses.length - 1];
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { extendedCartSchema, Cart } from "@/api-manager/schemas/cart.schema";
|
|
2
|
+
import { Cart as E4Cart } from "../graphqlRequestSdk";
|
|
3
|
+
import { cartMap } from "./e4-cart.remaps";
|
|
4
|
+
import { merge } from "object-mapper";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Transforms the E4 AddToCart response to a Cart retail-proxy object
|
|
8
|
+
* Add parameters to transform model as needed
|
|
9
|
+
*
|
|
10
|
+
* @param data the E4 Cart object
|
|
11
|
+
* @returns the transformed cart object
|
|
12
|
+
*/
|
|
13
|
+
export const cartTransformValidate = (cart: E4Cart): Cart => {
|
|
14
|
+
if (!(cart && cart?.id)) throw new Error("Not a valid cart");
|
|
15
|
+
const transformedData = merge(cart, cartMap);
|
|
16
|
+
try {
|
|
17
|
+
extendedCartSchema.parse(transformedData);
|
|
18
|
+
} catch (e) {
|
|
19
|
+
console.warn("Cart data does not match retail-proxy schema", e);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return transformedData as Cart;
|
|
23
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import getGraphqlClient from "@/api-manager/lib/get-graphql-client";
|
|
2
|
+
import { CategoryHierarchy } from "@/lib/category-helpers";
|
|
3
|
+
import { CategoryApi } from "@/api-manager/types/Datasource";
|
|
4
|
+
import { Category as E4Category } from "../graphqlRequestSdk";
|
|
5
|
+
import * as categoryTranslator from "./e4-categories.translator";
|
|
6
|
+
|
|
7
|
+
const categories: CategoryApi = {
|
|
8
|
+
async getCategories(): Promise<CategoryHierarchy[]> {
|
|
9
|
+
const e4Api = await getGraphqlClient();
|
|
10
|
+
const { data: rawApiResult, errors } = await e4Api.categories();
|
|
11
|
+
|
|
12
|
+
if (errors) {
|
|
13
|
+
console.error(
|
|
14
|
+
"GraphQL errors reading categories (in categories.getCategories):",
|
|
15
|
+
errors,
|
|
16
|
+
);
|
|
17
|
+
throw new Error("Error getting categories");
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const rawCategoryArray = rawApiResult?.categories?.category;
|
|
21
|
+
|
|
22
|
+
if (!Array.isArray(rawCategoryArray)) {
|
|
23
|
+
console.warn(
|
|
24
|
+
"Categories data at expected path not found or not an array in categories.getCategories:",
|
|
25
|
+
rawApiResult,
|
|
26
|
+
);
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const transformedHierarchicalData =
|
|
31
|
+
categoryTranslator.categoryTransformValidate(
|
|
32
|
+
rawApiResult?.categories?.category as E4Category[],
|
|
33
|
+
);
|
|
34
|
+
return transformedHierarchicalData;
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export default categories;
|