added filter to category page
This commit is contained in:
110
src/pages/Category/hooks/useCategoryData.js
Normal file
110
src/pages/Category/hooks/useCategoryData.js
Normal file
@@ -0,0 +1,110 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user