Files
fnx_web/svelte/src/filesystem/viewers/FilePreview.svelte

126 lines
3.1 KiB
Svelte
Raw Normal View History

<script lang="ts">
import { onMount, tick } from "svelte";
import Spinner from "util/Spinner.svelte";
2025-10-09 15:48:23 +02:00
import { fs_node_type } from "lib/FilesystemAPI";
import FileManager from "filesystem/filemanager/FileManager.svelte";
import Audio from "./Audio.svelte";
import File from "./File.svelte";
import Image from "./Image.svelte";
import Pdf from "./PDF.svelte";
import Text from "./Text.svelte";
import Video from "./Video.svelte";
import Torrent from "./Torrent.svelte";
import Zip from "./Zip.svelte";
2024-02-16 14:50:34 +01:00
import CustomBanner from "./CustomBanner.svelte";
import type { FSNavigator } from "filesystem/FSNavigator";
import FsUploadWidget from "filesystem/upload_widget/FSUploadWidget.svelte";
import EditWindow from "filesystem/edit_window/EditWindow.svelte";
2025-10-13 16:05:50 +02:00
let { nav, upload_widget, edit_window }: {
nav: FSNavigator;
upload_widget: FsUploadWidget;
edit_window: EditWindow;
} = $props();
2025-10-13 16:05:50 +02:00
let viewer: any = $state()
let viewer_type = $state("")
let last_path = ""
onMount(() => nav.subscribe(state_update))
const state_update = async () => {
if (!nav.initialized || nav.base.path === last_path) {
return
}
last_path = nav.base.path
// Update the viewer area with the right viewer type
viewer_type = fs_node_type(nav.base)
console.debug("Previewing file", nav.base, "viewer type", viewer_type)
// Render the viewer component and set the file type
await tick()
if (viewer && viewer.update) {
viewer.update()
}
}
export const toggle_playback = () => {
if (viewer && viewer.toggle_playback) {
viewer.toggle_playback()
return true
}
return false
}
2025-02-03 15:38:07 +01:00
export const toggle_mute = () => {
if (viewer && viewer.toggle_mute) {
viewer.toggle_mute()
return true
}
return false
}
2025-02-03 16:29:26 +01:00
export const toggle_fullscreen = () => {
if (viewer && viewer.toggle_fullscreen) {
viewer.toggle_fullscreen()
return true
}
return false
}
export const seek = (delta: number) => {
2024-08-14 19:58:25 +02:00
if (viewer && viewer.seek) {
viewer.seek(delta)
}
}
</script>
2023-05-25 17:06:17 +02:00
{#if viewer_type === ""}
<div class="center">
2025-10-09 15:48:23 +02:00
<Spinner/>
2023-05-25 17:06:17 +02:00
</div>
{:else if viewer_type === "dir"}
2024-09-10 18:51:13 +02:00
<FileManager nav={nav} upload_widget={upload_widget} edit_window={edit_window}>
<CustomBanner path={$nav.path}/>
2024-02-16 14:50:34 +01:00
</FileManager>
2023-05-25 17:06:17 +02:00
{:else if viewer_type === "audio"}
<Audio nav={nav} bind:this={viewer}>
<CustomBanner path={$nav.path}/>
2024-02-16 14:50:34 +01:00
</Audio>
2023-05-25 17:06:17 +02:00
{:else if viewer_type === "image"}
<Image nav={nav} bind:this={viewer}/>
2023-05-25 17:06:17 +02:00
{:else if viewer_type === "video"}
<Video nav={nav} bind:this={viewer} on:open_sibling/>
2023-05-25 17:06:17 +02:00
{:else if viewer_type === "pdf"}
<Pdf nav={nav} bind:this={viewer}/>
2023-05-25 17:06:17 +02:00
{:else if viewer_type === "text"}
<Text nav={nav} bind:this={viewer}>
<CustomBanner path={$nav.path}/>
2024-02-16 14:50:34 +01:00
</Text>
2023-05-25 17:06:17 +02:00
{:else if viewer_type === "torrent"}
<Torrent nav={nav} bind:this={viewer} on:download>
<CustomBanner path={$nav.path}/>
2024-02-16 14:50:34 +01:00
</Torrent>
2023-05-25 17:06:17 +02:00
{:else if viewer_type === "zip"}
<Zip nav={nav} bind:this={viewer} on:download>
<CustomBanner path={$nav.path}/>
2024-02-16 14:50:34 +01:00
</Zip>
2023-05-25 17:06:17 +02:00
{:else}
2025-02-03 16:29:26 +01:00
<File nav={nav} on:download on:details>
<CustomBanner path={$nav.path}/>
2024-02-16 14:50:34 +01:00
</File>
2023-05-25 17:06:17 +02:00
{/if}
<style>
.center{
position: relative;
display: block;
margin: auto;
width: 100px;
max-width: 100%;
height: 100px;
max-height: 100%;
top: 50%;
transform: translateY(-50%);
}
</style>