@mframework/layer-commerce 0.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/README.md +101 -0
- package/app/cart/useCart.ts +1 -0
- package/app/components/ChevronIcon/ChevronIcon.config.ts +17 -0
- package/app/components/DateSelect/DateSelect.config.ts +15 -0
- package/app/components/Field/Field.config.ts +14 -0
- package/app/components/FieldDate/FieldDate.config.ts +16 -0
- package/app/components/Form/Form.type.ts +8 -0
- package/app/components/Product/Product.config.ts +19 -0
- package/app/components/Product/Stock.config.ts +15 -0
- package/app/components/ProductCustomizableOption/ProductCustomizableOption.config.ts +5 -0
- package/app/components/ProductGallery/ProductGallery.config.ts +15 -0
- package/app/components/ProductReviews/ProductReviews.config.ts +8 -0
- package/app/composables/_types.ts +18 -0
- package/app/composables/adapters/abstract/cartAdapter.ts +0 -0
- package/app/composables/adapters/abstract/categoryAdapter.ts +0 -0
- package/app/composables/adapters/abstract/customerAdapter.ts +0 -0
- package/app/composables/adapters/abstract/inventoryAdapter.ts +0 -0
- package/app/composables/adapters/abstract/orderAdapter.ts +0 -0
- package/app/composables/adapters/abstract/productAdapter.ts +7 -0
- package/app/composables/cart/registry.ts +20 -0
- package/app/composables/cart/types.ts +18 -0
- package/app/composables/cart/useCart.ts +15 -0
- package/app/composables/config.ts +19 -0
- package/app/composables/defs/apiDefinitions.ts +55 -0
- package/app/composables/defs/extension.feature +40 -0
- package/app/composables/defs/extension.mocks.ts +39 -0
- package/app/composables/defs/extension.test.ts +280 -0
- package/app/composables/defs/extension.ts +236 -0
- package/app/composables/defs/index.ts +3 -0
- package/app/composables/defs/typeHelpers.ts +8 -0
- package/app/composables/defs/types.ts +136 -0
- package/app/composables/domain/product.ts +12 -0
- package/app/composables/featured-products.ts +20 -0
- package/app/composables/helpers/contextualizedNormalizers.feature +14 -0
- package/app/composables/helpers/contextualizedNormalizers.test.ts +85 -0
- package/app/composables/helpers/contextualizedNormalizers.ts +20 -0
- package/app/composables/helpers/index.ts +1 -0
- package/app/composables/index.ts +9 -0
- package/app/composables/methods/auth.ts +83 -0
- package/app/composables/methods/cart.ts +119 -0
- package/app/composables/methods/category.ts +27 -0
- package/app/composables/methods/checkout.ts +54 -0
- package/app/composables/methods/customer.ts +52 -0
- package/app/composables/methods/helpers.ts +5 -0
- package/app/composables/methods/index.ts +75 -0
- package/app/composables/methods/order.ts +39 -0
- package/app/composables/methods/product.ts +95 -0
- package/app/composables/methods/settings.ts +16 -0
- package/app/composables/models/cart.ts +95 -0
- package/app/composables/models/category.ts +13 -0
- package/app/composables/models/checkout.ts +17 -0
- package/app/composables/models/customer.ts +16 -0
- package/app/composables/models/facets.ts +25 -0
- package/app/composables/models/index.ts +94 -0
- package/app/composables/models/order.ts +43 -0
- package/app/composables/models/product.ts +73 -0
- package/app/composables/models/shared.ts +75 -0
- package/app/composables/orders.ts +69 -0
- package/app/composables/products/registry.ts +86 -0
- package/app/composables/products/types.ts +8 -0
- package/app/composables/products/useEvents.ts +26 -0
- package/app/composables/products/useGiftCards.ts +29 -0
- package/app/composables/products/useProducts.ts +12 -0
- package/app/composables/products/useSubscriptions.ts +29 -0
- package/app/composables/products.ts +30 -0
- package/app/composables/registry.ts +24 -0
- package/app/composables/useAuth.ts +43 -0
- package/app/composables/useBreakpoints/index.ts +1 -0
- package/app/composables/useBreakpoints/useBreakpoints.ts +28 -0
- package/app/composables/useCache.ts +38 -0
- package/app/composables/useCart/__tests__/useCart.spec.ts +11 -0
- package/app/composables/useCart/index.ts +1 -0
- package/app/composables/useCart/types.ts +17 -0
- package/app/composables/useCart/useCart.ts +46 -0
- package/app/composables/useCartShippingMethods/__tests__/useCartShippingMethods.spec.ts +11 -0
- package/app/composables/useCartShippingMethods/index.ts +1 -0
- package/app/composables/useCartShippingMethods/types.ts +17 -0
- package/app/composables/useCartShippingMethods/useCartShippingMethods.ts +47 -0
- package/app/composables/useCatalog.ts +26 -0
- package/app/composables/useContent.ts +26 -0
- package/app/composables/useCustomer/__tests__/useCustomer.spec.ts +25 -0
- package/app/composables/useCustomer/index.ts +2 -0
- package/app/composables/useCustomer/types.ts +17 -0
- package/app/composables/useCustomer/useCustomer.ts +40 -0
- package/app/composables/useCustomerAddress/__tests__/useCustomerAddress.spec.ts +11 -0
- package/app/composables/useCustomerAddress/index.ts +2 -0
- package/app/composables/useCustomerAddress/types.ts +17 -0
- package/app/composables/useCustomerAddress/useCustomerAddress.ts +55 -0
- package/app/composables/useCustomerOrder/__tests__/useCustomerOrder.spec.ts +11 -0
- package/app/composables/useCustomerOrder/adress.ts +10 -0
- package/app/composables/useCustomerOrder/index.ts +2 -0
- package/app/composables/useCustomerOrder/product.ts +37 -0
- package/app/composables/useCustomerOrder/types.ts +40 -0
- package/app/composables/useCustomerOrder/useCustomerOrder.ts +63 -0
- package/app/composables/useCustomerOrders/__tests__/useCustomerOrders.spec.ts +11 -0
- package/app/composables/useCustomerOrders/index.ts +2 -0
- package/app/composables/useCustomerOrders/types.ts +20 -0
- package/app/composables/useCustomerOrders/useCustomerOrders.ts +56 -0
- package/app/composables/useCustomerReturns/__tests__/useCustomerReturns.spec.ts +11 -0
- package/app/composables/useCustomerReturns/index.ts +2 -0
- package/app/composables/useCustomerReturns/types.ts +17 -0
- package/app/composables/useCustomerReturns/useCustomerReturns.ts +41 -0
- package/app/composables/useHandleError/index.ts +1 -0
- package/app/composables/useHandleError/types.ts +11 -0
- package/app/composables/useHandleError/useHandleError.ts +27 -0
- package/app/composables/useInventory.ts +29 -0
- package/app/composables/useLoading.ts +21 -0
- package/app/composables/useNotification.ts +21 -0
- package/app/composables/usePageTitle.ts +20 -0
- package/app/composables/useProduct/index.ts +2 -0
- package/app/composables/useProduct/types.ts +17 -0
- package/app/composables/useProduct/useProduct.ts +42 -0
- package/app/composables/useProductAttribute/__tests__/useProduct.mock.ts +31 -0
- package/app/composables/useProductAttribute/__tests__/useProductAttribute.spec.ts +14 -0
- package/app/composables/useProductAttribute/index.ts +1 -0
- package/app/composables/useProductAttribute/useProductAttribute.ts +37 -0
- package/app/composables/useProductRecommended/__tests__/useProductRecommended.spec.ts +12 -0
- package/app/composables/useProductRecommended/index.ts +1 -0
- package/app/composables/useProductRecommended/types.ts +17 -0
- package/app/composables/useProductRecommended/useProductRecommended.ts +43 -0
- package/app/composables/useProductReviews/__tests__/productReviews.mock.ts +20 -0
- package/app/composables/useProductReviews/__tests__/useProductReviews.spec.ts +22 -0
- package/app/composables/useProductReviews/index.ts +2 -0
- package/app/composables/useProductReviews/types.ts +17 -0
- package/app/composables/useProductReviews/useProductReviews.ts +46 -0
- package/app/composables/useProducts/__tests__/useProducts.spec.ts +11 -0
- package/app/composables/useProducts/types.ts +22 -0
- package/app/composables/useProducts/useProducts.ts +41 -0
- package/app/composables/useTax.ts +27 -0
- package/app/composables/validationRules/index.ts +1 -0
- package/app/composables/validationRules/password.feature +67 -0
- package/app/composables/validationRules/password.test.ts +89 -0
- package/app/composables/validationRules/password.ts +25 -0
- package/app/normalizers/Cart.query.ts +729 -0
- package/app/normalizers/Cart.type.ts +285 -0
- package/app/normalizers/Category.query.ts +146 -0
- package/app/normalizers/Category.type.ts +55 -0
- package/app/normalizers/CheckEmail.query.ts +28 -0
- package/app/normalizers/Checkout.query.ts +253 -0
- package/app/normalizers/Checkout.type.ts +77 -0
- package/app/normalizers/CmsBlock.query.ts +57 -0
- package/app/normalizers/CmsBlock.type.ts +25 -0
- package/app/normalizers/CmsPage.query.ts +59 -0
- package/app/normalizers/CmsPage.type.ts +26 -0
- package/app/normalizers/Config.query.ts +224 -0
- package/app/normalizers/Config.type.ts +196 -0
- package/app/normalizers/ContactForm.query.ts +49 -0
- package/app/normalizers/CreditMemo.type.ts +49 -0
- package/app/normalizers/GiftCard.type.ts +24 -0
- package/app/normalizers/Invoice.type.ts +58 -0
- package/app/normalizers/Menu.query.ts +54 -0
- package/app/normalizers/Menu.type.ts +22 -0
- package/app/normalizers/MyAccount.query.ts +268 -0
- package/app/normalizers/MyAccount.type.ts +129 -0
- package/app/normalizers/NewsletterSubscription.query.ts +38 -0
- package/app/normalizers/Order.query.ts +741 -0
- package/app/normalizers/Order.type.ts +268 -0
- package/app/normalizers/Payment.type.ts +28 -0
- package/app/normalizers/ProductAlerts.query.ts +23 -0
- package/app/normalizers/ProductCompare.query.ts +226 -0
- package/app/normalizers/ProductCompare.type.ts +90 -0
- package/app/normalizers/ProductList.query.ts +1620 -0
- package/app/normalizers/ProductList.type.ts +726 -0
- package/app/normalizers/Region.query.ts +58 -0
- package/app/normalizers/Region.type.ts +23 -0
- package/app/normalizers/Return.type.ts +50 -0
- package/app/normalizers/Review.query.ts +81 -0
- package/app/normalizers/Review.type.ts +42 -0
- package/app/normalizers/Slider.query.ts +72 -0
- package/app/normalizers/Slider.type.ts +26 -0
- package/app/normalizers/StoreInPickUp.query.ts +54 -0
- package/app/normalizers/StoreInPickUp.type.ts +59 -0
- package/app/normalizers/Subscription.type.ts +25 -0
- package/app/normalizers/Transaction.type.ts +20 -0
- package/app/normalizers/UrlRewrites.query.ts +55 -0
- package/app/normalizers/UrlRewrites.type.ts +25 -0
- package/app/normalizers/Wishlist.query.ts +202 -0
- package/app/normalizers/Wishlist.type.ts +42 -0
- package/app/pages/brand/[...slug].vue +76 -0
- package/app/pages/brands.vue +67 -0
- package/app/pages/cart.vue +142 -0
- package/app/pages/compare.vue +166 -0
- package/app/pages/departments/[...slug].vue +353 -0
- package/app/pages/departments/category/[...slug].vue +114 -0
- package/app/pages/incentive/[...id].vue +66 -0
- package/app/pages/invoice/[id].vue +309 -0
- package/app/pages/order/[id].vue +327 -0
- package/app/pages/product/[...id].vue +309 -0
- package/app/pages/product/showcases/index.vue +86 -0
- package/app/pages/shipment/[...id].vue +176 -0
- package/app/pages/shop/[...slug].vue +158 -0
- package/app/pages/shops.vue +76 -0
- package/app/pages/subscription/[...id].vue +147 -0
- package/app/pages/transaction/[...id].vue +74 -0
- package/app/routes/CategoryPage/CategoryPage.config.ts +28 -0
- package/app/routes/CategoryPage/CategoryPage.type.ts +8 -0
- package/app/routes/Checkout/Checkout.config.ts +3 -0
- package/app/routes/Checkout/Checkout.type.ts +14 -0
- package/app/routes/MyAccount/MyAccount.config.ts +1 -0
- package/app/routes/SearchPage/SearchPage.config.ts +1 -0
- package/app/routes/UrlRewrites/UrlRewrites.config.ts +5 -0
- package/app/stores/Cart/Cart.type.ts +26 -0
- package/app/stores/MyAccount/MyAccount.action.ts +7 -0
- package/app/stores/Notification/Notification.action.ts +40 -0
- package/app/stores/Notification/Notification.type.ts +16 -0
- package/app/stores/Popup/Popup.action.ts +30 -0
- package/app/stores/Product/Product.dispatcher.ts +53 -0
- package/app/stores/Product/Product.reducer.ts +12 -0
- package/app/stores/ProductList/ProductList.dispatcher.ts +35 -0
- package/app/stores/ProductList/ProductList.reducer.ts +13 -0
- package/app/stores/Store.type.ts +31 -0
- package/app/stores/Wishlist/Wishlist.type.ts +12 -0
- package/app/stores/cart.ts +218 -0
- package/app/stores/cartStore.ts +224 -0
- package/app/stores/checkout.ts +18 -0
- package/app/stores/compare.ts +65 -0
- package/app/stores/currency.js +29 -0
- package/app/stores/digital-products.js +11 -0
- package/app/stores/orders.ts +172 -0
- package/app/stores/product.ts +34 -0
- package/app/stores/productList.ts +35 -0
- package/app/stores/productListInfo.ts +0 -0
- package/app/stores/products.ts +118 -0
- package/app/stores/recentlyViewedProducts.ts +56 -0
- package/app/stores/review.ts +33 -0
- package/app/stores/storeInPickUp.ts +21 -0
- package/app/stores/user.ts +20 -0
- package/app/stores/wishlist.ts +46 -0
- package/app/types/Account.type.ts +141 -0
- package/app/types/Breadcrumbs.type.ts +23 -0
- package/app/types/CMS.type.ts +33 -0
- package/app/types/Category.type.ts +67 -0
- package/app/types/Checkout.type.ts +58 -0
- package/app/types/Common.type.ts +77 -0
- package/app/types/Config.type.ts +47 -0
- package/app/types/Device.type.ts +37 -0
- package/app/types/Direction.type.ts +23 -0
- package/app/types/Downloadable.type.ts +24 -0
- package/app/types/Error.type.ts +22 -0
- package/app/types/Field.type.ts +151 -0
- package/app/types/Global.type.ts +156 -0
- package/app/types/Graphql.type.ts +4497 -0
- package/app/types/Layout.type.ts +18 -0
- package/app/types/Menu.type.ts +39 -0
- package/app/types/MiniCart.type.ts +61 -0
- package/app/types/NotificationList.type.ts +34 -0
- package/app/types/Order.type.ts +174 -0
- package/app/types/Price.type.ts +72 -0
- package/app/types/ProductCompare.type.ts +24 -0
- package/app/types/ProductList.type.ts +351 -0
- package/app/types/Rating.type.ts +42 -0
- package/app/types/Router.type.ts +67 -0
- package/app/types/Slider.type.ts +25 -0
- package/app/types/StockStatus.type.ts +21 -0
- package/app/types/domain/index.ts +94 -0
- package/app/types/index.ts +33 -0
- package/app/types/shims.d.ts +52 -0
- package/app/types/tilework-opus.d.ts +48 -0
- package/app/utils/Address/Address.type.ts +28 -0
- package/app/utils/Address/index.ts +325 -0
- package/app/utils/Auth/IsSignedIn.ts +4 -0
- package/app/utils/Auth/Token.ts +9 -0
- package/app/utils/Base64/Base64.ts +16 -0
- package/app/utils/Base64/index.ts +12 -0
- package/app/utils/Browser/Browser.ts +29 -0
- package/app/utils/Browser/index.ts +12 -0
- package/app/utils/BrowserDatabase/BrowserDatabase.ts +70 -0
- package/app/utils/BrowserDatabase/index.ts +12 -0
- package/app/utils/CSS/CSS.ts +65 -0
- package/app/utils/CSS/index.ts +12 -0
- package/app/utils/Cache/Cache.ts +99 -0
- package/app/utils/Cart/Cart.ts +300 -0
- package/app/utils/Cart/Cart.type.ts +76 -0
- package/app/utils/Cart/Token.ts +59 -0
- package/app/utils/Cart/index.ts +13 -0
- package/app/utils/Category/Filters.ts +39 -0
- package/app/utils/Category/index.ts +12 -0
- package/app/utils/Common/index.ts +32 -0
- package/app/utils/Compare/Compare.ts +89 -0
- package/app/utils/Compare/index.ts +12 -0
- package/app/utils/Currency/Currency.ts +84 -0
- package/app/utils/Currency/index.ts +12 -0
- package/app/utils/DynamicReducer/DynamicReducer.type.ts +14 -0
- package/app/utils/DynamicReducer/Helper.ts +30 -0
- package/app/utils/DynamicReducer/index.tsx +35 -0
- package/app/utils/ElementTransition/ElementTransition.ts +100 -0
- package/app/utils/Form/Extract.ts +316 -0
- package/app/utils/Form/Form.ts +46 -0
- package/app/utils/Form/Form.type.ts +60 -0
- package/app/utils/Form/Transform.ts +33 -0
- package/app/utils/FormPortalCollector/index.ts +45 -0
- package/app/utils/History/History.type.ts +31 -0
- package/app/utils/History/index.ts +17 -0
- package/app/utils/Manipulations/Array.ts +18 -0
- package/app/utils/Manipulations/Date.ts +36 -0
- package/app/utils/Manipulations/index.ts +14 -0
- package/app/utils/Media/Media.ts +27 -0
- package/app/utils/Media/index.ts +13 -0
- package/app/utils/Menu/Menu.ts +116 -0
- package/app/utils/Menu/Menu.type.ts +37 -0
- package/app/utils/Menu/index.ts +12 -0
- package/app/utils/Mobile/index.ts +13 -0
- package/app/utils/Mobile/isMobile.ts +34 -0
- package/app/utils/Orders/Orders.ts +71 -0
- package/app/utils/Orders/Orders.type.ts +19 -0
- package/app/utils/Orders/index.ts +13 -0
- package/app/utils/Polyfill/index.ts +336 -0
- package/app/utils/Preload/CategoryPreload.ts +74 -0
- package/app/utils/Preload/ProductPreload.ts +28 -0
- package/app/utils/Preload/index.ts +75 -0
- package/app/utils/Price/Price.config.ts +189 -0
- package/app/utils/Price/Price.ts +63 -0
- package/app/utils/Price/index.ts +12 -0
- package/app/utils/Product/Extract.ts +652 -0
- package/app/utils/Product/Product.ts +575 -0
- package/app/utils/Product/Product.type.ts +260 -0
- package/app/utils/Product/Transform.ts +382 -0
- package/app/utils/Product/index.ts +12 -0
- package/app/utils/Promise/MakeCancelable.ts +44 -0
- package/app/utils/Promise/Promise.type.ts +15 -0
- package/app/utils/Promise/index.ts +13 -0
- package/app/utils/Query/Field.ts +71 -0
- package/app/utils/Query/Fragment.ts +22 -0
- package/app/utils/Query/PrepareDocument.ts +119 -0
- package/app/utils/Query/Query.type.ts +26 -0
- package/app/utils/Query/index.ts +15 -0
- package/app/utils/Request/Config.ts +21 -0
- package/app/utils/Request/DataContainer.ts +102 -0
- package/app/utils/Request/Debounce.ts +48 -0
- package/app/utils/Request/Error.ts +31 -0
- package/app/utils/Request/Hash.ts +88 -0
- package/app/utils/Request/LowPriorityLoad.ts +32 -0
- package/app/utils/Request/LowPriorityRender.ts +55 -0
- package/app/utils/Request/Mutation.ts +25 -0
- package/app/utils/Request/Query.ts +25 -0
- package/app/utils/Request/QueryDispatcher.ts +135 -0
- package/app/utils/Request/Request.ts +310 -0
- package/app/utils/Store/Store.type.ts +26 -0
- package/app/utils/Store/index.ts +71 -0
- package/app/utils/Url/Url.ts +297 -0
- package/app/utils/Url/index.ts +12 -0
- package/app/utils/Validator/Config.ts +96 -0
- package/app/utils/Validator/Validator.ts +268 -0
- package/app/utils/Validator/Validator.type.ts +47 -0
- package/app/utils/Validator/index.ts +12 -0
- package/app/utils/Wishlist/Wishlist.ts +65 -0
- package/app/utils/Wishlist/index.ts +12 -0
- package/app/utils/client.ts +280 -0
- package/app/utils/index.ts +53 -0
- package/app/utils/normalizer.ts +23 -0
- package/app/utils/normalizers/magento.ts +29 -0
- package/app/utils/normalizers/shopify.ts +29 -0
- package/nuxt.config.ts +11 -0
- package/package.json +43 -0
- package/tsconfig.json +45 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { getCommerceConfig } from '../config'
|
|
2
|
+
import { getProductProvider } from './registry'
|
|
3
|
+
|
|
4
|
+
export function useProducts() {
|
|
5
|
+
const { productProvider } = getCommerceConfig()
|
|
6
|
+
const provider = getProductProvider(productProvider)
|
|
7
|
+
|
|
8
|
+
return {
|
|
9
|
+
getProduct: provider.getProduct,
|
|
10
|
+
listProducts: provider.listProducts
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
|
|
2
|
+
import { getCommerceConfig } from '../config'
|
|
3
|
+
import { getSubscriptionProvider } from './registry'
|
|
4
|
+
|
|
5
|
+
export function useSubscriptions() {
|
|
6
|
+
const cfg = getCommerceConfig() as any
|
|
7
|
+
const providerName = cfg.subscriptionsProvider || cfg.productProvider
|
|
8
|
+
|
|
9
|
+
let provider: any
|
|
10
|
+
try {
|
|
11
|
+
provider = getSubscriptionProvider(providerName)
|
|
12
|
+
} catch (e) {
|
|
13
|
+
provider = {
|
|
14
|
+
getSubscription: async () => null,
|
|
15
|
+
listSubscriptions: async () => [],
|
|
16
|
+
subscribe: async () => ({ success: false })
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return {
|
|
21
|
+
getSubscription: provider.getSubscription ?? (async (id: string) => null),
|
|
22
|
+
listSubscriptions: provider.listSubscriptions ?? (async (params?: Record<string, any>) => []),
|
|
23
|
+
subscribe: provider.subscribe ?? (async (payload: Record<string, any>) => ({ success: false }))
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default useSubscriptions
|
|
28
|
+
|
|
29
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { useProducts as _useProducts } from './useProducts/useProducts'
|
|
2
|
+
|
|
3
|
+
export function useProducts() {
|
|
4
|
+
const core = _useProducts()
|
|
5
|
+
return {
|
|
6
|
+
// map older names used in stores to the implementation
|
|
7
|
+
getProducts: async (opts?: any) => {
|
|
8
|
+
const res = await core.fetchProducts()
|
|
9
|
+
const maybe = (res as any)?.value ?? res
|
|
10
|
+
return maybe || []
|
|
11
|
+
},
|
|
12
|
+
getProductById: async (id: string) => {
|
|
13
|
+
const res = await core.fetchProducts()
|
|
14
|
+
const maybe = (res as any)?.value ?? res
|
|
15
|
+
return (Array.isArray(maybe) ? maybe.find((p: any) => p.id === id || p.sku === id) || null : null)
|
|
16
|
+
},
|
|
17
|
+
getProductsByCategory: async (categoryId: string, opts?: any) => {
|
|
18
|
+
const res = await core.fetchProducts()
|
|
19
|
+
const maybe = (res as any)?.value ?? res
|
|
20
|
+
return Array.isArray(maybe) ? maybe.filter((p: any) => p.category_id === categoryId || p.category === categoryId) : []
|
|
21
|
+
},
|
|
22
|
+
searchProducts: async (query: string, opts?: any) => {
|
|
23
|
+
const res = await core.fetchProducts()
|
|
24
|
+
const maybe = (res as any)?.value ?? res
|
|
25
|
+
return Array.isArray(maybe) ? maybe.filter((p: any) => (p.name || p.title || '').toLowerCase().includes((query || '').toLowerCase())) : []
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export default useProducts
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ProductProvider } from './products/types'
|
|
2
|
+
import type { CartProvider } from './cart/types'
|
|
3
|
+
import { registerProductProvider } from './products/registry'
|
|
4
|
+
import { registerCartProvider } from './cart/registry'
|
|
5
|
+
|
|
6
|
+
export interface CommerceProviderBundle {
|
|
7
|
+
product?: ProductProvider
|
|
8
|
+
cart?: CartProvider
|
|
9
|
+
// future: category?: CategoryProvider
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// Register multiple domain providers at once from an adapter package.
|
|
13
|
+
// Example adapter entrypoint can call this during app boot.
|
|
14
|
+
export function registerCommerceProviderRuntime(name: string, bundle: CommerceProviderBundle) {
|
|
15
|
+
if (bundle.product) registerProductProvider(name, bundle.product)
|
|
16
|
+
if (bundle.cart) registerCartProvider(name, bundle.cart)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Also re-export individual runtime helpers for convenience
|
|
20
|
+
export { registerProductProviderRuntime } from './products/registry'
|
|
21
|
+
export { registerCartProviderRuntime } from './cart/registry'
|
|
22
|
+
export { registerEventProviderRuntime } from './products/registry'
|
|
23
|
+
export { registerGiftCardProviderRuntime } from './products/registry'
|
|
24
|
+
export { registerSubscriptionProviderRuntime } from './products/registry'
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ref } from 'vue'
|
|
2
|
+
|
|
3
|
+
export function useAuth() {
|
|
4
|
+
const token = ref<string | null>(process.env.MAGENTO_TOKEN || null)
|
|
5
|
+
const refreshInProgress = ref(false)
|
|
6
|
+
|
|
7
|
+
function isTokenExpired() {
|
|
8
|
+
// Best-effort check: token may be JWT
|
|
9
|
+
if (!token.value) return true
|
|
10
|
+
try {
|
|
11
|
+
const parts = token.value.split('.')
|
|
12
|
+
if (parts.length !== 3) return false
|
|
13
|
+
const payload = JSON.parse(atob(parts[1]))
|
|
14
|
+
const exp = payload.exp as number | undefined
|
|
15
|
+
if (!exp) return false
|
|
16
|
+
return Date.now() / 1000 > exp - 30
|
|
17
|
+
} catch {
|
|
18
|
+
return false
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async function refreshAccessToken() {
|
|
23
|
+
if (refreshInProgress.value) return
|
|
24
|
+
refreshInProgress.value = true
|
|
25
|
+
try {
|
|
26
|
+
const resp = await fetch(`${process.env.MAGENTO_API_URL}/auth/refresh`, { method: 'POST', credentials: 'include' })
|
|
27
|
+
if (resp.ok) {
|
|
28
|
+
const data = await resp.json()
|
|
29
|
+
token.value = data.token || token.value
|
|
30
|
+
}
|
|
31
|
+
} finally {
|
|
32
|
+
refreshInProgress.value = false
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function logout() {
|
|
37
|
+
token.value = null
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return { token, isTokenExpired, refreshAccessToken, logout }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export default useAuth
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useBreakpoints';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ref, onMounted } from 'vue';
|
|
2
|
+
import { createSharedComposable, syncRefs, useBreakpoints as useBreakpointsVueUse } from '@vueuse/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @description Composable that prepares breakpoints-dependent refs
|
|
6
|
+
* @returns {@link ReturnType<typeof useBreakpoints>}
|
|
7
|
+
* @example
|
|
8
|
+
* const { isTablet, isDesktop } = useBreakpoints();
|
|
9
|
+
*/
|
|
10
|
+
export const useBreakpoints = createSharedComposable(() => {
|
|
11
|
+
const breakpoints = useBreakpointsVueUse({
|
|
12
|
+
tablet: '768px',
|
|
13
|
+
desktop: '1024px',
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
const isTablet = ref(true);
|
|
17
|
+
const isDesktop = ref(false);
|
|
18
|
+
|
|
19
|
+
onMounted(() => {
|
|
20
|
+
syncRefs(breakpoints.greaterOrEqual('tablet'), isTablet);
|
|
21
|
+
syncRefs(breakpoints.greaterOrEqual('desktop'), isDesktop);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
return {
|
|
25
|
+
isTablet,
|
|
26
|
+
isDesktop,
|
|
27
|
+
};
|
|
28
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export function useCache() {
|
|
2
|
+
const store = new Map<string, any>()
|
|
3
|
+
|
|
4
|
+
function setCacheItem(key: string, value: any) {
|
|
5
|
+
try {
|
|
6
|
+
store.set(key, value)
|
|
7
|
+
if (typeof window !== 'undefined' && window.localStorage) {
|
|
8
|
+
localStorage.setItem(key, JSON.stringify(value))
|
|
9
|
+
}
|
|
10
|
+
} catch (e) {
|
|
11
|
+
// ignore storage failures
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function getCacheItem<T = any>(key: string): T | null {
|
|
16
|
+
if (store.has(key)) return store.get(key)
|
|
17
|
+
try {
|
|
18
|
+
if (typeof window !== 'undefined' && window.localStorage) {
|
|
19
|
+
const raw = localStorage.getItem(key)
|
|
20
|
+
if (raw) {
|
|
21
|
+
const parsed = JSON.parse(raw)
|
|
22
|
+
store.set(key, parsed)
|
|
23
|
+
return parsed as T
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
} catch {}
|
|
27
|
+
return null
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function removeCacheItem(key: string) {
|
|
31
|
+
store.delete(key)
|
|
32
|
+
try { if (typeof window !== 'undefined' && window.localStorage) localStorage.removeItem(key) } catch {}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return { setCacheItem, getCacheItem, removeCacheItem }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export default useCache
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useCart } from '~/composables/useCart/useCart';
|
|
2
|
+
|
|
3
|
+
describe('useCart', () => {
|
|
4
|
+
it('should return account data', async () => {
|
|
5
|
+
const { fetchCard, data } = useCart();
|
|
6
|
+
|
|
7
|
+
await fetchCard();
|
|
8
|
+
|
|
9
|
+
expect(data.value).not.toBeUndefined();
|
|
10
|
+
});
|
|
11
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useCart';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Ref } from 'vue';
|
|
2
|
+
import type { SfCart, Maybe } from '../_types';
|
|
3
|
+
|
|
4
|
+
export interface UseCartState {
|
|
5
|
+
data: Maybe<SfCart>;
|
|
6
|
+
loading: boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export type FetchCard = () => Promise<Ref<Maybe<SfCart>>>;
|
|
10
|
+
|
|
11
|
+
export interface UseCart {
|
|
12
|
+
data: Readonly<Ref<UseCartState['data']>>;
|
|
13
|
+
loading: Readonly<Ref<boolean>>;
|
|
14
|
+
fetchCard: FetchCard;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type UseCartReturn = () => UseCart;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { SfCart } from '../_types';
|
|
2
|
+
import { toRefs } from '@vueuse/shared';
|
|
3
|
+
import type { UseCartReturn, UseCartState, FetchCard } from './types';
|
|
4
|
+
import { getCommerceClient } from '../../utils/client';
|
|
5
|
+
import { useAsyncData, useState } from 'nuxt/app';
|
|
6
|
+
import { useHandleError } from '../useHandleError';
|
|
7
|
+
import { ref } from 'vue';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @description Composable for managing cart.
|
|
11
|
+
* @returns {@link UseCartReturn}
|
|
12
|
+
* @example
|
|
13
|
+
* const { data, loading } = useCart();
|
|
14
|
+
*/
|
|
15
|
+
export const useCart: UseCartReturn = () => {
|
|
16
|
+
const state = useState<UseCartState>('useCart', () => ({
|
|
17
|
+
data: null,
|
|
18
|
+
loading: false,
|
|
19
|
+
}));
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @description Function for fetching the cart.
|
|
23
|
+
* @example
|
|
24
|
+
* getCart();
|
|
25
|
+
*/
|
|
26
|
+
const fetchCard: FetchCard = async () => {
|
|
27
|
+
state.value.loading = true;
|
|
28
|
+
try {
|
|
29
|
+
const client = getCommerceClient();
|
|
30
|
+
const { data, error } = await useAsyncData<SfCart>(() => client.getCart?.());
|
|
31
|
+
useHandleError(error.value);
|
|
32
|
+
state.value.data = data.value;
|
|
33
|
+
// wrap the returned ref into our Vue ref to avoid cross-package Ref mismatch
|
|
34
|
+
return ref(data.value);
|
|
35
|
+
} catch (error) {
|
|
36
|
+
throw new Error(error as string);
|
|
37
|
+
} finally {
|
|
38
|
+
state.value.loading = false;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
fetchCard,
|
|
44
|
+
...toRefs(state.value),
|
|
45
|
+
};
|
|
46
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useCartShippingMethods } from '../useCartShippingMethods';
|
|
2
|
+
|
|
3
|
+
describe('useCartShippingMethods', () => {
|
|
4
|
+
it('should return shipping methods', async () => {
|
|
5
|
+
const { getShippingMethods, data } = useCartShippingMethods();
|
|
6
|
+
|
|
7
|
+
await getShippingMethods();
|
|
8
|
+
|
|
9
|
+
expect(data.value).not.toBeUndefined();
|
|
10
|
+
});
|
|
11
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useCartShippingMethods';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SfShippingMethods, Maybe } from '../_types';
|
|
2
|
+
import type { Ref } from 'vue';
|
|
3
|
+
|
|
4
|
+
export interface UseCartShippingMethodsState {
|
|
5
|
+
data: Maybe<SfShippingMethods>;
|
|
6
|
+
loading: boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export type GetShippingMethods = () => Promise<Ref<Maybe<SfShippingMethods>>>;
|
|
10
|
+
|
|
11
|
+
export interface UseCartShippingMethods {
|
|
12
|
+
data: Readonly<Ref<UseCartShippingMethodsState['data']>>;
|
|
13
|
+
loading: Readonly<Ref<boolean>>;
|
|
14
|
+
getShippingMethods: GetShippingMethods;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type UseCartShippingMethodsReturn = () => UseCartShippingMethods;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { toRefs } from '@vueuse/shared';
|
|
2
|
+
import { computed } from 'vue';
|
|
3
|
+
import type { Ref } from 'vue';
|
|
4
|
+
import type { Maybe, SfShippingMethods } from '../_types';
|
|
5
|
+
import type {
|
|
6
|
+
UseCartShippingMethodsState,
|
|
7
|
+
UseCartShippingMethodsReturn,
|
|
8
|
+
GetShippingMethods,
|
|
9
|
+
} from './types';
|
|
10
|
+
import { getCommerceClient } from '../../utils/client';
|
|
11
|
+
import { useAsyncData, useState } from 'nuxt/app';
|
|
12
|
+
import { useHandleError } from '../useHandleError';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @description Composable for getting shipping methods.
|
|
16
|
+
* @example
|
|
17
|
+
* const { data, loading, getShippingMethods } = useCartShippingMethods();
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
export const useCartShippingMethods: UseCartShippingMethodsReturn = () => {
|
|
21
|
+
const state = useState<UseCartShippingMethodsState>('useCartSippingMethods', () => ({
|
|
22
|
+
data: null,
|
|
23
|
+
loading: false,
|
|
24
|
+
}));
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @description Function for fetching shipping methods.
|
|
28
|
+
* @example
|
|
29
|
+
* getShippingMethods();
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
const getShippingMethods: GetShippingMethods = async () => {
|
|
33
|
+
state.value.loading = true;
|
|
34
|
+
const client = getCommerceClient();
|
|
35
|
+
const { data, error } = await useAsyncData<any>(() => client.listShippingMethods?.());
|
|
36
|
+
useHandleError(error.value);
|
|
37
|
+
const result = (data.value && (data.value as any).methods) ? data.value : { methods: [] };
|
|
38
|
+
state.value.data = result as any;
|
|
39
|
+
state.value.loading = false;
|
|
40
|
+
return computed(() => state.value.data) as unknown as Ref<Maybe<SfShippingMethods>>;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
getShippingMethods,
|
|
45
|
+
...toRefs(state.value),
|
|
46
|
+
};
|
|
47
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ref, watchEffect } from 'vue'
|
|
2
|
+
import { getCommerceClient } from '../utils/client'
|
|
3
|
+
|
|
4
|
+
export function useCatalogFallback() {
|
|
5
|
+
// Prefer the generic commerce client provided by an adapter or the SDK
|
|
6
|
+
const client = getCommerceClient()
|
|
7
|
+
return {
|
|
8
|
+
adapter: client,
|
|
9
|
+
async getProductById(id: string) {
|
|
10
|
+
if (client && typeof (client as any).getProductById === 'function') return (client as any).getProductById(id)
|
|
11
|
+
return null
|
|
12
|
+
},
|
|
13
|
+
async getProductBySlug(slug: string) {
|
|
14
|
+
if (client && typeof (client as any).getProductBySlug === 'function') return (client as any).getProductBySlug(slug)
|
|
15
|
+
return null
|
|
16
|
+
},
|
|
17
|
+
async listProducts(params?: Record<string, unknown>) {
|
|
18
|
+
if (client && typeof (client as any).listProducts === 'function') return (client as any).listProducts(params)
|
|
19
|
+
return []
|
|
20
|
+
},
|
|
21
|
+
async listAttributes(filter?: Record<string, unknown>) {
|
|
22
|
+
if (client && typeof (client as any).listAttributes === 'function') return (client as any).listAttributes(filter)
|
|
23
|
+
return []
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { getCommerceClient } from '../utils/client'
|
|
2
|
+
|
|
3
|
+
export function useContentFallback() {
|
|
4
|
+
const client = getCommerceClient()
|
|
5
|
+
return {
|
|
6
|
+
adapter: client,
|
|
7
|
+
async listShops(params?: Record<string, unknown>) {
|
|
8
|
+
if (client && typeof (client as any).listShops === 'function') return (client as any).listShops(params)
|
|
9
|
+
return []
|
|
10
|
+
},
|
|
11
|
+
async listBrands(params?: Record<string, unknown>) {
|
|
12
|
+
if (client && typeof (client as any).listBrands === 'function') return (client as any).listBrands(params)
|
|
13
|
+
return []
|
|
14
|
+
},
|
|
15
|
+
async getBrandBySlug(slug: string) {
|
|
16
|
+
if (client && typeof (client as any).getBrandBySlug === 'function') return (client as any).getBrandBySlug(slug)
|
|
17
|
+
return null
|
|
18
|
+
},
|
|
19
|
+
async getPage(id: string) {
|
|
20
|
+
if (client && typeof (client as any).getPage === 'function') return (client as any).getPage(id)
|
|
21
|
+
return null
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export default useContentFallback
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { useCustomer } from '~/composables/useCustomer/useCustomer';
|
|
2
|
+
|
|
3
|
+
vi.mock('@mframework/sdk', () => ({
|
|
4
|
+
sdk: {
|
|
5
|
+
commerce: {
|
|
6
|
+
getCustomer: vi.fn(() => ({
|
|
7
|
+
id: 'SfId',
|
|
8
|
+
email: 'hieronim.anonim@gmail.com',
|
|
9
|
+
firstName: 'hieronim',
|
|
10
|
+
lastName: 'anonim'
|
|
11
|
+
})),
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
}));
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
describe('useCustomer', () => {
|
|
18
|
+
it('should return account data', async () => {
|
|
19
|
+
const { fetchCustomer, data } = useCustomer();
|
|
20
|
+
|
|
21
|
+
await fetchCustomer();
|
|
22
|
+
|
|
23
|
+
expect(data.value).not.toBeUndefined();
|
|
24
|
+
});
|
|
25
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Ref } from 'vue';
|
|
2
|
+
import type { Maybe, SfCustomer } from '../_types';
|
|
3
|
+
|
|
4
|
+
export interface UseCustomerState {
|
|
5
|
+
data: Maybe<SfCustomer>;
|
|
6
|
+
loading: boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export type FetchCustomer = () => Promise<Ref<Maybe<SfCustomer>>>;
|
|
10
|
+
|
|
11
|
+
export interface UseCustomer {
|
|
12
|
+
data: Readonly<Ref<UseCustomerState['data']>>;
|
|
13
|
+
loading: Readonly<Ref<boolean>>;
|
|
14
|
+
fetchCustomer: FetchCustomer;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type UseCustomerReturn = () => UseCustomer;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { toRefs } from '@vueuse/shared';
|
|
2
|
+
import { computed } from 'vue';
|
|
3
|
+
import type { Ref } from 'vue';
|
|
4
|
+
import type { Maybe, SfCustomer } from '../_types';
|
|
5
|
+
import type { UseCustomerReturn, UseCustomerState, FetchCustomer } from './types';
|
|
6
|
+
import { getCommerceClient } from '../../utils/client';
|
|
7
|
+
import { useAsyncData, useState } from 'nuxt/app';
|
|
8
|
+
import { useHandleError } from '../useHandleError';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @description Composable managing customer data
|
|
12
|
+
* @returns {@link UseCustomerReturn}
|
|
13
|
+
* @example
|
|
14
|
+
* const { data, loading, fetchCustomer } = useCustomer();
|
|
15
|
+
*/
|
|
16
|
+
export const useCustomer: UseCustomerReturn = () => {
|
|
17
|
+
const state = useState<UseCustomerState>('useCustomer', () => ({
|
|
18
|
+
data: null,
|
|
19
|
+
loading: false,
|
|
20
|
+
}));
|
|
21
|
+
|
|
22
|
+
/** Function for fetching customer data
|
|
23
|
+
* @example
|
|
24
|
+
* fetchCustomer();
|
|
25
|
+
*/
|
|
26
|
+
const fetchCustomer: FetchCustomer = async () => {
|
|
27
|
+
state.value.loading = true;
|
|
28
|
+
const client = getCommerceClient();
|
|
29
|
+
const { data, error } = await useAsyncData<UseCustomerState['data']>(() => client.getCustomer?.());
|
|
30
|
+
useHandleError(error.value);
|
|
31
|
+
state.value.data = data.value;
|
|
32
|
+
state.value.loading = false;
|
|
33
|
+
return computed(() => state.value.data) as unknown as Ref<Maybe<SfCustomer>>;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
fetchCustomer,
|
|
38
|
+
...toRefs(state.value),
|
|
39
|
+
};
|
|
40
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useCustomerAddress } from '~/composables/useCustomerAddress/useCustomerAddress';
|
|
2
|
+
|
|
3
|
+
describe('useCustomerAddress', () => {
|
|
4
|
+
it('should return account data', async () => {
|
|
5
|
+
const { fetchCustomerAddress, data } = useCustomerAddress();
|
|
6
|
+
|
|
7
|
+
await fetchCustomerAddress();
|
|
8
|
+
|
|
9
|
+
expect(data.value).not.toBeUndefined();
|
|
10
|
+
});
|
|
11
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Ref } from 'vue';
|
|
2
|
+
import type { Maybe, SfAddress } from '../_types';
|
|
3
|
+
|
|
4
|
+
export interface UseCustomerAddressState {
|
|
5
|
+
data: Maybe<SfAddress>;
|
|
6
|
+
loading: boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export type FetchCustomerAddress = () => Promise<Ref<Maybe<SfAddress>>>;
|
|
10
|
+
|
|
11
|
+
export interface UseCustomerAddress {
|
|
12
|
+
data: Readonly<Ref<UseCustomerAddressState['data']>>;
|
|
13
|
+
loading: Readonly<Ref<boolean>>;
|
|
14
|
+
fetchCustomerAddress: FetchCustomerAddress;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type UseCustomerAddressReturn = () => UseCustomerAddress;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { toRefs } from '@vueuse/shared';
|
|
2
|
+
import { computed } from 'vue';
|
|
3
|
+
import type { Ref } from 'vue';
|
|
4
|
+
import type { Maybe, SfAddress } from '../_types';
|
|
5
|
+
import type {
|
|
6
|
+
UseCustomerAddressReturn,
|
|
7
|
+
UseCustomerAddressState,
|
|
8
|
+
FetchCustomerAddress,
|
|
9
|
+
} from './types';
|
|
10
|
+
import { useAsyncData, useState } from 'nuxt/app';
|
|
11
|
+
import { useHandleError } from '../useHandleError';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @description Composable managing address data
|
|
15
|
+
* @returns {@link UseCustomerAddressReturn}
|
|
16
|
+
* @example
|
|
17
|
+
* const { data, loading, fetchCustomerAddress } = useCustomerAddress();
|
|
18
|
+
*/
|
|
19
|
+
export const useCustomerAddress: UseCustomerAddressReturn = () => {
|
|
20
|
+
const state = useState<UseCustomerAddressState>(`useCustomerAddress`, () => ({
|
|
21
|
+
data: null,
|
|
22
|
+
loading: false,
|
|
23
|
+
}));
|
|
24
|
+
|
|
25
|
+
/** Function for fetching address data
|
|
26
|
+
* @example
|
|
27
|
+
* fetchCustomerAddress();
|
|
28
|
+
*/
|
|
29
|
+
const fetchCustomerAddress: FetchCustomerAddress = async () => {
|
|
30
|
+
state.value.loading = true;
|
|
31
|
+
const { data, error } = await useAsyncData(() =>
|
|
32
|
+
Promise.resolve({
|
|
33
|
+
firstName: 'Hieronim',
|
|
34
|
+
lastName: 'Anonim',
|
|
35
|
+
address1: 'Oak Drive',
|
|
36
|
+
address2: '3633',
|
|
37
|
+
city: 'Colonie',
|
|
38
|
+
country: 'US',
|
|
39
|
+
phoneNumber: '+1 321 765 0987',
|
|
40
|
+
postalCode: '12205',
|
|
41
|
+
state: 'NY',
|
|
42
|
+
titleCode: '',
|
|
43
|
+
}),
|
|
44
|
+
);
|
|
45
|
+
useHandleError(error.value);
|
|
46
|
+
state.value.data = data.value;
|
|
47
|
+
state.value.loading = false;
|
|
48
|
+
return computed(() => state.value.data) as unknown as Ref<Maybe<SfAddress>>;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
fetchCustomerAddress,
|
|
53
|
+
...toRefs(state.value),
|
|
54
|
+
};
|
|
55
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useCustomerOrder } from '~/composables/useCustomerOrder/useCustomerOrder';
|
|
2
|
+
|
|
3
|
+
describe('useCustomerOrder', () => {
|
|
4
|
+
it('should return customer order data', async () => {
|
|
5
|
+
const { fetchCustomerOrder, data } = useCustomerOrder('1');
|
|
6
|
+
|
|
7
|
+
await fetchCustomerOrder('1');
|
|
8
|
+
|
|
9
|
+
expect(data.value).not.toBeUndefined();
|
|
10
|
+
});
|
|
11
|
+
});
|