@@ -4,6 +4,7 @@ import { Send, Square, Copy, RotateCcw, Share2, Pencil, Loader2 } from 'lucide-r
4
4
import MarkdownContent from './MarkdownContent' ;
5
5
import MessageToolboxMenu , { ToolboxAction } from '../ui/MessageToolboxMenu' ;
6
6
import { MessageHelper } from '../../services/message-helper' ;
7
+ import { DatabaseIntegrationService } from '../../services/database-integration' ;
7
8
8
9
interface ChatMessageAreaProps {
9
10
activeConversation : Conversation | null ;
@@ -43,7 +44,7 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
43
44
setMessagesList ( MessageHelper . mapMessagesTreeToList ( activeConversation ) ) ;
44
45
}
45
46
} , [ activeConversation , activeConversation ?. messages ] ) ;
46
-
47
+
47
48
const handleSubmit = ( e : FormEvent ) => {
48
49
e . preventDefault ( ) ;
49
50
@@ -112,6 +113,63 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
112
113
return messagesList ;
113
114
}
114
115
116
+ const handleMessageIndexChange = async ( messageId : string , isPrevious : boolean ) => {
117
+ if ( ! activeConversation ) return ;
118
+
119
+ const message = messagesList . find ( m => m . messageId === messageId ) ;
120
+ if ( ! message || ! message . fatherMessageId ) return ;
121
+
122
+ const fatherMessage = activeConversation . messages . get ( message . fatherMessageId ) ;
123
+ if ( ! fatherMessage ) return ;
124
+
125
+ const currentIndex = fatherMessage . childrenMessageIds . indexOf ( messageId ) ;
126
+ if ( currentIndex <= 0 && isPrevious ) return ;
127
+ if ( currentIndex >= fatherMessage . childrenMessageIds . length - 1 && ! isPrevious ) return ;
128
+
129
+ // Create updated message
130
+ const updatedFatherMessage = {
131
+ ...fatherMessage ,
132
+ preferIndex : currentIndex + ( isPrevious ? - 1 : 1 ) ,
133
+ } ;
134
+
135
+ // Update activeConversation
136
+ activeConversation . messages . set ( updatedFatherMessage . messageId , updatedFatherMessage ) ;
137
+
138
+ // Update database
139
+ const dbService = DatabaseIntegrationService . getInstance ( ) ;
140
+ await dbService . updateChatMessage (
141
+ updatedFatherMessage . messageId ,
142
+ updatedFatherMessage ,
143
+ updatedFatherMessage . conversationId
144
+ ) ;
145
+
146
+ setMessagesList ( MessageHelper . mapMessagesTreeToList ( activeConversation ) ) ;
147
+ } ;
148
+
149
+ const getCurrentMessageIndex = ( messageId : string ) => {
150
+ const message = messagesList . find ( m => m . messageId === messageId ) ;
151
+ if ( ! message ) return 0 ;
152
+
153
+ const fatherMessage = messagesList . find ( m => m . messageId === message . fatherMessageId ) ;
154
+ if ( fatherMessage ) {
155
+ // Find the index of this message in the father's children
156
+ const index = fatherMessage . childrenMessageIds . indexOf ( messageId ) ;
157
+ return index >= 0 ? index : 0 ;
158
+ }
159
+ return 0 ;
160
+ }
161
+
162
+ const getTotalMessagesNumber = ( messageId : string ) => {
163
+ const message = messagesList . find ( m => m . messageId === messageId ) ;
164
+ if ( ! message ) return 0 ;
165
+
166
+ const fatherMessage = messagesList . find ( m => m . messageId === message . fatherMessageId ) ;
167
+ if ( fatherMessage ) {
168
+ return fatherMessage . childrenMessageIds . length ;
169
+ }
170
+ return 0 ;
171
+ }
172
+
115
173
// If no active conversation is selected
116
174
if ( ! activeConversation ) {
117
175
return (
@@ -226,6 +284,10 @@ export const ChatMessageArea: React.FC<ChatMessageAreaProps> = ({
226
284
< MessageToolboxMenu
227
285
actions = { toolboxActions }
228
286
className = { `mr-1 ${ hoveredMessageId === message . messageId ? 'opacity-100' : 'opacity-0' } ` }
287
+ currentMessageIndex = { getCurrentMessageIndex ( message . messageId ) }
288
+ totalMessages = { getTotalMessagesNumber ( message . messageId ) }
289
+ onPreviousMessageClick = { ( ) => handleMessageIndexChange ( message . messageId , true ) }
290
+ onNextMessageClick = { ( ) => handleMessageIndexChange ( message . messageId , false ) }
229
291
/>
230
292
</ div >
231
293
</ >
0 commit comments