2026-04-25 03:34:31 +08:00
|
|
|
|
// 聊天室 Vite 入口,集中导出从 Blade 内联脚本迁移出的纯前端工具。
|
|
|
|
|
|
|
2026-04-25 14:16:13 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 模块引用说明:
|
2026-04-25 19:27:39 +08:00
|
|
|
|
* - html.js:提供聊天内容通用 HTML 转义和安全链接规整工具。
|
2026-04-25 14:16:13 +08:00
|
|
|
|
* - appointment-announcement.js:处理任命/撤销公告的大卡片和系统消息。
|
|
|
|
|
|
* - banner.js:提供 window.chatBanner 居中大卡片通知。
|
|
|
|
|
|
* - chat-bot.js:处理 AI 小班长发送消息和清空上下文。
|
|
|
|
|
|
* - dialog.js:提供 window.chatDialog 全局弹窗。
|
|
|
|
|
|
* - daily-sign-in.js:处理每日签到弹窗与补签入口。
|
2026-04-25 14:25:07 +08:00
|
|
|
|
* - earn-panel.js:提供看视频赚钱 earnPanelData Alpine 组件和播放器加载入口。
|
2026-04-25 14:16:13 +08:00
|
|
|
|
* - font-size.js:处理聊天输入/消息字号设置。
|
|
|
|
|
|
* - image-upload.js:处理聊天图片上传入口。
|
|
|
|
|
|
* - composer.js:处理聊天输入框、发送按钮和快捷操作。
|
|
|
|
|
|
* - toast.js:提供 window.chatToast 右下角通知。
|
|
|
|
|
|
* - friend-panel.js:处理好友面板、搜索和好友快捷操作。
|
|
|
|
|
|
* - friend-notifications.js:监听好友通知和通用 BannerNotification。
|
|
|
|
|
|
* - lightbox.js:处理聊天图片预览灯箱。
|
2026-04-25 14:22:59 +08:00
|
|
|
|
* - lottery-panel.js:提供双色球彩票 lotteryPanel Alpine 组件和全局开关入口。
|
2026-04-25 14:16:13 +08:00
|
|
|
|
* - mobile-drawer.js:处理移动端抽屉、房间列表和在线名单。
|
2026-04-25 15:00:04 +08:00
|
|
|
|
* - marriage-status.js:处理婚姻状态弹窗、已婚列表、接受拒绝和离婚申请。
|
2026-04-25 19:11:07 +08:00
|
|
|
|
* - marriage-modals.js:处理婚姻弹窗的系统消息、求婚和婚礼设置全局入口。
|
2026-04-25 14:16:13 +08:00
|
|
|
|
* - toolbar.js:处理工具栏按钮和功能快捷入口。
|
2026-04-25 18:56:30 +08:00
|
|
|
|
* - user-card.js:提供用户名片弹窗 Alpine 组件和管理/礼物操作。
|
2026-04-25 14:16:13 +08:00
|
|
|
|
* - user-target-actions.js:处理点击用户名切换私聊目标和打开名片。
|
|
|
|
|
|
* - welcome-menu.js:处理欢迎菜单交互。
|
|
|
|
|
|
* - admin-menu.js:处理聊天室管理菜单交互。
|
2026-04-25 18:30:29 +08:00
|
|
|
|
* - baccarat-panel.js:提供百家乐主面板 Alpine 组件和下注流程。
|
2026-04-25 15:03:33 +08:00
|
|
|
|
* - baccarat-fab.js:处理百家乐悬浮按钮拖动与打开面板。
|
2026-04-25 18:18:41 +08:00
|
|
|
|
* - baccarat-events.js:处理百家乐广播事件和页面恢复当前局。
|
2026-04-25 14:16:13 +08:00
|
|
|
|
* - baccarat-loss-cover-admin.js:处理百家乐买单活动管理弹层。
|
|
|
|
|
|
* - baccarat-loss-cover.js:处理百家乐买单活动前台弹窗。
|
|
|
|
|
|
* - game-hall.js:处理娱乐大厅弹窗和游戏入口卡片。
|
|
|
|
|
|
* - game-bootstrap.js:提供非关键游戏延迟初始化工具。
|
|
|
|
|
|
* - game-panels.js:处理通用游戏面板关闭事件。
|
2026-04-25 18:50:05 +08:00
|
|
|
|
* - gomoku-panel.js:提供五子棋主面板 Alpine 组件和 Canvas 棋盘逻辑。
|
2026-04-25 18:14:07 +08:00
|
|
|
|
* - gomoku-controls.js:处理五子棋外部打开和接受邀请入口。
|
2026-04-25 18:33:08 +08:00
|
|
|
|
* - horse-race-panel.js:提供赛马竞猜主面板 Alpine 组件和下注流程。
|
2026-04-25 18:13:00 +08:00
|
|
|
|
* - horse-race-fab.js:处理赛马竞猜悬浮按钮拖动与打开面板。
|
2026-04-25 18:17:11 +08:00
|
|
|
|
* - horse-race-events.js:处理赛马广播事件和页面恢复当前场次。
|
2026-04-25 14:47:07 +08:00
|
|
|
|
* - holiday-modal.js:处理节日福利弹窗、广播监听、领取状态和系统消息入口。
|
2026-04-25 14:16:13 +08:00
|
|
|
|
* - initial-state.js:恢复首屏历史消息、欢迎消息、入场特效和挂起婚姻事件。
|
|
|
|
|
|
* - bank-modal.js:处理银行弹窗、转账、排行和标签切换。
|
2026-04-25 14:43:33 +08:00
|
|
|
|
* - fishing.js:处理钓鱼抛竿、收竿、浮漂和自动钓鱼循环。
|
2026-04-25 14:18:00 +08:00
|
|
|
|
* - fortune-panel.js:提供神秘占卜 fortunePanel Alpine 组件。
|
2026-04-25 14:51:07 +08:00
|
|
|
|
* - profile-controls.js:处理头像选择、个人资料、密码、邮箱验证码和微信绑定入口。
|
2026-04-25 14:56:04 +08:00
|
|
|
|
* - shop-controls.js:处理商店弹窗、商品加载、购买、赠礼和改名卡入口。
|
2026-04-25 18:27:48 +08:00
|
|
|
|
* - compact-shop-panel.js:兼容旧右侧紧凑商店面板,按需挂载旧全局函数。
|
2026-04-25 14:16:13 +08:00
|
|
|
|
* - slot-machine.js:提供老虎机 slotPanel/slotFab Alpine 组件。
|
2026-04-25 14:40:54 +08:00
|
|
|
|
* - vip-controls.js:处理 VIP 中心弹窗、会员数据渲染、支付跳转和专属进退场设置。
|
2026-04-25 14:16:13 +08:00
|
|
|
|
* - preferences-status.js:处理聊天偏好、屏蔽系统播报和静音状态。
|
|
|
|
|
|
* - right-panel.js:处理右侧在线用户列表和用户名交互。
|
|
|
|
|
|
* - rooms.js:处理房间在线状态渲染和跳转 URL。
|
|
|
|
|
|
* - reward-modal.js:处理职务奖励金币弹窗入口。
|
2026-04-25 18:22:27 +08:00
|
|
|
|
* - red-packet-panel.js:处理礼包红包发包、抢包、倒计时和广播监听。
|
2026-04-25 14:16:13 +08:00
|
|
|
|
* - message-queue.js:提供聊天消息分批渲染队列。
|
2026-04-25 19:27:39 +08:00
|
|
|
|
* - message-utils.js:提供图片消息过期等消息渲染辅助判断。
|
2026-04-25 14:16:13 +08:00
|
|
|
|
*/
|
|
|
|
|
|
|
2026-04-28 09:38:18 +08:00
|
|
|
|
// 统一转发各子模块导出(仅保留轻量核心模块的静态导出)
|
2026-04-25 19:27:39 +08:00
|
|
|
|
export { escapeHtml, escapeHtmlWithLineBreaks, normalizeSafeChatUrl } from "./chat-room/html.js";
|
2026-04-25 03:54:23 +08:00
|
|
|
|
export { bindGlobalDialogControls } from "./chat-room/dialog.js";
|
2026-04-25 13:51:50 +08:00
|
|
|
|
export { bindChatToast } from "./chat-room/toast.js";
|
2026-04-28 09:38:18 +08:00
|
|
|
|
export { bindChatComposerControls, setChatComposerAction } from "./chat-room/composer.js";
|
2026-04-25 18:27:48 +08:00
|
|
|
|
export {
|
2026-04-28 09:38:18 +08:00
|
|
|
|
isExpiredChatImageMessage,
|
|
|
|
|
|
localClearScreen,
|
|
|
|
|
|
scrollChatToBottom,
|
|
|
|
|
|
syncAutoScrollControls,
|
|
|
|
|
|
toggleAutoScroll,
|
|
|
|
|
|
} from "./chat-room/message-utils.js";
|
2026-04-25 03:34:31 +08:00
|
|
|
|
export {
|
|
|
|
|
|
BLOCKABLE_SYSTEM_SENDERS,
|
|
|
|
|
|
BLOCKED_SYSTEM_SENDERS_STORAGE_KEY,
|
|
|
|
|
|
CHAT_SOUND_MUTED_STORAGE_KEY,
|
2026-04-25 03:45:30 +08:00
|
|
|
|
bindBlockMenuControls,
|
2026-04-25 03:39:31 +08:00
|
|
|
|
bindSoundMuteControl,
|
2026-04-27 09:19:49 +00:00
|
|
|
|
buildChatPreferencesPayload,
|
2026-04-25 19:33:06 +08:00
|
|
|
|
closeDailyStatusEditor,
|
|
|
|
|
|
closeFeatureMenu,
|
2026-04-27 09:19:49 +00:00
|
|
|
|
getCurrentUserDailyStatus,
|
2026-04-25 19:38:58 +08:00
|
|
|
|
handleFeatureLocalClear,
|
2026-04-25 03:38:27 +08:00
|
|
|
|
isSoundMuted,
|
|
|
|
|
|
loadBlockedSystemSenders,
|
2026-04-25 03:34:31 +08:00
|
|
|
|
normalizeChatPreferences,
|
|
|
|
|
|
normalizeDailyStatus,
|
2026-04-25 19:33:06 +08:00
|
|
|
|
openDailyStatusEditor,
|
2026-04-25 03:34:31 +08:00
|
|
|
|
parseDailyStatusExpiry,
|
2026-04-25 03:38:27 +08:00
|
|
|
|
persistBlockedSystemSenders,
|
2026-04-27 09:19:49 +00:00
|
|
|
|
persistChatPreferencesToLocal,
|
|
|
|
|
|
removeDailyStatusFields,
|
|
|
|
|
|
resolveBlockedSystemSenderKey,
|
|
|
|
|
|
saveChatPreferences,
|
|
|
|
|
|
setOnlineUserDailyStatus,
|
|
|
|
|
|
setRenderedMessagesVisibilityBySender,
|
2026-04-25 03:38:27 +08:00
|
|
|
|
setSoundMuted,
|
|
|
|
|
|
shouldMigrateLocalChatPreferences,
|
2026-04-27 09:19:49 +00:00
|
|
|
|
syncBlockedSystemSenderCheckboxes,
|
|
|
|
|
|
syncDailyStatusUi,
|
2026-04-25 19:33:06 +08:00
|
|
|
|
toggleBlockMenu,
|
2026-04-27 09:19:49 +00:00
|
|
|
|
toggleBlockedSystemSender,
|
2026-04-25 19:33:06 +08:00
|
|
|
|
toggleFeatureMenu,
|
2026-04-25 19:36:37 +08:00
|
|
|
|
toggleSoundMute,
|
2026-04-25 03:34:31 +08:00
|
|
|
|
} from "./chat-room/preferences-status.js";
|
2026-04-25 19:50:28 +08:00
|
|
|
|
export {
|
|
|
|
|
|
bindInstantHoverTooltip,
|
|
|
|
|
|
} from "./chat-room/hover-tooltip.js";
|
2026-04-28 09:38:18 +08:00
|
|
|
|
export { createMessageQueue } from "./chat-room/message-queue.js";
|
2026-04-25 03:34:31 +08:00
|
|
|
|
|
2026-04-27 09:19:49 +00:00
|
|
|
|
// 新增:聊天室核心引擎模块导出
|
|
|
|
|
|
export {
|
|
|
|
|
|
appendMessage,
|
|
|
|
|
|
buildChatMessageContent,
|
|
|
|
|
|
commitChatMessageRenderBatch,
|
|
|
|
|
|
createChatMessageRenderBatch,
|
|
|
|
|
|
enqueueChatMessage,
|
|
|
|
|
|
flushQueuedChatMessages,
|
|
|
|
|
|
pruneMessageContainer,
|
|
|
|
|
|
} from "./chat-room/message-renderer.js";
|
|
|
|
|
|
export {
|
|
|
|
|
|
buildUserBadgeHtml,
|
|
|
|
|
|
filterUserList,
|
|
|
|
|
|
refreshRenderedUserBadges,
|
|
|
|
|
|
renderUserList,
|
|
|
|
|
|
renderUserListToContainer,
|
|
|
|
|
|
scheduleFilterUserList,
|
|
|
|
|
|
scheduleRenderUserList,
|
|
|
|
|
|
startBadgeRotation,
|
|
|
|
|
|
stopBadgeRotation,
|
|
|
|
|
|
} from "./chat-room/user-list.js";
|
|
|
|
|
|
export { bindChatEvents } from "./chat-room/chat-events.js";
|
|
|
|
|
|
export { leaveRoom, notifyExpiredLeave, saveExp, startHeartbeat, stopHeartbeat, HEARTBEAT_INTERVAL, MAX_HEARTBEAT_FAILS } from "./chat-room/heartbeat.js";
|
|
|
|
|
|
|
2026-04-28 09:38:18 +08:00
|
|
|
|
// ─── 懒加载工具 ──────────────────────────────────────
|
|
|
|
|
|
import { createLazyModule, createLazyAlpineComponent } from "./chat-room/lazy-loader.js";
|
|
|
|
|
|
|
|
|
|
|
|
// ─── 游戏模块(按需懒加载)──────────────────────────
|
|
|
|
|
|
const _baccaratPanel = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/baccarat-panel.js"),
|
|
|
|
|
|
(mod) => mod.bindBaccaratPanelControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _baccaratFab = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/baccarat-fab.js"),
|
|
|
|
|
|
(mod) => mod.bindBaccaratFabControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _baccaratEvents = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/baccarat-events.js"),
|
|
|
|
|
|
(mod) => mod.bindBaccaratEvents()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _baccaratLossCoverAdmin = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/baccarat-loss-cover-admin.js"),
|
|
|
|
|
|
(mod) => mod.bindBaccaratLossCoverAdminControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _baccaratLossCover = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/baccarat-loss-cover.js"),
|
|
|
|
|
|
(mod) => mod.bindBaccaratLossCoverControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _gomokuPanel = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/gomoku-panel.js"),
|
|
|
|
|
|
(mod) => mod.bindGomokuPanelControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _gomokuControls = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/gomoku-controls.js"),
|
|
|
|
|
|
(mod) => mod.bindGomokuControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _horseRacePanel = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/horse-race-panel.js"),
|
|
|
|
|
|
(mod) => mod.bindHorseRacePanelControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _horseRaceFab = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/horse-race-fab.js"),
|
|
|
|
|
|
(mod) => mod.bindHorseRaceFabControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _horseRaceEvents = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/horse-race-events.js"),
|
|
|
|
|
|
(mod) => mod.bindHorseRaceEvents()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _fishing = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/fishing.js"),
|
|
|
|
|
|
(mod) => mod.bindFishingControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _slotMachine = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/slot-machine.js"),
|
|
|
|
|
|
(mod) => mod.bindSlotMachineControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _fortunePanel = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/fortune-panel.js"),
|
|
|
|
|
|
(mod) => mod.bindFortunePanelControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _lotteryPanel = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/lottery-panel.js"),
|
|
|
|
|
|
(mod) => mod.bindLotteryPanelControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _gameHall = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/game-hall.js"),
|
|
|
|
|
|
(mod) => mod.bindGameHallControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _gameBootstrap = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/game-bootstrap.js"),
|
|
|
|
|
|
(mod) => mod.bindGameBootstrapControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _gamePanels = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/game-panels.js"),
|
|
|
|
|
|
(mod) => mod.bindGamePanelControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// ─── 功能模块(按需懒加载)────────────────────────
|
|
|
|
|
|
const _shop = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/shop-controls.js"),
|
|
|
|
|
|
(mod) => mod.bindShopControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _compactShop = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/compact-shop-panel.js"),
|
|
|
|
|
|
(mod) => mod.bindCompactShopPanelControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _bank = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/bank-modal.js"),
|
|
|
|
|
|
(mod) => mod.bindBankControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _marriageModals = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/marriage-modals.js"),
|
|
|
|
|
|
(mod) => mod.bindMarriageModalControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _marriageStatus = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/marriage-status.js"),
|
|
|
|
|
|
(mod) => mod.bindMarriageStatusControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _profile = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/profile-controls.js"),
|
|
|
|
|
|
(mod) => mod.bindProfileControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _userCard = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/user-card.js"),
|
|
|
|
|
|
(mod) => mod.bindUserCardControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _userTargetActions = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/user-target-actions.js"),
|
|
|
|
|
|
(mod) => mod.bindUserTargetActions()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _vip = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/vip-controls.js"),
|
|
|
|
|
|
(mod) => mod.bindVipControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _redPacket = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/red-packet-panel.js"),
|
|
|
|
|
|
(mod) => mod.bindRedPacketPanelControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _holiday = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/holiday-modal.js"),
|
|
|
|
|
|
(mod) => mod.bindHolidayModalControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _reward = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/reward-modal.js"),
|
|
|
|
|
|
(mod) => mod.bindRewardModalControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _earn = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/earn-panel.js"),
|
|
|
|
|
|
(mod) => mod.bindEarnPanelControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _dailySignIn = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/daily-sign-in.js"),
|
|
|
|
|
|
(mod) => mod.bindDailySignInControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _mobileDrawer = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/mobile-drawer.js"),
|
|
|
|
|
|
(mod) => mod.bindMobileDrawerControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _welcomeMenu = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/welcome-menu.js"),
|
|
|
|
|
|
(mod) => mod.bindWelcomeMenuControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _adminMenu = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/admin-menu.js"),
|
|
|
|
|
|
(mod) => mod.bindAdminMenuControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _friendPanel = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/friend-panel.js"),
|
|
|
|
|
|
(mod) => mod.bindFriendPanelControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _friendNotifications = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/friend-notifications.js"),
|
|
|
|
|
|
(mod) => mod.bindFriendNotificationControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _lightbox = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/lightbox.js")
|
|
|
|
|
|
);
|
|
|
|
|
|
const _rooms = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/rooms.js"),
|
|
|
|
|
|
(mod) => mod.bindRoomStatusControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _rightPanel = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/right-panel.js"),
|
|
|
|
|
|
(mod) => mod.bindChatRightPanelControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _imageUpload = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/image-upload.js"),
|
|
|
|
|
|
(mod) => mod.bindChatImageUploadControl()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _fontSize = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/font-size.js"),
|
|
|
|
|
|
(mod) => mod.bindChatFontSizeControl()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _appointment = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/appointment-announcement.js"),
|
|
|
|
|
|
(mod) => mod.bindAppointmentAnnouncementControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _banner = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/banner.js"),
|
|
|
|
|
|
(mod) => mod.bindChatBanner()
|
|
|
|
|
|
);
|
|
|
|
|
|
const _chatBot = createLazyModule(
|
|
|
|
|
|
() => import("./chat-room/chat-bot.js"),
|
|
|
|
|
|
(mod) => mod.bindChatBotControls()
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// ─── 轻量核心模块(保持静态导入)────────────────────
|
2026-04-25 19:27:39 +08:00
|
|
|
|
import { escapeHtml, escapeHtmlWithLineBreaks, normalizeSafeChatUrl } from "./chat-room/html.js";
|
2026-04-25 03:54:23 +08:00
|
|
|
|
import { bindGlobalDialogControls } from "./chat-room/dialog.js";
|
2026-04-25 13:51:50 +08:00
|
|
|
|
import { bindChatToast } from "./chat-room/toast.js";
|
2026-04-28 09:38:18 +08:00
|
|
|
|
import { bindChatComposerControls, setChatComposerAction } from "./chat-room/composer.js";
|
2026-04-25 18:27:48 +08:00
|
|
|
|
import {
|
2026-04-28 09:38:18 +08:00
|
|
|
|
isExpiredChatImageMessage,
|
|
|
|
|
|
localClearScreen,
|
|
|
|
|
|
scrollChatToBottom,
|
|
|
|
|
|
syncAutoScrollControls,
|
|
|
|
|
|
toggleAutoScroll,
|
|
|
|
|
|
} from "./chat-room/message-utils.js";
|
2026-04-25 03:34:31 +08:00
|
|
|
|
import {
|
|
|
|
|
|
BLOCKABLE_SYSTEM_SENDERS,
|
|
|
|
|
|
BLOCKED_SYSTEM_SENDERS_STORAGE_KEY,
|
|
|
|
|
|
CHAT_SOUND_MUTED_STORAGE_KEY,
|
2026-04-25 03:45:30 +08:00
|
|
|
|
bindBlockMenuControls,
|
2026-04-25 03:39:31 +08:00
|
|
|
|
bindSoundMuteControl,
|
2026-04-27 09:19:49 +00:00
|
|
|
|
buildChatPreferencesPayload,
|
2026-04-25 19:33:06 +08:00
|
|
|
|
closeDailyStatusEditor,
|
|
|
|
|
|
closeFeatureMenu,
|
2026-04-27 09:19:49 +00:00
|
|
|
|
getCurrentUserDailyStatus,
|
2026-04-25 19:38:58 +08:00
|
|
|
|
handleFeatureLocalClear,
|
2026-04-25 03:38:27 +08:00
|
|
|
|
isSoundMuted,
|
|
|
|
|
|
loadBlockedSystemSenders,
|
2026-04-25 03:34:31 +08:00
|
|
|
|
normalizeChatPreferences,
|
|
|
|
|
|
normalizeDailyStatus,
|
2026-04-25 19:33:06 +08:00
|
|
|
|
openDailyStatusEditor,
|
2026-04-25 03:34:31 +08:00
|
|
|
|
parseDailyStatusExpiry,
|
2026-04-25 03:38:27 +08:00
|
|
|
|
persistBlockedSystemSenders,
|
2026-04-27 09:19:49 +00:00
|
|
|
|
persistChatPreferencesToLocal,
|
|
|
|
|
|
removeDailyStatusFields,
|
|
|
|
|
|
resolveBlockedSystemSenderKey,
|
|
|
|
|
|
saveChatPreferences,
|
|
|
|
|
|
setOnlineUserDailyStatus,
|
|
|
|
|
|
setRenderedMessagesVisibilityBySender,
|
2026-04-25 03:38:27 +08:00
|
|
|
|
setSoundMuted,
|
|
|
|
|
|
shouldMigrateLocalChatPreferences,
|
2026-04-27 09:19:49 +00:00
|
|
|
|
syncBlockedSystemSenderCheckboxes,
|
|
|
|
|
|
syncDailyStatusUi,
|
2026-04-25 19:33:06 +08:00
|
|
|
|
toggleBlockMenu,
|
2026-04-27 09:19:49 +00:00
|
|
|
|
toggleBlockedSystemSender,
|
2026-04-25 19:33:06 +08:00
|
|
|
|
toggleFeatureMenu,
|
2026-04-25 19:36:37 +08:00
|
|
|
|
toggleSoundMute,
|
2026-04-25 03:34:31 +08:00
|
|
|
|
} from "./chat-room/preferences-status.js";
|
2026-04-25 19:50:28 +08:00
|
|
|
|
import {
|
|
|
|
|
|
bindInstantHoverTooltip,
|
|
|
|
|
|
} from "./chat-room/hover-tooltip.js";
|
2026-04-28 09:38:18 +08:00
|
|
|
|
import { createMessageQueue } from "./chat-room/message-queue.js";
|
2026-04-25 03:34:31 +08:00
|
|
|
|
|
2026-04-27 09:19:49 +00:00
|
|
|
|
// 新增:聊天室核心引擎模块(共享状态、消息渲染、用户名单、事件监听、心跳)
|
|
|
|
|
|
import "./chat-room/chat-state.js";
|
|
|
|
|
|
import { appendMessage, buildChatMessageContent, commitChatMessageRenderBatch, createChatMessageRenderBatch, enqueueChatMessage, flushQueuedChatMessages, pruneMessageContainer } from "./chat-room/message-renderer.js";
|
|
|
|
|
|
import { buildUserBadgeHtml, filterUserList, refreshRenderedUserBadges, renderUserList, renderUserListToContainer, scheduleFilterUserList, scheduleRenderUserList, startBadgeRotation, stopBadgeRotation } from "./chat-room/user-list.js";
|
|
|
|
|
|
import { bindChatEvents } from "./chat-room/chat-events.js";
|
|
|
|
|
|
import { leaveRoom, notifyExpiredLeave, saveExp, startHeartbeat, stopHeartbeat } from "./chat-room/heartbeat.js";
|
|
|
|
|
|
|
2026-04-28 09:38:18 +08:00
|
|
|
|
// ─── 工具 & 初始化模块(静态保留)────────────────────
|
|
|
|
|
|
import { bindToolbarControls, runFeatureShortcut, runToolbarAction } from "./chat-room/toolbar.js";
|
|
|
|
|
|
import { bindChatInitialStateControls } from "./chat-room/initial-state.js";
|
|
|
|
|
|
|
2026-04-25 03:34:31 +08:00
|
|
|
|
if (typeof window !== "undefined") {
|
2026-04-25 19:50:28 +08:00
|
|
|
|
bindInstantHoverTooltip();
|
|
|
|
|
|
|
2026-04-28 09:38:18 +08:00
|
|
|
|
// 保留聚合入口,懒加载模块通过按需动态导入自动初始化。
|
2026-04-25 03:34:31 +08:00
|
|
|
|
window.ChatRoomTools = {
|
2026-04-28 09:38:18 +08:00
|
|
|
|
// ── 静态核心模块(直接引用) ────────────────
|
2026-04-25 03:34:31 +08:00
|
|
|
|
escapeHtml,
|
|
|
|
|
|
escapeHtmlWithLineBreaks,
|
2026-04-25 19:27:39 +08:00
|
|
|
|
normalizeSafeChatUrl,
|
2026-04-25 03:54:23 +08:00
|
|
|
|
bindGlobalDialogControls,
|
2026-04-28 09:38:18 +08:00
|
|
|
|
bindChatToast,
|
2026-04-25 10:41:20 +08:00
|
|
|
|
bindChatComposerControls,
|
2026-04-25 19:52:03 +08:00
|
|
|
|
setChatComposerAction,
|
2026-04-28 09:38:18 +08:00
|
|
|
|
isExpiredChatImageMessage,
|
|
|
|
|
|
localClearScreen,
|
|
|
|
|
|
scrollChatToBottom,
|
|
|
|
|
|
syncAutoScrollControls,
|
|
|
|
|
|
toggleAutoScroll,
|
|
|
|
|
|
bindInstantHoverTooltip,
|
|
|
|
|
|
createMessageQueue,
|
2026-04-25 03:34:31 +08:00
|
|
|
|
BLOCKABLE_SYSTEM_SENDERS,
|
|
|
|
|
|
BLOCKED_SYSTEM_SENDERS_STORAGE_KEY,
|
|
|
|
|
|
CHAT_SOUND_MUTED_STORAGE_KEY,
|
2026-04-25 03:45:30 +08:00
|
|
|
|
bindBlockMenuControls,
|
2026-04-25 03:39:31 +08:00
|
|
|
|
bindSoundMuteControl,
|
2026-04-28 09:38:18 +08:00
|
|
|
|
buildChatPreferencesPayload,
|
2026-04-25 19:33:06 +08:00
|
|
|
|
closeDailyStatusEditor,
|
|
|
|
|
|
closeFeatureMenu,
|
2026-04-28 09:38:18 +08:00
|
|
|
|
getCurrentUserDailyStatus,
|
2026-04-25 19:38:58 +08:00
|
|
|
|
handleFeatureLocalClear,
|
2026-04-25 03:38:27 +08:00
|
|
|
|
isSoundMuted,
|
|
|
|
|
|
loadBlockedSystemSenders,
|
2026-04-25 03:34:31 +08:00
|
|
|
|
normalizeChatPreferences,
|
|
|
|
|
|
normalizeDailyStatus,
|
2026-04-25 19:33:06 +08:00
|
|
|
|
openDailyStatusEditor,
|
2026-04-25 03:34:31 +08:00
|
|
|
|
parseDailyStatusExpiry,
|
2026-04-25 03:38:27 +08:00
|
|
|
|
persistBlockedSystemSenders,
|
2026-04-27 09:19:49 +00:00
|
|
|
|
persistChatPreferencesToLocal,
|
|
|
|
|
|
removeDailyStatusFields,
|
|
|
|
|
|
resolveBlockedSystemSenderKey,
|
|
|
|
|
|
saveChatPreferences,
|
|
|
|
|
|
setOnlineUserDailyStatus,
|
|
|
|
|
|
setRenderedMessagesVisibilityBySender,
|
2026-04-28 09:38:18 +08:00
|
|
|
|
setSoundMuted,
|
|
|
|
|
|
shouldMigrateLocalChatPreferences,
|
2026-04-27 09:19:49 +00:00
|
|
|
|
syncBlockedSystemSenderCheckboxes,
|
|
|
|
|
|
syncDailyStatusUi,
|
2026-04-28 09:38:18 +08:00
|
|
|
|
toggleBlockMenu,
|
2026-04-27 09:19:49 +00:00
|
|
|
|
toggleBlockedSystemSender,
|
2026-04-28 09:38:18 +08:00
|
|
|
|
toggleFeatureMenu,
|
|
|
|
|
|
toggleSoundMute,
|
|
|
|
|
|
bindToolbarControls,
|
|
|
|
|
|
runFeatureShortcut,
|
|
|
|
|
|
runToolbarAction,
|
|
|
|
|
|
bindChatInitialStateControls,
|
2026-04-27 09:19:49 +00:00
|
|
|
|
// 聊天室核心引擎
|
|
|
|
|
|
bindChatEvents,
|
|
|
|
|
|
appendMessage,
|
|
|
|
|
|
buildChatMessageContent,
|
|
|
|
|
|
commitChatMessageRenderBatch,
|
|
|
|
|
|
createChatMessageRenderBatch,
|
|
|
|
|
|
enqueueChatMessage,
|
|
|
|
|
|
flushQueuedChatMessages,
|
|
|
|
|
|
pruneMessageContainer,
|
|
|
|
|
|
buildUserBadgeHtml,
|
|
|
|
|
|
filterUserList,
|
|
|
|
|
|
refreshRenderedUserBadges,
|
|
|
|
|
|
renderUserListToContainer,
|
|
|
|
|
|
startBadgeRotation,
|
|
|
|
|
|
stopBadgeRotation,
|
|
|
|
|
|
scheduleFilterUserList,
|
|
|
|
|
|
leaveRoom,
|
|
|
|
|
|
notifyExpiredLeave,
|
|
|
|
|
|
startHeartbeat,
|
|
|
|
|
|
stopHeartbeat,
|
2026-04-28 09:38:18 +08:00
|
|
|
|
|
|
|
|
|
|
// ── 功能模块(懒加载包装)────────────────
|
|
|
|
|
|
bindAppointmentAnnouncementControls: (...args) => _appointment.wrap('bindAppointmentAnnouncementControls')(...args),
|
|
|
|
|
|
showAppointmentBanner: (...args) => _appointment.wrap('showAppointmentBanner')(...args),
|
|
|
|
|
|
bindChatBanner: (...args) => _banner.wrap('bindChatBanner')(...args),
|
|
|
|
|
|
bindChatBotControls: (...args) => _chatBot.wrap('bindChatBotControls')(...args),
|
|
|
|
|
|
clearChatBotContext: (...args) => _chatBot.wrap('clearChatBotContext')(...args),
|
|
|
|
|
|
sendToChatBot: (...args) => _chatBot.wrap('sendToChatBot')(...args),
|
|
|
|
|
|
bindDailySignInControls: (...args) => _dailySignIn.wrap('bindDailySignInControls')(...args),
|
|
|
|
|
|
bindEarnPanelControls: (...args) => _earn.wrap('bindEarnPanelControls')(...args),
|
|
|
|
|
|
createEarnPanelData: (...args) => _earn.wrap('createEarnPanelData')(...args),
|
|
|
|
|
|
applyFontSize: (...args) => _fontSize.wrap('applyFontSize')(...args),
|
|
|
|
|
|
bindChatFontSizeControl: (...args) => _fontSize.wrap('bindChatFontSizeControl')(...args),
|
|
|
|
|
|
CHAT_FONT_SIZE_STORAGE_KEY: undefined, // 静态常量,通过模块直接导入或 window 上取
|
|
|
|
|
|
restoreChatFontSize: (...args) => _fontSize.wrap('restoreChatFontSize')(...args),
|
|
|
|
|
|
bindChatImageUploadControl: (...args) => _imageUpload.wrap('bindChatImageUploadControl')(...args),
|
|
|
|
|
|
bindLotteryPanelControls: (...args) => _lotteryPanel.wrap('bindLotteryPanelControls')(...args),
|
|
|
|
|
|
closeLotteryPanel: (...args) => _lotteryPanel.wrap('closeLotteryPanel')(...args),
|
|
|
|
|
|
openLotteryPanel: (...args) => _lotteryPanel.wrap('openLotteryPanel')(...args),
|
|
|
|
|
|
showLotteryMsg: (...args) => _lotteryPanel.wrap('showLotteryMsg')(...args),
|
|
|
|
|
|
bindFriendPanelControls: (...args) => _friendPanel.wrap('bindFriendPanelControls')(...args),
|
|
|
|
|
|
bindFriendNotificationControls: (...args) => _friendNotifications.wrap('bindFriendNotificationControls')(...args),
|
|
|
|
|
|
closeFriendPanel: (...args) => _friendPanel.wrap('closeFriendPanel')(...args),
|
|
|
|
|
|
friendSearch: (...args) => _friendPanel.wrap('friendSearch')(...args),
|
|
|
|
|
|
loadFriends: (...args) => _friendPanel.wrap('loadFriends')(...args),
|
|
|
|
|
|
openFriendPanel: (...args) => _friendPanel.wrap('openFriendPanel')(...args),
|
|
|
|
|
|
quickFriendAction: (...args) => _friendPanel.wrap('quickFriendAction')(...args),
|
|
|
|
|
|
setupBannerNotification: (...args) => _friendNotifications.wrap('setupBannerNotification')(...args),
|
|
|
|
|
|
setupFriendNotification: (...args) => _friendNotifications.wrap('setupFriendNotification')(...args),
|
|
|
|
|
|
showFriendBanner: (...args) => _friendNotifications.wrap('showFriendBanner')(...args),
|
|
|
|
|
|
bindMobileDrawerControls: (...args) => _mobileDrawer.wrap('bindMobileDrawerControls')(...args),
|
|
|
|
|
|
closeMobileDrawer: (...args) => _mobileDrawer.wrap('closeMobileDrawer')(...args),
|
|
|
|
|
|
loadMobileRoomList: (...args) => _mobileDrawer.wrap('loadMobileRoomList')(...args),
|
|
|
|
|
|
openMobileDrawer: (...args) => _mobileDrawer.wrap('openMobileDrawer')(...args),
|
|
|
|
|
|
renderMobileRoomList: (...args) => _mobileDrawer.wrap('renderMobileRoomList')(...args),
|
|
|
|
|
|
renderMobileUserList: (...args) => _mobileDrawer.wrap('renderMobileUserList')(...args),
|
|
|
|
|
|
scheduleRenderMobileUserList: (...args) => _mobileDrawer.wrap('scheduleRenderMobileUserList')(...args),
|
|
|
|
|
|
switchMobileTab: (...args) => _mobileDrawer.wrap('switchMobileTab')(...args),
|
|
|
|
|
|
bindUserCardControls: (...args) => _userCard.wrap('bindUserCardControls')(...args),
|
|
|
|
|
|
bindUserTargetActions: (...args) => _userTargetActions.wrap('bindUserTargetActions')(...args),
|
|
|
|
|
|
openUserCard: (...args) => _userTargetActions.wrap('openUserCard')(...args),
|
|
|
|
|
|
switchTarget: (...args) => _userTargetActions.wrap('switchTarget')(...args),
|
|
|
|
|
|
bindWelcomeMenuControls: (...args) => _welcomeMenu.wrap('bindWelcomeMenuControls')(...args),
|
|
|
|
|
|
bindAdminMenuControls: (...args) => _adminMenu.wrap('bindAdminMenuControls')(...args),
|
|
|
|
|
|
bindBaccaratPanelControls: (...args) => _baccaratPanel.wrap('bindBaccaratPanelControls')(...args),
|
|
|
|
|
|
bindBaccaratFabControls: (...args) => _baccaratFab.wrap('bindBaccaratFabControls')(...args),
|
|
|
|
|
|
bindBaccaratEvents: (...args) => _baccaratEvents.wrap('bindBaccaratEvents')(...args),
|
|
|
|
|
|
bindBaccaratLossCoverAdminControls: (...args) => _baccaratLossCoverAdmin.wrap('bindBaccaratLossCoverAdminControls')(...args),
|
|
|
|
|
|
closeAdminBaccaratLossCoverModal: (...args) => _baccaratLossCoverAdmin.wrap('closeAdminBaccaratLossCoverModal')(...args),
|
|
|
|
|
|
closeCurrentBaccaratLossCoverEvent: (...args) => _baccaratLossCoverAdmin.wrap('closeCurrentBaccaratLossCoverEvent')(...args),
|
|
|
|
|
|
loadAdminCurrentLossCoverEvent: (...args) => _baccaratLossCoverAdmin.wrap('loadAdminCurrentLossCoverEvent')(...args),
|
|
|
|
|
|
openAdminBaccaratLossCoverModal: (...args) => _baccaratLossCoverAdmin.wrap('openAdminBaccaratLossCoverModal')(...args),
|
|
|
|
|
|
submitBaccaratLossCoverEvent: (...args) => _baccaratLossCoverAdmin.wrap('submitBaccaratLossCoverEvent')(...args),
|
|
|
|
|
|
bindBaccaratLossCoverControls: (...args) => _baccaratLossCover.wrap('bindBaccaratLossCoverControls')(...args),
|
|
|
|
|
|
claimBaccaratLossCover: (...args) => _baccaratLossCover.wrap('claimBaccaratLossCover')(...args),
|
|
|
|
|
|
closeBaccaratLossCoverModal: (...args) => _baccaratLossCover.wrap('closeBaccaratLossCoverModal')(...args),
|
|
|
|
|
|
openBaccaratLossCoverModal: (...args) => _baccaratLossCover.wrap('openBaccaratLossCoverModal')(...args),
|
|
|
|
|
|
switchBaccaratLossCoverTab: (...args) => _baccaratLossCover.wrap('switchBaccaratLossCoverTab')(...args),
|
|
|
|
|
|
bindGameHallControls: (...args) => _gameHall.wrap('bindGameHallControls')(...args),
|
|
|
|
|
|
closeGameHall: (...args) => _gameHall.wrap('closeGameHall')(...args),
|
|
|
|
|
|
openGameHall: (...args) => _gameHall.wrap('openGameHall')(...args),
|
|
|
|
|
|
bindGameBootstrapControls: (...args) => _gameBootstrap.wrap('bindGameBootstrapControls')(...args),
|
|
|
|
|
|
deferChatGameBootstrap: (...args) => _gameBootstrap.wrap('deferChatGameBootstrap')(...args),
|
|
|
|
|
|
bindGamePanelControls: (...args) => _gamePanels.wrap('bindGamePanelControls')(...args),
|
|
|
|
|
|
bindGomokuPanelControls: (...args) => _gomokuPanel.wrap('bindGomokuPanelControls')(...args),
|
|
|
|
|
|
acceptGomokuInvite: (...args) => _gomokuControls.wrap('acceptGomokuInvite')(...args),
|
|
|
|
|
|
bindGomokuControls: (...args) => _gomokuControls.wrap('bindGomokuControls')(...args),
|
|
|
|
|
|
openGomokuPanel: (...args) => _gomokuControls.wrap('openGomokuPanel')(...args),
|
|
|
|
|
|
bindHorseRacePanelControls: (...args) => _horseRacePanel.wrap('bindHorseRacePanelControls')(...args),
|
|
|
|
|
|
requestHorseRaceJson: (...args) => _horseRacePanel.wrap('requestHorseRaceJson')(...args),
|
|
|
|
|
|
bindHorseRaceFabControls: (...args) => _horseRaceFab.wrap('bindHorseRaceFabControls')(...args),
|
|
|
|
|
|
bindHorseRaceEvents: (...args) => _horseRaceEvents.wrap('bindHorseRaceEvents')(...args),
|
|
|
|
|
|
bindHolidayModalControls: (...args) => _holiday.wrap('bindHolidayModalControls')(...args),
|
|
|
|
|
|
buildHolidayClaimActionButton: (...args) => _holiday.wrap('buildHolidayClaimActionButton')(...args),
|
|
|
|
|
|
buildHolidaySystemMessage: (...args) => _holiday.wrap('buildHolidaySystemMessage')(...args),
|
|
|
|
|
|
openHolidayRunFromSystemMessage: (...args) => _holiday.wrap('openHolidayRunFromSystemMessage')(...args),
|
|
|
|
|
|
bankAction: (...args) => _bank.wrap('bankAction')(...args),
|
|
|
|
|
|
bankLoadInfo: (...args) => _bank.wrap('bankLoadInfo')(...args),
|
|
|
|
|
|
bankShowMsg: (...args) => _bank.wrap('bankShowMsg')(...args),
|
|
|
|
|
|
bindBankControls: (...args) => _bank.wrap('bindBankControls')(...args),
|
|
|
|
|
|
closeBankModal: (...args) => _bank.wrap('closeBankModal')(...args),
|
|
|
|
|
|
fetchBankRanking: (...args) => _bank.wrap('fetchBankRanking')(...args),
|
|
|
|
|
|
openBankModal: (...args) => _bank.wrap('openBankModal')(...args),
|
|
|
|
|
|
switchBankTab: (...args) => _bank.wrap('switchBankTab')(...args),
|
|
|
|
|
|
toggleBankRankSort: (...args) => _bank.wrap('toggleBankRankSort')(...args),
|
|
|
|
|
|
bindFishingControls: (...args) => _fishing.wrap('bindFishingControls')(...args),
|
|
|
|
|
|
checkAndAutoStartFishing: (...args) => _fishing.wrap('checkAndAutoStartFishing')(...args),
|
|
|
|
|
|
createBobber: (...args) => _fishing.wrap('createBobber')(...args),
|
|
|
|
|
|
reelFish: (...args) => _fishing.wrap('reelFish')(...args),
|
|
|
|
|
|
removeBobber: (...args) => _fishing.wrap('removeBobber')(...args),
|
|
|
|
|
|
resetFishingBtn: (...args) => _fishing.wrap('resetFishingBtn')(...args),
|
|
|
|
|
|
startFishing: (...args) => _fishing.wrap('startFishing')(...args),
|
|
|
|
|
|
stopAutoFishing: (...args) => _fishing.wrap('stopAutoFishing')(...args),
|
|
|
|
|
|
bindFortunePanelControls: (...args) => _fortunePanel.wrap('bindFortunePanelControls')(...args),
|
|
|
|
|
|
bindProfileControls: (...args) => _profile.wrap('bindProfileControls')(...args),
|
|
|
|
|
|
closeAvatarPicker: (...args) => _profile.wrap('closeAvatarPicker')(...args),
|
|
|
|
|
|
closeSettingsModal: (...args) => _profile.wrap('closeSettingsModal')(...args),
|
|
|
|
|
|
copyWechatBindCode: (...args) => _profile.wrap('copyWechatBindCode')(...args),
|
|
|
|
|
|
generateWechatBindCode: (...args) => _profile.wrap('generateWechatBindCode')(...args),
|
|
|
|
|
|
handleAvatarUpload: (...args) => _profile.wrap('handleAvatarUpload')(...args),
|
|
|
|
|
|
loadHeadfaces: (...args) => _profile.wrap('loadHeadfaces')(...args),
|
|
|
|
|
|
openAvatarPicker: (...args) => _profile.wrap('openAvatarPicker')(...args),
|
|
|
|
|
|
openSettingsModal: (...args) => _profile.wrap('openSettingsModal')(...args),
|
|
|
|
|
|
saveAvatar: (...args) => _profile.wrap('saveAvatar')(...args),
|
|
|
|
|
|
savePassword: (...args) => _profile.wrap('savePassword')(...args),
|
|
|
|
|
|
saveSettings: (...args) => _profile.wrap('saveSettings')(...args),
|
|
|
|
|
|
selectAvatar: (...args) => _profile.wrap('selectAvatar')(...args),
|
|
|
|
|
|
sendEmailCode: (...args) => _profile.wrap('sendEmailCode')(...args),
|
|
|
|
|
|
showInlineMsg: (...args) => _profile.wrap('showInlineMsg')(...args),
|
|
|
|
|
|
unbindWechat: (...args) => _profile.wrap('unbindWechat')(...args),
|
|
|
|
|
|
bindMarriageStatusControls: (...args) => _marriageStatus.wrap('bindMarriageStatusControls')(...args),
|
|
|
|
|
|
appendSystemMessage: (...args) => _marriageModals.wrap('appendSystemMessage')(...args),
|
|
|
|
|
|
bindMarriageModalControls: (...args) => _marriageModals.wrap('bindMarriageModalControls')(...args),
|
|
|
|
|
|
divorceConfirmModal: (...args) => _marriageModals.wrap('divorceConfirmModal')(...args),
|
|
|
|
|
|
divorceRequestModal: (...args) => _marriageModals.wrap('divorceRequestModal')(...args),
|
|
|
|
|
|
marriageAcceptedModal: (...args) => _marriageModals.wrap('marriageAcceptedModal')(...args),
|
|
|
|
|
|
marriageDivorcedModal: (...args) => _marriageModals.wrap('marriageDivorcedModal')(...args),
|
|
|
|
|
|
marriageIncomingModal: (...args) => _marriageModals.wrap('marriageIncomingModal')(...args),
|
|
|
|
|
|
marriageProposeModal: (...args) => _marriageModals.wrap('marriageProposeModal')(...args),
|
|
|
|
|
|
closeMarriageStatusModal: (...args) => _marriageStatus.wrap('closeMarriageStatusModal')(...args),
|
|
|
|
|
|
fetchMarriedList: (...args) => _marriageStatus.wrap('fetchMarriedList')(...args),
|
|
|
|
|
|
fetchMyMarriageStatus: (...args) => _marriageStatus.wrap('fetchMyMarriageStatus')(...args),
|
|
|
|
|
|
marriageAction: (...args) => _marriageStatus.wrap('marriageAction')(...args),
|
|
|
|
|
|
openMarriageStatusModal: (...args) => _marriageStatus.wrap('openMarriageStatusModal')(...args),
|
|
|
|
|
|
openProposeModal: (...args) => _marriageModals.wrap('openProposeModal')(...args),
|
|
|
|
|
|
openWeddingSetupModal: (...args) => _marriageModals.wrap('openWeddingSetupModal')(...args),
|
|
|
|
|
|
weddingEnvelopeModal: (...args) => _marriageModals.wrap('weddingEnvelopeModal')(...args),
|
|
|
|
|
|
weddingSetupModal: (...args) => _marriageModals.wrap('weddingSetupModal')(...args),
|
|
|
|
|
|
renderMarriedList: (...args) => _marriageStatus.wrap('renderMarriedList')(...args),
|
|
|
|
|
|
renderMarriageStatus: (...args) => _marriageStatus.wrap('renderMarriageStatus')(...args),
|
|
|
|
|
|
switchMarriageTab: (...args) => _marriageStatus.wrap('switchMarriageTab')(...args),
|
|
|
|
|
|
tryDivorce: (...args) => _marriageStatus.wrap('tryDivorce')(...args),
|
|
|
|
|
|
bindShopControls: (...args) => _shop.wrap('bindShopControls')(...args),
|
|
|
|
|
|
buyItem: (...args) => _shop.wrap('buyItem')(...args),
|
|
|
|
|
|
closeGiftDialog: (...args) => _shop.wrap('closeGiftDialog')(...args),
|
|
|
|
|
|
closeRenameModal: (...args) => _shop.wrap('closeRenameModal')(...args),
|
|
|
|
|
|
closeShopModal: (...args) => _shop.wrap('closeShopModal')(...args),
|
|
|
|
|
|
confirmGift: (...args) => _shop.wrap('confirmGift')(...args),
|
|
|
|
|
|
fetchShopData: (...args) => _shop.wrap('fetchShopData')(...args),
|
|
|
|
|
|
loadShop: (...args) => _shop.wrap('loadShop')(...args),
|
|
|
|
|
|
openGiftDialog: (...args) => _shop.wrap('openGiftDialog')(...args),
|
|
|
|
|
|
openRenameModal: (...args) => _shop.wrap('openRenameModal')(...args),
|
|
|
|
|
|
openShopModal: (...args) => _shop.wrap('openShopModal')(...args),
|
|
|
|
|
|
renderShop: (...args) => _shop.wrap('renderShop')(...args),
|
|
|
|
|
|
showShopToast: (...args) => _shop.wrap('showShopToast')(...args),
|
|
|
|
|
|
submitRename: (...args) => _shop.wrap('submitRename')(...args),
|
|
|
|
|
|
bindCompactShopPanelControls: (...args) => _compactShop.wrap('bindCompactShopPanelControls')(...args),
|
|
|
|
|
|
buyCompactShopItem: (...args) => _compactShop.wrap('buyCompactShopItem')(...args),
|
|
|
|
|
|
closeCompactRenameModal: (...args) => _compactShop.wrap('closeCompactRenameModal')(...args),
|
|
|
|
|
|
fetchCompactShopData: (...args) => _compactShop.wrap('fetchCompactShopData')(...args),
|
|
|
|
|
|
loadCompactShop: (...args) => _compactShop.wrap('loadCompactShop')(...args),
|
|
|
|
|
|
openCompactRenameModal: (...args) => _compactShop.wrap('openCompactRenameModal')(...args),
|
|
|
|
|
|
renderCompactShop: (...args) => _compactShop.wrap('renderCompactShop')(...args),
|
|
|
|
|
|
showCompactShopToast: (...args) => _compactShop.wrap('showCompactShopToast')(...args),
|
|
|
|
|
|
submitCompactRename: (...args) => _compactShop.wrap('submitCompactRename')(...args),
|
|
|
|
|
|
bindSlotMachineControls: (...args) => _slotMachine.wrap('bindSlotMachineControls')(...args),
|
|
|
|
|
|
bindVipControls: (...args) => _vip.wrap('bindVipControls')(...args),
|
|
|
|
|
|
buyVip: (...args) => _vip.wrap('buyVip')(...args),
|
|
|
|
|
|
closeVipModal: (...args) => _vip.wrap('closeVipModal')(...args),
|
|
|
|
|
|
openVipModal: (...args) => _vip.wrap('openVipModal')(...args),
|
|
|
|
|
|
saveVipPresenceSettings: (...args) => _vip.wrap('saveVipPresenceSettings')(...args),
|
|
|
|
|
|
switchVipTab: (...args) => _vip.wrap('switchVipTab')(...args),
|
|
|
|
|
|
closeChatImageLightbox: (...args) => _lightbox.wrap('closeChatImageLightbox')(...args),
|
|
|
|
|
|
initChatImageLightboxEvents: (...args) => _lightbox.wrap('initChatImageLightboxEvents')(...args),
|
|
|
|
|
|
openChatImageLightbox: (...args) => _lightbox.wrap('openChatImageLightbox')(...args),
|
|
|
|
|
|
bindChatRightPanelControls: (...args) => _rightPanel.wrap('bindChatRightPanelControls')(...args),
|
|
|
|
|
|
bindRoomStatusControls: (...args) => _rooms.wrap('bindRoomStatusControls')(...args),
|
|
|
|
|
|
normalizeRoomStatus: (...args) => _rooms.wrap('normalizeRoomStatus')(...args),
|
|
|
|
|
|
renderRoomStatusRow: (...args) => _rooms.wrap('renderRoomStatusRow')(...args),
|
|
|
|
|
|
renderRoomsOnlineStatus: (...args) => _rooms.wrap('renderRoomsOnlineStatus')(...args),
|
|
|
|
|
|
renderRoomsOnlineStatusToContainer: (...args) => _rooms.wrap('renderRoomsOnlineStatusToContainer')(...args),
|
|
|
|
|
|
resolveRoomUrl: (...args) => _rooms.wrap('resolveRoomUrl')(...args),
|
|
|
|
|
|
bindRewardModalControls: (...args) => _reward.wrap('bindRewardModalControls')(...args),
|
|
|
|
|
|
openRewardModal: (...args) => _reward.wrap('openRewardModal')(...args),
|
|
|
|
|
|
bindRedPacketPanelControls: (...args) => _redPacket.wrap('bindRedPacketPanelControls')(...args),
|
|
|
|
|
|
claimRedPacket: (...args) => _redPacket.wrap('claimRedPacket')(...args),
|
|
|
|
|
|
closeRedPacketModal: (...args) => _redPacket.wrap('closeRedPacketModal')(...args),
|
|
|
|
|
|
sendRedPacket: (...args) => _redPacket.wrap('sendRedPacket')(...args),
|
|
|
|
|
|
showRedPacketModal: (...args) => _redPacket.wrap('showRedPacketModal')(...args),
|
|
|
|
|
|
updateRedPacketClaimsUI: (...args) => _redPacket.wrap('updateRedPacketClaimsUI')(...args),
|
|
|
|
|
|
|
|
|
|
|
|
// ── 游戏模块 Alpine 对象(懒加载 Proxy) ──
|
|
|
|
|
|
lotteryPanel: new Proxy({}, {
|
|
|
|
|
|
get(_, prop) { return (...args) => _lotteryPanel.load().then(m => { const v = m.lotteryPanel; return typeof v[prop] === 'function' ? v[prop](...args) : v[prop]; }); }
|
|
|
|
|
|
}),
|
|
|
|
|
|
baccaratPanel: new Proxy({}, {
|
|
|
|
|
|
get(_, prop) { return (...args) => _baccaratPanel.load().then(m => { const v = m.baccaratPanel; return typeof v[prop] === 'function' ? v[prop](...args) : v[prop]; }); }
|
|
|
|
|
|
}),
|
|
|
|
|
|
baccaratFab: new Proxy({}, {
|
|
|
|
|
|
get(_, prop) { return (...args) => _baccaratFab.load().then(m => { const v = m.baccaratFab; return typeof v[prop] === 'function' ? v[prop](...args) : v[prop]; }); }
|
|
|
|
|
|
}),
|
|
|
|
|
|
gomokuPanel: new Proxy({}, {
|
|
|
|
|
|
get(_, prop) { return (...args) => _gomokuPanel.load().then(m => { const v = m.gomokuPanel; return typeof v[prop] === 'function' ? v[prop](...args) : v[prop]; }); }
|
|
|
|
|
|
}),
|
|
|
|
|
|
horseRacePanel: new Proxy({}, {
|
|
|
|
|
|
get(_, prop) { return (...args) => _horseRacePanel.load().then(m => { const v = m.horseRacePanel; return typeof v[prop] === 'function' ? v[prop](...args) : v[prop]; }); }
|
|
|
|
|
|
}),
|
|
|
|
|
|
horseRaceFab: new Proxy({}, {
|
|
|
|
|
|
get(_, prop) { return (...args) => _horseRaceFab.load().then(m => { const v = m.horseRaceFab; return typeof v[prop] === 'function' ? v[prop](...args) : v[prop]; }); }
|
|
|
|
|
|
}),
|
|
|
|
|
|
slotFab: new Proxy({}, {
|
|
|
|
|
|
get(_, prop) { return (...args) => _slotMachine.load().then(m => { const v = m.slotFab; return typeof v[prop] === 'function' ? v[prop](...args) : v[prop]; }); }
|
|
|
|
|
|
}),
|
|
|
|
|
|
slotPanel: new Proxy({}, {
|
|
|
|
|
|
get(_, prop) { return (...args) => _slotMachine.load().then(m => { const v = m.slotPanel; return typeof v[prop] === 'function' ? v[prop](...args) : v[prop]; }); }
|
|
|
|
|
|
}),
|
|
|
|
|
|
fortunePanel: new Proxy({}, {
|
|
|
|
|
|
get(_, prop) { return (...args) => _fortunePanel.load().then(m => { const v = m.fortunePanel; return typeof v[prop] === 'function' ? v[prop](...args) : v[prop]; }); }
|
|
|
|
|
|
}),
|
|
|
|
|
|
rewardModal: new Proxy({}, {
|
|
|
|
|
|
get(_, prop) { return (...args) => _reward.load().then(m => { const v = m.rewardModal; return typeof v[prop] === 'function' ? v[prop](...args) : v[prop]; }); }
|
|
|
|
|
|
}),
|
|
|
|
|
|
userCardComponent: new Proxy({}, {
|
|
|
|
|
|
get(_, prop) { return (...args) => _userCard.load().then(m => { const v = m.userCardComponent; return typeof v[prop] === 'function' ? v[prop](...args) : v[prop]; }); }
|
|
|
|
|
|
}),
|
|
|
|
|
|
holidayEventModal: new Proxy({}, {
|
|
|
|
|
|
get(_, prop) { return (...args) => _holiday.load().then(m => { const v = m.holidayEventModal; return typeof v[prop] === 'function' ? v[prop](...args) : v[prop]; }); }
|
|
|
|
|
|
}),
|
2026-04-25 03:34:31 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
2026-04-25 08:16:50 +08:00
|
|
|
|
// 直接挂载只服务暂未迁移的 Blade 调用点;新代码优先通过模块导入或 ChatRoomTools 复用。
|
2026-04-28 09:38:18 +08:00
|
|
|
|
// ── 静态核心模块 window 挂载 ──
|
2026-04-25 19:27:39 +08:00
|
|
|
|
window.escapeHtml = escapeHtml;
|
|
|
|
|
|
window.isExpiredChatImageMessage = isExpiredChatImageMessage;
|
2026-04-25 19:38:58 +08:00
|
|
|
|
window.localClearScreen = localClearScreen;
|
2026-04-25 19:27:39 +08:00
|
|
|
|
window.normalizeSafeChatUrl = normalizeSafeChatUrl;
|
2026-04-25 19:52:03 +08:00
|
|
|
|
window.setAction = setChatComposerAction;
|
2026-04-25 19:45:15 +08:00
|
|
|
|
window.syncAutoScrollControls = syncAutoScrollControls;
|
2026-04-28 09:38:18 +08:00
|
|
|
|
|
|
|
|
|
|
// ── 懒加载功能模块 window 挂载(按需加载) ──
|
|
|
|
|
|
window.closeChatImageLightbox = (...args) => _lightbox.wrap('closeChatImageLightbox')(...args);
|
|
|
|
|
|
window.openChatImageLightbox = (...args) => _lightbox.wrap('openChatImageLightbox')(...args);
|
|
|
|
|
|
window.closeFriendPanel = (...args) => _friendPanel.wrap('closeFriendPanel')(...args);
|
|
|
|
|
|
window.friendSearch = (...args) => _friendPanel.wrap('friendSearch')(...args);
|
|
|
|
|
|
window.openFriendPanel = (...args) => _friendPanel.wrap('openFriendPanel')(...args);
|
|
|
|
|
|
window.quickFriendAction = (...args) => _friendPanel.wrap('quickFriendAction')(...args);
|
|
|
|
|
|
window.setupBannerNotification = (...args) => _friendNotifications.wrap('setupBannerNotification')(...args);
|
|
|
|
|
|
window.setupFriendNotification = (...args) => _friendNotifications.wrap('setupFriendNotification')(...args);
|
|
|
|
|
|
window.showFriendBanner = (...args) => _friendNotifications.wrap('showFriendBanner')(...args);
|
|
|
|
|
|
window.closeMobileDrawer = (...args) => _mobileDrawer.wrap('closeMobileDrawer')(...args);
|
|
|
|
|
|
window.loadMobileRoomList = (...args) => _mobileDrawer.wrap('loadMobileRoomList')(...args);
|
|
|
|
|
|
window.openMobileDrawer = (...args) => _mobileDrawer.wrap('openMobileDrawer')(...args);
|
|
|
|
|
|
window.openUserCard = (...args) => _userTargetActions.wrap('openUserCard')(...args);
|
|
|
|
|
|
window.openRewardModal = (...args) => _reward.wrap('openRewardModal')(...args);
|
|
|
|
|
|
window.renderMobileRoomList = (...args) => _mobileDrawer.wrap('renderMobileRoomList')(...args);
|
|
|
|
|
|
window.renderMobileUserList = (...args) => _mobileDrawer.wrap('renderMobileUserList')(...args);
|
|
|
|
|
|
window.scheduleRenderMobileUserList = (...args) => _mobileDrawer.wrap('scheduleRenderMobileUserList')(...args);
|
|
|
|
|
|
window.switchMobileTab = (...args) => _mobileDrawer.wrap('switchMobileTab')(...args);
|
|
|
|
|
|
window.switchTarget = (...args) => _userTargetActions.wrap('switchTarget')(...args);
|
|
|
|
|
|
window.clearChatBotContext = (...args) => _chatBot.wrap('clearChatBotContext')(...args);
|
|
|
|
|
|
window.sendToChatBot = (...args) => _chatBot.wrap('sendToChatBot')(...args);
|
2026-04-25 10:16:14 +08:00
|
|
|
|
window.runFeatureShortcut = runFeatureShortcut;
|
|
|
|
|
|
window.runToolbarAction = runToolbarAction;
|
2026-04-28 09:38:18 +08:00
|
|
|
|
window.buildHolidayClaimActionButton = (...args) => _holiday.wrap('buildHolidayClaimActionButton')(...args);
|
|
|
|
|
|
window.buildHolidaySystemMessage = (...args) => _holiday.wrap('buildHolidaySystemMessage')(...args);
|
|
|
|
|
|
window.openHolidayRunFromSystemMessage = (...args) => _holiday.wrap('openHolidayRunFromSystemMessage')(...args);
|
|
|
|
|
|
window.closeAdminBaccaratLossCoverModal = (...args) => _baccaratLossCoverAdmin.wrap('closeAdminBaccaratLossCoverModal')(...args);
|
|
|
|
|
|
window.closeCurrentBaccaratLossCoverEvent = (...args) => _baccaratLossCoverAdmin.wrap('closeCurrentBaccaratLossCoverEvent')(...args);
|
|
|
|
|
|
window.claimBaccaratLossCover = (...args) => _baccaratLossCover.wrap('claimBaccaratLossCover')(...args);
|
|
|
|
|
|
window.closeBaccaratLossCoverModal = (...args) => _baccaratLossCover.wrap('closeBaccaratLossCoverModal')(...args);
|
|
|
|
|
|
window.openBaccaratLossCoverModal = (...args) => _baccaratLossCover.wrap('openBaccaratLossCoverModal')(...args);
|
|
|
|
|
|
window.openAdminBaccaratLossCoverModal = (...args) => _baccaratLossCoverAdmin.wrap('openAdminBaccaratLossCoverModal')(...args);
|
|
|
|
|
|
window.submitBaccaratLossCoverEvent = (...args) => _baccaratLossCoverAdmin.wrap('submitBaccaratLossCoverEvent')(...args);
|
|
|
|
|
|
window.switchBaccaratLossCoverTab = (...args) => _baccaratLossCover.wrap('switchBaccaratLossCoverTab')(...args);
|
|
|
|
|
|
window.bankAction = (...args) => _bank.wrap('bankAction')(...args);
|
|
|
|
|
|
window.bankLoadInfo = (...args) => _bank.wrap('bankLoadInfo')(...args);
|
|
|
|
|
|
window.bankShowMsg = (...args) => _bank.wrap('bankShowMsg')(...args);
|
|
|
|
|
|
window.closeBankModal = (...args) => _bank.wrap('closeBankModal')(...args);
|
|
|
|
|
|
window.closeGameHall = (...args) => _gameHall.wrap('closeGameHall')(...args);
|
|
|
|
|
|
window.fetchBankRanking = (...args) => _bank.wrap('fetchBankRanking')(...args);
|
|
|
|
|
|
window.closeLotteryPanel = (...args) => _lotteryPanel.wrap('closeLotteryPanel')(...args);
|
|
|
|
|
|
window.createEarnPanelData = (...args) => _earn.wrap('createEarnPanelData')(...args);
|
|
|
|
|
|
window.deferChatGameBootstrap = (...args) => _gameBootstrap.wrap('deferChatGameBootstrap')(...args);
|
|
|
|
|
|
window.openGameHall = (...args) => _gameHall.wrap('openGameHall')(...args);
|
|
|
|
|
|
window.acceptGomokuInvite = (...args) => _gomokuControls.wrap('acceptGomokuInvite')(...args);
|
|
|
|
|
|
window.openGomokuPanel = (...args) => _gomokuControls.wrap('openGomokuPanel')(...args);
|
|
|
|
|
|
window.openLotteryPanel = (...args) => _lotteryPanel.wrap('openLotteryPanel')(...args);
|
|
|
|
|
|
window.openBankModal = (...args) => _bank.wrap('openBankModal')(...args);
|
|
|
|
|
|
window.showLotteryMsg = (...args) => _lotteryPanel.wrap('showLotteryMsg')(...args);
|
|
|
|
|
|
window.checkAndAutoStartFishing = (...args) => _fishing.wrap('checkAndAutoStartFishing')(...args);
|
|
|
|
|
|
window.createBobber = (...args) => _fishing.wrap('createBobber')(...args);
|
|
|
|
|
|
window.reelFish = (...args) => _fishing.wrap('reelFish')(...args);
|
|
|
|
|
|
window.removeBobber = (...args) => _fishing.wrap('removeBobber')(...args);
|
|
|
|
|
|
window.resetFishingBtn = (...args) => _fishing.wrap('resetFishingBtn')(...args);
|
|
|
|
|
|
window.startFishing = (...args) => _fishing.wrap('startFishing')(...args);
|
|
|
|
|
|
window.stopAutoFishing = (...args) => _fishing.wrap('stopAutoFishing')(...args);
|
|
|
|
|
|
window.buyVip = (...args) => _vip.wrap('buyVip')(...args);
|
|
|
|
|
|
window.closeVipModal = (...args) => _vip.wrap('closeVipModal')(...args);
|
|
|
|
|
|
window.openVipModal = (...args) => _vip.wrap('openVipModal')(...args);
|
|
|
|
|
|
window.saveVipPresenceSettings = (...args) => _vip.wrap('saveVipPresenceSettings')(...args);
|
|
|
|
|
|
window.switchVipTab = (...args) => _vip.wrap('switchVipTab')(...args);
|
|
|
|
|
|
window.switchBankTab = (...args) => _bank.wrap('switchBankTab')(...args);
|
|
|
|
|
|
window.toggleBankRankSort = (...args) => _bank.wrap('toggleBankRankSort')(...args);
|
|
|
|
|
|
window.claimRedPacket = (...args) => _redPacket.wrap('claimRedPacket')(...args);
|
|
|
|
|
|
window.closeRedPacketModal = (...args) => _redPacket.wrap('closeRedPacketModal')(...args);
|
|
|
|
|
|
window.sendRedPacket = (...args) => _redPacket.wrap('sendRedPacket')(...args);
|
|
|
|
|
|
window.showRedPacketModal = (...args) => _redPacket.wrap('showRedPacketModal')(...args);
|
|
|
|
|
|
window.updateRedPacketClaimsUI = (...args) => _redPacket.wrap('updateRedPacketClaimsUI')(...args);
|
|
|
|
|
|
window.applyFontSize = (...args) => _fontSize.wrap('applyFontSize')(...args);
|
|
|
|
|
|
window.closeAvatarPicker = (...args) => _profile.wrap('closeAvatarPicker')(...args);
|
|
|
|
|
|
window.closeSettingsModal = (...args) => _profile.wrap('closeSettingsModal')(...args);
|
|
|
|
|
|
window.copyWechatBindCode = (...args) => _profile.wrap('copyWechatBindCode')(...args);
|
|
|
|
|
|
window.generateWechatBindCode = (...args) => _profile.wrap('generateWechatBindCode')(...args);
|
|
|
|
|
|
window.handleAvatarUpload = (...args) => _profile.wrap('handleAvatarUpload')(...args);
|
|
|
|
|
|
window.loadHeadfaces = (...args) => _profile.wrap('loadHeadfaces')(...args);
|
|
|
|
|
|
window.openAvatarPicker = (...args) => _profile.wrap('openAvatarPicker')(...args);
|
|
|
|
|
|
window.openSettingsModal = (...args) => _profile.wrap('openSettingsModal')(...args);
|
|
|
|
|
|
window.saveAvatar = (...args) => _profile.wrap('saveAvatar')(...args);
|
|
|
|
|
|
window.savePassword = (...args) => _profile.wrap('savePassword')(...args);
|
|
|
|
|
|
window.saveSettings = (...args) => _profile.wrap('saveSettings')(...args);
|
|
|
|
|
|
window.selectAvatar = (...args) => _profile.wrap('selectAvatar')(...args);
|
|
|
|
|
|
window.sendEmailCode = (...args) => _profile.wrap('sendEmailCode')(...args);
|
|
|
|
|
|
window.showInlineMsg = (...args) => _profile.wrap('showInlineMsg')(...args);
|
|
|
|
|
|
window.unbindWechat = (...args) => _profile.wrap('unbindWechat')(...args);
|
|
|
|
|
|
window.closeMarriageStatusModal = (...args) => _marriageStatus.wrap('closeMarriageStatusModal')(...args);
|
|
|
|
|
|
window.fetchMarriedList = (...args) => _marriageStatus.wrap('fetchMarriedList')(...args);
|
|
|
|
|
|
window.fetchMyMarriageStatus = (...args) => _marriageStatus.wrap('fetchMyMarriageStatus')(...args);
|
|
|
|
|
|
window.marriageAction = (...args) => _marriageStatus.wrap('marriageAction')(...args);
|
|
|
|
|
|
window.openMarriageStatusModal = (...args) => _marriageStatus.wrap('openMarriageStatusModal')(...args);
|
|
|
|
|
|
window.appendSystemMessage = (...args) => _marriageModals.wrap('appendSystemMessage')(...args);
|
|
|
|
|
|
window.divorceConfirmModal = (...args) => _marriageModals.wrap('divorceConfirmModal')(...args);
|
|
|
|
|
|
window.divorceRequestModal = (...args) => _marriageModals.wrap('divorceRequestModal')(...args);
|
|
|
|
|
|
window.marriageAcceptedModal = (...args) => _marriageModals.wrap('marriageAcceptedModal')(...args);
|
|
|
|
|
|
window.marriageDivorcedModal = (...args) => _marriageModals.wrap('marriageDivorcedModal')(...args);
|
|
|
|
|
|
window.marriageIncomingModal = (...args) => _marriageModals.wrap('marriageIncomingModal')(...args);
|
|
|
|
|
|
window.marriageProposeModal = (...args) => _marriageModals.wrap('marriageProposeModal')(...args);
|
|
|
|
|
|
window.openProposeModal = (...args) => _marriageModals.wrap('openProposeModal')(...args);
|
|
|
|
|
|
window.openWeddingSetupModal = (...args) => _marriageModals.wrap('openWeddingSetupModal')(...args);
|
|
|
|
|
|
window.weddingEnvelopeModal = (...args) => _marriageModals.wrap('weddingEnvelopeModal')(...args);
|
|
|
|
|
|
window.weddingSetupModal = (...args) => _marriageModals.wrap('weddingSetupModal')(...args);
|
|
|
|
|
|
window.renderMarriedList = (...args) => _marriageStatus.wrap('renderMarriedList')(...args);
|
|
|
|
|
|
window.renderMarriageStatus = (...args) => _marriageStatus.wrap('renderMarriageStatus')(...args);
|
|
|
|
|
|
window.switchMarriageTab = (...args) => _marriageStatus.wrap('switchMarriageTab')(...args);
|
|
|
|
|
|
window.tryDivorce = (...args) => _marriageStatus.wrap('tryDivorce')(...args);
|
|
|
|
|
|
window.buyItem = (...args) => _shop.wrap('buyItem')(...args);
|
|
|
|
|
|
window.closeGiftDialog = (...args) => _shop.wrap('closeGiftDialog')(...args);
|
|
|
|
|
|
window.closeRenameModal = (...args) => _shop.wrap('closeRenameModal')(...args);
|
|
|
|
|
|
window.closeShopModal = (...args) => _shop.wrap('closeShopModal')(...args);
|
|
|
|
|
|
window.confirmGift = (...args) => _shop.wrap('confirmGift')(...args);
|
|
|
|
|
|
window.fetchShopData = (...args) => _shop.wrap('fetchShopData')(...args);
|
|
|
|
|
|
window.loadShop = (...args) => _shop.wrap('loadShop')(...args);
|
|
|
|
|
|
window.openGiftDialog = (...args) => _shop.wrap('openGiftDialog')(...args);
|
|
|
|
|
|
window.openRenameModal = (...args) => _shop.wrap('openRenameModal')(...args);
|
|
|
|
|
|
window.openShopModal = (...args) => _shop.wrap('openShopModal')(...args);
|
|
|
|
|
|
window.renderShop = (...args) => _shop.wrap('renderShop')(...args);
|
|
|
|
|
|
window.showShopToast = (...args) => _shop.wrap('showShopToast')(...args);
|
|
|
|
|
|
window.submitRename = (...args) => _shop.wrap('submitRename')(...args);
|
|
|
|
|
|
|
|
|
|
|
|
// ── Alpine 组件懒加载(createLazyAlpineComponent:$watch 触发时才加载真实模块) ──
|
|
|
|
|
|
window.baccaratPanel = createLazyAlpineComponent(
|
|
|
|
|
|
() => import("./chat-room/baccarat-panel.js"),
|
|
|
|
|
|
"baccaratPanel",
|
|
|
|
|
|
{ show: false }
|
|
|
|
|
|
);
|
|
|
|
|
|
window.baccaratFab = createLazyAlpineComponent(
|
|
|
|
|
|
() => import("./chat-room/baccarat-fab.js"),
|
|
|
|
|
|
"baccaratFab",
|
|
|
|
|
|
{ show: false }
|
|
|
|
|
|
);
|
|
|
|
|
|
window.slotFab = createLazyAlpineComponent(
|
|
|
|
|
|
() => import("./chat-room/slot-machine.js"),
|
|
|
|
|
|
"slotFab",
|
|
|
|
|
|
{ show: false }
|
|
|
|
|
|
);
|
|
|
|
|
|
window.slotPanel = createLazyAlpineComponent(
|
|
|
|
|
|
() => import("./chat-room/slot-machine.js"),
|
|
|
|
|
|
"slotPanel",
|
|
|
|
|
|
{ show: false }
|
|
|
|
|
|
);
|
|
|
|
|
|
window.userCardComponent = createLazyAlpineComponent(
|
|
|
|
|
|
() => import("./chat-room/user-card.js"),
|
|
|
|
|
|
"userCardComponent",
|
|
|
|
|
|
{
|
|
|
|
|
|
showUserModal: false,
|
|
|
|
|
|
showOriginalLightbox: false,
|
|
|
|
|
|
userInfo: {},
|
|
|
|
|
|
isMuting: false,
|
|
|
|
|
|
muteDuration: 5,
|
|
|
|
|
|
showWhispers: false,
|
|
|
|
|
|
whisperList: [],
|
|
|
|
|
|
showAnnounce: false,
|
|
|
|
|
|
announceText: "",
|
|
|
|
|
|
is_friend: false,
|
|
|
|
|
|
friendLoading: false,
|
|
|
|
|
|
gifts: [],
|
|
|
|
|
|
selectedGiftId: 0,
|
|
|
|
|
|
giftCount: 1,
|
|
|
|
|
|
sendingGift: false,
|
|
|
|
|
|
showGiftPanel: false,
|
|
|
|
|
|
showGiftGoldPanel: false,
|
|
|
|
|
|
giftGoldAmount: "",
|
|
|
|
|
|
giftGoldSending: false,
|
|
|
|
|
|
rewardAmount: 0,
|
|
|
|
|
|
sendingReward: false,
|
|
|
|
|
|
showRewardPanel: false,
|
|
|
|
|
|
showAppointPanel: false,
|
|
|
|
|
|
appointPositions: [],
|
|
|
|
|
|
selectedPositionId: null,
|
|
|
|
|
|
appointRemark: "",
|
|
|
|
|
|
appointLoading: false,
|
|
|
|
|
|
showAdminView: false,
|
|
|
|
|
|
showPositionHistory: false,
|
|
|
|
|
|
showAdminPanel: false,
|
|
|
|
|
|
targetMarriage: null,
|
|
|
|
|
|
marriageLoading: false,
|
|
|
|
|
|
mySex: "",
|
|
|
|
|
|
assetCache: [],
|
|
|
|
|
|
},
|
|
|
|
|
|
"showUserModal"
|
|
|
|
|
|
);
|
|
|
|
|
|
window.holidayEventModal = createLazyAlpineComponent(
|
|
|
|
|
|
() => import("./chat-room/holiday-modal.js"),
|
|
|
|
|
|
"holidayEventModal",
|
|
|
|
|
|
{ show: false }
|
|
|
|
|
|
);
|
|
|
|
|
|
window.fortunePanel = createLazyAlpineComponent(
|
|
|
|
|
|
() => import("./chat-room/fortune-panel.js"),
|
|
|
|
|
|
"fortunePanel",
|
|
|
|
|
|
{ show: false }
|
|
|
|
|
|
);
|
|
|
|
|
|
window.lotteryPanel = createLazyAlpineComponent(
|
|
|
|
|
|
() => import("./chat-room/lottery-panel.js"),
|
|
|
|
|
|
"lotteryPanel",
|
|
|
|
|
|
{ show: false }
|
|
|
|
|
|
);
|
|
|
|
|
|
window.gomokuPanel = createLazyAlpineComponent(
|
|
|
|
|
|
() => import("./chat-room/gomoku-panel.js"),
|
|
|
|
|
|
"gomokuPanel",
|
|
|
|
|
|
{ show: false }
|
|
|
|
|
|
);
|
|
|
|
|
|
window.horseRacePanel = createLazyAlpineComponent(
|
|
|
|
|
|
() => import("./chat-room/horse-race-panel.js"),
|
|
|
|
|
|
"horseRacePanel",
|
|
|
|
|
|
{ show: false }
|
|
|
|
|
|
);
|
|
|
|
|
|
window.horseRaceFab = createLazyAlpineComponent(
|
|
|
|
|
|
() => import("./chat-room/horse-race-fab.js"),
|
|
|
|
|
|
"horseRaceFab",
|
|
|
|
|
|
{ show: false }
|
|
|
|
|
|
);
|
|
|
|
|
|
window.rewardModal = createLazyAlpineComponent(
|
|
|
|
|
|
() => import("./chat-room/reward-modal.js"),
|
|
|
|
|
|
"rewardModal",
|
|
|
|
|
|
{ show: false }
|
|
|
|
|
|
);
|
2026-04-25 04:00:38 +08:00
|
|
|
|
|
2026-04-27 09:19:49 +00:00
|
|
|
|
// 聊天室核心引擎 window 挂载
|
|
|
|
|
|
window.bindChatEvents = bindChatEvents;
|
|
|
|
|
|
window.startBadgeRotation = startBadgeRotation;
|
|
|
|
|
|
window.stopBadgeRotation = stopBadgeRotation;
|
|
|
|
|
|
window.startHeartbeat = startHeartbeat;
|
|
|
|
|
|
window.stopHeartbeat = stopHeartbeat;
|
|
|
|
|
|
|
2026-04-28 09:38:18 +08:00
|
|
|
|
// 页面加载后立即注册事件委托(仅静态核心模块,懒加载模块通过 createLazyModule initFn 自动初始化)
|
2026-04-25 03:54:23 +08:00
|
|
|
|
bindGlobalDialogControls();
|
2026-04-25 10:41:20 +08:00
|
|
|
|
bindChatComposerControls();
|
2026-04-25 13:51:50 +08:00
|
|
|
|
bindChatToast();
|
2026-04-28 09:38:18 +08:00
|
|
|
|
bindBlockMenuControls();
|
|
|
|
|
|
bindSoundMuteControl();
|
|
|
|
|
|
bindInstantHoverTooltip();
|
2026-04-25 03:59:53 +08:00
|
|
|
|
bindToolbarControls();
|
2026-04-25 14:04:42 +08:00
|
|
|
|
bindChatInitialStateControls();
|
2026-04-27 09:19:49 +00:00
|
|
|
|
bindChatEvents();
|
|
|
|
|
|
startBadgeRotation();
|
|
|
|
|
|
startHeartbeat();
|
2026-04-25 03:34:31 +08:00
|
|
|
|
}
|