fix event och tappa decoder connect
This commit is contained in:
10
src/app.js
10
src/app.js
@@ -127,7 +127,7 @@ const hydrateFromBackend = () => hydrateFromBackendHelper({ backend, t, getBacke
|
|||||||
const scheduleBackendSync = () => scheduleBackendSyncHelper({ getBackendSyncTimer: () => backendSyncTimer, setBackendSyncTimer: (value) => { backendSyncTimer = value; }, syncStateToBackend });
|
const scheduleBackendSync = () => scheduleBackendSyncHelper({ getBackendSyncTimer: () => backendSyncTimer, setBackendSyncTimer: (value) => { backendSyncTimer = value; }, syncStateToBackend });
|
||||||
const syncStateToBackend = () => syncStateToBackendHelper({ backend, t, getBackendUrl, buildPersistableState, getLocalStateVersion: () => localStateVersion, getSyncedStateVersion: () => syncedStateVersion, setSyncedStateVersion: (value) => { syncedStateVersion = value; }, getLocalStateDirty: () => localStateDirty, setLocalStateDirty: (value) => { localStateDirty = value; } });
|
const syncStateToBackend = () => syncStateToBackendHelper({ backend, t, getBackendUrl, buildPersistableState, getLocalStateVersion: () => localStateVersion, getSyncedStateVersion: () => syncedStateVersion, setSyncedStateVersion: (value) => { syncedStateVersion = value; }, getLocalStateDirty: () => localStateDirty, setLocalStateDirty: (value) => { localStateDirty = value; } });
|
||||||
const pingBackend = () => pingBackendHelper({ backend, t, getBackendUrl });
|
const pingBackend = () => pingBackendHelper({ backend, t, getBackendUrl });
|
||||||
const checkAppVersion = () => checkAppVersionHelper({ getBackendUrl, getBaselineAppVersion: () => baselineAppVersion, setBaselineAppVersion: (value) => { baselineAppVersion = value; } });
|
const checkAppVersion = () => checkAppVersionHelper({ getBackendUrl, getBaselineAppVersion: () => baselineAppVersion, setBaselineAppVersion: (value) => { baselineAppVersion = value; }, getPendingAppVersion: () => pendingAppVersion, setPendingAppVersion: (value) => { pendingAppVersion = value; }, getLocalStateDirty: () => localStateDirty });
|
||||||
const startAppVersionPolling = () => startAppVersionPollingHelper({ checkAppVersion, getAppVersionPollTimer: () => appVersionPollTimer, setAppVersionPollTimer: (value) => { appVersionPollTimer = value; } });
|
const startAppVersionPolling = () => startAppVersionPollingHelper({ checkAppVersion, getAppVersionPollTimer: () => appVersionPollTimer, setAppVersionPollTimer: (value) => { appVersionPollTimer = value; } });
|
||||||
const startOverlaySync = () => startOverlaySyncHelper({ getOverlaySyncTimer: () => overlaySyncTimer, setOverlaySyncTimer: (value) => { overlaySyncTimer = value; }, getLocalStateDirty: () => localStateDirty, hydrateFromBackend, getCurrentView: () => currentView, renderView });
|
const startOverlaySync = () => startOverlaySyncHelper({ getOverlaySyncTimer: () => overlaySyncTimer, setOverlaySyncTimer: (value) => { overlaySyncTimer = value; }, getLocalStateDirty: () => localStateDirty, hydrateFromBackend, getCurrentView: () => currentView, renderView });
|
||||||
const startOverlayRotation = () => startOverlayRotationHelper({ getOverlayRotationTimer: () => overlayRotationTimer, setOverlayRotationTimer: (value) => { overlayRotationTimer = value; }, getOverlayRotationIndex: () => overlayRotationIndex, setOverlayRotationIndex: (value) => { overlayRotationIndex = value; }, getCurrentView: () => currentView, getOverlayViewMode: () => overlayViewMode, renderView });
|
const startOverlayRotation = () => startOverlayRotationHelper({ getOverlayRotationTimer: () => overlayRotationTimer, setOverlayRotationTimer: (value) => { overlayRotationTimer = value; }, getOverlayRotationIndex: () => overlayRotationIndex, setOverlayRotationIndex: (value) => { overlayRotationIndex = value; }, getCurrentView: () => currentView, getOverlayViewMode: () => overlayViewMode, renderView });
|
||||||
@@ -1862,6 +1862,7 @@ let reconnectTimer = null;
|
|||||||
let backendSyncTimer = null;
|
let backendSyncTimer = null;
|
||||||
let appVersionPollTimer = null;
|
let appVersionPollTimer = null;
|
||||||
let baselineAppVersion = "";
|
let baselineAppVersion = "";
|
||||||
|
let pendingAppVersion = "";
|
||||||
let localStateVersion = 0;
|
let localStateVersion = 0;
|
||||||
let syncedStateVersion = 0;
|
let syncedStateVersion = 0;
|
||||||
let localStateDirty = false;
|
let localStateDirty = false;
|
||||||
@@ -2098,17 +2099,18 @@ async function init() {
|
|||||||
setupLanguageControl();
|
setupLanguageControl();
|
||||||
updateHeaderState();
|
updateHeaderState();
|
||||||
updateConnectionBadge();
|
updateConnectionBadge();
|
||||||
|
if (state.settings.wsUrl && state.settings.autoReconnect && !state.decoder.connected) {
|
||||||
|
connectDecoder();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
startOverlaySync();
|
startOverlaySync();
|
||||||
startOverlayRotation();
|
startOverlayRotation();
|
||||||
startOverlayLiveRefresh();
|
startOverlayLiveRefresh();
|
||||||
|
|
||||||
if (overlayMode) {
|
if (overlayMode && state.settings.wsUrl && !state.decoder.connected) {
|
||||||
if (state.settings.wsUrl) {
|
|
||||||
connectDecoder();
|
connectDecoder();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function seedDefaultData() {
|
function seedDefaultData() {
|
||||||
|
|||||||
@@ -489,20 +489,42 @@ export function renderEventManagerView(context) {
|
|||||||
persistRaceParticipants();
|
persistRaceParticipants();
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById("teamForm")?.addEventListener("submit", (e) => {
|
const getTeamCreateSelections = () => ({
|
||||||
e.preventDefault();
|
driverIds: Array.from(document.querySelectorAll('[form="teamForm"][name="teamDriverIds"]:checked')).map((node) => String(node.value)).filter(Boolean),
|
||||||
const form = new FormData(e.currentTarget);
|
carIds: Array.from(document.querySelectorAll('[form="teamForm"][name="teamCarIds"]:checked')).map((node) => String(node.value)).filter(Boolean),
|
||||||
const name = String(form.get("teamName") || "").trim();
|
});
|
||||||
const driverIds = form.getAll("teamDriverIds").map(String).filter(Boolean);
|
|
||||||
const carIds = form.getAll("teamCarIds").map(String).filter(Boolean);
|
const commitTeamCreate = () => {
|
||||||
if (!name || (!driverIds.length && !carIds.length)) {
|
const formNode = document.getElementById("teamForm");
|
||||||
|
if (!(formNode instanceof HTMLFormElement)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
const form = new FormData(formNode);
|
||||||
|
const name = String(form.get("teamName") || "").trim();
|
||||||
|
const { driverIds, carIds } = getTeamCreateSelections();
|
||||||
|
if (!name) {
|
||||||
|
setFormError("teamCreateError", t("validation.required_name"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!driverIds.length && !carIds.length) {
|
||||||
|
setFormError("teamCreateError", t("validation.invalid_selection"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setFormError("teamCreateError", "");
|
||||||
const createdTeam = normalizeRaceTeam({ id: uid("team"), name, driverIds, carIds });
|
const createdTeam = normalizeRaceTeam({ id: uid("team"), name, driverIds, carIds });
|
||||||
event.raceConfig.teams = [...getEventTeams(event), createdTeam];
|
event.raceConfig.teams = [...getEventTeams(event), createdTeam];
|
||||||
setSelectedTeamEditId(createdTeam.id);
|
setSelectedTeamEditId(createdTeam.id);
|
||||||
saveState();
|
saveState();
|
||||||
rerenderEventManager(eventId);
|
rerenderEventManager(eventId);
|
||||||
|
};
|
||||||
|
|
||||||
|
document.getElementById("teamForm")?.addEventListener("submit", (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
commitTeamCreate();
|
||||||
|
});
|
||||||
|
|
||||||
|
document.getElementById("teamAddSave")?.addEventListener("click", () => {
|
||||||
|
commitTeamCreate();
|
||||||
});
|
});
|
||||||
|
|
||||||
raceTeams.forEach((team) => {
|
raceTeams.forEach((team) => {
|
||||||
@@ -543,12 +565,15 @@ export function renderEventManagerView(context) {
|
|||||||
rerenderEventManager(eventId);
|
rerenderEventManager(eventId);
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById("teamEditForm")?.addEventListener("submit", (submitEvent) => {
|
const commitTeamEdit = () => {
|
||||||
submitEvent.preventDefault();
|
|
||||||
if (!editingTeam) {
|
if (!editingTeam) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const form = new FormData(submitEvent.currentTarget);
|
const formNode = document.getElementById("teamEditForm");
|
||||||
|
if (!(formNode instanceof HTMLFormElement)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const form = new FormData(formNode);
|
||||||
const name = String(form.get("teamName") || "").trim();
|
const name = String(form.get("teamName") || "").trim();
|
||||||
const driverIds = form.getAll("teamDriverIds").map(String).filter(Boolean);
|
const driverIds = form.getAll("teamDriverIds").map(String).filter(Boolean);
|
||||||
const carIds = form.getAll("teamCarIds").map(String).filter(Boolean);
|
const carIds = form.getAll("teamCarIds").map(String).filter(Boolean);
|
||||||
@@ -567,6 +592,15 @@ export function renderEventManagerView(context) {
|
|||||||
setSelectedTeamEditId(null);
|
setSelectedTeamEditId(null);
|
||||||
saveState();
|
saveState();
|
||||||
rerenderEventManager(eventId);
|
rerenderEventManager(eventId);
|
||||||
|
};
|
||||||
|
|
||||||
|
document.getElementById("teamEditForm")?.addEventListener("submit", (submitEvent) => {
|
||||||
|
submitEvent.preventDefault();
|
||||||
|
commitTeamEdit();
|
||||||
|
});
|
||||||
|
|
||||||
|
document.getElementById("teamEditSave")?.addEventListener("click", () => {
|
||||||
|
commitTeamEdit();
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById("raceFormatBasicToggle")?.addEventListener("click", () => {
|
document.getElementById("raceFormatBasicToggle")?.addEventListener("click", () => {
|
||||||
|
|||||||
@@ -171,14 +171,29 @@ export async function pingBackendHelper({ backend, t, getBackendUrl }) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function checkAppVersionHelper({ getBackendUrl, getBaselineAppVersion, setBaselineAppVersion }) {
|
export async function checkAppVersionHelper({ getBackendUrl, getBaselineAppVersion, setBaselineAppVersion, getPendingAppVersion, setPendingAppVersion, getLocalStateDirty }) {
|
||||||
try {
|
try {
|
||||||
const res = await fetch(`${getBackendUrl()}/api/app-version`, { cache: "no-store" });
|
const res = await fetch(`${getBackendUrl()}/api/app-version`, { cache: "no-store" });
|
||||||
if (!res.ok) return;
|
if (!res.ok) return;
|
||||||
const payload = await res.json();
|
const payload = await res.json();
|
||||||
const key = `${payload.revision}:${payload.updatedAt}`;
|
const key = `${payload.revision}:${payload.updatedAt}`;
|
||||||
if (!getBaselineAppVersion()) { setBaselineAppVersion(key); return; }
|
if (!getBaselineAppVersion()) {
|
||||||
if (key !== getBaselineAppVersion()) window.location.reload();
|
setBaselineAppVersion(key);
|
||||||
|
setPendingAppVersion("");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (key === getBaselineAppVersion()) {
|
||||||
|
setPendingAppVersion("");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (getPendingAppVersion() !== key) {
|
||||||
|
setPendingAppVersion(key);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (getLocalStateDirty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
window.location.reload();
|
||||||
} catch {}
|
} catch {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,7 +201,7 @@ export function startAppVersionPollingHelper({ checkAppVersion, getAppVersionPol
|
|||||||
if (!window.location.protocol.startsWith("http")) return;
|
if (!window.location.protocol.startsWith("http")) return;
|
||||||
clearInterval(getAppVersionPollTimer());
|
clearInterval(getAppVersionPollTimer());
|
||||||
checkAppVersion();
|
checkAppVersion();
|
||||||
setAppVersionPollTimer(setInterval(checkAppVersion, 3000));
|
setAppVersionPollTimer(setInterval(checkAppVersion, 5000));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function startOverlaySyncHelper({ getOverlaySyncTimer, setOverlaySyncTimer, getLocalStateDirty, hydrateFromBackend, getCurrentView, renderView }) {
|
export function startOverlaySyncHelper({ getOverlaySyncTimer, setOverlaySyncTimer, getLocalStateDirty, hydrateFromBackend, getCurrentView, renderView }) {
|
||||||
|
|||||||
Reference in New Issue
Block a user