@@ -25,6 +25,7 @@ export interface MessagesActions {
2525 updateMessageContent : ( chatId : string , messageId : string , content : string ) => void
2626 updateMessageReasoning : ( chatId : string , messageId : string , reasoning_content : string ) => void
2727 removeMessage : ( chatId : string , messageId : string ) => void
28+ deleteMessageAndChildren : ( chatId : string , messageId : string ) => void
2829 toggleMessageFavorite : ( chatId : string , messageId : string ) => void
2930
3031 // 流式消息处理 - 优化版本
@@ -204,6 +205,98 @@ export const useMessagesStore = create<MessagesState & MessagesActions>()(
204205 }
205206 } ,
206207
208+ deleteMessageAndChildren : ( chatId , messageId ) => {
209+ try {
210+ const { updatePage } = usePagesStore . getState ( )
211+ const page = usePagesStore . getState ( ) . findPageById ( chatId )
212+
213+ if ( page && page . type === 'regular' && page . messages ) {
214+ // 递归查找所有需要删除的消息ID(包括子分支)
215+ const messagesToDelete = new Set < string > ( )
216+
217+ const findChildrenRecursively = ( currentMessageId : string ) => {
218+ messagesToDelete . add ( currentMessageId )
219+ const message = page . messages ?. find ( msg => msg . id === currentMessageId )
220+ if ( message && message . children ) {
221+ message . children . forEach ( childId => {
222+ findChildrenRecursively ( childId )
223+ } )
224+ }
225+ }
226+
227+ findChildrenRecursively ( messageId )
228+
229+ // 过滤掉要删除的消息
230+ const updatedMessages = page . messages ?. filter ( msg => ! messagesToDelete . has ( msg . id ) ) || [ ]
231+
232+ // 更新父消息的children数组(如果被删除的消息有父消息)
233+ const messageToDelete = page . messages ?. find ( msg => msg . id === messageId )
234+ let finalMessages = updatedMessages
235+
236+ if ( messageToDelete ?. parentId ) {
237+ finalMessages = updatedMessages . map ( msg =>
238+ msg . id === messageToDelete . parentId
239+ ? {
240+ ...msg ,
241+ children : ( msg . children || [ ] ) . filter ( childId => childId !== messageId )
242+ }
243+ : msg
244+ )
245+ }
246+
247+ // 更新当前路径,移除已删除的消息
248+ let newCurrentPath = page . currentPath || [ ]
249+
250+ // 如果当前路径包含被删除的消息,需要调整路径
251+ if ( messagesToDelete . has ( newCurrentPath [ newCurrentPath . length - 1 ] ) ) {
252+ // 找到被删除消息在路径中的位置
253+ const deletedMessageIndex = newCurrentPath . findIndex ( id => messagesToDelete . has ( id ) )
254+ if ( deletedMessageIndex !== - 1 ) {
255+ // 截取到被删除消息之前的路径
256+ newCurrentPath = newCurrentPath . slice ( 0 , deletedMessageIndex )
257+
258+ // 如果删除了路径中的消息,尝试找到同级的其他消息作为替代
259+ if ( messageToDelete ?. parentId && deletedMessageIndex > 0 ) {
260+ const parentId = newCurrentPath [ newCurrentPath . length - 1 ]
261+ const parentMessage = finalMessages . find ( msg => msg . id === parentId )
262+ if ( parentMessage ?. children && parentMessage . children . length > 0 ) {
263+ // 选择同级的第一个子消息继续路径
264+ newCurrentPath . push ( parentMessage . children [ 0 ] )
265+ }
266+ }
267+ }
268+ }
269+
270+ // 更新消息映射(如果存在)
271+ let updatedMessageMap = page . messageMap
272+ if ( updatedMessageMap ) {
273+ const newMessageMap = { ...updatedMessageMap }
274+ messagesToDelete . forEach ( id => {
275+ delete newMessageMap [ id ]
276+ } )
277+
278+ // 更新父消息在messageMap中的children
279+ if ( messageToDelete ?. parentId && newMessageMap [ messageToDelete . parentId ] ) {
280+ newMessageMap [ messageToDelete . parentId ] = {
281+ ...newMessageMap [ messageToDelete . parentId ] ,
282+ children : ( newMessageMap [ messageToDelete . parentId ] . children || [ ] ) . filter ( childId => childId !== messageId )
283+ }
284+ }
285+
286+ updatedMessageMap = newMessageMap
287+ }
288+
289+ updatePage ( chatId , {
290+ messages : finalMessages ,
291+ currentPath : newCurrentPath ,
292+ messageMap : updatedMessageMap
293+ } )
294+ }
295+ } catch ( error ) {
296+ handleStoreError ( 'messagesStore' , 'deleteMessageAndChildren' , error )
297+ }
298+ } ,
299+
207300 toggleMessageFavorite : ( chatId , messageId ) => {
208301 try {
209302 const { updatePage } = usePagesStore . getState ( )
0 commit comments