From 9a9ad640c0e66870705228f2fd2c93f3ed5f3ea7 Mon Sep 17 00:00:00 2001 From: RandyJC Date: Tue, 9 Dec 2025 10:00:14 +0100 Subject: [PATCH] adding option to upload from within theme editor --- .../components/game/create/ThemeEditor.tsx | 65 ++++++++++++++++--- 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/packages/web/src/components/game/create/ThemeEditor.tsx b/packages/web/src/components/game/create/ThemeEditor.tsx index bc69515..1bdbed8 100644 --- a/packages/web/src/components/game/create/ThemeEditor.tsx +++ b/packages/web/src/components/game/create/ThemeEditor.tsx @@ -24,6 +24,8 @@ const ThemeEditor = ({ onBack }: Props) => { const [customUrl, setCustomUrl] = useState("") const [items, setItems] = useState([]) const [loading, setLoading] = useState(false) + const [uploading, setUploading] = useState(false) + const [uploadError, setUploadError] = useState(null) const previewUrl = useMemo( () => backgroundUrl || customUrl || background.src, @@ -61,6 +63,34 @@ const ThemeEditor = ({ onBack }: Props) => { handleSet(customUrl.trim()) } + const handleUpload = async (file?: File | null) => { + if (!file) return + setUploading(true) + setUploadError(null) + try { + const form = new FormData() + form.append("file", file) + const res = await fetch("/api/media", { + method: "POST", + body: form, + }) + const data = await res.json() + if (!res.ok) { + throw new Error(data.error || "Upload failed") + } + if (data.media?.url) { + handleSet(data.media.url) + setCustomUrl(data.media.url) + } + load() + } catch (error) { + const message = error instanceof Error ? error.message : "Upload failed" + setUploadError(message) + } finally { + setUploading(false) + } + } + const handleReset = () => { reset() setCustomUrl("") @@ -117,15 +147,34 @@ const ThemeEditor = ({ onBack }: Props) => {
-
-
-

Images from media library

-

Pick any uploaded image as the background.

-
- +
+
+

Images from media library

+

Pick any uploaded image as the background.

+ +
+ +
+ +

+ Upload a background image (webp/png/jpg). It will be available immediately and selected as the current background. +

+ {uploadError && ( +

{uploadError}

+ )} +
{items.map((item) => (