Skip to content

Commit

Permalink
fix: ChatGPTNextWeb#2336 resending message should delete origional me…
Browse files Browse the repository at this point in the history
…ssages
  • Loading branch information
Yidadaa authored and chenzeyu committed Nov 8, 2023
1 parent bc666f6 commit b8902b6
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 8 deletions.
53 changes: 46 additions & 7 deletions app/components/chat.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -710,7 +710,7 @@ export function Chat() {
};

const findLastUserIndex = (messageId: string) => {
// find last user input message and resend
// find last user input message
let lastUserMessageIndex: number | null = null;
for (let i = 0; i < session.messages.length; i += 1) {
const message = session.messages[i];
Expand All @@ -737,17 +737,56 @@ export function Chat() {
};

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) {
const userIndex = findLastUserIndex(message.id);
if (userIndex) {
content = session.messages.at(userIndex)?.content ?? content;
if (message.role === "assistant") {
// if it is resending a bot's message, find the user input for it
botMessage = message;
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);
chatStore.onUserInput(content).then(() => setIsLoading(false));
chatStore.onUserInput(userMessage.content).then(() => setIsLoading(false));
inputRef.current?.focus();
};

Expand Down
1 change: 0 additions & 1 deletion app/store/chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,6 @@ export const useChatStore = create<ChatStore>()(
const botMessage: ChatMessage = createMessage({
role: "assistant",
streaming: true,
id: userMessage.id! + 1,
model: modelConfig.model,
});

Expand Down

0 comments on commit b8902b6

Please sign in to comment.