|
|
@ -710,7 +710,7 @@ export function Chat() {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const findLastUserIndex = (messageId: string) => {
|
|
|
|
const findLastUserIndex = (messageId: string) => {
|
|
|
|
// find last user input message and resend
|
|
|
|
// find last user input message
|
|
|
|
let lastUserMessageIndex: number | null = null;
|
|
|
|
let lastUserMessageIndex: number | null = null;
|
|
|
|
for (let i = 0; i < session.messages.length; i += 1) {
|
|
|
|
for (let i = 0; i < session.messages.length; i += 1) {
|
|
|
|
const message = session.messages[i];
|
|
|
|
const message = session.messages[i];
|
|
|
@ -737,17 +737,56 @@ export function Chat() {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onResend = (message: ChatMessage) => {
|
|
|
|
const onResend = (message: ChatMessage) => {
|
|
|
|
let content = message.content;
|
|
|
|
// when it is resending a message
|
|
|
|
|
|
|
|
// 1. for a user's message, find the next bot response
|
|
|
|
|
|
|
|
// 2. for a bot's message, find the last user's input
|
|
|
|
|
|
|
|
// 3. delete original user input and bot's message
|
|
|
|
|
|
|
|
// 4. resend the user's input
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const resendingIndex = session.messages.findIndex(
|
|
|
|
|
|
|
|
(m) => m.id === message.id,
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (resendingIndex <= 0 || resendingIndex >= session.messages.length) {
|
|
|
|
|
|
|
|
console.error("[Chat] failed to find resending message", message);
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let userMessage: ChatMessage | undefined;
|
|
|
|
|
|
|
|
let botMessage: ChatMessage | undefined;
|
|
|
|
|
|
|
|
|
|
|
|
if (message.role === "assistant" && message.id) {
|
|
|
|
if (message.role === "assistant") {
|
|
|
|
const userIndex = findLastUserIndex(message.id);
|
|
|
|
// if it is resending a bot's message, find the user input for it
|
|
|
|
if (userIndex) {
|
|
|
|
botMessage = message;
|
|
|
|
content = session.messages.at(userIndex)?.content ?? content;
|
|
|
|
for (let i = resendingIndex; i >= 0; i -= 1) {
|
|
|
|
|
|
|
|
if (session.messages[i].role === "user") {
|
|
|
|
|
|
|
|
userMessage = session.messages[i];
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (message.role === "user") {
|
|
|
|
|
|
|
|
// if it is resending a user's input, find the bot's response
|
|
|
|
|
|
|
|
userMessage = message;
|
|
|
|
|
|
|
|
for (let i = resendingIndex; i < session.messages.length; i += 1) {
|
|
|
|
|
|
|
|
if (session.messages[i].role === "assistant") {
|
|
|
|
|
|
|
|
botMessage = session.messages[i];
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (userMessage === undefined) {
|
|
|
|
|
|
|
|
console.error("[Chat] failed to resend", message);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// delete the original messages
|
|
|
|
|
|
|
|
deleteMessage(userMessage.id);
|
|
|
|
|
|
|
|
deleteMessage(botMessage?.id);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// resend the message
|
|
|
|
setIsLoading(true);
|
|
|
|
setIsLoading(true);
|
|
|
|
chatStore.onUserInput(content).then(() => setIsLoading(false));
|
|
|
|
chatStore.onUserInput(userMessage.content).then(() => setIsLoading(false));
|
|
|
|
inputRef.current?.focus();
|
|
|
|
inputRef.current?.focus();
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|