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

117 lines
2.9 KiB
Svelte
Raw Normal View History

<script>
import { onMount, tick } from "svelte";
import Spinner from "../../util/Spinner.svelte";
2024-11-19 15:31:51 +01:00
import { fs_node_type, fs_thumbnail_url } from "../FilesystemAPI.mjs";
import FileManager from "../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";
2024-09-12 15:11:50 +02:00
import { stats } from "../../lib/StatsSocket.js"
import SlowDown from "../../layout/SlowDown.svelte";
export let nav
2024-09-10 18:51:13 +02:00
export let upload_widget
export let edit_window
let viewer
let viewer_type = ""
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
}
2024-08-14 19:58:25 +02:00
export const seek = delta => {
if (viewer && viewer.seek) {
viewer.seek(delta)
}
}
</script>
2023-05-25 17:06:17 +02:00
{#if viewer_type === ""}
<div class="center">
<Spinner></Spinner>
</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>
2024-09-05 17:28:31 +02:00
{:else if $nav.context.premium_transfer === false && $stats.limits.transfer_limit_used > $stats.limits.transfer_limit}
<SlowDown
on:download
file_size={$nav.base.file_size}
file_name={$nav.base.name}
file_type={$nav.base.file_type}
icon_href={fs_thumbnail_url($nav.base.path, 256, 256)}
/>
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}/>
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}
<File nav={nav} on:download>
<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>