From 48586f1a500b06274d2c9052d20d487c370c90cb Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Wed, 2 Apr 2025 09:52:37 +0200 Subject: [PATCH] Add error handling and improve file upload UX --- src/components/dashboard/UploadModal.svelte | 51 +++++++++++++-------- src/components/styled/SWModal.svelte | 10 ++-- src/i18n/common/de.json | 7 ++- src/i18n/common/en.json | 5 ++ 4 files changed, 50 insertions(+), 23 deletions(-) diff --git a/src/components/dashboard/UploadModal.svelte b/src/components/dashboard/UploadModal.svelte index 015fbb8..b9c019d 100644 --- a/src/components/dashboard/UploadModal.svelte +++ b/src/components/dashboard/UploadModal.svelte @@ -21,19 +21,21 @@ import {createEventDispatcher} from "svelte"; import {schemRepo} from "@repo/schem.ts"; import SWModal from "@components/styled/SWModal.svelte"; - import {t} from "astro-i18n" + import {t} from "astro-i18n"; const dispatch = createEventDispatcher(); - interface Props { - open?: boolean; - } + interface Props { + open?: boolean; + } - let { open = $bindable(false) }: Props = $props(); + let {open = $bindable(false)}: Props = $props(); - async function upload() { + async function upload(e: Event) { + e.stopPropagation(); if (uploadFile == null) { - return + error = "dashboard.schematic.errors.noFile"; + return; } let file = uploadFile[0]; @@ -42,33 +44,46 @@ let type = name.split(".").pop(); if (type !== "schem" && type !== "schematic") { - return + error = "dashboard.schematic.errors.invalidEnding"; + return; } let content = await file.arrayBuffer(); - // @ts-ignore let b64 = btoa(String.fromCharCode.apply(null, new Uint8Array(content))); - let response = await $schemRepo.uploadSchematic(name, b64); + try { + await $schemRepo.uploadSchematic(name, b64); - open = false; + open = false; + value = ""; + dispatch("reset"); + } catch (e) { + error = "dashboard.schematic.errors.upload"; + } + } + + function reset(e: Event) { + e.stopPropagation(); + open = false value = ""; - dispatch("reset") } let uploadFile: FileList | null = $state(null); let value = $state(""); + let error = $state(null)
- + + + {#if error !== null} +

{t(error)}

+ {/if}
{#snippet footer()} - - - - - {/snippet} + + + {/snippet}
\ No newline at end of file diff --git a/src/components/styled/SWModal.svelte b/src/components/styled/SWModal.svelte index 502ee88..0d7704a 100644 --- a/src/components/styled/SWModal.svelte +++ b/src/components/styled/SWModal.svelte @@ -68,16 +68,18 @@ }) - dialog.close()} aria-hidden="true" class="max-h-full max-w-md w-full rounded-lg shadow-lg dark:bg-neutral-800 dark:text-neutral-100"> -