From c90ba431e861ff9b4ee513fb0a2b87d1e89c41e4 Mon Sep 17 00:00:00 2001
From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com>
Date: Fri, 20 Mar 2026 21:25:45 +0100
Subject: [PATCH] fix: resolve mentions in reply previews to display usernames
Reply preview was rendering raw <@userId> tokens as plain text instead
of resolving them to MentionBadge components with proper usernames.
---
packages/web/src/components/chat/Message.tsx | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/packages/web/src/components/chat/Message.tsx b/packages/web/src/components/chat/Message.tsx
index e3c1003b..237cdac1 100644
--- a/packages/web/src/components/chat/Message.tsx
+++ b/packages/web/src/components/chat/Message.tsx
@@ -2,6 +2,7 @@ import React, { useState, useRef, useEffect, useCallback } from 'react';
import { createPortal } from 'react-dom';
import type { MessageWithUser } from '@backspace/shared';
import { MarkdownRenderer } from './MarkdownRenderer';
+import { MentionBadge } from './MentionBadge';
import { Avatar } from '../ui/Avatar';
import { useContextMenu } from '../../hooks/useContextMenu';
import type { ContextMenuItem } from '../../stores/contextMenuStore';
@@ -40,6 +41,16 @@ function formatHoverTime(timestamp: number): string {
return new Date(timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
}
+/** Lightweight inline renderer that resolves <@userId> mentions to MentionBadge components. */
+function renderInlineWithMentions(content: string): React.ReactNode {
+ const parts = content.split(/(<@[a-zA-Z0-9_-]+>)/g);
+ return parts.map((part, i) => {
+ const match = part.match(/^<@([a-zA-Z0-9_-]+)>$/);
+ if (match) return ;
+ return part;
+ });
+}
+
const GIF_URL_REGEX = /^https:\/\/(?:media\.tenor\.com|static\.klipy\.com)\/.+$/;
function isGifOnlyMessage(content: string | null): boolean {
@@ -285,7 +296,7 @@ export function Message({ message, isCompact, isFirstInGroup }: MessageProps) {
style={replyRoleColor(message.replyTo)}
/>
- {message.replyTo.content}
+ {message.replyTo.content ? renderInlineWithMentions(message.replyTo.content) : ''}
);