import { axiosInstance } from '@/libs/axios' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import type { SurveyBasicInfo, SurveyBasicRequest, SurveyDetailInfo, SurveyDetailRequest } from '@/types/Survey' export function useServey(id?: number): { surveyList: SurveyBasicInfo[] | [] surveyDetail: SurveyBasicInfo | null isLoadingSurveyList: boolean isLoadingSurveyDetail: boolean isCreatingSurvey: boolean isUpdatingSurvey: boolean isDeletingSurvey: boolean createSurvey: (survey: SurveyBasicRequest) => Promise createSurveyDetail: (params: { surveyId: number; surveyDetail: SurveyDetailRequest }) => void updateSurvey: (survey: SurveyBasicRequest) => void deleteSurvey: () => Promise submitSurvey: () => void } { const queryClient = useQueryClient() const { data: surveyList, isLoading: isLoadingSurveyList } = useQuery({ queryKey: ['survey', 'list'], queryFn: async () => { const resp = await axiosInstance.get('/api/survey-sales') return resp.data }, }) const { data: surveyDetail, isLoading: isLoadingSurveyDetail } = useQuery({ queryKey: ['survey', id], queryFn: async () => { if (id === undefined) throw new Error('id is required') if (id === null) return null const resp = await axiosInstance.get(`/api/survey-sales/${id}`) return resp.data }, enabled: id !== undefined, }) const { mutateAsync: createSurvey, isPending: isCreatingSurvey } = useMutation({ mutationFn: async (survey: SurveyBasicRequest) => { const resp = await axiosInstance.post('/api/survey-sales', survey) return resp.data.id ?? 0 }, onSuccess: (data) => { queryClient.invalidateQueries({ queryKey: ['survey', 'list'] }) return data }, }) const { mutate: updateSurvey, isPending: isUpdatingSurvey } = useMutation({ mutationFn: async (survey: SurveyBasicRequest) => { if (id === undefined) throw new Error('id is required') const resp = await axiosInstance.put(`/api/survey-sales/${id}`, survey) return resp.data }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['survey', id] }) queryClient.invalidateQueries({ queryKey: ['survey', 'list'] }) }, }) const { mutateAsync: deleteSurvey, isPending: isDeletingSurvey } = useMutation({ mutationFn: async () => { if (id === null) throw new Error('id is required') const resp = await axiosInstance.delete(`/api/survey-sales/${id}`) return resp.data }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['survey', 'list'] }) queryClient.invalidateQueries({ queryKey: ['survey', id] }) }, }) const { mutateAsync: createSurveyDetail, isPending: isCreatingSurveyDetail } = useMutation({ mutationFn: async ({ surveyId, surveyDetail }: { surveyId: number; surveyDetail: SurveyDetailRequest }) => { const resp = await axiosInstance.post(`/api/survey-sales/${surveyId}`, surveyDetail) return resp.data }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['survey', 'list'] }) queryClient.invalidateQueries({ queryKey: ['survey', id] }) }, }) const { mutateAsync: submitSurvey } = useMutation({ mutationFn: async () => { if (id === undefined) throw new Error('id is required') const resp = await axiosInstance.patch(`/api/survey-sales/${id}`) return resp.data }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['survey', 'list'] }) queryClient.invalidateQueries({ queryKey: ['survey', id] }) }, }) return { surveyList: surveyList || [], surveyDetail: surveyDetail || null, isLoadingSurveyList, isLoadingSurveyDetail, isCreatingSurvey, isUpdatingSurvey, isDeletingSurvey, createSurvey, updateSurvey, deleteSurvey, createSurveyDetail, submitSurvey, } }