diff --git a/web-app/src/lib/utils.ts b/web-app/src/lib/utils.ts
index d4110f7..ed917e0 100644
--- a/web-app/src/lib/utils.ts
+++ b/web-app/src/lib/utils.ts
@@ -113,5 +113,38 @@ export const md = markdownit({
md.core.ruler.push("header_sections", addSections);
});
+export const handleImagePaste = async (event: ClipboardEvent) => {
+ const clipboardItems = Array.from(event.clipboardData?.items || []);
+ const file = clipboardItems.find((item) => item.type.startsWith("image/"));
+
+ if (!file) return;
+
+ event.preventDefault();
+
+ const fileObject = file.getAsFile();
+
+ if (!fileObject) return;
+
+ const formData = new FormData();
+ formData.append("file", fileObject);
+
+ const request = await fetch("?/pasteImage", {
+ method: "POST",
+ body: formData
+ });
+
+ const response = await request.json();
+ const fileId = JSON.parse(response.data)[1];
+ const fileUrl = `${API_BASE_PREFIX}/rpc/retrieve_file?id=${fileId}`;
+
+ const target = event.target as HTMLTextAreaElement;
+ const newContent =
+ target.value.slice(0, target.selectionStart) +
+ `` +
+ target.value.slice(target.selectionStart);
+
+ return newContent;
+};
+
export const API_BASE_PREFIX = dev ? "http://localhost:3000" : "/api";
export const NGINX_BASE_PREFIX = dev ? "http://localhost:18000" : "";
diff --git a/web-app/src/routes/(authenticated)/website/[websiteId]/+page.server.ts b/web-app/src/routes/(authenticated)/website/[websiteId]/+page.server.ts
index e9343e0..9da5bbf 100644
--- a/web-app/src/routes/(authenticated)/website/[websiteId]/+page.server.ts
+++ b/web-app/src/routes/(authenticated)/website/[websiteId]/+page.server.ts
@@ -180,5 +180,30 @@ export const actions: Actions = {
success: true,
message: "Successfully updated footer"
};
+ },
+ pasteImage: async ({ request, fetch, cookies, params }) => {
+ const data = await request.formData();
+ const file = data.get("file") as File;
+
+ const fileData = await fetch(`${API_BASE_PREFIX}/rpc/upload_file`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/octet-stream",
+ Authorization: `Bearer ${cookies.get("session_token")}`,
+ Accept: "application/vnd.pgrst.object+json",
+ "X-Website-Id": params.websiteId,
+ "X-Mimetype": file.type,
+ "X-Original-Filename": file.name
+ },
+ body: await file.arrayBuffer()
+ });
+
+ const fileJSON = await fileData.json();
+
+ if (!fileData.ok) {
+ return { success: false, message: fileJSON.message };
+ }
+
+ return { fileId: fileJSON.file_id };
}
};
diff --git a/web-app/src/routes/(authenticated)/website/[websiteId]/+page.svelte b/web-app/src/routes/(authenticated)/website/[websiteId]/+page.svelte
index f988edd..de55ef1 100644
--- a/web-app/src/routes/(authenticated)/website/[websiteId]/+page.svelte
+++ b/web-app/src/routes/(authenticated)/website/[websiteId]/+page.svelte
@@ -1,7 +1,7 @@