|
@@ -536,21 +536,45 @@ export function Chat(props: {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- const onResend = (botIndex: number) => {
|
|
|
+ const findLastUesrIndex = (messageId: number) => {
|
|
|
// find last user input message and resend
|
|
|
- for (let i = botIndex; i >= 0; i -= 1) {
|
|
|
- if (messages[i].role === "user") {
|
|
|
- setIsLoading(true);
|
|
|
- chatStore
|
|
|
- .onUserInput(messages[i].content)
|
|
|
- .then(() => setIsLoading(false));
|
|
|
- chatStore.updateCurrentSession((session) =>
|
|
|
- session.messages.splice(i, 2),
|
|
|
- );
|
|
|
- inputRef.current?.focus();
|
|
|
- return;
|
|
|
+ let lastUserMessageIndex: number | null = null;
|
|
|
+ for (let i = 0; i < session.messages.length; i += 1) {
|
|
|
+ const message = session.messages[i];
|
|
|
+ if (message.id === messageId) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (message.role === "user") {
|
|
|
+ lastUserMessageIndex = i;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ return lastUserMessageIndex;
|
|
|
+ };
|
|
|
+
|
|
|
+ const deleteMessage = (userIndex: number) => {
|
|
|
+ chatStore.updateCurrentSession((session) =>
|
|
|
+ session.messages.splice(userIndex, 2),
|
|
|
+ );
|
|
|
+ };
|
|
|
+
|
|
|
+ const onDelete = (botMessageId: number) => {
|
|
|
+ const userIndex = findLastUesrIndex(botMessageId);
|
|
|
+ if (userIndex === null) return;
|
|
|
+ deleteMessage(userIndex);
|
|
|
+ };
|
|
|
+
|
|
|
+ const onResend = (botMessageId: number) => {
|
|
|
+ // find last user input message and resend
|
|
|
+ const userIndex = findLastUesrIndex(botMessageId);
|
|
|
+ if (userIndex === null) return;
|
|
|
+
|
|
|
+ setIsLoading(true);
|
|
|
+ chatStore
|
|
|
+ .onUserInput(session.messages[userIndex].content)
|
|
|
+ .then(() => setIsLoading(false));
|
|
|
+ deleteMessage(userIndex);
|
|
|
+ inputRef.current?.focus();
|
|
|
};
|
|
|
|
|
|
const config = useChatStore((state) => state.config);
|
|
@@ -722,12 +746,20 @@ export function Chat(props: {
|
|
|
{Locale.Chat.Actions.Stop}
|
|
|
</div>
|
|
|
) : (
|
|
|
- <div
|
|
|
- className={styles["chat-message-top-action"]}
|
|
|
- onClick={() => onResend(i)}
|
|
|
- >
|
|
|
- {Locale.Chat.Actions.Retry}
|
|
|
- </div>
|
|
|
+ <>
|
|
|
+ <div
|
|
|
+ className={styles["chat-message-top-action"]}
|
|
|
+ onClick={() => onDelete(message.id ?? i)}
|
|
|
+ >
|
|
|
+ {Locale.Chat.Actions.Delete}
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ className={styles["chat-message-top-action"]}
|
|
|
+ onClick={() => onResend(message.id ?? i)}
|
|
|
+ >
|
|
|
+ {Locale.Chat.Actions.Retry}
|
|
|
+ </div>
|
|
|
+ </>
|
|
|
)}
|
|
|
|
|
|
<div
|