// 小型游戏弹窗通用事件代理,收口各游戏头部关闭按钮内联 onclick。 let gamePanelEventsBound = false; /** * 关闭指定 Alpine 游戏面板。 * * @param {string} panelId 面板 DOM ID * @returns {void} */ function closeAlpineGamePanel(panelId) { const panel = document.getElementById(panelId); const panelData = panel && typeof window.Alpine?.$data === "function" ? window.Alpine.$data(panel) : null; if (!panelData) { return; } // 多数游戏面板提供 close(),占卜面板只暴露 show 状态,因此保留 show=false 兜底。 if (typeof panelData.close === "function") { panelData.close(); return; } panelData.show = false; } /** * 打开五子棋面板,作为公屏邀请按钮和存量全局函数之间的桥接。 * * @returns {void} */ function openGomokuPanelFromInvite() { if (typeof window.openGomokuPanel === "function") { window.openGomokuPanel(); return; } const panel = document.getElementById("gomoku-panel"); const panelData = panel && typeof window.Alpine?.$data === "function" ? window.Alpine.$data(panel) : null; panelData?.open?.(); } /** * 接受五子棋公屏邀请,业务仍沿用五子棋面板里的存量全局函数。 * * @param {string} gameId 对局 ID * @returns {void} */ function acceptGomokuInviteFromMessage(gameId) { if (!gameId) { return; } window.acceptGomokuInvite?.(gameId); } /** * 绑定小型游戏面板通用关闭事件。 * * @returns {void} */ export function bindGamePanelControls() { if (gamePanelEventsBound || typeof document === "undefined") { return; } gamePanelEventsBound = true; document.addEventListener("click", (event) => { if (!(event.target instanceof Element)) { return; } const gomokuOpenButton = event.target.closest("[data-gomoku-open-panel]"); if (gomokuOpenButton) { event.preventDefault(); openGomokuPanelFromInvite(); return; } const gomokuAcceptButton = event.target.closest("[data-gomoku-accept-id]"); if (gomokuAcceptButton) { event.preventDefault(); acceptGomokuInviteFromMessage(gomokuAcceptButton.getAttribute("data-gomoku-accept-id") || ""); return; } const closeButton = event.target.closest("[data-game-panel-close]"); if (!closeButton) { return; } event.preventDefault(); closeAlpineGamePanel(closeButton.getAttribute("data-game-panel-close") || ""); }); }