From a800d9ff25f3b545a7b9e721e08bee1a4ab89b47 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Fri, 20 Mar 2026 23:43:31 +0100 Subject: [PATCH] feat: add AttachmentRenderer with video/audio inline playback --- .../components/chat/AttachmentRenderer.tsx | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 packages/web/src/components/chat/AttachmentRenderer.tsx diff --git a/packages/web/src/components/chat/AttachmentRenderer.tsx b/packages/web/src/components/chat/AttachmentRenderer.tsx new file mode 100644 index 00000000..b1cb7de6 --- /dev/null +++ b/packages/web/src/components/chat/AttachmentRenderer.tsx @@ -0,0 +1,110 @@ +import React from 'react'; +import type { Attachment } from '@backspace/shared'; +import { useUIStore } from '../../stores/uiStore'; + +interface AttachmentRendererProps { + attachment: Attachment; +} + +function formatFileSize(bytes: number): string { + if (bytes < 1024) return `${bytes} B`; + if (bytes < 1048576) return `${(bytes / 1024).toFixed(1)} KB`; + return `${(bytes / 1048576).toFixed(1)} MB`; +} + +export function AttachmentRenderer({ attachment }: AttachmentRendererProps) { + const openImagePreview = useUIStore((s) => s.openImagePreview); + + const attUrl = + attachment.filename.startsWith('http') || attachment.filename.startsWith('/') + ? attachment.filename + : `/api/uploads/${attachment.filename}`; + + const thumbUrl = attachment.thumbnailFilename + ? attachment.thumbnailFilename.startsWith('http') || attachment.thumbnailFilename.startsWith('/') + ? attachment.thumbnailFilename + : `/api/uploads/${attachment.thumbnailFilename}` + : null; + + const { mimetype, originalName, size } = attachment; + + if (mimetype.startsWith('image/')) { + return ( +
{originalName}
+{formatFileSize(size)}
+{originalName}
+{formatFileSize(size)}
+