// Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 import { FileInfo, FileService, FullFile } from "@/bindings/fileservice"; import { DirectoryTable } from "@/element/directorytable"; import { Markdown } from "@/element/markdown"; import { useBlockAtom } from "@/store/global"; import * as WOS from "@/store/wos"; import * as util from "@/util/util"; import * as jotai from "jotai"; import { CenteredDiv } from "../element/quickelems"; import "./view.less"; const MaxFileSize = 1024 * 1024 * 10; // 10MB function MarkdownPreview({ contentAtom }: { contentAtom: jotai.Atom> }) { const readmeText = jotai.useAtomValue(contentAtom); return (
); } function StreamingPreview({ fileInfo }: { fileInfo: FileInfo }) { const filePath = fileInfo.path; const streamingUrl = "/wave/stream-file?path=" + encodeURIComponent(filePath); if (fileInfo.mimetype.startsWith("video/")) { return (
); } if (fileInfo.mimetype.startsWith("audio/")) { return (
); } if (fileInfo.mimetype.startsWith("image/")) { return (
); } return Preview Not Supported; } function DirectoryPreview({ contentAtom }: { contentAtom: jotai.Atom> }) { const contentText = jotai.useAtomValue(contentAtom); let content: FileInfo[] = JSON.parse(contentText); return ; } function PreviewView({ blockId }: { blockId: string }) { const blockData = WOS.useWaveObjectValueWithSuspense(WOS.makeORef("block", blockId)); if (blockData == null) { return (
Block Not Found
); } const fileNameAtom = useBlockAtom(blockId, "preview:filename", () => jotai.atom((get) => { return blockData?.meta?.file; }) ); const statFileAtom = useBlockAtom(blockId, "preview:statfile", () => jotai.atom>(async (get) => { const fileName = get(fileNameAtom); if (fileName == null) { return null; } const statFile = await FileService.StatFile(fileName); return statFile; }) ); const fullFileAtom = useBlockAtom(blockId, "preview:fullfile", () => jotai.atom>(async (get) => { const fileName = get(fileNameAtom); if (fileName == null) { return null; } const file = await FileService.ReadFile(fileName); return file; }) ); const fileMimeTypeAtom = useBlockAtom(blockId, "preview:mimetype", () => jotai.atom>(async (get) => { const fileInfo = await get(statFileAtom); return fileInfo?.mimetype; }) ); const fileContentAtom = useBlockAtom(blockId, "preview:filecontent", () => jotai.atom>(async (get) => { const fullFile = await get(fullFileAtom); return util.base64ToString(fullFile?.data64); }) ); let mimeType = jotai.useAtomValue(fileMimeTypeAtom); if (mimeType == null) { mimeType = ""; } const fileInfo = jotai.useAtomValue(statFileAtom); // handle streaming files here if (mimeType.startsWith("video/") || mimeType.startsWith("audio/") || mimeType.startsWith("image/")) { return ; } if (fileInfo == null) { return File Not Found; } if (fileInfo.size > MaxFileSize) { return File Too Large to Preview; } if (mimeType === "text/markdown") { return ; } if (mimeType.startsWith("text/")) { return (
{jotai.useAtomValue(fileContentAtom)}
); } if (mimeType === "directory") { return ; } return (
Preview ({mimeType})
); } export { PreviewView };