From eace3e9467aa674524298a2a13ebbdf2dede0827 Mon Sep 17 00:00:00 2001 From: xuncha <1658671838@qq.com> Date: Mon, 2 Mar 2026 21:36:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E6=B6=88=E6=81=AF=E5=86=85?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ChatPage.scss | 131 ++++++++++++++++++++++++++++++++++++++++ src/pages/ChatPage.tsx | 83 +++++++++++++++++++++++++ 2 files changed, 214 insertions(+) diff --git a/src/pages/ChatPage.scss b/src/pages/ChatPage.scss index 953341b..0c30aa2 100644 --- a/src/pages/ChatPage.scss +++ b/src/pages/ChatPage.scss @@ -4132,4 +4132,135 @@ .session-name { font-weight: 500; } +} + +// 消息信息弹窗 +.message-info-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.6); + backdrop-filter: blur(4px); + display: flex; + align-items: center; + justify-content: center; + z-index: 2000; + padding: 20px; +} + +.message-info-modal { + width: 520px; + max-width: 90vw; + max-height: 80vh; + background: var(--card-bg); + border-radius: 12px; + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.2); + display: flex; + flex-direction: column; + overflow: hidden; + + .modal-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 20px; + border-bottom: 1px solid var(--border-color); + + h3 { + font-size: 16px; + font-weight: 600; + color: var(--text-primary); + } + + .close-btn { + width: 28px; + height: 28px; + border: none; + background: transparent; + border-radius: 6px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + color: var(--text-tertiary); + transition: all 0.2s; + + &:hover { + background: var(--bg-hover); + color: var(--text-primary); + } + } + } + + .modal-body { + flex: 1; + overflow-y: auto; + padding: 16px 20px; + } + + .info-section { + margin-bottom: 16px; + + h4 { + font-size: 13px; + font-weight: 600; + color: var(--text-secondary); + margin: 0 0 8px 0; + } + } + + .info-grid { + display: flex; + flex-direction: column; + gap: 6px; + } + + .info-item { + display: flex; + align-items: baseline; + gap: 8px; + font-size: 13px; + + .label { + color: var(--text-tertiary); + min-width: 80px; + flex-shrink: 0; + } + + .value { + color: var(--text-primary); + word-break: break-all; + + &.code { + font-family: monospace; + font-size: 12px; + background: var(--bg-tertiary); + padding: 2px 6px; + border-radius: 4px; + } + } + } + + .raw-content-container { + background: var(--bg-tertiary); + border-radius: 8px; + padding: 12px; + max-height: 200px; + overflow: auto; + + pre { + margin: 0; + font-size: 12px; + font-family: monospace; + color: var(--text-primary); + white-space: pre-wrap; + word-break: break-all; + } + } + + .select-text { + user-select: text; + } } \ No newline at end of file diff --git a/src/pages/ChatPage.tsx b/src/pages/ChatPage.tsx index b2373dd..05fddde 100644 --- a/src/pages/ChatPage.tsx +++ b/src/pages/ChatPage.tsx @@ -324,6 +324,7 @@ function ChatPage(_props: ChatPageProps) { // 消息右键菜单 const [contextMenu, setContextMenu] = useState<{ x: number, y: number, message: Message } | null>(null) + const [showMessageInfo, setShowMessageInfo] = useState(null) const [editingMessage, setEditingMessage] = useState<{ message: Message, content: string } | null>(null) // 多选模式 @@ -2735,11 +2736,93 @@ function ChatPage(_props: ChatPageProps) { 删除消息 +
{ setShowMessageInfo(contextMenu.message); setContextMenu(null) }}> + + 查看消息信息 +
, document.body )} + {/* 消息信息弹窗 */} + {showMessageInfo && createPortal( +
setShowMessageInfo(null)}> +
e.stopPropagation()}> +
+
+ +

消息详细信息

+
+ +
+
+
+

基础字段

+
+
Local ID{showMessageInfo.localId}
+
Server ID{showMessageInfo.serverId}
+
Local Type{showMessageInfo.localType}
+
发送者{showMessageInfo.senderUsername || '-'}
+
创建时间{new Date(showMessageInfo.createTime * 1000).toLocaleString()} ({showMessageInfo.createTime})
+
发送状态{showMessageInfo.isSend === 1 ? '发送' : '接收'}
+
+
+ + {showMessageInfo.imageMd5 && ( +
+

图片信息

+
+
Image MD5{showMessageInfo.imageMd5}
+ {showMessageInfo.imageDatName &&
DAT 文件名{showMessageInfo.imageDatName}
} +
+
+ )} + + {showMessageInfo.videoMd5 && ( +
+

视频信息

+
+
Video MD5{showMessageInfo.videoMd5}
+
+
+ )} + + {showMessageInfo.voiceDurationSeconds != null && ( +
+

语音信息

+
+
时长{showMessageInfo.voiceDurationSeconds}秒
+
+
+ )} + + {(showMessageInfo.emojiMd5 || showMessageInfo.emojiCdnUrl) && ( +
+

表情包信息

+
+ {showMessageInfo.emojiMd5 &&
MD5{showMessageInfo.emojiMd5}
} + {showMessageInfo.emojiCdnUrl &&
CDN URL{showMessageInfo.emojiCdnUrl}
} +
+
+ )} + + {(showMessageInfo.rawContent || showMessageInfo.content) && ( +
+

原始消息内容

+
+
{showMessageInfo.rawContent || showMessageInfo.content}
+
+
+ )} +
+
+
, + document.body + )} + {/* 修改消息弹窗 */} {editingMessage && createPortal(