@heyframe/composables
Version:
HeyFrame Frontends composables for Vue
59 lines (53 loc) • 1.56 kB
text/typescript
import { defu } from "defu";
import { useHeyFrameContext } from "#imports";
import type { Schemas } from "#heyframe";
import { cmsAssociations } from "../cms/cmsAssociations";
type UseProductSearchReturnOptions = {
withCmsAssociations?: boolean;
criteria?: Partial<Schemas["Criteria"]>;
associations?: Partial<Schemas["Association"]>;
};
export type UseProductSearchReturn = {
/**
* Searches for a product by its id
* @param productId
* @param options - optional parameters accepts `withCmsAssociations` flag to fetch cms-related associations and criteria
* @returns {Promise<Schemas['ProductDetailResponse']>}
*/
search: (
productId: string,
options?: UseProductSearchReturnOptions,
) => Promise<Schemas["ProductDetailResponse"]>;
};
/**
* Composable for product search.
* @public
* @category Navigation & Routing
*/
export function useProductSearch(): UseProductSearchReturn {
const { apiClient } = useHeyFrameContext();
const search = async (
productId: string,
options?: UseProductSearchReturnOptions,
) => {
const associations = defu(
options?.withCmsAssociations ? cmsAssociations : {},
options?.criteria,
{ associations: options?.associations ?? {} },
);
const result = await apiClient.invoke(
"readProductDetail post /product/{productId}",
{
headers: {
"sw-include-seo-urls": true,
},
pathParams: { productId },
body: associations,
},
);
return result.data;
};
return {
search,
};
}