@@ -4,15 +4,18 @@ import type { EditMessage } from '@/app/project/[id]/_hooks/use-chat';
4
4
import { useEditorEngine } from '@/components/store/editor' ;
5
5
import { transKeys } from '@/i18n/keys' ;
6
6
import { type ChatMessage } from '@onlook/models/chat' ;
7
- import { ChatMessageList } from '@onlook/ui/chat/chat-message-list' ;
7
+ import {
8
+ Conversation ,
9
+ ConversationContent ,
10
+ ConversationScrollButton
11
+ } from '@onlook/ui/ai-elements' ;
8
12
import { Icons } from '@onlook/ui/icons' ;
9
13
import { assertNever } from '@onlook/utility' ;
10
14
import { observer } from 'mobx-react-lite' ;
11
15
import { useTranslations } from 'next-intl' ;
12
- import { useCallback , useMemo } from 'react' ;
16
+ import { useCallback } from 'react' ;
13
17
import { AssistantMessage } from './assistant-message' ;
14
18
import { ErrorMessage } from './error-message' ;
15
- import { StreamMessage } from './stream-message' ;
16
19
import { UserMessage } from './user-message' ;
17
20
18
21
interface ChatMessagesProps {
@@ -23,28 +26,13 @@ interface ChatMessagesProps {
23
26
}
24
27
25
28
export const ChatMessages = observer ( ( {
26
- messages : baseMessages ,
29
+ messages,
27
30
onEditMessage,
28
31
isStreaming,
29
32
error,
30
33
} : ChatMessagesProps ) => {
31
34
const editorEngine = useEditorEngine ( ) ;
32
35
const t = useTranslations ( ) ;
33
- const { messages, streamedMessage } : { messages : ChatMessage [ ] , streamedMessage : ChatMessage | null } = useMemo ( ( ) => {
34
- if ( isStreaming ) {
35
- const lastAssistantMessage = baseMessages [ baseMessages . length - 1 ] ;
36
- if ( lastAssistantMessage && lastAssistantMessage . role === 'assistant' ) {
37
- return {
38
- messages : baseMessages . slice ( 0 , - 1 ) ,
39
- streamedMessage : lastAssistantMessage ,
40
- } ;
41
- }
42
- }
43
- return {
44
- messages : baseMessages ,
45
- streamedMessage : null ,
46
- } ;
47
- } , [ baseMessages , isStreaming ] ) ;
48
36
49
37
const renderMessage = useCallback (
50
38
( message : ChatMessage , index : number ) => {
@@ -68,7 +56,7 @@ export const ChatMessages = observer(({
68
56
default :
69
57
assertNever ( message . role ) ;
70
58
}
71
- return < div key = { `message-${ message . id } -${ index } ` } > { messageNode } </ div > ;
59
+ return < div key = { `message-${ message . id } -${ index } ` } className = "my-2" > { messageNode } </ div > ;
72
60
} ,
73
61
[ onEditMessage ] ,
74
62
) ;
@@ -87,17 +75,17 @@ export const ChatMessages = observer(({
87
75
}
88
76
89
77
return (
90
- < ChatMessageList
91
- contentKey = { ` ${ messages . map ( ( m ) => m . id ) . join ( '|' ) } ${ isStreaming ? `| ${ messages ?. [ messages . length - 1 ] ?. id ?? '' } ` : '' } ` }
92
- >
93
- { messages . map ( ( message , index ) => renderMessage ( message , index ) ) }
94
- { streamedMessage && < StreamMessage message = { streamedMessage } /> }
95
- { error && < ErrorMessage error = { error } /> }
96
- { isStreaming && < div className = "flex w-full h-full flex-row items-center gap-2 px-4 my-2 text-small content-start text-foreground-secondary" >
97
- < Icons . LoadingSpinner className = "animate-spin" />
98
- < p > Thinking ... </ p >
99
- </ div > }
100
- </ ChatMessageList >
78
+ < Conversation className = "h-full w-full" >
79
+ < ConversationContent className = "p-0 m-0" >
80
+ { messages . map ( ( message , index ) => renderMessage ( message , index ) ) }
81
+ { error && < ErrorMessage error = { error } /> }
82
+ { isStreaming && < div className = "flex w-full h-full flex-row items-center gap-2 px-4 my-2 text-small content-start text-foreground-secondary" >
83
+ < Icons . LoadingSpinner className = "animate-spin" />
84
+ < p > Thinking ... </ p >
85
+ </ div > }
86
+ </ ConversationContent >
87
+ < ConversationScrollButton />
88
+ </ Conversation >
101
89
) ;
102
90
} ,
103
91
) ;
0 commit comments