From 0ac12364bb0658702267a7221eb1186977525e49 Mon Sep 17 00:00:00 2001 From: lkddi Date: Sat, 25 Apr 2026 19:38:58 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E8=81=8A=E5=A4=A9=E5=AE=A4?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E6=B8=85=E5=B1=8F=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/js/chat-room.js | 9 ++++- resources/js/chat-room/message-utils.js | 40 +++++++++++++++++++ resources/js/chat-room/preferences-status.js | 14 +++++++ .../views/chat/partials/scripts.blade.php | 22 +++++----- 4 files changed, 74 insertions(+), 11 deletions(-) diff --git a/resources/js/chat-room.js b/resources/js/chat-room.js index 332fcc9..97f2cac 100644 --- a/resources/js/chat-room.js +++ b/resources/js/chat-room.js @@ -216,6 +216,7 @@ export { bindSoundMuteControl, closeDailyStatusEditor, closeFeatureMenu, + handleFeatureLocalClear, isSoundMuted, loadBlockedSystemSenders, normalizeChatPreferences, @@ -248,7 +249,7 @@ export { updateRedPacketClaimsUI, } from "./chat-room/red-packet-panel.js"; export { createMessageQueue } from "./chat-room/message-queue.js"; -export { isExpiredChatImageMessage } from "./chat-room/message-utils.js"; +export { isExpiredChatImageMessage, localClearScreen } from "./chat-room/message-utils.js"; import { escapeHtml, escapeHtmlWithLineBreaks, normalizeSafeChatUrl } from "./chat-room/html.js"; import { bindAppointmentAnnouncementControls, showAppointmentBanner } from "./chat-room/appointment-announcement.js"; @@ -408,6 +409,7 @@ import { bindSoundMuteControl, closeDailyStatusEditor, closeFeatureMenu, + handleFeatureLocalClear, isSoundMuted, loadBlockedSystemSenders, normalizeChatPreferences, @@ -440,7 +442,7 @@ import { updateRedPacketClaimsUI, } from "./chat-room/red-packet-panel.js"; import { createMessageQueue } from "./chat-room/message-queue.js"; -import { isExpiredChatImageMessage } from "./chat-room/message-utils.js"; +import { isExpiredChatImageMessage, localClearScreen } from "./chat-room/message-utils.js"; if (typeof window !== "undefined") { // 保留聚合入口,给新迁移模块、测试和仍在 Blade 内的存量脚本统一读取工具。 @@ -636,6 +638,7 @@ if (typeof window !== "undefined") { bindSoundMuteControl, closeDailyStatusEditor, closeFeatureMenu, + handleFeatureLocalClear, isSoundMuted, loadBlockedSystemSenders, normalizeChatPreferences, @@ -666,12 +669,14 @@ if (typeof window !== "undefined") { updateRedPacketClaimsUI, createMessageQueue, isExpiredChatImageMessage, + localClearScreen, }; // 直接挂载只服务暂未迁移的 Blade 调用点;新代码优先通过模块导入或 ChatRoomTools 复用。 window.closeChatImageLightbox = closeChatImageLightbox; window.escapeHtml = escapeHtml; window.isExpiredChatImageMessage = isExpiredChatImageMessage; + window.localClearScreen = localClearScreen; window.normalizeSafeChatUrl = normalizeSafeChatUrl; window.openChatImageLightbox = openChatImageLightbox; window.closeFriendPanel = closeFriendPanel; diff --git a/resources/js/chat-room/message-utils.js b/resources/js/chat-room/message-utils.js index 0f62b36..87e9491 100644 --- a/resources/js/chat-room/message-utils.js +++ b/resources/js/chat-room/message-utils.js @@ -38,3 +38,43 @@ export function isExpiredChatImageMessage( return nowTimestamp >= sentAt.getTime() + retentionDays * 24 * 60 * 60 * 1000; } + +/** + * 只清理当前浏览器的聊天窗口,并记录本地清屏的最大消息 ID。 + * + * @param {number|string} roomId 房间 ID + * @param {number|string} maxMessageId 当前已接收最大消息 ID + * @returns {void} + */ +export function localClearScreen(roomId = window.chatContext?.roomId, maxMessageId = 0) { + const publicPane = document.getElementById("chat-messages-container"); + const privatePane = document.getElementById("chat-messages-container2"); + + if (publicPane) { + publicPane.innerHTML = ""; + } + + if (privatePane) { + privatePane.innerHTML = ""; + } + + // 刷新页面时只恢复本地清屏点之后的新消息,避免旧消息重新回流。 + localStorage.setItem(`local_clear_msg_id_${roomId}`, maxMessageId); + + const notice = document.createElement("div"); + notice.className = "msg-line"; + + const now = new Date(); + const timeText = [ + now.getHours().toString().padStart(2, "0"), + now.getMinutes().toString().padStart(2, "0"), + now.getSeconds().toString().padStart(2, "0"), + ].join(":"); + + notice.innerHTML = `🧹 您已执行本地清屏(${timeText})`; + + if (publicPane) { + publicPane.appendChild(notice); + publicPane.scrollTop = publicPane.scrollHeight; + } +} diff --git a/resources/js/chat-room/preferences-status.js b/resources/js/chat-room/preferences-status.js index 503426f..2a261f5 100644 --- a/resources/js/chat-room/preferences-status.js +++ b/resources/js/chat-room/preferences-status.js @@ -296,6 +296,20 @@ export function toggleBlockMenu(event = null, beforeToggle = undefined) { menu.style.display = menu.style.display === "none" ? "block" : "none"; } +/** + * 执行功能菜单里的本地清屏动作,并在执行前关闭菜单。 + * + * @param {() => void} onLocalClear 本地清屏回调 + * @returns {void} + */ +export function handleFeatureLocalClear(onLocalClear) { + closeFeatureMenu(); + + if (typeof onLocalClear === "function") { + onLocalClear(); + } +} + /** * 绑定功能菜单、每日状态编辑与系统播报屏蔽的统一事件代理。 * diff --git a/resources/views/chat/partials/scripts.blade.php b/resources/views/chat/partials/scripts.blade.php index 1d0ad43..9a4d2b6 100644 --- a/resources/views/chat/partials/scripts.blade.php +++ b/resources/views/chat/partials/scripts.blade.php @@ -3608,19 +3608,18 @@ // ── 本地清屏(仅限自己的屏幕)─────────────────────────── function localClearScreen() { - // 清理公聊窗口 - const say1 = document.getElementById('chat-messages-container'); - if (say1) say1.innerHTML = ''; - - // 清理包厢窗口 - const say2 = document.getElementById('chat-messages-container2'); - if (say2) say2.innerHTML = ''; lastAutosaveNode = null; + if (window.ChatRoomTools?.localClearScreen) { + window.ChatRoomTools.localClearScreen(window.chatContext.roomId, _maxMsgId); + return; + } - // 将当前最大消息 ID 保存至本地,刷新时只显示大于此 ID 的历史记录 + const say1 = document.getElementById('chat-messages-container'); + const say2 = document.getElementById('chat-messages-container2'); + if (say1) say1.innerHTML = ''; + if (say2) say2.innerHTML = ''; localStorage.setItem(`local_clear_msg_id_${window.chatContext.roomId}`, _maxMsgId); - // 插入清屏提示 const sysDiv = document.createElement('div'); sysDiv.className = 'msg-line'; const now = new Date(); @@ -3638,6 +3637,11 @@ * 在状态面板中触发本地清屏,并顺手关闭面板。 */ function handleFeatureLocalClear() { + if (window.ChatRoomTools?.handleFeatureLocalClear) { + window.ChatRoomTools.handleFeatureLocalClear(localClearScreen); + return; + } + closeFeatureMenu(); localClearScreen(); }