diff --git a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageEnter/index.tsx b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageEnter/index.tsx index 06bfc121..074f5459 100644 --- a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageEnter/index.tsx +++ b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageEnter/index.tsx @@ -16,7 +16,10 @@ import SimpleFileUpload from "@/components/Upload/SimpleFileUpload"; import AudioRecorder from "@/components/Upload/AudioRecorder"; import ToContract from "./components/toContract"; import styles from "./MessageEnter.module.scss"; -import { useWeChatStore } from "@/store/module/weChat/weChat"; +import { + useWeChatStore, + clearAiRequestQueue, +} from "@/store/module/weChat/weChat"; import { useContactStore } from "@/store/module/weChat/contacts"; const { Footer } = Layout; const { TextArea } = Input; @@ -63,6 +66,8 @@ const MessageEnter: React.FC = ({ contract }) => { // 取消AI生成 const handleCancelAi = () => { + // 清除AI请求定时器和队列 + clearAiRequestQueue("用户手动取消"); // 停止AI加载状态 updateIsLoadingAiChat(false); // 清空AI回复内容 @@ -70,6 +75,22 @@ const MessageEnter: React.FC = ({ contract }) => { message.info("已取消AI生成"); }; + // 监听输入框变化 - 用户开始输入时取消AI + const handleInputChange = (e: React.ChangeEvent) => { + const newValue = e.target.value; + setInputValue(newValue); + + // 如果用户开始输入(且不是AI填充的内容),取消AI请求 + if (newValue && newValue !== quoteMessageContent) { + if (isLoadingAiChat) { + console.log("👤 用户开始输入,取消AI生成"); + clearAiRequestQueue("用户开始输入"); + updateIsLoadingAiChat(false); + updateQuoteMessageContent(""); + } + } + }; + // 发送消息(支持传入内容参数,避免闭包问题) const handleSend = async (content?: string) => { const messageContent = content || inputValue; // 优先使用传入的内容 @@ -79,6 +100,13 @@ const MessageEnter: React.FC = ({ contract }) => { return; } + // 用户主动发送消息时,取消AI请求 + if (!content && isLoadingAiChat) { + console.log("👤 用户主动发送消息,取消AI生成"); + clearAiRequestQueue("用户主动发送"); + updateIsLoadingAiChat(false); + } + console.log("handleSend", messageContent); const messageId = +Date.now(); // 构造本地消息对象 @@ -128,17 +156,27 @@ const MessageEnter: React.FC = ({ contract }) => { // AI 消息处理 useEffect(() => { if (quoteMessageContent) { - console.log("AI消息到达 - aiQuoteMessageContent:", aiQuoteMessageContent); + console.log( + "🤖 AI消息到达 - aiQuoteMessageContent:", + aiQuoteMessageContent, + ); + + // 检查:如果用户输入框已有内容(且不是之前的AI内容),不覆盖 + if (inputValue && inputValue !== quoteMessageContent) { + console.log("⚠️ 用户正在输入,不覆盖输入内容"); + updateQuoteMessageContent(""); // 清空AI回复 + return; + } if (isAiAssist) { // AI辅助模式:填充到输入框,等待人工确认 - console.log("AI辅助模式:填充消息到输入框"); + console.log("✨ AI辅助模式:填充消息到输入框"); setInputValue(quoteMessageContent); } if (isAiTakeover) { // AI接管模式:直接发送消息(传入内容,避免 state 闭包问题) - console.log("AI接管模式:自动发送消息"); + console.log("🚀 AI接管模式:自动发送消息"); handleSend(quoteMessageContent); } } @@ -354,7 +392,7 @@ const MessageEnter: React.FC = ({ contract }) => {