diff options
| author | MohamedBassem <me@mbassem.com> | 2024-09-21 14:42:58 +0000 |
|---|---|---|
| committer | MohamedBassem <me@mbassem.com> | 2024-09-21 17:00:06 +0000 |
| commit | 6b5c597dcb9f8f85eda9ce4f5f678f958d979913 (patch) | |
| tree | 4fa8cbca4e2be645c080bdd24866b98d83e68994 /apps/web/lib/hooks | |
| parent | 33779697c7c97c9394bb8f6c7e08bd82e2f3a87c (diff) | |
| download | karakeep-6b5c597dcb9f8f85eda9ce4f5f678f958d979913.tar.zst | |
refactor: Extract useUpload into its own reusable hook
Diffstat (limited to 'apps/web/lib/hooks')
| -rw-r--r-- | apps/web/lib/hooks/upload-file.ts | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/apps/web/lib/hooks/upload-file.ts b/apps/web/lib/hooks/upload-file.ts new file mode 100644 index 00000000..42d1cb42 --- /dev/null +++ b/apps/web/lib/hooks/upload-file.ts @@ -0,0 +1,38 @@ +import { useMutation } from "@tanstack/react-query"; + +import { + ZUploadError, + zUploadErrorSchema, + ZUploadResponse, + zUploadResponseSchema, +} from "@hoarder/shared/types/uploads"; + +export default function useUpload({ + onSuccess, + onError, +}: { + onError?: (e: ZUploadError, req: File) => void; + onSuccess?: (resp: ZUploadResponse, req: File) => Promise<void>; +}) { + return useMutation({ + mutationFn: async (file: File) => { + const formData = new FormData(); + formData.append("file", file); + const resp = await fetch("/api/assets", { + method: "POST", + body: formData, + }); + if (!resp.ok) { + throw new Error(await resp.text()); + } + return zUploadResponseSchema.parse(await resp.json()); + }, + onSuccess: onSuccess, + onError: (error, req) => { + const err = zUploadErrorSchema.parse(JSON.parse(error.message)); + if (onError) { + onError(err, req); + } + }, + }); +} |
