ERP-node/frontend/hooks/queries/useCategories.ts

80 lines
2.5 KiB
TypeScript

import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { commonCodeApi } from "@/lib/api/commonCode";
import { queryKeys } from "@/lib/queryKeys";
import type { CategoryFilter, CreateCategoryData, UpdateCategoryData } from "@/lib/schemas/commonCode";
/**
* 카테고리 목록 조회 훅
*/
export function useCategories(filters?: CategoryFilter) {
return useQuery({
queryKey: queryKeys.categories.list(filters),
queryFn: () => commonCodeApi.categories.getList(filters),
select: (data) => data.data || [],
});
}
/**
* 카테고리 생성 뮤테이션 훅
*/
export function useCreateCategory() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: CreateCategoryData) => commonCodeApi.categories.create(data),
onSuccess: () => {
// 모든 카테고리 쿼리 무효화
queryClient.invalidateQueries({ queryKey: queryKeys.categories.all });
},
onError: (error) => {
console.error("카테고리 생성 실패:", error);
},
});
}
/**
* 카테고리 수정 뮤테이션 훅
*/
export function useUpdateCategory() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ categoryCode, data }: { categoryCode: string; data: UpdateCategoryData }) =>
commonCodeApi.categories.update(categoryCode, data),
onSuccess: (_, variables) => {
// 해당 카테고리 상세 쿼리 무효화
queryClient.invalidateQueries({
queryKey: queryKeys.categories.detail(variables.categoryCode)
});
// 모든 카테고리 목록 쿼리 무효화
queryClient.invalidateQueries({ queryKey: queryKeys.categories.lists() });
},
onError: (error) => {
console.error("카테고리 수정 실패:", error);
},
});
}
/**
* 카테고리 삭제 뮤테이션 훅
*/
export function useDeleteCategory() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (categoryCode: string) => commonCodeApi.categories.delete(categoryCode),
onSuccess: (_, categoryCode) => {
// 해당 카테고리와 관련된 모든 쿼리 무효화
queryClient.invalidateQueries({ queryKey: queryKeys.categories.all });
queryClient.invalidateQueries({ queryKey: queryKeys.codes.all });
// 해당 카테고리의 캐시 제거
queryClient.removeQueries({ queryKey: queryKeys.categories.detail(categoryCode) });
},
onError: (error) => {
console.error("카테고리 삭제 실패:", error);
},
});
}