113 lines
4.0 KiB
TypeScript
113 lines
4.0 KiB
TypeScript
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<number>
|
|
createSurveyDetail: (params: { surveyId: number; surveyDetail: SurveyDetailRequest }) => void
|
|
updateSurvey: (survey: SurveyBasicRequest) => void
|
|
deleteSurvey: () => Promise<boolean>
|
|
submitSurvey: () => void
|
|
} {
|
|
const queryClient = useQueryClient()
|
|
|
|
const { data: surveyList, isLoading: isLoadingSurveyList } = useQuery({
|
|
queryKey: ['survey', 'list'],
|
|
queryFn: async () => {
|
|
const resp = await axiosInstance.get<SurveyBasicInfo[]>('/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<SurveyBasicInfo>(`/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<SurveyBasicInfo>('/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<SurveyBasicInfo>(`/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<boolean>(`/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<SurveyDetailInfo>(`/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<boolean>(`/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,
|
|
}
|
|
}
|