wcz-layout
Version:
146 lines (145 loc) • 4.58 kB
JavaScript
import { l as getAccessToken } from "./utils-uByKcwM2.mjs";
import { t as serverEnv } from "./env-CoveIivr.mjs";
import { t as authenticationMiddleware } from "./authMiddleware-D8zGrrHP.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-BdW8lbKO.mjs";
import { mutationOptions, queryOptions } from "@tanstack/react-query";
import { createServerFn } from "@tanstack/react-start";
import { uuidv7 } from "uuidv7";
import { Upload } from "tus-js-client";
//#region src/server/actions/file.ts
const getFileUploadToken = createServerFn({ method: "GET" }).middleware([authenticationMiddleware()]).handler(async () => ({
token: await getAccessToken("file"),
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 responseToObjectUrl(response) {
const blob = await response.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 () => responseToObjectUrl(await getFileThumbnail({ data: params })),
enabled: !!params.id,
...baseOptions
});
const fileQueryOptions = (params) => queryOptions({
queryKey: [
QUERY_KEY,
params.appName,
params.id
],
queryFn: async () => responseToObjectUrl(await downloadFile({ data: params })),
enabled: !!params.id,
...baseOptions
});
const downloadFileMutationOptions = () => mutationOptions({ mutationFn: async (data) => {
saveBlob(await (await downloadFile({ data })).blob(), `${data.fileName}.${data.fileExtension}`);
} });
const openFileMutationOptions = ({ target }) => mutationOptions({
mutationFn: async (data) => responseToObjectUrl(await getFile({ data })),
onSuccess: (source) => {
const popup = target.current;
target.current = null;
if (popup) {
popup.opener = null;
popup.location.href = source;
} else window.open(source, "_blank");
},
onError: () => {
target.current?.close();
target.current = null;
}
});
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();
await new Promise((resolve, reject) => {
new Upload(file, {
endpoint,
chunkSize: 1048576,
metadata: {
id,
appName,
subId,
filename: file.name,
filetype: 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-eWFbMirr.mjs.map