@@ -32,6 +32,7 @@ function toAcpMessage(r: MessageRecord): AcpMessage {
3232
3333export interface UseSessionMessagesReturn {
3434 clearMessages : ( ) => void ;
35+ addOptimisticUserMessage : ( text : string ) => void ;
3536 messages : AcpMessage [ ] ;
3637 isLoadingInitial : boolean ;
3738 isLoadingMore : boolean ;
@@ -73,6 +74,16 @@ export function useSessionMessages(sessionId: string): UseSessionMessagesReturn
7374 void loadInitial ( ) ;
7475 } , [ loadInitial ] ) ;
7576
77+ const addOptimisticUserMessage = useCallback ( ( text : string ) => {
78+ const optimisticMsg : AcpMessage = {
79+ id : `optimistic-${ Date . now ( ) } ` ,
80+ role : "user" ,
81+ content : text ,
82+ timestamp : new Date ( ) ,
83+ } ;
84+ setMessages ( ( prev ) => [ ...prev , optimisticMsg ] ) ;
85+ } , [ ] ) ;
86+
7687 useEffect ( ( ) => {
7788 const unlisten = window . __TAURI__ . event . listen < {
7889 sessionId : string ;
@@ -84,7 +95,16 @@ export function useSessionMessages(sessionId: string): UseSessionMessagesReturn
8495 if ( msgSessionId !== sessionId ) return ;
8596 setMessages ( ( prev ) => {
8697 if ( prev . some ( ( m ) => m . id === id ) ) return prev ;
87- return [ ...prev , { id, role : "user" , content, timestamp : new Date ( ) } ] ;
98+ const idx = prev . findIndex (
99+ ( m ) => m . id . startsWith ( "optimistic-" ) && m . role === "user" && m . content === content
100+ ) ;
101+ const persisted : AcpMessage = { id, role : "user" , content, timestamp : new Date ( ) } ;
102+ if ( idx >= 0 ) {
103+ const updated = [ ...prev ] ;
104+ updated [ idx ] = persisted ;
105+ return updated ;
106+ }
107+ return [ ...prev , persisted ] ;
88108 } ) ;
89109 } ) ;
90110 return ( ) => { void unlisten . then ( ( fn ) => fn ( ) ) ; } ;
@@ -151,5 +171,5 @@ export function useSessionMessages(sessionId: string): UseSessionMessagesReturn
151171 return [ ...messages , ...streamingMessages ] ;
152172 } , [ messages , streamingMessages ] ) ;
153173
154- return { messages : merged , isLoadingInitial, isLoadingMore, hasMore, loadMore, clearMessages } ;
174+ return { messages : merged , isLoadingInitial, isLoadingMore, hasMore, loadMore, clearMessages, addOptimisticUserMessage } ;
155175}
0 commit comments