aboutsummaryrefslogtreecommitdiff
path: root/src/lib/FallbackImage.svelte
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-02-10 02:30:54 -0800
committerFuwn <[email protected]>2024-02-10 02:30:54 -0800
commitb72af1b4a2e14947949f986a1f24ad028c0031ec (patch)
tree4b2eadfdcaebb36f508b9a6dff3820c158c125c3 /src/lib/FallbackImage.svelte
parentfeat(badges): switch to supabase orm (diff)
downloaddue.moe-b72af1b4a2e14947949f986a1f24ad028c0031ec.tar.xz
due.moe-b72af1b4a2e14947949f986a1f24ad028c0031ec.zip
feat(badges): fallback yotsuba
Diffstat (limited to 'src/lib/FallbackImage.svelte')
-rw-r--r--src/lib/FallbackImage.svelte32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/lib/FallbackImage.svelte b/src/lib/FallbackImage.svelte
new file mode 100644
index 00000000..a8f367fb
--- /dev/null
+++ b/src/lib/FallbackImage.svelte
@@ -0,0 +1,32 @@
+<script lang="ts">
+ export let source: string | undefined;
+ export let alternative: string | undefined;
+ export let fallback: string | undefined;
+ export let maxReplaceCount = 1;
+ export let replaceDelay = 1000;
+ export let error = 'http://i2.kym-cdn.com/photos/images/newsfeed/000/290/992/0aa.jpg';
+
+ let replaceCount = 0;
+
+ const delayedReplace = (event: Event, image: string | undefined) => {
+ if (replaceCount >= maxReplaceCount) return;
+
+ setTimeout(() => {
+ (event.target as HTMLImageElement).src = image || '';
+
+ replaceCount += 1;
+ }, replaceDelay);
+ };
+</script>
+
+{#if replaceCount < maxReplaceCount}
+ <img
+ src={source}
+ alt={alternative}
+ loading="lazy"
+ class="badge"
+ on:error={(e) => delayedReplace(e, fallback)}
+ />
+{:else}
+ <img src={error} alt="Not found" loading="lazy" />
+{/if}