onsitesurvey/src/hooks/useInquiry.ts

103 lines
3.3 KiB
TypeScript

import { InquiryList, Inquiry, InquirySaveResponse, CommonCode } from '@/types/Inquiry'
import { useAxios } from '@/hooks/useAxios'
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import { useInquiryFilterStore } from '@/store/inquiryFilterStore'
import { useMemo } from 'react'
import { useSessionStore } from '@/store/session'
export function useInquiry(
qnoNo?: number,
compCd?: string,
): {
inquiryList: InquiryList[]
isLoadingInquiryList: boolean
inquiryDetail: Inquiry | null
isLoadingInquiryDetail: boolean
isSavingInquiry: boolean
saveInquiry: (formData: FormData) => Promise<InquirySaveResponse>
downloadFile: (encodeFileNo: number) => Promise<File>
commonCodeList: CommonCode[]
} {
const queryClient = useQueryClient()
const { inquiryListRequest, offset } = useInquiryFilterStore()
const { session } = useSessionStore()
const { axiosInstance } = useAxios()
const { data: inquiryList, isLoading: isLoadingInquiryList } = useQuery({
queryKey: ['inquiryList', inquiryListRequest, offset],
queryFn: async () => {
try {
const resp = await axiosInstance(null).get<{ data: InquiryList[] }>(`/api/qna/list`, {
params: { inquiryListRequest, startRow: offset, endRow: offset + 9 },
})
return resp.data.data
} catch (error: any) {
console.error(error.response.data)
return []
}
},
enabled: !!inquiryListRequest,
})
const inquriyListData = useMemo(() => {
if (isLoadingInquiryList) {
return { inquiryList: [] }
}
return {
inquiryList: inquiryList ?? [],
}
}, [inquiryList, isLoadingInquiryList])
const { data: inquiryDetail, isLoading: isLoadingInquiryDetail } = useQuery({
queryKey: ['inquiryDetail', qnoNo, compCd, session?.userId],
queryFn: async () => {
try {
const resp = await axiosInstance(null).get<{ data: Inquiry }>(`/api/qna/detail`, {
params: { qnoNo, compCd, langCd: 'JA', loginId: session?.userId ?? '' },
})
return resp.data.data
} catch (error: any) {
console.error(error.response)
return null
}
},
enabled: qnoNo !== undefined && compCd !== undefined,
})
const { mutateAsync: saveInquiry, isPending: isSavingInquiry } = useMutation({
mutationFn: async (formData: FormData) => {
const resp = await axiosInstance(null).post<{ data: InquirySaveResponse }>('/api/qna/save', formData)
return resp.data.data
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['inquiryList'] })
},
})
const downloadFile = async (encodeFileNo: number) => {
const resp = await axiosInstance(null).get<File>(`/api/qna/file`, { params: { encodeFileNo } })
return resp.data
}
const { data: commonCodeList, isLoading: isLoadingCommonCodeList } = useQuery({
queryKey: ['commonCodeList'],
queryFn: async () => {
const resp = await axiosInstance(null).get<{ data: CommonCode[] }>(`/api/qna`)
return resp.data
},
staleTime: Infinity,
gcTime: Infinity,
})
return {
inquiryList: inquriyListData.inquiryList,
inquiryDetail: inquiryDetail ?? null,
isLoadingInquiryList,
isLoadingInquiryDetail,
isSavingInquiry,
saveInquiry,
downloadFile,
commonCodeList: commonCodeList?.data ?? [],
}
}