Fix backend sync race causing reverted edits

This commit is contained in:
larssand
2026-03-25 22:20:50 +01:00
parent 86fea2c2ea
commit 2194dbdb4f

View File

@@ -1767,6 +1767,9 @@ let reconnectTimer = null;
let backendSyncTimer = null;
let appVersionPollTimer = null;
let baselineAppVersion = "";
let localStateVersion = 0;
let syncedStateVersion = 0;
let localStateDirty = false;
let selectedClassEditId = null;
let selectedLeaderboardKey = null;
let selectedGridSessionId = null;
@@ -2134,6 +2137,8 @@ function saveState(options = {}) {
const persistable = buildPersistableState();
localStorage.setItem(STORAGE_KEY, JSON.stringify(persistable));
if (!options.skipBackend) {
localStateVersion += 1;
localStateDirty = true;
scheduleBackendSync();
}
}
@@ -2675,6 +2680,7 @@ function scheduleBackendSync() {
}
async function syncStateToBackend() {
const syncVersion = localStateVersion;
try {
const res = await fetch(`${getBackendUrl()}/api/state`, {
method: "POST",
@@ -2687,6 +2693,10 @@ async function syncStateToBackend() {
backend.available = true;
backend.lastError = "";
backend.lastSyncAt = new Date().toISOString();
syncedStateVersion = Math.max(syncedStateVersion, syncVersion);
if (syncVersion === localStateVersion) {
localStateDirty = false;
}
} catch (error) {
backend.available = false;
backend.lastError = t("error.sync_failed", { msg: error instanceof Error ? error.message : String(error) });
@@ -2740,7 +2750,9 @@ async function checkAppVersion() {
function startOverlaySync() {
clearInterval(overlaySyncTimer);
overlaySyncTimer = setInterval(async () => {
await hydrateFromBackend();
if (!localStateDirty) {
await hydrateFromBackend();
}
if (currentView === "overlay") {
renderView();
}