mirror of
				https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
				synced 2025-11-04 16:23:41 +08:00 
			
		
		
		
	feat: close #539 add delete message button
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@ const cn = {
 | 
			
		||||
      Copy: "复制",
 | 
			
		||||
      Stop: "停止",
 | 
			
		||||
      Retry: "重试",
 | 
			
		||||
      Delete: "删除",
 | 
			
		||||
    },
 | 
			
		||||
    Rename: "重命名对话",
 | 
			
		||||
    Typing: "正在输入…",
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@ const de: LocaleType = {
 | 
			
		||||
      Copy: "Kopieren",
 | 
			
		||||
      Stop: "Stop",
 | 
			
		||||
      Retry: "Wiederholen",
 | 
			
		||||
      Delete: "Delete",
 | 
			
		||||
    },
 | 
			
		||||
    Rename: "Chat umbenennen",
 | 
			
		||||
    Typing: "Tippen...",
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@ const en: LocaleType = {
 | 
			
		||||
      Copy: "Copy",
 | 
			
		||||
      Stop: "Stop",
 | 
			
		||||
      Retry: "Retry",
 | 
			
		||||
      Delete: "Delete",
 | 
			
		||||
    },
 | 
			
		||||
    Rename: "Rename Chat",
 | 
			
		||||
    Typing: "Typing…",
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@ const es: LocaleType = {
 | 
			
		||||
      Copy: "Copiar",
 | 
			
		||||
      Stop: "Detener",
 | 
			
		||||
      Retry: "Reintentar",
 | 
			
		||||
      Delete: "Delete",
 | 
			
		||||
    },
 | 
			
		||||
    Rename: "Renombrar chat",
 | 
			
		||||
    Typing: "Escribiendo...",
 | 
			
		||||
 
 | 
			
		||||
@@ -54,23 +54,13 @@ export function getLang(): Lang {
 | 
			
		||||
 | 
			
		||||
  const lang = getLanguage();
 | 
			
		||||
 | 
			
		||||
  if (lang.includes("zh") || lang.includes("cn")) {
 | 
			
		||||
    return "cn";
 | 
			
		||||
  } else if (lang.includes("tw")) {
 | 
			
		||||
    return "tw";
 | 
			
		||||
  } else if (lang.includes("es")) {
 | 
			
		||||
    return "es";
 | 
			
		||||
  } else if (lang.includes("it")) {
 | 
			
		||||
    return "it";
 | 
			
		||||
  } else if (lang.includes("tr")) {
 | 
			
		||||
    return "tr";
 | 
			
		||||
  } else if (lang.includes("jp")) {
 | 
			
		||||
    return "jp";
 | 
			
		||||
  } else if (lang.includes("de")) {
 | 
			
		||||
    return "de";
 | 
			
		||||
  } else {
 | 
			
		||||
    return "en";
 | 
			
		||||
  for (const option of AllLangs) {
 | 
			
		||||
    if (lang.includes(option)) {
 | 
			
		||||
      return option;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return "en";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function changeLang(lang: Lang) {
 | 
			
		||||
@@ -87,4 +77,4 @@ export default {
 | 
			
		||||
  tr: TR,
 | 
			
		||||
  jp: JP,
 | 
			
		||||
  de: DE,
 | 
			
		||||
}[getLang()];
 | 
			
		||||
}[getLang()] as typeof CN;
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@ const it: LocaleType = {
 | 
			
		||||
      Copy: "Copia",
 | 
			
		||||
      Stop: "Stop",
 | 
			
		||||
      Retry: "Riprova",
 | 
			
		||||
      Delete: "Delete",
 | 
			
		||||
    },
 | 
			
		||||
    Rename: "Rinomina Chat",
 | 
			
		||||
    Typing: "Typing…",
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@ const jp = {
 | 
			
		||||
      Copy: "コピー",
 | 
			
		||||
      Stop: "停止",
 | 
			
		||||
      Retry: "リトライ",
 | 
			
		||||
      Delete: "Delete",
 | 
			
		||||
    },
 | 
			
		||||
    Rename: "チャットの名前を変更",
 | 
			
		||||
    Typing: "入力中…",
 | 
			
		||||
@@ -178,6 +179,4 @@ const jp = {
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export type LocaleType = typeof jp;
 | 
			
		||||
 | 
			
		||||
export default jp;
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@ const tr: LocaleType = {
 | 
			
		||||
      Copy: "Kopyala",
 | 
			
		||||
      Stop: "Durdur",
 | 
			
		||||
      Retry: "Tekrar Dene",
 | 
			
		||||
      Delete: "Delete",
 | 
			
		||||
    },
 | 
			
		||||
    Rename: "Sohbeti Yeniden Adlandır",
 | 
			
		||||
    Typing: "Yazıyor…",
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@ const tw: LocaleType = {
 | 
			
		||||
      Copy: "複製",
 | 
			
		||||
      Stop: "停止",
 | 
			
		||||
      Retry: "重試",
 | 
			
		||||
      Delete: "刪除",
 | 
			
		||||
    },
 | 
			
		||||
    Rename: "重命名對話",
 | 
			
		||||
    Typing: "正在輸入…",
 | 
			
		||||
 
 | 
			
		||||
@@ -386,6 +386,7 @@ export const useChatStore = create<ChatStore>()(
 | 
			
		||||
        const botMessage: Message = createMessage({
 | 
			
		||||
          role: "assistant",
 | 
			
		||||
          streaming: true,
 | 
			
		||||
          id: userMessage.id! + 1,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // get recent messages
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user