mirror of
https://github.com/lobehub/lobe-chat.git
synced 2026-06-14 03:30:19 +00:00
✨ feat: ChatList 支持操作行为
This commit is contained in:
@@ -27,6 +27,7 @@ const Config = () => {
|
|||||||
mode={'float'}
|
mode={'float'}
|
||||||
pin
|
pin
|
||||||
resize={{ left: false }}
|
resize={{ left: false }}
|
||||||
|
minWidth={400}
|
||||||
expand={showAgentSettings}
|
expand={showAgentSettings}
|
||||||
className={styles.drawer}
|
className={styles.drawer}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,13 +1,31 @@
|
|||||||
import { ChatList } from '@lobehub/ui';
|
import { ChatList } from '@lobehub/ui';
|
||||||
import isEqual from 'fast-deep-equal';
|
import isEqual from 'fast-deep-equal';
|
||||||
import { memo } from 'react';
|
import { memo } from 'react';
|
||||||
|
import { shallow } from 'zustand/shallow';
|
||||||
|
|
||||||
import { chatSelectors, useChatStore } from '@/store/session';
|
import { chatSelectors, useChatStore } from '@/store/session';
|
||||||
|
|
||||||
const List = () => {
|
const List = () => {
|
||||||
const data = useChatStore(chatSelectors.currentChats, isEqual);
|
const data = useChatStore(chatSelectors.currentChats, isEqual);
|
||||||
|
const [deleteMessage, resendMessage] = useChatStore((s) => [s.deleteMessage, s.resendMessage], shallow);
|
||||||
|
|
||||||
return <ChatList data={data} />;
|
return (
|
||||||
|
<ChatList
|
||||||
|
data={data}
|
||||||
|
onActionClick={(key, id) => {
|
||||||
|
switch (key) {
|
||||||
|
case 'delete':
|
||||||
|
deleteMessage(id);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'regenerate':
|
||||||
|
resendMessage(id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
style={{ marginTop: 24 }}
|
||||||
|
/>
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default memo(List);
|
export default memo(List);
|
||||||
|
|||||||
@@ -32,13 +32,14 @@ export interface ChatAction {
|
|||||||
* @param index - 消息索引
|
* @param index - 消息索引
|
||||||
* @returns Promise<void>
|
* @returns Promise<void>
|
||||||
*/
|
*/
|
||||||
// resendMessage: (id: string) => Promise<void>;
|
resendMessage: (id: string) => Promise<void>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @title 发送消息
|
* @title 发送消息
|
||||||
* @returns Promise<void>
|
* @returns Promise<void>
|
||||||
*/
|
*/
|
||||||
sendMessage: (text: string) => Promise<void>;
|
sendMessage: (text: string) => Promise<void>;
|
||||||
|
deleteMessage: (id: string) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const createChatSlice: StateCreator<SessionStore, [['zustand/devtools', never]], [], ChatAction> = (
|
export const createChatSlice: StateCreator<SessionStore, [['zustand/devtools', never]], [], ChatAction> = (
|
||||||
@@ -73,73 +74,73 @@ export const createChatSlice: StateCreator<SessionStore, [['zustand/devtools', n
|
|||||||
set({ editingMessageId: messageId });
|
set({ editingMessageId: messageId });
|
||||||
},
|
},
|
||||||
|
|
||||||
// resendMessage: async (id) => {
|
resendMessage: async () => {
|
||||||
// const {
|
// const {
|
||||||
// sendMessage,
|
// sendMessage,
|
||||||
// dispatchMessage,
|
// dispatchMessage,
|
||||||
// // generateMessage
|
// // generateMessage
|
||||||
// } = get();
|
// } = get();
|
||||||
//
|
//
|
||||||
// const session = sessionSelectors.currentSession(get());
|
// const session = sessionSelectors.currentSession(get());
|
||||||
//
|
//
|
||||||
// if (!session) return;
|
// if (!session) return;
|
||||||
//
|
//
|
||||||
// const index = session.chats.findIndex((s) => s.id === id);
|
// const index = session.chats.findIndex((s) => s.id === id);
|
||||||
// if (index < 0) return;
|
// if (index < 0) return;
|
||||||
//
|
//
|
||||||
// const message = session.chats[index];
|
// const message = session.chats[index];
|
||||||
//
|
//
|
||||||
// // 用户通过手动删除,造成了他的问题是最后一条消息
|
// // 用户通过手动删除,造成了他的问题是最后一条消息
|
||||||
// // 这种情况下,相当于用户重新发送消息
|
// // 这种情况下,相当于用户重新发送消息
|
||||||
// if (session.chats.length === index && message.role === 'user') {
|
// if (session.chats.length === index && message.role === 'user') {
|
||||||
// // 发送消息的时候会把传入的消息 message 新建一条,因此在发送前先把这条消息在记录中删除
|
// // 发送消息的时候会把传入的消息 message 新建一条,因此在发送前先把这条消息在记录中删除
|
||||||
// dispatchMessage({ id: message.id, type: 'deleteMessage' });
|
// dispatchMessage({ id: message.id, type: 'deleteMessage' });
|
||||||
// await sendMessage(message.content);
|
// await sendMessage(message.content);
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// // 上下文消息就是当前消息之前的消息
|
// // 上下文消息就是当前消息之前的消息
|
||||||
// const contextMessages = session.chats.slice(0, index);
|
// const contextMessages = session.chats.slice(0, index);
|
||||||
//
|
//
|
||||||
// // 上下文消息中最后一条消息
|
// // 上下文消息中最后一条消息
|
||||||
// const userMessage = contextMessages.at(-1)?.content;
|
// const userMessage = contextMessages.at(-1)?.content;
|
||||||
// if (!userMessage) return;
|
// if (!userMessage) return;
|
||||||
//
|
//
|
||||||
// const targetMessage = session.chats[index];
|
// const targetMessage = session.chats[index];
|
||||||
//
|
//
|
||||||
// // 如果不是 assistant 的消息,那么需要额外插入一条消息
|
// // 如果不是 assistant 的消息,那么需要额外插入一条消息
|
||||||
// if (targetMessage.role === 'assistant') {
|
// if (targetMessage.role === 'assistant') {
|
||||||
// // 保存之前的消息为历史消息
|
// // 保存之前的消息为历史消息
|
||||||
// // dispatchMessage({ type: 'updateMessage', message: botPrevMsg, index });
|
// // dispatchMessage({ type: 'updateMessage', message: botPrevMsg, index });
|
||||||
// // dispatchMessage({ type: 'updateMessage', message: LOADING_FLAT, index });
|
// // dispatchMessage({ type: 'updateMessage', message: LOADING_FLAT, index });
|
||||||
// } else {
|
// } else {
|
||||||
// // dispatchMessage({
|
// // dispatchMessage({
|
||||||
// // type: 'insertMessage',
|
// // type: 'insertMessage',
|
||||||
// // index,
|
// // index,
|
||||||
// // message: { role: 'assistant', content: LOADING_FLAT },
|
// // message: { role: 'assistant', content: LOADING_FLAT },
|
||||||
// // });
|
// // });
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// // 重置错误信息
|
// // 重置错误信息
|
||||||
// dispatchMessage({
|
// dispatchMessage({
|
||||||
// id: targetMessage.id,
|
// id: targetMessage.id,
|
||||||
// key: 'error',
|
// key: 'error',
|
||||||
// type: 'updateMessage',
|
// type: 'updateMessage',
|
||||||
// value: undefined,
|
// value: undefined,
|
||||||
// });
|
// });
|
||||||
//
|
//
|
||||||
// // 开始更新消息
|
// // 开始更新消息
|
||||||
//
|
//
|
||||||
// // await generateMessage(userMessage, contextMessages, {
|
// // await generateMessage(userMessage, contextMessages, {
|
||||||
// // onMessageHandle: (text) => {
|
// // onMessageHandle: (text) => {
|
||||||
// // currentResponse = [...currentResponse, text];
|
// // currentResponse = [...currentResponse, text];
|
||||||
// // dispatchMessage({ type: 'updateMessage', message: currentResponse.join(''), index });
|
// // dispatchMessage({ type: 'updateMessage', message: currentResponse.join(''), index });
|
||||||
// // },
|
// // },
|
||||||
// // onErrorHandle: (error) => {
|
// // onErrorHandle: (error) => {
|
||||||
// // dispatchMessage({ type: 'updateMessage' });
|
// // dispatchMessage({ type: 'updateMessage' });
|
||||||
// // },
|
// // },
|
||||||
// // });
|
// // });
|
||||||
// },
|
},
|
||||||
|
|
||||||
sendMessage: async (message) => {
|
sendMessage: async (message) => {
|
||||||
const { dispatchMessage, generateMessage } = get();
|
const { dispatchMessage, generateMessage } = get();
|
||||||
@@ -182,4 +183,8 @@ export const createChatSlice: StateCreator<SessionStore, [['zustand/devtools', n
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
deleteMessage: (id) => {
|
||||||
|
get().dispatchMessage({ type: 'deleteMessage', id });
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user