fix: stop state ping-pong by removing broadcastStateRefresh from auto-persist

The CRDT auto-persist was broadcasting state-refresh after each save, causing
other clients to fetch from DB and overwrite their local variables/characters
with stale values. Since CRDT already syncs nodes/edges via yjs-update
broadcasts, the state-refresh from auto-persist was redundant and destructive.
Manual save still broadcasts state-refresh as intended.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Gustavo Henrique Santos Souza de Miranda 2026-01-24 18:46:59 -03:00
parent cd73b31739
commit ec053d8126
1 changed files with 5 additions and 2 deletions

View File

@ -566,6 +566,11 @@ function FlowchartEditorInner({ projectId, projectName, userId, userDisplayName,
}, },
onPersist: async (persistNodes: FlowchartNode[], persistEdges: FlowchartEdge[]) => { onPersist: async (persistNodes: FlowchartNode[], persistEdges: FlowchartEdge[]) => {
try { try {
// Auto-persist saves the current state for durability. We do NOT
// broadcast state-refresh here because CRDT already syncs nodes/edges
// via yjs-update broadcasts. Broadcasting here causes ping-pong:
// other clients fetch from DB, overwrite their local variables/characters,
// then their persist writes stale data back, causing a loop.
await supabase await supabase
.from('projects') .from('projects')
.update({ .update({
@ -577,8 +582,6 @@ function FlowchartEditorInner({ projectId, projectName, userId, userDisplayName,
}, },
}) })
.eq('id', projectId) .eq('id', projectId)
// Notify other clients to refresh after successful auto-persist
realtimeRef.current?.broadcastStateRefresh()
} catch { } catch {
// Persistence failure is non-critical; will retry on next change // Persistence failure is non-critical; will retry on next change
} }