1- import { memo } from 'react'
1+ import { memo , useMemo } from 'react'
22import { MessagePart } from './MessagePart'
33import type { MessageWithParts } from '@/api/types'
44
@@ -24,12 +24,24 @@ const isMessageStreaming = (msg: MessageWithParts): boolean => {
2424 return ! ( 'completed' in msg . info . time && msg . info . time . completed )
2525}
2626
27- const isMessageThinking = ( msg : MessageWithParts ) : boolean => {
28- if ( msg . info . role !== 'assistant' ) return false
29- return msg . parts . length === 0 && isMessageStreaming ( msg )
27+
28+
29+ const findPendingAssistantMessageId = ( messages : MessageWithParts [ ] ) : string | undefined => {
30+ for ( let i = messages . length - 1 ; i >= 0 ; i -- ) {
31+ const msg = messages [ i ]
32+ if ( msg . info . role === 'assistant' && isMessageStreaming ( msg ) ) {
33+ return msg . info . id
34+ }
35+ }
36+ return undefined
3037}
3138
3239export const MessageThread = memo ( function MessageThread ( { messages, onFileClick, onChildSessionClick } : MessageThreadProps ) {
40+ const pendingAssistantId = useMemo ( ( ) => {
41+ if ( ! messages ) return undefined
42+ return findPendingAssistantMessageId ( messages )
43+ } , [ messages ] )
44+
3345 if ( ! messages || messages . length === 0 ) {
3446 return (
3547 < div className = "flex items-center justify-center h-full text-muted-foreground" >
@@ -42,7 +54,7 @@ export const MessageThread = memo(function MessageThread({ messages, onFileClick
4254 < div className = "flex flex-col space-y-2 p-2 overflow-x-hidden" >
4355 { messages . map ( ( msg ) => {
4456 const streaming = isMessageStreaming ( msg )
45- const thinking = isMessageThinking ( msg )
57+ const isQueued = msg . info . role === 'user' && pendingAssistantId && msg . info . id > pendingAssistantId
4658
4759 return (
4860 < div
@@ -52,7 +64,9 @@ export const MessageThread = memo(function MessageThread({ messages, onFileClick
5264 < div
5365 className = { `w-full rounded-lg p-1.5 ${
5466 msg . info . role === 'user'
55- ? 'bg-blue-600/20 border border-blue-600/30'
67+ ? isQueued
68+ ? 'bg-amber-500/10 border border-amber-500/30'
69+ : 'bg-blue-600/20 border border-blue-600/30'
5670 : 'bg-card/50 border border-border'
5771 } ${ streaming ? 'animate-pulse-subtle' : '' } `}
5872 >
@@ -65,35 +79,28 @@ export const MessageThread = memo(function MessageThread({ messages, onFileClick
6579 { new Date ( msg . info . time . created ) . toLocaleTimeString ( ) }
6680 </ span >
6781 ) }
68- { streaming && (
69- < span className = "text-xs text-blue-600 dark: text-blue-400 flex items-center gap-1 " >
70- < span className = "animate-pulse" > ● </ span > < span className = "shine-loading" > Generating... </ span >
82+ { isQueued && (
83+ < span className = "text-xs font-semibold bg-amber-500 text-amber-950 px-1.5 py-0.5 rounded " >
84+ QUEUED
7185 </ span >
7286 ) }
7387 </ div >
7488
75- { thinking ? (
76- < div className = "flex items-center gap-2 text-muted-foreground" >
77- < span className = "animate-pulse" > ▋</ span >
78- < span className = "text-sm shine-loading" > Thinking...</ span >
79- </ div >
80- ) : (
81- < div className = "space-y-2" >
82- { msg . parts . map ( ( part , index ) => (
83- < div key = { `${ msg . info . id } -${ part . id } -${ index } ` } >
84- < MessagePart
85- part = { part }
86- role = { msg . info . role }
87- allParts = { msg . parts }
88- partIndex = { index }
89- onFileClick = { onFileClick }
90- onChildSessionClick = { onChildSessionClick }
91- messageTextContent = { msg . info . role === 'assistant' ? getMessageTextContent ( msg ) : undefined }
92- />
93- </ div >
94- ) ) }
95- </ div >
96- ) }
89+ < div className = "space-y-2" >
90+ { msg . parts . map ( ( part , index ) => (
91+ < div key = { `${ msg . info . id } -${ part . id } -${ index } ` } >
92+ < MessagePart
93+ part = { part }
94+ role = { msg . info . role }
95+ allParts = { msg . parts }
96+ partIndex = { index }
97+ onFileClick = { onFileClick }
98+ onChildSessionClick = { onChildSessionClick }
99+ messageTextContent = { msg . info . role === 'assistant' ? getMessageTextContent ( msg ) : undefined }
100+ />
101+ </ div >
102+ ) ) }
103+ </ div >
97104 </ div >
98105 </ div >
99106 )
0 commit comments