From 5f1a1e9f0eb30b17c6749c5170d362e928cef535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E8=80=81=E7=99=BD=E5=85=94?= Date: Sat, 25 Oct 2025 18:42:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B6=88=E6=81=AF=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8F=B7=E6=94=AF=E6=8C=81=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81=E5=92=8C=E6=8E=A5=E6=94=B6?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E6=9B=B4=E6=96=B0=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=A4=84=E7=90=86=EF=BC=8C=E6=8F=90=E5=8D=87?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=8F=AF=E8=AF=BB=E6=80=A7=E5=92=8C=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=BD=93=E9=AA=8C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Touchkebao/src/pages/pc/ckbox/data.ts | 1 + .../components/MessageEnter/index.tsx | 40 ++++++++++++++++--- .../AudioMessage/AudioMessage.module.scss | 4 -- .../components/AudioMessage/AudioMessage.tsx | 8 +--- .../components/MessageRecord/index.tsx | 18 ++++++++- .../src/store/module/weChat/weChat.data.ts | 2 + Touchkebao/src/store/module/weChat/weChat.ts | 3 ++ .../src/store/module/websocket/msgManage.ts | 17 +++++--- 8 files changed, 71 insertions(+), 22 deletions(-) diff --git a/Touchkebao/src/pages/pc/ckbox/data.ts b/Touchkebao/src/pages/pc/ckbox/data.ts index 367a8ee6..6e006858 100644 --- a/Touchkebao/src/pages/pc/ckbox/data.ts +++ b/Touchkebao/src/pages/pc/ckbox/data.ts @@ -194,6 +194,7 @@ export interface ChatRecord { wechatId: string; [key: string]: any; }; + seq?: number; [key: string]: any; } 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 f49ceccb..73391f5e 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 @@ -9,7 +9,7 @@ import { MessageOutlined, LoadingOutlined, } from "@ant-design/icons"; -import { ContractData, weChatGroup } from "@/pages/pc/ckbox/data"; +import { ContractData, weChatGroup, ChatRecord } from "@/pages/pc/ckbox/data"; import { useWebSocketStore } from "@/store/module/websocket/websocket"; import { EmojiPicker } from "@/components/EmojiSeclection"; import { EmojiInfo } from "@/components/EmojiSeclection/wechatEmoji"; @@ -18,6 +18,7 @@ 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 { useContactStore } from "@/store/module/weChat/contacts"; const { Footer } = Layout; const { TextArea } = Input; @@ -33,9 +34,8 @@ const MessageEnter: React.FC = ({ contract }) => { const EnterModule = useWeChatStore(state => state.EnterModule); const updateShowCheckbox = useWeChatStore(state => state.updateShowCheckbox); const updateEnterModule = useWeChatStore(state => state.updateEnterModule); - const updateTransmitModal = useWeChatStore( - state => state.updateTransmitModal, - ); + const setTransmitModal = useContactStore(state => state.setTransmitModal); + const addMessage = useWeChatStore(state => state.addMessage); const showChatRecordModel = useWeChatStore( state => state.showChatRecordModel, ); @@ -55,6 +55,35 @@ const MessageEnter: React.FC = ({ contract }) => { const handleSend = async () => { if (!inputValue.trim()) return; + const messageId = +Date.now(); + // 构造本地消息对象 + const localMessage: ChatRecord = { + id: messageId, // 使用时间戳作为临时ID + wechatAccountId: contract.wechatAccountId, + wechatFriendId: contract?.chatroomId ? 0 : contract.id, + wechatChatroomId: contract?.chatroomId ? contract.id : 0, + tenantId: 0, + accountId: 0, + synergyAccountId: 0, + content: inputValue, + msgType: 1, + msgSubType: 0, + msgSvrId: "", + isSend: true, // 标记为发送中 + createTime: new Date().toISOString(), + isDeleted: false, + deleteTime: "", + sendStatus: 1, + wechatTime: Date.now(), + origin: 0, + msgId: 0, + recalled: false, + seq: messageId, + }; + // 先插入本地数据 + addMessage(localMessage); + + // 再发送消息到服务器 const params = { wechatAccountId: contract.wechatAccountId, wechatChatroomId: contract?.chatroomId ? contract.id : 0, @@ -62,6 +91,7 @@ const MessageEnter: React.FC = ({ contract }) => { msgSubType: 0, msgType: 1, content: inputValue, + seq: messageId, }; sendCommand("CmdSendMessage", params); setInputValue(""); @@ -159,7 +189,7 @@ const MessageEnter: React.FC = ({ contract }) => { updateEnterModule("common"); }; const handTurnRignt = () => { - updateTransmitModal(true); + setTransmitModal(true); }; const openChatRecordModel = () => { updateShowChatRecordModel(!showChatRecordModel); diff --git a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageRecord/components/AudioMessage/AudioMessage.module.scss b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageRecord/components/AudioMessage/AudioMessage.module.scss index 394058b6..b732a7fe 100644 --- a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageRecord/components/AudioMessage/AudioMessage.module.scss +++ b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageRecord/components/AudioMessage/AudioMessage.module.scss @@ -104,10 +104,6 @@ font-size: 11px; color: #666; margin-top: 2px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - cursor: help; } // 进度条容器 diff --git a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageRecord/components/AudioMessage/AudioMessage.tsx b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageRecord/components/AudioMessage/AudioMessage.tsx index f087165c..d9840279 100644 --- a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageRecord/components/AudioMessage/AudioMessage.tsx +++ b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageRecord/components/AudioMessage/AudioMessage.tsx @@ -215,13 +215,7 @@ const AudioMessage: React.FC = ({ audioUrl, msgId }) => {
- {audioText && ( -
- {audioText.length > 10 - ? `${audioText.substring(0, 10)}...` - : audioText} -
- )} + {audioText &&
{audioText}
}
); diff --git a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageRecord/index.tsx b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageRecord/index.tsx index ae4a706e..de065ea2 100644 --- a/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageRecord/index.tsx +++ b/Touchkebao/src/pages/pc/ckbox/weChat/components/ChatWindow/components/MessageRecord/index.tsx @@ -542,7 +542,7 @@ const MessageRecord: React.FC = ({ contract }) => { return messages .filter(msg => msg !== null && msg !== undefined) // 过滤掉null和undefined的消息 .map(msg => ({ - time: formatWechatTime(msg?.wechatTime), + time: formatWechatTime(String(msg?.wechatTime)), messages: [msg], })); }; @@ -636,6 +636,7 @@ const MessageRecord: React.FC = ({ contract }) => { /> )} + = ({ contract }) => { className={styles.messageAvatar} />
{parseMessageContent(msg?.content, msg, msg?.msgType)}
+ {/* 发送状态 loading 图标 */} + {msg.sendStatus === 1 && ( +
+ +
+ )} )} diff --git a/Touchkebao/src/store/module/weChat/weChat.data.ts b/Touchkebao/src/store/module/weChat/weChat.data.ts index 3a7bb10e..c4c9ae22 100644 --- a/Touchkebao/src/store/module/weChat/weChat.data.ts +++ b/Touchkebao/src/store/module/weChat/weChat.data.ts @@ -101,4 +101,6 @@ export interface WeChatState { // ==================== 消息接收处理 ==================== /** 接收新消息处理 */ receivedMsg: (message: ChatRecord) => void; + /** 查找消息 */ + findMessageBySeq: (seq: number) => ChatRecord | undefined; } diff --git a/Touchkebao/src/store/module/weChat/weChat.ts b/Touchkebao/src/store/module/weChat/weChat.ts index d3d51007..c0532c18 100644 --- a/Touchkebao/src/store/module/weChat/weChat.ts +++ b/Touchkebao/src/store/module/weChat/weChat.ts @@ -84,6 +84,9 @@ export const useWeChatStore = create()( } } }, + findMessageBySeq: (seq: number) => { + return get().currentMessages.find(msg => msg.seq === seq); + }, /** 更新指定消息内容 */ updateMessage: (messageId, updates) => { set(state => ({ diff --git a/Touchkebao/src/store/module/websocket/msgManage.ts b/Touchkebao/src/store/module/websocket/msgManage.ts index 0b071cb4..1052a139 100644 --- a/Touchkebao/src/store/module/websocket/msgManage.ts +++ b/Touchkebao/src/store/module/websocket/msgManage.ts @@ -11,6 +11,8 @@ type MessageHandler = (message: WebSocketMessage) => void; const addMessage = useWeChatStore.getState().addMessage; const recallMessage = useWeChatStore.getState().recallMessage; const receivedMsg = useWeChatStore.getState().receivedMsg; +const findMessageBySeq = useWeChatStore.getState().findMessageBySeq; +const updateMessage = useWeChatStore.getState().updateMessage; const updateMomentCommonLoading = useWeChatStore.getState().updateMomentCommonLoading; const addMomentCommon = useWeChatStore.getState().addMomentCommon; @@ -41,13 +43,18 @@ const messageHandlers: Record = { }, // 发送消息响应 CmdSendMessageResp: message => { - console.log("发送消息响应", message); - addMessage(message.friendMessage || message.chatroomMessage); - // 在这里添加具体的处理逻辑 + const msg = findMessageBySeq(message.seq); + if (msg) { + updateMessage(message.seq, { + sendStatus: 1, + id: message.friendMessage?.id || message.chatroomMessage?.id, + }); + } }, CmdSendMessageResult: message => { - console.log("发送消息结果", message); - // 在这里添加具体的处理逻辑 + updateMessage(message.friendMessageId, { + sendStatus: 0, + }); }, // 接收消息响应 CmdReceiveMessageResp: message => {