✨ Closes #182
This commit is contained in:
@@ -6,12 +6,16 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { browser } from '$app/environment';
|
import { browser } from '$app/environment';
|
||||||
|
import { fade } from 'svelte/transition';
|
||||||
|
|
||||||
export let src: string;
|
export let src: string;
|
||||||
export let css_classes = 'max-h-64 h-auto w-auto';
|
export let css_classes = 'max-h-64 h-auto w-auto';
|
||||||
export let muted = true;
|
export let muted = true;
|
||||||
|
export let allow_fullscreen = true;
|
||||||
let type: 'img' | 'video' | undefined = undefined;
|
let type: 'img' | 'video' | undefined = undefined;
|
||||||
|
|
||||||
|
let img_data;
|
||||||
|
|
||||||
const get_media = async () => {
|
const get_media = async () => {
|
||||||
if (!browser) {
|
if (!browser) {
|
||||||
return;
|
return;
|
||||||
@@ -23,7 +27,7 @@
|
|||||||
} else {
|
} else {
|
||||||
type = 'img';
|
type = 'img';
|
||||||
const data = await fetch(`/api/v1/storage/download/${src}`);
|
const data = await fetch(`/api/v1/storage/download/${src}`);
|
||||||
return {
|
img_data = {
|
||||||
data: URL.createObjectURL(await data.blob()),
|
data: URL.createObjectURL(await data.blob()),
|
||||||
alt_text: res.headers.get('X-Alt-Text')
|
alt_text: res.headers.get('X-Alt-Text')
|
||||||
};
|
};
|
||||||
@@ -37,13 +41,27 @@
|
|||||||
src;
|
src;
|
||||||
update_url();
|
update_url();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let fullscreen_open = false;
|
||||||
|
|
||||||
|
const open_fullscreen = () => {
|
||||||
|
if (!allow_fullscreen) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fullscreen_open = true;
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#await media}
|
{#await media}
|
||||||
<p>Placeholder</p>
|
<p>Placeholder</p>
|
||||||
{:then data}
|
{:then data}
|
||||||
{#if type === 'img'}
|
{#if type === 'img'}
|
||||||
<img src={data.data} alt={data.alt_text ?? 'Not available'} class={css_classes} />
|
<img
|
||||||
|
src={img_data.data}
|
||||||
|
alt={img_data.alt_text ?? 'Not available'}
|
||||||
|
class={css_classes}
|
||||||
|
on:click={() => open_fullscreen()}
|
||||||
|
/>
|
||||||
{:else if type === 'video'}
|
{:else if type === 'video'}
|
||||||
<video
|
<video
|
||||||
class={css_classes}
|
class={css_classes}
|
||||||
@@ -61,3 +79,17 @@
|
|||||||
<p>Unknown media type</p>
|
<p>Unknown media type</p>
|
||||||
{/if}
|
{/if}
|
||||||
{/await}
|
{/await}
|
||||||
|
|
||||||
|
{#if fullscreen_open}
|
||||||
|
<div
|
||||||
|
class="fixed top-0 left-0 z-50 w-screen h-screen bg-black bg-opacity-50 fle p-2"
|
||||||
|
transition:fade={{ duration: 80 }}
|
||||||
|
on:click={() => (fullscreen_open = false)}
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src={img_data.data}
|
||||||
|
alt={img_data.alt_text ?? 'Not available'}
|
||||||
|
class="object-cover rounded m-auto max-h-full max-w-full"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|||||||
Reference in New Issue
Block a user