Browse Source

fix: Prevent local AppState reset during collaboration

Daniel J. Geiger 2 years ago
parent
commit
5542e4528a
2 changed files with 23 additions and 6 deletions
  1. 20 5
      src/excalidraw-app/data/LocalData.ts
  2. 3 1
      src/excalidraw-app/index.tsx

+ 20 - 5
src/excalidraw-app/data/LocalData.ts

@@ -46,12 +46,15 @@ class LocalFileManager extends FileManager {
 const saveDataStateToLocalStorage = (
 const saveDataStateToLocalStorage = (
   elements: readonly ExcalidrawElement[],
   elements: readonly ExcalidrawElement[],
   appState: AppState,
   appState: AppState,
+  appStateOnly = false,
 ) => {
 ) => {
   try {
   try {
-    localStorage.setItem(
-      STORAGE_KEYS.LOCAL_STORAGE_ELEMENTS,
-      JSON.stringify(clearElementsForLocalStorage(elements)),
-    );
+    if (!appStateOnly) {
+      localStorage.setItem(
+        STORAGE_KEYS.LOCAL_STORAGE_ELEMENTS,
+        JSON.stringify(clearElementsForLocalStorage(elements)),
+      );
+    }
     localStorage.setItem(
     localStorage.setItem(
       STORAGE_KEYS.LOCAL_STORAGE_APP_STATE,
       STORAGE_KEYS.LOCAL_STORAGE_APP_STATE,
       JSON.stringify(clearAppStateForLocalStorage(appState)),
       JSON.stringify(clearAppStateForLocalStorage(appState)),
@@ -72,8 +75,12 @@ export class LocalData {
       appState: AppState,
       appState: AppState,
       files: BinaryFiles,
       files: BinaryFiles,
       onFilesSaved: () => void,
       onFilesSaved: () => void,
+      appStateOnly = false,
     ) => {
     ) => {
-      saveDataStateToLocalStorage(elements, appState);
+      saveDataStateToLocalStorage(elements, appState, appStateOnly);
+      if (appStateOnly) {
+        return;
+      }
 
 
       await this.fileStorage.saveFiles({
       await this.fileStorage.saveFiles({
         elements,
         elements,
@@ -97,6 +104,14 @@ export class LocalData {
     }
     }
   };
   };
 
 
+  /** Saves the AppState, only if saving is paused. */
+  static saveAppState = (appState: AppState) => {
+    // we need to make the `isSavePaused` check synchronously (undebounced)
+    if (this.isSavePaused()) {
+      this._save([], appState, {}, () => {}, true);
+    }
+  };
+
   static flushSave = () => {
   static flushSave = () => {
     this._save.flush();
     this._save.flush();
   };
   };

+ 3 - 1
src/excalidraw-app/index.tsx

@@ -189,7 +189,7 @@ const initializeScene = async (opts: {
           ...restoreAppState(
           ...restoreAppState(
             {
             {
               ...scene?.appState,
               ...scene?.appState,
-              theme: localDataState?.appState?.theme || scene?.appState?.theme,
+              ...localDataState?.appState,
             },
             },
             excalidrawAPI.getAppState(),
             excalidrawAPI.getAppState(),
           ),
           ),
@@ -538,6 +538,8 @@ const ExcalidrawWrapper = () => {
           }
           }
         }
         }
       });
       });
+    } else {
+      LocalData.saveAppState(appState);
     }
     }
   };
   };