@@ -22,7 +22,6 @@ import {
22
22
selectIntegration ,
23
23
selectIsStreaming ,
24
24
selectIsWaiting ,
25
- selectMessages ,
26
25
selectThread ,
27
26
selectThreadUsage ,
28
27
} from "../../features/Chat/Thread/selectors" ;
@@ -35,6 +34,8 @@ import { telemetryApi } from "../../services/refact/telemetry";
35
34
import { PlaceHolderText } from "./PlaceHolderText" ;
36
35
import { UsageCounter } from "../UsageCounter" ;
37
36
import { getConfirmationPauseStatus } from "../../features/ToolConfirmation/confirmationSlice" ;
37
+ import { MessageNode } from "../MessageNode" ;
38
+ import { chatDbMessagesSliceSelectors } from "../../features/ChatDB/chatDbMessagesSlice" ;
38
39
39
40
export type ChatContentProps = {
40
41
onRetry : ( index : number , question : UserMessage [ "content" ] ) => void ;
@@ -43,11 +44,9 @@ export type ChatContentProps = {
43
44
44
45
export const ChatContent : React . FC < ChatContentProps > = ( {
45
46
onStopStreaming,
46
- onRetry,
47
47
} ) => {
48
48
const dispatch = useAppDispatch ( ) ;
49
49
const scrollRef = useRef < HTMLDivElement > ( null ) ;
50
- const messages = useAppSelector ( selectMessages ) ;
51
50
const isStreaming = useAppSelector ( selectIsStreaming ) ;
52
51
const thread = useAppSelector ( selectThread ) ;
53
52
const threadUsage = useAppSelector ( selectThreadUsage ) ;
@@ -57,6 +56,9 @@ export const ChatContent: React.FC<ChatContentProps> = ({
57
56
telemetryApi . useLazySendTelemetryChatEventQuery ( ) ;
58
57
const integrationMeta = useAppSelector ( selectIntegration ) ;
59
58
const isWaitingForConfirmation = useAppSelector ( getConfirmationPauseStatus ) ;
59
+ const messageTree = useAppSelector (
60
+ chatDbMessagesSliceSelectors . selectMessageTree ,
61
+ ) ;
60
62
61
63
const {
62
64
handleScroll,
@@ -67,10 +69,6 @@ export const ChatContent: React.FC<ChatContentProps> = ({
67
69
scrollRef,
68
70
} ) ;
69
71
70
- const onRetryWrapper = ( index : number , question : UserMessage [ "content" ] ) => {
71
- onRetry ( index , question ) ;
72
- } ;
73
-
74
72
const handleReturnToConfigurationClick = useCallback ( ( ) => {
75
73
// console.log(`[DEBUG]: going back to configuration page`);
76
74
// TBD: should it be allowed to run in the background?
@@ -121,10 +119,11 @@ export const ChatContent: React.FC<ChatContentProps> = ({
121
119
p = "2"
122
120
gap = "1"
123
121
>
124
- { messages . length === 0 && < PlaceHolderText /> }
125
- { renderMessages ( messages , onRetryWrapper ) }
126
- < UncommittedChangesWarning />
127
- { threadUsage && messages . length > 0 && < UsageCounter /> }
122
+ { ! messageTree && < PlaceHolderText /> }
123
+ { /* {renderMessages(messages, onRetryWrapper)} */ }
124
+ < MessageNode > { messageTree } </ MessageNode >
125
+ { ! messageTree && < UncommittedChangesWarning /> }
126
+ { threadUsage && messageTree && < UsageCounter /> }
128
127
129
128
< Container py = "4" >
130
129
< Spinner
@@ -176,7 +175,8 @@ export const ChatContent: React.FC<ChatContentProps> = ({
176
175
177
176
ChatContent . displayName = "ChatContent" ;
178
177
179
- function renderMessages (
178
+ // TODO: can delete
179
+ function _renderMessages (
180
180
messages : ChatMessages ,
181
181
onRetry : ( index : number , question : UserMessage [ "content" ] ) => void ,
182
182
memo : React . ReactNode [ ] = [ ] ,
@@ -185,13 +185,13 @@ function renderMessages(
185
185
if ( messages . length === 0 ) return memo ;
186
186
const [ head , ...tail ] = messages ;
187
187
if ( head . role === "tool" ) {
188
- return renderMessages ( tail , onRetry , memo , index + 1 ) ;
188
+ return _renderMessages ( tail , onRetry , memo , index + 1 ) ;
189
189
}
190
190
191
191
if ( head . role === "plain_text" ) {
192
192
const key = "plain-text-" + index ;
193
193
const nextMemo = [ ...memo , < PlainText key = { key } > { head . content } </ PlainText > ] ;
194
- return renderMessages ( tail , onRetry , nextMemo , index + 1 ) ;
194
+ return _renderMessages ( tail , onRetry , nextMemo , index + 1 ) ;
195
195
}
196
196
197
197
if ( head . role === "assistant" ) {
@@ -207,7 +207,7 @@ function renderMessages(
207
207
/> ,
208
208
] ;
209
209
210
- return renderMessages ( tail , onRetry , nextMemo , index + 1 ) ;
210
+ return _renderMessages ( tail , onRetry , nextMemo , index + 1 ) ;
211
211
}
212
212
213
213
if ( head . role === "user" ) {
@@ -219,13 +219,13 @@ function renderMessages(
219
219
{ head . content }
220
220
</ UserInput > ,
221
221
] ;
222
- return renderMessages ( tail , onRetry , nextMemo , index + 1 ) ;
222
+ return _renderMessages ( tail , onRetry , nextMemo , index + 1 ) ;
223
223
}
224
224
225
225
if ( isChatContextFileMessage ( head ) ) {
226
226
const key = "context-file-" + index ;
227
227
const nextMemo = [ ...memo , < ContextFiles key = { key } files = { head . content } /> ] ;
228
- return renderMessages ( tail , onRetry , nextMemo , index + 1 ) ;
228
+ return _renderMessages ( tail , onRetry , nextMemo , index + 1 ) ;
229
229
}
230
230
231
231
if ( isDiffMessage ( head ) ) {
@@ -240,13 +240,13 @@ function renderMessages(
240
240
241
241
const nextMemo = [ ...memo , < GroupedDiffs key = { key } diffs = { diffMessages } /> ] ;
242
242
243
- return renderMessages (
243
+ return _renderMessages (
244
244
nextTail ,
245
245
onRetry ,
246
246
nextMemo ,
247
247
index + diffMessages . length ,
248
248
) ;
249
249
}
250
250
251
- return renderMessages ( tail , onRetry , memo , index + 1 ) ;
251
+ return _renderMessages ( tail , onRetry , memo , index + 1 ) ;
252
252
}
0 commit comments