Files
mm.com.tm-frontend/src/pages/Category/hooks/useCategoryData.js
2025-12-20 03:34:46 +05:00

111 lines
3.1 KiB
JavaScript

import { useState, useEffect, useMemo } from "react";
import { useGetCategoriesQuery } from "../../../app/api/categories";
import { useGetCollectionByIdQuery } from "../../../app/api/collectionsApi";
import {
useGetFiltersQuery,
useLazyGetFiltersQuery,
} from "../../../app/api/filtersApi";
const useCategoryData = ({
categoryId,
collectionId,
brandId,
selectedFilterCategory,
searchQuery,
}) => {
const [selectedCategory, setSelectedCategory] = useState(null);
const { data: categoriesData } = useGetCategoriesQuery("tree");
const filterParams = useMemo(() => {
if (searchQuery) return null;
if (selectedFilterCategory) return { category_id: selectedFilterCategory };
if (categoryId) return { category_id: categoryId };
if (collectionId) return { collection_id: collectionId };
if (brandId) return { brand_id: brandId };
return null;
}, [categoryId, collectionId, brandId, selectedFilterCategory, searchQuery]);
const {
data: filtersData,
isLoading: filtersLoading,
error: filtersError,
} = useGetFiltersQuery(filterParams, {
skip: !filterParams,
});
const [fetchFilters, { data: lazyFiltersData }] = useLazyGetFiltersQuery();
const {
data: collectionData,
isLoading: collectionLoading,
error: collectionError,
} = useGetCollectionByIdQuery(collectionId, {
skip: !collectionId,
});
const isSubCategory = useMemo(() => {
if (!categoriesData?.data || !categoryId) return false;
const checkIsSubCategory = (categories, targetId) => {
for (const category of categories) {
if (category.children) {
for (const subCategory of category.children) {
if (subCategory.id === parseInt(targetId)) return true;
if (subCategory.children) {
const found = checkIsSubCategory([subCategory], targetId);
if (found) return true;
}
}
}
}
return false;
};
return checkIsSubCategory(categoriesData.data, parseInt(categoryId));
}, [categoriesData, categoryId]);
const activeFilters = useMemo(() => {
return selectedFilterCategory && lazyFiltersData
? lazyFiltersData
: filtersData;
}, [selectedFilterCategory, lazyFiltersData, filtersData]);
useEffect(() => {
if (!categoryId || !categoriesData?.data) {
setSelectedCategory(null);
return;
}
const findCategory = (categories, targetId) => {
for (const cat of categories) {
if (cat.id === parseInt(targetId)) return cat;
if (cat.children) {
const found = findCategory(cat.children, targetId);
if (found) return found;
}
}
return null;
};
const category = findCategory(categoriesData.data, parseInt(categoryId));
setSelectedCategory(category);
}, [categoryId, categoriesData]);
const isLoading = filtersLoading || collectionLoading;
const hasError = filtersError || collectionError;
return {
categoriesData,
selectedCategory,
isSubCategory,
filtersData: activeFilters,
collectionData,
isLoading,
hasError,
fetchFilters,
};
};
export default useCategoryData;