diff --git a/apps/x/apps/renderer/src/App.tsx b/apps/x/apps/renderer/src/App.tsx index 9e1a5759..edd939a5 100644 --- a/apps/x/apps/renderer/src/App.tsx +++ b/apps/x/apps/renderer/src/App.tsx @@ -15,6 +15,7 @@ import { GraphView, type GraphEdge, type GraphNode } from '@/components/graph-vi import { BasesView, type BaseConfig, DEFAULT_BASE_CONFIG } from '@/components/bases-view'; import { HtmlFileViewer } from '@/components/html-file-viewer'; import { ImageFileViewer } from '@/components/image-file-viewer'; +import { VideoFileViewer } from '@/components/video-file-viewer'; import { useDebounce } from './hooks/use-debounce'; import { SidebarContentPanel } from '@/components/sidebar-content'; import { SuggestedTopicsView } from '@/components/suggested-topics-view'; @@ -4836,6 +4837,10 @@ function App() {
+ ) : selectedPath && /\.(mp4|mov|webm|m4v)$/i.test(selectedPath) ? ( +
+ +
) : (
diff --git a/apps/x/apps/renderer/src/components/video-file-viewer.tsx b/apps/x/apps/renderer/src/components/video-file-viewer.tsx
new file mode 100644
index 00000000..4b5a0d6d
--- /dev/null
+++ b/apps/x/apps/renderer/src/components/video-file-viewer.tsx
@@ -0,0 +1,53 @@
+import { useEffect, useState } from 'react'
+import { ExternalLinkIcon, FileVideoIcon } from 'lucide-react'
+
+interface VideoFileViewerProps {
+  path: string
+}
+
+type State = 'loading' | 'ready' | 'error'
+
+export function VideoFileViewer({ path }: VideoFileViewerProps) {
+  const [state, setState] = useState('loading')
+
+  useEffect(() => {
+    setState('loading')
+  }, [path])
+
+  const src = `app://workspace/${path.split('/').map(encodeURIComponent).join('/')}`
+
+  if (state === 'error') {
+    return (
+      
+ +

Cannot play this video

+

+ The codec or container format isn't supported by Chromium (e.g. WMV, AVI, or some MKV files). +

+ +
+ ) + } + + return ( +
+
+ ) +}