wcz-layout
Version:
1 lines • 12.7 kB
Source Map (JSON)
{"version":3,"file":"file-CJwB2sE7.mjs","names":["createServerFn","serverEnv","getAccessToken","authenticationMiddleware","getFileUploadToken","method","middleware","handler","token","endpoint","FILE_BASE_URL","mutationOptions","queryOptions","createServerFn","Upload","uuidv7","z","UploadFileMetaSchema","UploadFileResult","FileSchema","GetFileMetasSchema","UpdateFileMetaSchema","batchDeleteFiles","deleteFile","downloadFile","getFile","getFileMetas","getFileThumbnail","updateFileMeta","QueryClientParam","getFileUploadToken","QUERY_KEY","HOUR","getFileMetasRpc","method","validator","handler","data","getFileThumbnailRpc","getFileRpc","downloadFileRpc","updateFileMetaRpc","deleteFileRpc","batchDeleteFilesRpc","baseOptions","staleTime","gcTime","refetchOnWindowFocus","responseToObjectUrl","response","Response","Promise","blob","URL","createObjectURL","saveBlob","Blob","fileName","url","anchor","document","createElement","href","download","click","revokeObjectURL","fileMetasQueryOptions","params","input","queryKey","appName","subId","queryFn","fileThumbnailQueryOptions","id","enabled","fileQueryOptions","downloadFileMutationOptions","mutationFn","fileExtension","openFileMutationOptions","target","current","Window","Error","onSuccess","source","popup","opener","location","window","open","onError","close","updateFileMetaMutationOptions","queryClient","onSettled","invalidateQueries","exact","deleteFileMutationOptions","batchDeleteFilesMutationOptions","uploadFileMutationOptions","file","setProgress","progress","token","endpoint","resolve","reject","upload","chunkSize","metadata","filename","name","filetype","type","headers","Authorization","onProgress","bytesUploaded","bytesTotal","start","result"],"sources":["../src/server/actions/file.ts","../src/data/client/file.ts"],"sourcesContent":["import { createServerFn } from \"@tanstack/react-start\";\nimport { serverEnv } from \"~/env\";\nimport { getAccessToken } from \"~/lib/auth/user\";\nimport { authenticationMiddleware } from \"~/middleware/authMiddleware\";\n\nexport const getFileUploadToken = createServerFn({ method: \"GET\" })\n .middleware([authenticationMiddleware()])\n .handler(async () => ({\n token: await getAccessToken(\"file\"),\n endpoint: `${serverEnv.FILE_BASE_URL}/v1/upload`,\n }));\n","import { mutationOptions, queryOptions } from \"@tanstack/react-query\";\r\nimport { createServerFn } from \"@tanstack/react-start\";\r\nimport { Upload } from \"tus-js-client\";\r\nimport { uuidv7 } from \"uuidv7\";\r\nimport type { z } from \"zod\";\r\nimport type { UploadFileMetaSchema, UploadFileResult } from \"~/data/server/file\";\r\nimport {\r\n FileSchema,\r\n GetFileMetasSchema,\r\n UpdateFileMetaSchema,\r\n batchDeleteFiles,\r\n deleteFile,\r\n downloadFile,\r\n getFile,\r\n getFileMetas,\r\n getFileThumbnail,\r\n updateFileMeta,\r\n} from \"~/data/server/file\";\r\nimport type { QueryClientParam } from \"~/models/QueryClientParam\";\r\nimport { getFileUploadToken } from \"~/server/actions/file\";\r\n\r\nconst QUERY_KEY = \"file\";\r\nconst HOUR = 1000 * 60 * 60;\r\n\r\nconst getFileMetasRpc = createServerFn({ method: \"GET\" })\r\n .validator(GetFileMetasSchema)\r\n .handler(({ data }) => getFileMetas({ data }));\r\n\r\nconst getFileThumbnailRpc = createServerFn({ method: \"GET\" })\r\n .validator(FileSchema)\r\n .handler(({ data }) => getFileThumbnail({ data }));\r\n\r\nconst getFileRpc = createServerFn({ method: \"GET\" })\r\n .validator(FileSchema)\r\n .handler(({ data }) => getFile({ data }));\r\n\r\nconst downloadFileRpc = createServerFn({ method: \"GET\" })\r\n .validator(FileSchema)\r\n .handler(({ data }) => downloadFile({ data }));\r\n\r\nconst updateFileMetaRpc = createServerFn({ method: \"POST\" })\r\n .validator(UpdateFileMetaSchema)\r\n .handler(({ data }) => updateFileMeta({ data }));\r\n\r\nconst deleteFileRpc = createServerFn({ method: \"POST\" })\r\n .validator(FileSchema)\r\n .handler(({ data }) => deleteFile({ data }));\r\n\r\nconst batchDeleteFilesRpc = createServerFn({ method: \"POST\" })\r\n .validator(GetFileMetasSchema)\r\n .handler(({ data }) => batchDeleteFiles({ data }));\r\n\r\nconst baseOptions = {\r\n staleTime: HOUR,\r\n gcTime: HOUR,\r\n refetchOnWindowFocus: false,\r\n};\r\n\r\nasync function responseToObjectUrl(response: Response): Promise<string> {\r\n const blob = await response.blob();\r\n return URL.createObjectURL(blob);\r\n}\r\n\r\nfunction saveBlob(blob: Blob, fileName: string): void {\r\n const url = URL.createObjectURL(blob);\r\n const anchor = document.createElement(\"a\");\r\n anchor.href = url;\r\n anchor.download = fileName;\r\n anchor.click();\r\n URL.revokeObjectURL(url);\r\n}\r\n\r\nexport const fileMetasQueryOptions = (params: z.input<typeof GetFileMetasSchema>) =>\r\n queryOptions({\r\n queryKey: [QUERY_KEY, \"meta\", params.appName, params.subId],\r\n queryFn: () => getFileMetasRpc({ data: params }),\r\n ...baseOptions,\r\n });\r\n\r\nexport const fileThumbnailQueryOptions = (params: z.input<typeof FileSchema>) =>\r\n queryOptions({\r\n queryKey: [QUERY_KEY, \"thumbnail\", params.appName, params.id],\r\n queryFn: async () => responseToObjectUrl(await getFileThumbnailRpc({ data: params })),\r\n enabled: !!params.id,\r\n ...baseOptions,\r\n });\r\n\r\nexport const fileQueryOptions = (params: z.input<typeof FileSchema>) =>\r\n queryOptions({\r\n queryKey: [QUERY_KEY, params.appName, params.id],\r\n queryFn: async () => responseToObjectUrl(await downloadFileRpc({ data: params })),\r\n enabled: !!params.id,\r\n ...baseOptions,\r\n });\r\n\r\nexport const downloadFileMutationOptions = () =>\r\n mutationOptions({\r\n mutationFn: async (\r\n data: z.input<typeof FileSchema> & { fileName: string; fileExtension: string },\r\n ) => {\r\n const response = await downloadFileRpc({ data });\r\n saveBlob(await response.blob(), `${data.fileName}.${data.fileExtension}`);\r\n },\r\n });\r\n\r\nexport const openFileMutationOptions = ({ target }: { target: { current: Window | null } }) =>\r\n mutationOptions<string, Error, z.input<typeof FileSchema>>({\r\n mutationFn: async (data) => responseToObjectUrl(await getFileRpc({ data })),\r\n onSuccess: (source) => {\r\n const popup = target.current;\r\n target.current = null;\r\n\r\n if (popup) {\r\n popup.opener = null;\r\n popup.location.href = source;\r\n } else {\r\n window.open(source, \"_blank\");\r\n }\r\n },\r\n onError: () => {\r\n target.current?.close();\r\n target.current = null;\r\n },\r\n });\r\n\r\nexport const updateFileMetaMutationOptions = ({ queryClient }: QueryClientParam) =>\r\n mutationOptions({\r\n mutationFn: (data: z.input<typeof UpdateFileMetaSchema>) => updateFileMetaRpc({ data }),\r\n onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\"], exact: false }),\r\n });\r\n\r\nexport const deleteFileMutationOptions = ({ queryClient }: QueryClientParam) =>\r\n mutationOptions({\r\n mutationFn: (data: z.input<typeof FileSchema>) => deleteFileRpc({ data }),\r\n onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\"], exact: false }),\r\n });\r\n\r\nexport const batchDeleteFilesMutationOptions = ({ queryClient }: QueryClientParam) =>\r\n mutationOptions({\r\n mutationFn: (data: z.input<typeof GetFileMetasSchema>) => batchDeleteFilesRpc({ data }),\r\n onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\"], exact: false }),\r\n });\r\n\r\nexport const uploadFileMutationOptions = ({ queryClient }: QueryClientParam) =>\r\n mutationOptions({\r\n mutationFn: async ({\r\n appName,\r\n subId,\r\n file,\r\n setProgress,\r\n }: z.input<typeof UploadFileMetaSchema> & {\r\n setProgress?: (progress: number) => void;\r\n }): Promise<UploadFileResult> => {\r\n const { token, endpoint } = await getFileUploadToken();\r\n\r\n const id = uuidv7();\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const upload = new Upload(file, {\r\n endpoint,\r\n chunkSize: 1_048_576,\r\n metadata: {\r\n id,\r\n appName: appName,\r\n subId: subId,\r\n filename: file.name,\r\n filetype: file.type,\r\n },\r\n headers: { Authorization: `Bearer ${token}` },\r\n onProgress: (bytesUploaded, bytesTotal) =>\r\n setProgress?.((bytesUploaded / bytesTotal) * 100),\r\n onError: reject,\r\n onSuccess: () => resolve(),\r\n });\r\n upload.start();\r\n });\r\n\r\n return { id, appName, subId, fileName: file.name };\r\n },\r\n onSuccess: (result) =>\r\n queryClient.invalidateQueries({\r\n queryKey: [QUERY_KEY, \"meta\", result.appName, result.subId],\r\n exact: false,\r\n }),\r\n });\r\n"],"mappings":"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"}