wcz-layout
Version:
148 lines (147 loc) • 4.69 kB
JavaScript
import { t as serverEnv } from "./env-CoveIivr.mjs";
import { l as getAccessToken } from "./utils-2XiozDlV.mjs";
import { t as getAppToken } from "./msalServer-CkNOOjjH.mjs";
import { t as authenticationMiddleware } from "./authMiddleware--HdlhhZO.mjs";
import { a as batchDeleteFiles, c as getFile, d as updateFileMeta, l as getFileMetas, o as deleteFile, s as downloadFile, u as getFileThumbnail } from "./file-DM1x40eJ.mjs";
import { createServerFn } from "@tanstack/react-start";
import { mutationOptions, queryOptions } from "@tanstack/react-query";
import { uuidv7 } from "uuidv7";
import { Upload } from "tus-js-client";
//#region src/server/actions/file.ts
const getFileUploadToken = createServerFn({ method: "GET" }).middleware([authenticationMiddleware({ optional: true })]).handler(async () => {
let token;
try {
token = await getAccessToken("file");
} catch {
token = await getAppToken("file");
}
return {
token,
endpoint: `${serverEnv.FILE_BASE_URL}/v1/upload`
};
});
//#endregion
//#region src/data/client/file.ts
const QUERY_KEY = "file";
const HOUR = 1e3 * 60 * 60;
const baseOptions = {
staleTime: HOUR,
gcTime: HOUR,
refetchOnWindowFocus: false
};
async function streamToObjectUrl(stream) {
const blob = await new Response(stream).blob();
return URL.createObjectURL(blob);
}
function saveBlob(blob, fileName) {
const url = URL.createObjectURL(blob);
const anchor = document.createElement("a");
anchor.href = url;
anchor.download = fileName;
anchor.click();
URL.revokeObjectURL(url);
}
const fileMetasQueryOptions = (params) => queryOptions({
queryKey: [
QUERY_KEY,
"meta",
params.appName,
params.subId
],
queryFn: () => getFileMetas({ data: params }),
...baseOptions
});
const fileThumbnailQueryOptions = (params) => queryOptions({
queryKey: [
QUERY_KEY,
"thumbnail",
params.appName,
params.id
],
queryFn: async () => streamToObjectUrl(await getFileThumbnail({ data: params })),
enabled: !!params.id,
...baseOptions
});
const fileQueryOptions = (params) => queryOptions({
queryKey: [
QUERY_KEY,
params.appName,
params.id
],
queryFn: async () => streamToObjectUrl(await getFile({ data: params })),
enabled: !!params.id,
...baseOptions
});
const downloadFileMutationOptions = () => mutationOptions({ mutationFn: async (data) => {
const stream = await downloadFile({ data });
saveBlob(await new Response(stream).blob(), `${data.fileName}.${data.fileExtension}`);
} });
const openFileMutationOptions = () => mutationOptions({ mutationFn: async (data) => {
const stream = await getFile({ data });
window.open(await streamToObjectUrl(stream));
} });
const updateFileMetaMutationOptions = ({ queryClient }) => mutationOptions({
mutationFn: (data) => updateFileMeta({ data }),
onSettled: () => queryClient.invalidateQueries({
queryKey: [QUERY_KEY, "meta"],
exact: false
})
});
const deleteFileMutationOptions = ({ queryClient }) => mutationOptions({
mutationFn: (data) => deleteFile({ data }),
onSettled: () => queryClient.invalidateQueries({
queryKey: [QUERY_KEY, "meta"],
exact: false
})
});
const batchDeleteFilesMutationOptions = ({ queryClient }) => mutationOptions({
mutationFn: (data) => batchDeleteFiles({ data }),
onSettled: () => queryClient.invalidateQueries({
queryKey: [QUERY_KEY, "meta"],
exact: false
})
});
const uploadFileMutationOptions = ({ queryClient }) => mutationOptions({
mutationFn: async ({ appName, subId, file, setProgress }) => {
const { token, endpoint } = await getFileUploadToken();
const id = uuidv7();
const dotIndex = file.name.lastIndexOf(".");
const fileExtension = dotIndex >= 0 ? file.name.slice(dotIndex + 1) : "";
await new Promise((resolve, reject) => {
new Upload(file, {
endpoint,
chunkSize: 1048576,
metadata: {
id,
appName,
subId,
fileName: file.name,
fileExtension,
mimeType: file.type
},
headers: { Authorization: `Bearer ${token}` },
onProgress: (bytesUploaded, bytesTotal) => setProgress?.(bytesUploaded / bytesTotal * 100),
onError: reject,
onSuccess: () => resolve()
}).start();
});
return {
id,
appName,
subId,
fileName: file.name
};
},
onSuccess: (result) => queryClient.invalidateQueries({
queryKey: [
QUERY_KEY,
"meta",
result.appName,
result.subId
],
exact: false
})
});
//#endregion
export { fileQueryOptions as a, updateFileMetaMutationOptions as c, fileMetasQueryOptions as i, uploadFileMutationOptions as l, deleteFileMutationOptions as n, fileThumbnailQueryOptions as o, downloadFileMutationOptions as r, openFileMutationOptions as s, batchDeleteFilesMutationOptions as t };
//# sourceMappingURL=file-C5-a_6W6.mjs.map