Files
AstralRinth/apps/frontend/src/composables/image-upload.ts
IThundxr d24528f6a6 frontend: Improve file too large error (#3774)
* Improve file too large error

Signed-off-by: IThundxr <me@ithundxr.dev>

* MB -> MiB

Signed-off-by: Prospector <6166773+Prospector@users.noreply.github.com>

---------

Signed-off-by: IThundxr <me@ithundxr.dev>
Signed-off-by: Prospector <6166773+Prospector@users.noreply.github.com>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2025-06-12 02:05:30 +00:00

47 lines
1.3 KiB
TypeScript

type ImageUploadContext = {
projectID?: string;
context: "project" | "version" | "thread_message" | "report";
};
interface ImageUploadResponse {
id: string;
url: string;
}
export const useImageUpload = async (file: File, ctx: ImageUploadContext) => {
// Make sure file is of type image/png, image/jpeg, image/gif, or image/webp
if (
!file.type.startsWith("image/") ||
!["png", "jpeg", "gif", "webp"].includes(file.type.split("/")[1])
) {
throw new Error("File is not an accepted image type");
}
// Make sure file is less than 1MB
if (file.size > 1024 * 1024) {
throw new Error("File exceeds the 1MiB size limit");
}
const qs = new URLSearchParams();
if (ctx.projectID) qs.set("project_id", ctx.projectID);
qs.set("context", ctx.context);
qs.set("ext", file.type.split("/")[1]);
const url = `image?${qs.toString()}`;
const response = (await useBaseFetch(url, {
method: "POST",
body: file,
apiVersion: 3,
})) as ImageUploadResponse;
// Type check to see if response has a url property and an id property
if (!response?.id || typeof response.id !== "string") {
throw new Error("Unexpected response from server");
}
if (!response?.url || typeof response.url !== "string") {
throw new Error("Unexpected response from server");
}
return response;
};