BUILD152 — пауза всех обновлений в настройках

This commit is contained in:
2026-09-18 20:38:17 +03:00
parent eed07cd47c
commit 5a20245f5e
3 changed files with 140 additions and 21 deletions

View File

@@ -1,3 +1,4 @@
// BUILD152: all browser-side hockey data polling pauses while operator settings are open.
// BUILD151: Schedule ONLINE is a toggle; one-second live polling uses isolated schedule_live.
// BUILD150: Schedule ONLINE button refreshes score/status from language-specific per-game JSON.
// BUILD146: schedule tab remains permanent; score/status refresh is driven by tournament-menu.js.
@@ -4582,7 +4583,15 @@ function startCustomTooltips() {
refreshQuickPanelOnAirClasses();
}
function hockeySettingsDataRefreshPaused() {
return Boolean(
document.querySelector(".modal-settings-full")
|| document.querySelector(".hockey-settings-modal")
);
}
async function pollQuickPanelOverlayState({ force = false } = {}) {
if (hockeySettingsDataRefreshPaused()) return false;
if (state.quickPanelOverlayPollPending && !force) return false;
const deviceId = currentRuntimeVmixDeviceId();
if (!deviceId) return false;
@@ -4602,8 +4611,16 @@ function startCustomTooltips() {
}
}
function stopQuickPanelOverlayPolling() {
if (state.quickPanelOverlayPollTimer) {
window.clearInterval(state.quickPanelOverlayPollTimer);
state.quickPanelOverlayPollTimer = null;
}
}
function startQuickPanelOverlayPolling() {
if (state.quickPanelOverlayPollTimer) window.clearInterval(state.quickPanelOverlayPollTimer);
stopQuickPanelOverlayPolling();
if (hockeySettingsDataRefreshPaused()) return;
pollQuickPanelOverlayState({ force: true }).catch(() => {});
state.quickPanelOverlayPollTimer = window.setInterval(() => {
pollQuickPanelOverlayState().catch(() => {});
@@ -15255,15 +15272,20 @@ function renderHockeyPenaltyDashboard(node, component, runtime) {
function showSettingsModal(title, bodyHtml, options = {}) {
const className = ["modal-settings-full", String(options.className || "").trim()].filter(Boolean).join(" ");
showModal(title, bodyHtml, { ...options, locked: true, className });
window.dispatchEvent(new CustomEvent("hockey:settings-visibility", { detail: { open: true } }));
}
function closeModal() {
const closingSettings = Boolean(el.modalHost?.querySelector?.(".modal-settings-full"));
closeControlPopover();
if (state.shortcutCapture) { state.shortcutCapture = null; state.pressedShortcutModifiers.clear(); }
clearInterval(state.timerQuickEditorInterval);
state.timerQuickEditorInterval = null;
state.modalLocked = false;
el.modalHost.innerHTML = "";
if (closingSettings) {
window.dispatchEvent(new CustomEvent("hockey:settings-visibility", { detail: { open: false } }));
}
renderHockeyRuntimeSideWindows();
scheduleRuntimeScale();
}
@@ -15386,11 +15408,25 @@ function renderHockeyPenaltyDashboard(node, component, runtime) {
}
scheduleRuntimeScale();
});
window.addEventListener("hockey:settings-updated", () => {
const refreshHockeyRuntimeAfterSettings = () => {
const gameId = hockeyTimerSelectedGameId();
if (gameId) hockeyLoadGameControl(gameId, { force: true, rerender: false }).then(() => {
if (!gameId) return;
hockeyLoadGameControl(gameId, { force: true, rerender: false }).then(() => {
if (hockeyTeamStateScoreboardIsLive()) hockeySyncTeamStateOverlays({ force: true }).catch(() => {});
});
};
window.addEventListener("hockey:data-refresh-paused", (event) => {
const paused = Boolean(event?.detail?.paused);
if (paused) {
stopQuickPanelOverlayPolling();
} else if (boot.mode === "runtime") {
startQuickPanelOverlayPolling();
refreshHockeyRuntimeAfterSettings();
}
});
window.addEventListener("hockey:settings-updated", () => {
if (hockeySettingsDataRefreshPaused()) return;
refreshHockeyRuntimeAfterSettings();
});
window.addEventListener("hockey:game-selected", (event) => {
const gameId = String(event?.detail?.game?.external_id || event?.detail?.game?.id || "").trim();