Fix backend sync race causing reverted edits
This commit is contained in:
14
src/app.js
14
src/app.js
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user