feat: Add button to remove messages and responses

This commit is contained in:
GOWxx 2023-03-31 22:55:49 +08:00
parent 61eb356fd9
commit 2ffe2a98b8
6 changed files with 69 additions and 27 deletions

View File

@ -324,8 +324,21 @@
} }
} }
.chat-message-user > .chat-message-container > .chat-message-item { .chat-message-user > .chat-message-container {
.chat-message-top-actions {
flex-direction: row;
right: unset;
left: 20px;
}
&:hover {
.chat-message-top-actions {
left: 10px;
}
}
& > .chat-message-item {
background-color: var(--second); background-color: var(--second);
}
} }
.chat-message-actions { .chat-message-actions {

View File

@ -274,6 +274,10 @@ export function Chat(props: {
} }
}; };
const onMessageDelete = (messageIndex: number) => {
chatStore.removeMessage(sessionIndex, messageIndex);
};
const onResend = (botIndex: number) => { const onResend = (botIndex: number) => {
// find last user input message and resend // find last user input message and resend
for (let i = botIndex; i >= 0; i -= 1) { for (let i = botIndex; i >= 0; i -= 1) {
@ -418,8 +422,8 @@ export function Chat(props: {
</div> </div>
)} )}
<div className={styles["chat-message-item"]}> <div className={styles["chat-message-item"]}>
{!isUser && {!isUser
!(message.preview || message.content.length === 0) && ( ? !(message.preview || message.content.length === 0) && (
<div className={styles["chat-message-top-actions"]}> <div className={styles["chat-message-top-actions"]}>
{message.streaming ? ( {message.streaming ? (
<div <div
@ -444,6 +448,18 @@ export function Chat(props: {
{Locale.Chat.Actions.Copy} {Locale.Chat.Actions.Copy}
</div> </div>
</div> </div>
)
: !(message.preview || message.content.length === 0) && (
<div className={styles["chat-message-top-actions"]}>
{!message.streaming && (
<div
className={styles["chat-message-top-action"]}
onClick={(e) => onMessageDelete(i)}
>
{Locale.Chat.Actions.Delete}
</div>
)}
</div>
)} )}
{(message.preview || message.content.length === 0) && {(message.preview || message.content.length === 0) &&
!isUser ? ( !isUser ? (

View File

@ -17,6 +17,7 @@ const cn = {
Copy: "复制", Copy: "复制",
Stop: "停止", Stop: "停止",
Retry: "重试", Retry: "重试",
Delete: "删除",
}, },
Rename: "重命名对话", Rename: "重命名对话",
Typing: "正在输入…", Typing: "正在输入…",

View File

@ -19,6 +19,7 @@ const en: LocaleType = {
Copy: "Copy", Copy: "Copy",
Stop: "Stop", Stop: "Stop",
Retry: "Retry", Retry: "Retry",
Delete: "Delete",
}, },
Rename: "Rename Chat", Rename: "Rename Chat",
Typing: "Typing…", Typing: "Typing…",

View File

@ -18,6 +18,7 @@ const tw: LocaleType = {
Copy: "複製", Copy: "複製",
Stop: "停止", Stop: "停止",
Retry: "重試", Retry: "重試",
Delete: "刪除",
}, },
Rename: "重命名對話", Rename: "重命名對話",
Typing: "正在輸入…", Typing: "正在輸入…",

View File

@ -194,6 +194,7 @@ interface ChatStore {
summarizeSession: () => void; summarizeSession: () => void;
updateStat: (message: Message) => void; updateStat: (message: Message) => void;
updateCurrentSession: (updater: (session: ChatSession) => void) => void; updateCurrentSession: (updater: (session: ChatSession) => void) => void;
removeMessage: (sessionIndex: number, messageIndex: number) => void;
updateMessage: ( updateMessage: (
sessionIndex: number, sessionIndex: number,
messageIndex: number, messageIndex: number,
@ -384,6 +385,15 @@ export const useChatStore = create<ChatStore>()(
return recentMessages; return recentMessages;
}, },
removeMessage(sessionIndex: number, messageIndex: number) {
const sessions = get().sessions;
const session = sessions.at(sessionIndex);
const messages = session?.messages;
// remove user's message and bot's response
messages?.splice(messageIndex, 2);
set(() => ({ sessions }));
},
updateMessage( updateMessage(
sessionIndex: number, sessionIndex: number,
messageIndex: number, messageIndex: number,