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 is too large"); } 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; };