From 324fcac490515a4f49af892f377b473fbbec3dbd Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Sun, 9 Aug 2026 13:56:28 +0400 Subject: [PATCH] Fix save restore --- packages/core/src/editor/model/Editor.ts | 13 ++++++----- packages/core/test/specs/grapesjs/index.ts | 26 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/packages/core/src/editor/model/Editor.ts b/packages/core/src/editor/model/Editor.ts index 2c6474e1a..b7bdbbec1 100644 --- a/packages/core/src/editor/model/Editor.ts +++ b/packages/core/src/editor/model/Editor.ts @@ -909,11 +909,14 @@ export default class EditorModel extends Model { this.clearDirtyCount(); }, 1); const data = this.storeData(); - await this.Storage.store(data, options); - setTimeout(() => { - this._isStoring = false; - }, 1); - return data; + try { + await this.Storage.store(data, options); + return data; + } finally { + setTimeout(() => { + this._isStoring = false; + }, 1); + } } /** diff --git a/packages/core/test/specs/grapesjs/index.ts b/packages/core/test/specs/grapesjs/index.ts index d04c2a82a..4c0fbb497 100644 --- a/packages/core/test/specs/grapesjs/index.ts +++ b/packages/core/test/specs/grapesjs/index.ts @@ -4,6 +4,7 @@ import ComponentWrapper from '../../../src/dom_components/model/ComponentWrapper import { EditorConfig } from '../../../src/editor/config/config'; import PluginsEvents, { Plugin } from '../../../src/plugin_manager/types'; import { StorageManagerConfig } from '../../../src/storage_manager/config/config'; +import { wait } from '../../../src/utils/mixins'; import { fixJsDom, fixJsDomIframe, waitEditorEvent } from '../../common'; type TestPlugin = Plugin<{ cVal: string }>; @@ -517,6 +518,31 @@ describe('GrapesJS', () => { expect(data).toEqual(projectData); }); + test('Allows retrying store after a storage failure', async () => { + const store = jest + .fn() + .mockRejectedValueOnce(new Error('store failed')) + .mockResolvedValueOnce(undefined); + + (config.storageManager as StorageManagerConfig).type = storageId; + config.plugins = [ + (e) => + e.StorageManager.add(storageId, { + store, + async load() { + return {}; + }, + }), + ]; + const editor = initTestEditor(config); + + await expect(editor.store()).rejects.toThrow('store failed'); + await wait(2); + await editor.store(); + + expect(store).toHaveBeenCalledTimes(2); + }); + test('Adds a new storage and fetch correctly data from it', async () => { fixture.innerHTML = documentEl; const styleResult = { color: 'white', display: 'block' };