useProduct composable
useProduct composable allows loading product details or list with params for sorting, filtering and pagination.
API
useProduct composable returns the following properties:
getProductList- function that fetches a list of products with sorting, filtering and pagination.getProductDetails- function that fetches a product details with sorting, filtering and pagination.getProductPath- function that gets a product path from url_rewrites or url_key .error- ref that contains an errors from the composable methods.loading- ref that contains information whether any of the composable methods is loading.
Interfaces
type GetProductSearchParams = {
search?: string;
filter?: ProductAttributeFilterInput;
pageSize?: number;
currentPage?: number;
sort?: ProductAttributeSortInput;
configurations?: string[];
};
interface UseProductErrors {
getProductList: Error | null;
getProductDetails: Error | null;
}
interface UseProductInterface {
error: DeepReadonly<Ref<UseProductErrors>>;
loading: Readonly<Ref<boolean>>;
getProductList(searchParams: GetProductSearchParams): Promise<ProductList | null>;
getProductDetails(searchParams: GetProductSearchParams): Promise<ProductDetails | null>;
getProductPath(product: Product): string;
}
productGetters
productGetters is a set of helper functions that can be used to get data from the product. They receive product object as a parameter and return the data from it.
product parameter
getName- returns the name of the productgetSlug- returns the slug of the productgetPrice- returns an object with the prices of the product:regular- returns the regular price of the productspecial- returns the special price of the productmaximum- returns the maximum price of the productfinal- returns final price with discounts, etc.
getGallery- returns an object with the media content:small- returns URL for small sized imagenormal- returns URL for normal sized imagebig- returns URL for big sized image
getCoverImage- returns the main product cover image URLgetAttributes- returns an object with the attributes objects, can be filter by attribute namegetDescription- returns product descriptiongetCategoryIds- returns an array of product category IDsgetId- returns product IDgetTotalReviews- returns a number of user's reviews for a productgetAverageRating- returns a number of an average product's ratinggetBreadcrumbs- returns an array of breadcrumb objects:text- text of the breadcrumblink- link of the breadcrumb
getCategory- returns product's category objectgetProductRelatedProduct- returns a related productgetProductSku- returns SKU of the productgetProductThumbnailImage- returns thumbnail image URLgetProductUpsellProduct- returns the upsell productgetShortDescription- returns a short product's descriptiongetTypeId- returns type idgetSwatchData- returns product's swatch datagetGroupedProducts- returns grouped productsgetBundleProducts- returns bundle products
productGetters usage
import productGetters from '~/modules/catalog/product/getters/productGetters';
const productName = productGetters.getName(product);
const productSlug = productGetters.getSlug(product);
const productDescription = productGetters.getDescription(product);
Examples
Search products
Handle user search input and fetch list of products:
<script>
import { useProduct } from '~/composables';
setup() {
const term = ref('');
const { getProductList } = useProduct();
const rawHandleSearch = async (searchTerm: string) => {
term.value = searchTerm;
const productList : Products = await getProductList({
pageSize: 30,
search: term.value,
}) as Products;
};
}
</script>
Get product details
Fetch product details by sku:
import { usePageStore } from '~/stores/page';
import { useProduct } from '~/composables';
setup() {
const { routeData } = usePageStore();
const { getProductDetails } = useProduct();
const getBaseSearchQuery = {
filter: {
sku: {
eq: routeData.sku,
},
}
};
const fetchProductBaseData = async (searchQuery = getBaseSearchQuery()) => {
const result = await getProductDetails({
...searchQuery,
});
product.value = result.items[0] as Product;
};
useFetch(async () => {
await fetchProductBaseData();
});
}
Get product path
Get product's path and pass as link prop to SfProductCard component:
<template>
<div>
<SfProductCard
//...
:link="localePath(getProductPath(product))"
/>
</div>
</template>
<script lang="ts">
import { useProduct } from '~/composables';
setup() {
const { getProductPath } = useProduct();
return {
getProductPath,
};
}
</script>