import { Upload, type HttpResponse } from "tus-js-client"; import { getCookie, setCookie } from "@/shared/lib"; import { ENDPOINT } from "../api/attachment/attachment-service"; const AUTH_USER_ID = process.env.NEXT_PUBLIC_AUTH_USER_ID || "token-id"; const CLAIM_NAME = process.env.NEXT_PUBLIC_CLAIM_NAME || "Authorization"; type UploadOptions = { handleUploadStart?: (upload: Upload) => void; handleProgress?: (percentage: string) => void; handleSuccess?: (upload: Upload) => void; handleResponse?: (res: HttpResponse) => void; }; export const handleUpload = (files: FileList, options?: UploadOptions) => { let metadata = {}; const file = files.item(0); if (!file) return; metadata = { filename: file.name, filetype: file.type, }; const upload = new Upload(file, { endpoint: ENDPOINT.ATTACH_SERVICE.TUS_UPLOAD, chunkSize: 10 * 1024 * 1024, headers: { [CLAIM_NAME]: getCookie(CLAIM_NAME) ?? "", [AUTH_USER_ID]: getCookie(AUTH_USER_ID) ?? "", }, metadata, onError(error) { console.error(`Failed because: ${error}`); }, onProgress(bytesUploaded, bytesTotal) { const percentage = ((bytesUploaded / bytesTotal) * 100).toFixed(2); options?.handleProgress?.(percentage); }, onAfterResponse(req, res) { const fileInfo = res.getHeader("X-File-Info"); if (fileInfo === undefined || fileInfo === null) return; setCookie("atfl-cd-key", JSON.parse(fileInfo)?.atflCd ?? ""); options?.handleResponse?.(res); }, onSuccess() { options?.handleSuccess?.(upload); }, }); upload.start(); options?.handleUploadStart?.(upload); console.log("upload start"); };