UNPKG

wcz-layout

Version:

153 lines (152 loc) 5.6 kB
import { l as getAccessToken } from "./utils-Bt_Hs0N8.mjs"; import { t as serverEnv } from "./env-CoveIivr.mjs"; import { a as batchDeleteFiles, c as getFile, d as updateFileMeta, l as getFileMetas, n as GetFileMetasSchema, o as deleteFile, r as UpdateFileMetaSchema, s as downloadFile, t as FileSchema, u as getFileThumbnail } from "./file-DUtvlVZX.mjs"; import { t as authenticationMiddleware } from "./authMiddleware-C0MbAuvL.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 getFileMetasRpc = createServerFn({ method: "GET" }).validator(GetFileMetasSchema).handler(({ data }) => getFileMetas({ data })); const getFileThumbnailRpc = createServerFn({ method: "GET" }).validator(FileSchema).handler(({ data }) => getFileThumbnail({ data })); const getFileRpc = createServerFn({ method: "GET" }).validator(FileSchema).handler(({ data }) => getFile({ data })); const downloadFileRpc = createServerFn({ method: "GET" }).validator(FileSchema).handler(({ data }) => downloadFile({ data })); const updateFileMetaRpc = createServerFn({ method: "POST" }).validator(UpdateFileMetaSchema).handler(({ data }) => updateFileMeta({ data })); const deleteFileRpc = createServerFn({ method: "POST" }).validator(FileSchema).handler(({ data }) => deleteFile({ data })); const batchDeleteFilesRpc = createServerFn({ method: "POST" }).validator(GetFileMetasSchema).handler(({ data }) => batchDeleteFiles({ data })); 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: () => getFileMetasRpc({ data: params }), ...baseOptions }); const fileThumbnailQueryOptions = (params) => queryOptions({ queryKey: [ QUERY_KEY, "thumbnail", params.appName, params.id ], queryFn: async () => responseToObjectUrl(await getFileThumbnailRpc({ data: params })), enabled: !!params.id, ...baseOptions }); const fileQueryOptions = (params) => queryOptions({ queryKey: [ QUERY_KEY, params.appName, params.id ], queryFn: async () => responseToObjectUrl(await downloadFileRpc({ data: params })), enabled: !!params.id, ...baseOptions }); const downloadFileMutationOptions = () => mutationOptions({ mutationFn: async (data) => { saveBlob(await (await downloadFileRpc({ data })).blob(), `${data.fileName}.${data.fileExtension}`); } }); const openFileMutationOptions = ({ target }) => mutationOptions({ mutationFn: async (data) => responseToObjectUrl(await getFileRpc({ 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) => updateFileMetaRpc({ data }), onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, "meta"], exact: false }) }); const deleteFileMutationOptions = ({ queryClient }) => mutationOptions({ mutationFn: (data) => deleteFileRpc({ data }), onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, "meta"], exact: false }) }); const batchDeleteFilesMutationOptions = ({ queryClient }) => mutationOptions({ mutationFn: (data) => batchDeleteFilesRpc({ 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-CJwB2sE7.mjs.map