@@ -4,18 +4,35 @@ import {useSelector} from 'react-redux';
44import { RootState } from '../store' ;
55import { logger } from '../utils/logger' ;
66import { Message } from '../types' ;
7- import { updateTabs , resetTabState } from '../utils/tabHandling' ;
7+ import { resetTabState , updateTabs } from '../utils/tabHandling' ;
88import WebSocketService from "../services/websocket" ;
99
10- const expandMessageReferences = ( content : string , messages : Message [ ] ) : string => {
10+ export const expandMessageReferences = ( content : string , messages : Message [ ] ) : string => {
1111 if ( ! content ) return '' ;
12- return content . replace ( / \{ ( [ ^ } ] + ) } / g, ( match , messageId ) => {
13- const referencedMessage = messages . find ( m => m . id === messageId ) ;
14- if ( referencedMessage ) {
15- return expandMessageReferences ( referencedMessage . content , messages ) ;
12+ // Create a temporary div to parse HTML content
13+ const tempDiv = document . createElement ( 'div' ) ;
14+ tempDiv . innerHTML = content ;
15+ // Process all elements with IDs that match message references
16+ const processNode = ( node : HTMLElement ) => {
17+ if ( node . id && node . id . startsWith ( 'z' ) ) {
18+ const referencedMessage = messages . find ( m => m . id === node . id ) ;
19+ if ( referencedMessage ) {
20+ logger . debug ( 'Expanding referenced message' , { id : node . id , contentLength : referencedMessage . content . length } ) ;
21+ node . innerHTML = expandMessageReferences ( referencedMessage . content , messages ) ;
22+ } else {
23+ logger . debug ( 'Referenced message not found' , { id : node . id } ) ;
24+ }
1625 }
17- return match ;
18- } ) ;
26+ // Recursively process child elements
27+ Array . from ( node . children ) . forEach ( child => {
28+ if ( child instanceof HTMLElement ) {
29+ processNode ( child ) ;
30+ }
31+ } ) ;
32+ } ;
33+ logger . debug ( 'Expanding message references' , { content} ) ;
34+ processNode ( tempDiv ) ;
35+ return tempDiv . innerHTML ;
1936} ;
2037
2138const MessageListContainer = styled . div `
@@ -31,9 +48,26 @@ const MessageContent = styled.div`
3148 .href-link, .play-button, .regen-button, .cancel-button, .text-submit-button {
3249 cursor: pointer;
3350 user-select: none;
51+ display: inline-block;
52+ padding: 2px 8px;
53+ margin: 2px;
54+ border-radius: 4px;
55+ background-color: rgba(0, 0, 0, 0.1);
3456
3557 &:hover {
3658 opacity: 0.8;
59+ background-color: rgba(0, 0, 0, 0.2);
60+ }
61+ }
62+
63+ .referenced-message {
64+ cursor: pointer;
65+ padding: 4px;
66+ margin: 4px 0;
67+ border-left: 3px solid #ccc;
68+
69+ &.expanded {
70+ background-color: rgba(0, 0, 0, 0.05);
3771 }
3872 }
3973` ;
@@ -164,27 +198,22 @@ const MessageList: React.FC<MessageListProps> = ({messages: propMessages}) => {
164198 } ) ;
165199 // Process tabs after messages update
166200 requestAnimationFrame ( ( ) => {
167- try {
168- updateTabs ( ) ;
169- // Process message references in visible tab content
170- document . querySelectorAll ( '.tab-content.active' ) . forEach ( tab => {
171- const content = tab . innerHTML ;
172- const expandedContent = processMessageContent ( content ) ;
173- if ( content !== expandedContent ) {
174- tab . innerHTML = expandedContent ;
175- }
176- } ) ;
177- } catch ( error ) {
178- logger . error ( 'Error processing tabs:' , error ) ;
179- // Reset tab state on error
180- resetTabState ( ) ;
181- }
201+ try {
202+ updateTabs ( ) ;
203+ } catch ( error ) {
204+ logger . error ( 'Error processing tabs:' , error ) ;
205+ // Reset tab state on error
206+ resetTabState ( ) ;
207+ }
182208 } ) ;
183209 } , [ messages ] ) ;
184210
185211 return (
186212 < MessageListContainer >
187- { messages . map ( ( message ) => {
213+ { messages
214+ . filter ( ( message ) => message . id && ! message . id . startsWith ( "z" ) )
215+ . filter ( ( message ) => message . content && message . content . length > 0 )
216+ . map ( ( message ) => {
188217 logger . debug ( 'MessageList - Rendering message' , {
189218 id : message . id ,
190219 type : message . type ,
0 commit comments