67 lines
1.8 KiB
TypeScript
67 lines
1.8 KiB
TypeScript
import { pikku } from "@/pikku/http"
|
|
import type { DB } from '@heygermany/sdk'
|
|
import { useQueryClient } from "@tanstack/react-query"
|
|
|
|
export const useUploadBackOfficeCandidateFiles = (candidateId: string, category: DB.CandidateDocumentType) => {
|
|
const queryClient = useQueryClient()
|
|
|
|
const uploadFiles = async (files: File[]) => {
|
|
if (!files.length) {
|
|
return
|
|
}
|
|
|
|
const uploadUrls = await pikku().post('/candidate/:candidateId/document', {
|
|
candidateId,
|
|
documents: files.map((file) => ({
|
|
fileName: file.name,
|
|
size: file.size,
|
|
contentType: file.type,
|
|
category
|
|
}))
|
|
})
|
|
|
|
await Promise.all(uploadUrls.map(async ({ uploadUrl }: any, index: number) => {
|
|
const response = await fetch(uploadUrl, {
|
|
method: 'PUT',
|
|
body: files[index],
|
|
cache: 'no-cache',
|
|
mode: 'cors',
|
|
credentials: 'include',
|
|
headers: {
|
|
'Content-Type': files[index].type,
|
|
'Content-Disposition': 'inline'
|
|
}
|
|
})
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`Failed to upload ${files[index].name}`)
|
|
}
|
|
}))
|
|
|
|
await Promise.all(uploadUrls.map(async ({ documentId }: any) => {
|
|
await pikku().patch('/candidate/:candidateId/document/:documentId', {
|
|
documentId,
|
|
candidateId,
|
|
uploaded: true
|
|
})
|
|
}))
|
|
|
|
await queryClient.invalidateQueries({
|
|
queryKey: ['backoffice', 'candidate', candidateId]
|
|
})
|
|
}
|
|
|
|
const deleteFile = async (documentId: string) => {
|
|
await pikku().delete('/candidate/:candidateId/document/:documentId', {
|
|
candidateId,
|
|
documentId
|
|
})
|
|
|
|
await queryClient.invalidateQueries({
|
|
queryKey: ['backoffice', 'candidate', candidateId]
|
|
})
|
|
}
|
|
|
|
return { uploadFiles, deleteFile }
|
|
}
|