80 lines
2.5 KiB
TypeScript
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);
|
|
},
|
|
});
|
|
}
|
|
|