57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
import { Upload, type HttpResponse } from "tus-js-client";
|
|
import { getCookie, setCookie } from "@utils";
|
|
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");
|
|
};
|