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); }, }); }