From e836e48e27247c8cfaf6575864a0275ac1daf050 Mon Sep 17 00:00:00 2001 From: Avinash Kumar Deepak Date: Sun, 1 Mar 2026 14:25:29 +0530 Subject: [PATCH] fix: cap undo history, fix btoa unicode crash, add quota fallback (#352) --- src/graph-builder/graph-core/4-undo-redo.js | 7 +++++++ src/graph-builder/graph-core/5-load-save.js | 8 ++++++-- src/graph-builder/local-storage-manager.js | 14 +++++++++++--- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/graph-builder/graph-core/4-undo-redo.js b/src/graph-builder/graph-core/4-undo-redo.js index f43396d..7b152cf 100644 --- a/src/graph-builder/graph-core/4-undo-redo.js +++ b/src/graph-builder/graph-core/4-undo-redo.js @@ -99,6 +99,13 @@ class GraphUndoRedo extends GraphComponent { ), }); this.curActionIndex += 1; + + if (this.actionArr.length > 100) { + const drop = this.actionArr.length - 100; + this.actionArr.splice(0, drop); + this.curActionIndex -= drop; + } + this.informUI(); } diff --git a/src/graph-builder/graph-core/5-load-save.js b/src/graph-builder/graph-core/5-load-save.js index 4034bc1..98c9675 100644 --- a/src/graph-builder/graph-core/5-load-save.js +++ b/src/graph-builder/graph-core/5-load-save.js @@ -48,11 +48,15 @@ class GraphLoadSave extends GraphUndoRedo { } static stringifyAction({ actionName, parameters }) { - return { actionName, parameters: window.btoa(JSON.stringify(parameters)) }; + return { actionName, parameters: JSON.stringify(parameters) }; } static parseAction({ actionName, parameters }) { - return { actionName, parameters: JSON.parse(window.atob(parameters)) }; + try { + return { actionName, parameters: JSON.parse(parameters) }; + } catch { + return { actionName, parameters: JSON.parse(window.atob(parameters)) }; + } } jsonifyGraph() { diff --git a/src/graph-builder/local-storage-manager.js b/src/graph-builder/local-storage-manager.js index 1b4a93f..cafc55c 100644 --- a/src/graph-builder/local-storage-manager.js +++ b/src/graph-builder/local-storage-manager.js @@ -12,8 +12,10 @@ const localStorageGet = (key) => { const localStorageSet = (key, value) => { try { window.localStorage.setItem(key, value); + return true; } catch (e) { toast.error(e.message); + return false; } }; @@ -53,12 +55,18 @@ const localStorageManager = { get(id) { const raw = localStorageGet(id); if (raw === null) return null; - return JSON.parse(window.atob(raw)); + try { + return JSON.parse(raw); + } catch { + return JSON.parse(window.atob(raw)); + } }, save(id, graphContent) { this.addGraph(id); - const serializedJson = JSON.stringify(graphContent); - localStorageSet(id, window.btoa(serializedJson)); + if (!localStorageSet(id, JSON.stringify(graphContent))) { + const stripped = { ...graphContent, actionHistory: [] }; + localStorageSet(id, JSON.stringify(stripped)); + } }, remove(id) { if (this.allgs.delete(id)) this.saveAllgs();