From 7b69ed6df85fdbfa22df5957c268fd874a10f749 Mon Sep 17 00:00:00 2001 From: Max Litruv Boonzaayer Date: Fri, 24 Apr 2026 08:38:22 +1000 Subject: [PATCH] feat: add VideoViewer component for enhanced video playback experience; implement download functionality and viewer modal --- src/app/components/RenderMessageContent.tsx | 5 +- src/app/components/media/Video.tsx | 150 +++--------------- src/app/components/media/videoControls.css.ts | 7 + .../message/content/VideoContent.tsx | 39 +++++ .../video-viewer/VideoViewer.css.ts | 40 +++++ .../components/video-viewer/VideoViewer.tsx | 78 +++++++++ src/app/components/video-viewer/index.ts | 1 + 7 files changed, 192 insertions(+), 128 deletions(-) create mode 100644 src/app/components/video-viewer/VideoViewer.css.ts create mode 100644 src/app/components/video-viewer/VideoViewer.tsx create mode 100644 src/app/components/video-viewer/index.ts diff --git a/src/app/components/RenderMessageContent.tsx b/src/app/components/RenderMessageContent.tsx index 672dc70..468241c 100644 --- a/src/app/components/RenderMessageContent.tsx +++ b/src/app/components/RenderMessageContent.tsx @@ -28,6 +28,7 @@ import { import { UrlPreviewCard, UrlPreviewHolder, YouTubeEmbed, isYouTubeUrl, TikTokEmbed, isTikTokUrl, GiphyEmbed, isGiphyUrl } from './url-preview'; import { Image, MediaControl, Video } from './media'; import { ImageViewer } from './image-viewer'; +import { VideoViewer } from './video-viewer'; import { PdfViewer } from './Pdf-viewer'; import { TextViewer } from './text-viewer'; import { testMatrixTo } from '../plugins/matrix-to'; @@ -240,7 +241,6 @@ export function RenderMessageContent({ content={getContent()} renderAsFile={renderFile} renderVideoContent={({ body, info, mimeType, url, encInfo, ...props }) => { - // Check if there's valid thumbnail metadata const hasValidThumbnail = (typeof info.thumbnail_file?.url === 'string' || typeof info.thumbnail_url === 'string') && typeof info.thumbnail_info?.mimetype === 'string'; @@ -257,7 +257,6 @@ export function RenderMessageContent({ renderThumbnail={ mediaAutoLoad ? () => hasValidThumbnail ? ( - // Try to load the provided thumbnail first ( @@ -265,7 +264,6 @@ export function RenderMessageContent({ )} /> ) : ( - // Fallback: Extract first frame from the video itself } renderVideo={(p) =>