@@ -11,9 +11,15 @@ import { Alert, AlertTitle, AlertDescription } from "./ui/alert";
11
11
import { ModeToggle } from "./mode-toggle" ;
12
12
13
13
interface Message {
14
+ id : number ;
14
15
role : string ;
15
16
content : string ;
16
- id : number ;
17
+ }
18
+
19
+ // Draft messages are used to optmistically update the UI
20
+ // before the server responds.
21
+ interface DraftMessage extends Omit < Message , "id" > {
22
+ id ?: number ;
17
23
}
18
24
19
25
interface MessageUpdateEvent {
@@ -28,7 +34,7 @@ interface StatusChangeEvent {
28
34
}
29
35
30
36
export default function ChatInterface ( ) {
31
- const [ messages , setMessages ] = useState < Message [ ] > ( [ ] ) ;
37
+ const [ messages , setMessages ] = useState < ( Message | DraftMessage ) [ ] > ( [ ] ) ;
32
38
const [ loading , setLoading ] = useState < boolean > ( false ) ;
33
39
const [ serverStatus , setServerStatus ] = useState < string > ( "unknown" ) ;
34
40
const searchParams = useSearchParams ( ) ;
@@ -87,12 +93,18 @@ export default function ChatInterface() {
87
93
const data : MessageUpdateEvent = JSON . parse ( event . data ) ;
88
94
89
95
setMessages ( ( prevMessages ) => {
96
+ // Clean up draft messages
97
+ const updatedMessages = [ ...prevMessages ] . filter (
98
+ ( m ) => m . id !== undefined
99
+ ) ;
100
+
90
101
// Check if message with this ID already exists
91
- const existingIndex = prevMessages . findIndex ( ( m ) => m . id === data . id ) ;
102
+ const existingIndex = updatedMessages . findIndex (
103
+ ( m ) => m . id === data . id
104
+ ) ;
92
105
93
106
if ( existingIndex !== - 1 ) {
94
107
// Update existing message
95
- const updatedMessages = [ ...prevMessages ] ;
96
108
updatedMessages [ existingIndex ] = {
97
109
role : data . role ,
98
110
content : data . message ,
@@ -102,7 +114,7 @@ export default function ChatInterface() {
102
114
} else {
103
115
// Add new message
104
116
return [
105
- ...prevMessages ,
117
+ ...updatedMessages ,
106
118
{
107
119
role : data . role ,
108
120
content : data . message ,
@@ -164,6 +176,10 @@ export default function ChatInterface() {
164
176
165
177
// For raw messages, don't set loading state as it's usually fast
166
178
if ( type === "user" ) {
179
+ setMessages ( ( prevMessages ) => [
180
+ ...prevMessages ,
181
+ { role : "user" , content } ,
182
+ ] ) ;
167
183
setLoading ( true ) ;
168
184
}
169
185
@@ -263,7 +279,7 @@ export default function ChatInterface() {
263
279
</ div >
264
280
) }
265
281
266
- < MessageList messages = { messages } loading = { loading } />
282
+ < MessageList messages = { messages } />
267
283
< MessageInput onSendMessage = { sendMessage } disabled = { loading } />
268
284
</ main >
269
285
</ div >
0 commit comments