возможно теперь загружается матч через интернет, но не точно
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
gameDate: "hockey.gameDate",
|
||||
session: "hockey.operatorSessionToken",
|
||||
vmixDevice: "hockey.vmix.selected_device",
|
||||
account: "hockey.accountId",
|
||||
};
|
||||
|
||||
const state = {
|
||||
@@ -280,6 +281,32 @@
|
||||
return String(window.HockeyAgentRuntime?.currentDeviceId?.() || localStorage.getItem(storage.vmixDevice) || "").trim();
|
||||
}
|
||||
|
||||
async function ensureAccountScopedRuntimeState() {
|
||||
let user = null;
|
||||
try {
|
||||
user = await request("/api/hockey/me");
|
||||
} catch (_) {
|
||||
return;
|
||||
}
|
||||
const currentAccountId = String(user?.id || "").trim();
|
||||
if (!currentAccountId) return;
|
||||
const previousAccountId = String(localStorage.getItem(storage.account) || "").trim();
|
||||
if (previousAccountId && previousAccountId !== currentAccountId) {
|
||||
// Session tokens and Agent selection belong to one WFL account only.
|
||||
// Keeping them across logout/login can bind a new operator to the
|
||||
// previous account's match or vMix device.
|
||||
localStorage.removeItem(storage.session);
|
||||
localStorage.removeItem(storage.game);
|
||||
localStorage.removeItem(storage.vmixDevice);
|
||||
state.selectedGameId = "";
|
||||
state.selectedGame = null;
|
||||
state.selectedMatchDetails = null;
|
||||
stopSelectedGamePolling();
|
||||
try { window.HockeyAgentRuntime?.selectDevice?.(""); } catch (_) {}
|
||||
}
|
||||
localStorage.setItem(storage.account, currentAccountId);
|
||||
}
|
||||
|
||||
async function request(path, options = {}) {
|
||||
const { timeoutMs = 15000, ...fetchOptions } = options;
|
||||
const controller = new AbortController();
|
||||
@@ -1442,22 +1469,42 @@ function gameCard(game) {
|
||||
}
|
||||
}
|
||||
|
||||
const session = await request("/api/hockey/sessions", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({
|
||||
tournament_external_id: state.selectedId,
|
||||
game_external_id: id,
|
||||
display_language: state.language,
|
||||
vmix_language: state.language,
|
||||
vmix_device_id: currentAgentDeviceId(),
|
||||
replace_existing: true,
|
||||
}),
|
||||
});
|
||||
let session = null;
|
||||
const selectedDeviceId = currentAgentDeviceId();
|
||||
const sessionPayload = {
|
||||
tournament_external_id: state.selectedId,
|
||||
game_external_id: id,
|
||||
display_language: state.language,
|
||||
vmix_language: state.language,
|
||||
vmix_device_id: selectedDeviceId,
|
||||
replace_existing: true,
|
||||
};
|
||||
try {
|
||||
session = await request("/api/hockey/sessions", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify(sessionPayload),
|
||||
});
|
||||
} catch (sessionError) {
|
||||
// A device stored in localStorage may belong to the previous account.
|
||||
// Retry the operator session without Agent instead of blocking the match.
|
||||
if (selectedDeviceId) {
|
||||
localStorage.removeItem(storage.vmixDevice);
|
||||
try { window.HockeyAgentRuntime?.selectDevice?.(""); } catch (_) {}
|
||||
session = await request("/api/hockey/sessions", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ ...sessionPayload, vmix_device_id: "" }),
|
||||
});
|
||||
} else {
|
||||
throw sessionError;
|
||||
}
|
||||
}
|
||||
|
||||
state.selectedGameId = String(id);
|
||||
localStorage.setItem(storage.game, state.selectedGameId);
|
||||
localStorage.setItem(storage.session, session.token);
|
||||
if (session?.token) localStorage.setItem(storage.session, session.token);
|
||||
else localStorage.removeItem(storage.session);
|
||||
|
||||
const selectedGameDate = String(state.selectedGame?.date || "").trim();
|
||||
const scheduleDate = String(state.games?.meta?.date || state.games?.selected_date || "").trim();
|
||||
@@ -2018,6 +2065,7 @@ document.addEventListener("visibilitychange", () => {
|
||||
async function init() {
|
||||
ensureShell();
|
||||
renderStaticLabels();
|
||||
await ensureAccountScopedRuntimeState();
|
||||
await loadNavigation();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user