diff --git a/apps/main/src/routes/(main)/devices/[deviceId]/+page.svelte b/apps/main/src/routes/(main)/devices/[deviceId]/+page.svelte index 242d7b1..184e47a 100644 --- a/apps/main/src/routes/(main)/devices/[deviceId]/+page.svelte +++ b/apps/main/src/routes/(main)/devices/[deviceId]/+page.svelte @@ -3,20 +3,47 @@ import Icon from "$lib/components/atoms/icon.svelte"; import { Button } from "$lib/components/ui/button"; import * as Card from "$lib/components/ui/card"; + import * as Dialog from "$lib/components/ui/dialog/index.js"; import * as Table from "$lib/components/ui/table"; import * as Tabs from "$lib/components/ui/tabs/index.js"; + import type { MobileMediaAsset } from "@pkg/logic/domains/mobile/data"; import { mainNavTree } from "$lib/core/constants"; import { mobileVM } from "$lib/domains/mobile/mobile.vm.svelte"; import { breadcrumbs } from "$lib/global.stores"; import ArrowLeft from "@lucide/svelte/icons/arrow-left"; + import FileIcon from "@lucide/svelte/icons/file"; import ImageIcon from "@lucide/svelte/icons/image"; import MessageSquare from "@lucide/svelte/icons/message-square"; import Smartphone from "@lucide/svelte/icons/smartphone"; + import VideoIcon from "@lucide/svelte/icons/video"; import { onDestroy, onMount } from "svelte"; let selectedTab = $state("sms"); + let mediaPreviewOpen = $state(false); + let selectedMedia = $state(null as MobileMediaAsset | null); const deviceId = $derived(Number(page.params.deviceId)); + function isImageAsset(asset: MobileMediaAsset) { + return asset.mimeType.startsWith("image/"); + } + + function isVideoAsset(asset: MobileMediaAsset) { + return asset.mimeType.startsWith("video/"); + } + + function formatSize(size: number | null | undefined) { + if (!size || size <= 0) return "-"; + if (size < 1024) return `${size} B`; + if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`; + if (size < 1024 * 1024 * 1024) return `${(size / (1024 * 1024)).toFixed(1)} MB`; + return `${(size / (1024 * 1024 * 1024)).toFixed(1)} GB`; + } + + function openMediaPreview(asset: MobileMediaAsset) { + selectedMedia = asset; + mediaPreviewOpen = true; + } + breadcrumbs.set([ mainNavTree[0], { title: "Device Detail", url: page.url.pathname }, @@ -160,39 +187,106 @@ No media assets yet. {:else} -
Video preview opens in a new tab.
+Preview unavailable for this file type.
+