Files
mm.com.tm-frontend/src/app/api/categories.js
@jcarymuhammedow a2298dfa9c added sorting
2026-04-18 11:05:39 +05:00

127 lines
4.1 KiB
JavaScript

import { baseApi } from "./baseApi";
export const categoriesApi = baseApi.injectEndpoints({
endpoints: (builder) => ({
getCategories: builder.query({
query: (type = "tree") => `/categories?type=${type}`,
}),
getCategoryProducts: builder.query({
query: ({ categoryId, page = 1, limit, brands, min_price, max_price, sorting }) => {
const params = new URLSearchParams();
params.append('page', page);
if (limit) params.append('limit', limit);
if (brands) params.append('brands', brands);
if (min_price) params.append('min_price', min_price);
if (max_price) params.append('max_price', max_price);
if (sorting) params.append('sorting', sorting);
return `categories/${categoryId}/products?${params.toString()}`;
},
transformResponse: (response) => ({
data: response.data || [],
pagination: response.pagination || {},
}),
}),
getAllCategoryProducts: builder.query({
async queryFn(category, queryApi, extraOptions, baseQuery) {
const fetchProducts = async (categoryId) => {
const result = await baseQuery(`categories/${categoryId}/products`);
return result.data ? result.data.data : [];
};
let allProducts = await fetchProducts(category.id);
for (const child of category.children) {
const childProducts = await fetchProducts(child.id);
allProducts = [...allProducts, ...childProducts];
}
return { data: allProducts };
},
}),
getAllCategoryProductsPaginated: builder.query({
async queryFn(
{ category, page = 1, limit = 6, brands, min_price, max_price, sorting },
queryApi,
extraOptions,
baseQuery
) {
if (!category) return { data: [] };
try {
const hasMoreByCategory = {};
const fetchProductsForPage = async (categoryIds, currentPage) => {
let allPageProducts = [];
const perCategoryLimit = Math.ceil(limit / categoryIds.length);
for (const categoryId of categoryIds) {
const params = new URLSearchParams();
params.append('page', currentPage);
params.append('limit', perCategoryLimit);
if (brands) params.append('brands', brands);
if (min_price) params.append('min_price', min_price);
if (max_price) params.append('max_price', max_price);
if (sorting) params.append('sorting', sorting);
const result = await baseQuery(
`categories/${categoryId}/products?${params.toString()}`
);
if (result.data && result.data.data) {
allPageProducts = [...allPageProducts, ...result.data.data];
hasMoreByCategory[categoryId] = !!result.data.pagination.next_page_url;
}
}
return allPageProducts;
};
const categoryIds = [category.id];
if (category.children && category.children.length > 0) {
category.children.forEach((child) => categoryIds.push(child.id));
}
const productsForPage = await fetchProductsForPage(categoryIds, page);
const hasMorePages = Object.values(hasMoreByCategory).some(
(hasMore) => hasMore
);
return {
data: {
data: productsForPage,
pagination: {
currentPage: page,
hasMorePages: hasMorePages,
},
},
};
} catch (error) {
return { error };
}
},
}),
getProductById: builder.query({
query: (productId) => `/products/${productId}`,
}),
getRelatedProducts: builder.query({
query: (productId) => `/products/${productId}/related`,
}),
}),
});
export const {
useGetCategoriesQuery,
useGetCategoryProductsQuery,
useGetAllCategoryProductsQuery,
useGetAllCategoryProductsPaginatedQuery,
useLazyGetAllCategoryProductsPaginatedQuery,
useGetProductByIdQuery,
useGetRelatedProductsQuery,
} = categoriesApi;