Compress base64 fallback

This commit is contained in:
Jon Staab 2026-07-02 14:29:30 -07:00
parent 4cba342a04
commit e575be921d

View file

@ -5,7 +5,9 @@
import AddCircle from "@assets/icons/add-circle.svg?dataurl" import AddCircle from "@assets/icons/add-circle.svg?dataurl"
import GallerySend from "@assets/icons/gallery-send.svg?dataurl" import GallerySend from "@assets/icons/gallery-send.svg?dataurl"
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import Spinner from "@lib/components/Spinner.svelte"
import {uploadFile} from "@app/uploads" import {uploadFile} from "@app/uploads"
import {pushToast} from "@app/toast"
interface Props { interface Props {
file?: File | undefined file?: File | undefined
@ -45,27 +47,23 @@
} }
let active = $state(false) let active = $state(false)
let loading = $state(false)
let initialUrl = $state(url) let initialUrl = $state(url)
$effect(() => { $effect(() => {
call(async () => { call(async () => {
if (file) { if (file) {
const {result} = await uploadFile(file) loading = true
const {error, result} = await uploadFile(file)
loading = false
if (result?.url) { if (result?.url) {
url = result.url url = result.url
} else { } else {
const reader = new FileReader() file = undefined
pushToast({theme: "error", message: error || "Failed to upload image."})
reader.addEventListener(
"load",
() => {
url = reader.result as string
},
false,
)
reader.readAsDataURL(file)
} }
} else { } else {
url = initialUrl url = initialUrl
@ -86,22 +84,21 @@
ondragover={stopPropagation(preventDefault(onDragOver))} ondragover={stopPropagation(preventDefault(onDragOver))}
ondragleave={stopPropagation(preventDefault(onDragLeave))} ondragleave={stopPropagation(preventDefault(onDragLeave))}
ondrop={stopPropagation(preventDefault(onDrop))}> ondrop={stopPropagation(preventDefault(onDrop))}>
<div <button
class="absolute right-0 top-0 h-5 w-5 overflow-hidden rounded-full" onclick={url && stopPropagation(onClear)}
class="absolute right-0 top-0 h-5 w-5 overflow-hidden rounded-full flex items-center justify-center"
style="background: {url ? 'var(--error)' : 'var(--primary)'};"> style="background: {url ? 'var(--error)' : 'var(--primary)'};">
{#if url} {#if url}
<span <Icon icon={CloseCircle} class="scale-150 bg-surface-more!" />
role="button"
tabindex="-1"
onmousedown={stopPropagation(onClear)}
ontouchstart={stopPropagation(onClear)}>
<Icon icon={CloseCircle} class="scale-150 bg-surface-more!" />
</span>
{:else} {:else}
<Icon icon={AddCircle} class="scale-150 bg-surface-more!" /> <Icon icon={AddCircle} class="scale-150 bg-surface-more!" />
{/if} {/if}
</div> </button>
{#if !url} {#if loading}
<div class="absolute inset-0 flex items-center justify-center rounded-full bg-black/40">
<Spinner />
</div>
{:else if !url}
<Icon icon={GallerySend} size={7} /> <Icon icon={GallerySend} size={7} />
{/if} {/if}
</label> </label>