diff --git a/src/components/File.tsx b/src/components/File.tsx index 10e17fc..42214b9 100644 --- a/src/components/File.tsx +++ b/src/components/File.tsx @@ -19,6 +19,7 @@ import { } from './icons'; import Link from './Link'; import MutedText from './MutedText'; +import Markdown from './render/Markdown'; import Type from './Type'; export function FileMeta({ Icon, title, subtitle, ...other }) { @@ -45,6 +46,7 @@ export function FileMeta({ Icon, title, subtitle, ...other }) { export default function File({ image, disableMediaPreview, exifEnabled }) { const [open, setOpen] = useState(false); + const [overrideRender, setOverrideRender] = useState(false); const deleteFile = useFileDelete(); const favoriteFile = useFileFavorite(); const clipboard = useClipboard(); @@ -124,6 +126,8 @@ export default function File({ image, disableMediaPreview, exifEnabled }) { sx={{ minHeight: 200 }} style={{ minHeight: 200 }} disableMediaPreview={false} + overrideRender={overrideRender} + setOverrideRender={setOverrideRender} /> diff --git a/src/components/Type.tsx b/src/components/Type.tsx index 3220a48..b4017e0 100644 --- a/src/components/Type.tsx +++ b/src/components/Type.tsx @@ -1,7 +1,10 @@ -import { Box, Center, Group, Image, Text } from '@mantine/core'; +import { Alert, Box, Button, Card, Center, Container, Group, Image, Text } from '@mantine/core'; import { Prism } from '@mantine/prism'; import { useEffect, useState } from 'react'; import { AudioIcon, FileIcon, ImageIcon, PlayIcon } from './icons'; +import KaTeX from './render/KaTeX'; +import Markdown from './render/Markdown'; +import PrismCode from './render/PrismCode'; function PlaceholderContent({ text, Icon }) { return ( @@ -13,8 +16,6 @@ function PlaceholderContent({ text, Icon }) { } function Placeholder({ text, Icon, ...props }) { - if (props.disableResolve) props.src = null; - return (
@@ -31,8 +32,10 @@ export default function Type({ file, popup = false, disableMediaPreview, ...prop const media = /^(video|audio|image|text)/.test(type); const [text, setText] = useState(''); + const shouldRenderMarkdown = name.endsWith('.md'); + const shouldRenderTex = name.endsWith('.tex'); - if (type === 'text') { + if (type === 'text' && popup) { useEffect(() => { (async () => { const res = await fetch('/r/' + name); @@ -43,10 +46,35 @@ export default function Type({ file, popup = false, disableMediaPreview, ...prop }, []); } - if (media && disableMediaPreview) { + const renderRenderAlert = () => { return ( - + + You are{props.overrideRender ? ' not ' : ' '}viewing a rendered version of the file + + ); + }; + + if ((shouldRenderMarkdown || shouldRenderTex) && !props.overrideRender && popup) + return ( + <> + {renderRenderAlert()} + + {shouldRenderMarkdown && } + {shouldRenderTex && } + + + ); + + if (media && disableMediaPreview) { + return ; } return popup ? ( @@ -61,9 +89,10 @@ export default function Type({ file, popup = false, disableMediaPreview, ...prop ), audio: