From 30da53761856f7483725ae9dd7e8692d3365170a Mon Sep 17 00:00:00 2001 From: arvinxx Date: Tue, 11 Jul 2023 23:30:12 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20feat:=20ChatList=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=93=8D=E4=BD=9C=E8=A1=8C=E4=B8=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/chat/Config/index.tsx | 1 + src/pages/chat/Conversation/ChatList.tsx | 20 +++- src/store/session/slices/chat/action.ts | 141 ++++++++++++----------- 3 files changed, 93 insertions(+), 69 deletions(-) diff --git a/src/pages/chat/Config/index.tsx b/src/pages/chat/Config/index.tsx index cdc13b5358a61..d70059f0a260c 100644 --- a/src/pages/chat/Config/index.tsx +++ b/src/pages/chat/Config/index.tsx @@ -27,6 +27,7 @@ const Config = () => { mode={'float'} pin resize={{ left: false }} + minWidth={400} expand={showAgentSettings} className={styles.drawer} > diff --git a/src/pages/chat/Conversation/ChatList.tsx b/src/pages/chat/Conversation/ChatList.tsx index 4fd530c8a1a97..a9aa688f3e156 100644 --- a/src/pages/chat/Conversation/ChatList.tsx +++ b/src/pages/chat/Conversation/ChatList.tsx @@ -1,13 +1,31 @@ import { ChatList } from '@lobehub/ui'; import isEqual from 'fast-deep-equal'; import { memo } from 'react'; +import { shallow } from 'zustand/shallow'; import { chatSelectors, useChatStore } from '@/store/session'; const List = () => { const data = useChatStore(chatSelectors.currentChats, isEqual); + const [deleteMessage, resendMessage] = useChatStore((s) => [s.deleteMessage, s.resendMessage], shallow); - return ; + return ( + { + switch (key) { + case 'delete': + deleteMessage(id); + break; + + case 'regenerate': + resendMessage(id); + break; + } + }} + style={{ marginTop: 24 }} + /> + ); }; export default memo(List); diff --git a/src/store/session/slices/chat/action.ts b/src/store/session/slices/chat/action.ts index 839124cf1913f..2e38544533d83 100644 --- a/src/store/session/slices/chat/action.ts +++ b/src/store/session/slices/chat/action.ts @@ -32,13 +32,14 @@ export interface ChatAction { * @param index - 消息索引 * @returns Promise */ - // resendMessage: (id: string) => Promise; + resendMessage: (id: string) => Promise; /** * @title 发送消息 * @returns Promise */ sendMessage: (text: string) => Promise; + deleteMessage: (id: string) => void; } export const createChatSlice: StateCreator = ( @@ -73,73 +74,73 @@ export const createChatSlice: StateCreator { - // const { - // sendMessage, - // dispatchMessage, - // // generateMessage - // } = get(); - // - // const session = sessionSelectors.currentSession(get()); - // - // if (!session) return; - // - // const index = session.chats.findIndex((s) => s.id === id); - // if (index < 0) return; - // - // const message = session.chats[index]; - // - // // 用户通过手动删除,造成了他的问题是最后一条消息 - // // 这种情况下,相当于用户重新发送消息 - // if (session.chats.length === index && message.role === 'user') { - // // 发送消息的时候会把传入的消息 message 新建一条,因此在发送前先把这条消息在记录中删除 - // dispatchMessage({ id: message.id, type: 'deleteMessage' }); - // await sendMessage(message.content); - // return; - // } - // - // // 上下文消息就是当前消息之前的消息 - // const contextMessages = session.chats.slice(0, index); - // - // // 上下文消息中最后一条消息 - // const userMessage = contextMessages.at(-1)?.content; - // if (!userMessage) return; - // - // const targetMessage = session.chats[index]; - // - // // 如果不是 assistant 的消息,那么需要额外插入一条消息 - // if (targetMessage.role === 'assistant') { - // // 保存之前的消息为历史消息 - // // dispatchMessage({ type: 'updateMessage', message: botPrevMsg, index }); - // // dispatchMessage({ type: 'updateMessage', message: LOADING_FLAT, index }); - // } else { - // // dispatchMessage({ - // // type: 'insertMessage', - // // index, - // // message: { role: 'assistant', content: LOADING_FLAT }, - // // }); - // } - // - // // 重置错误信息 - // dispatchMessage({ - // id: targetMessage.id, - // key: 'error', - // type: 'updateMessage', - // value: undefined, - // }); - // - // // 开始更新消息 - // - // // await generateMessage(userMessage, contextMessages, { - // // onMessageHandle: (text) => { - // // currentResponse = [...currentResponse, text]; - // // dispatchMessage({ type: 'updateMessage', message: currentResponse.join(''), index }); - // // }, - // // onErrorHandle: (error) => { - // // dispatchMessage({ type: 'updateMessage' }); - // // }, - // // }); - // }, + resendMessage: async () => { + // const { + // sendMessage, + // dispatchMessage, + // // generateMessage + // } = get(); + // + // const session = sessionSelectors.currentSession(get()); + // + // if (!session) return; + // + // const index = session.chats.findIndex((s) => s.id === id); + // if (index < 0) return; + // + // const message = session.chats[index]; + // + // // 用户通过手动删除,造成了他的问题是最后一条消息 + // // 这种情况下,相当于用户重新发送消息 + // if (session.chats.length === index && message.role === 'user') { + // // 发送消息的时候会把传入的消息 message 新建一条,因此在发送前先把这条消息在记录中删除 + // dispatchMessage({ id: message.id, type: 'deleteMessage' }); + // await sendMessage(message.content); + // return; + // } + // + // // 上下文消息就是当前消息之前的消息 + // const contextMessages = session.chats.slice(0, index); + // + // // 上下文消息中最后一条消息 + // const userMessage = contextMessages.at(-1)?.content; + // if (!userMessage) return; + // + // const targetMessage = session.chats[index]; + // + // // 如果不是 assistant 的消息,那么需要额外插入一条消息 + // if (targetMessage.role === 'assistant') { + // // 保存之前的消息为历史消息 + // // dispatchMessage({ type: 'updateMessage', message: botPrevMsg, index }); + // // dispatchMessage({ type: 'updateMessage', message: LOADING_FLAT, index }); + // } else { + // // dispatchMessage({ + // // type: 'insertMessage', + // // index, + // // message: { role: 'assistant', content: LOADING_FLAT }, + // // }); + // } + // + // // 重置错误信息 + // dispatchMessage({ + // id: targetMessage.id, + // key: 'error', + // type: 'updateMessage', + // value: undefined, + // }); + // + // // 开始更新消息 + // + // // await generateMessage(userMessage, contextMessages, { + // // onMessageHandle: (text) => { + // // currentResponse = [...currentResponse, text]; + // // dispatchMessage({ type: 'updateMessage', message: currentResponse.join(''), index }); + // // }, + // // onErrorHandle: (error) => { + // // dispatchMessage({ type: 'updateMessage' }); + // // }, + // // }); + }, sendMessage: async (message) => { const { dispatchMessage, generateMessage } = get(); @@ -182,4 +183,8 @@ export const createChatSlice: StateCreator { + get().dispatchMessage({ type: 'deleteMessage', id }); + }, });