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();
}