diff --git a/src/electron/create-menu.ts b/src/electron/create-menu.ts index 6133d3466..9cd903492 100644 --- a/src/electron/create-menu.ts +++ b/src/electron/create-menu.ts @@ -97,15 +97,7 @@ export function createMenu(ctx: MenuContext): void { if (!project) { return; } - - Sender.send({ - type: ServerMessageType.Save, - id: uuid.v4(), - payload: { - path: project.getPath(), - project: project.toJSON() - } - }); + ctx.store.save(); } }, { diff --git a/src/electron/renderer.tsx b/src/electron/renderer.tsx index 5028e009e..beb0759b3 100644 --- a/src/electron/renderer.tsx +++ b/src/electron/renderer.tsx @@ -335,32 +335,6 @@ Mobx.autorunAsync(() => { }); }); -Mobx.autorunAsync(() => { - const project = store.getProject(); - const savedProjects = store.getSavedProjects(); - const savedProject = savedProjects[savedProjects.length - 1]; - - if (savedProject && Project.isEqual(savedProject, project.toDisk())) { - return; - } - - if (project) { - const serializedProject = project.toJSON(); - store.addSavedProject(project); - - const payload = { - path: project.getPath(), - project: serializedProject - }; - - Sender.send({ - id: uuid.v4(), - payload, - type: ServerMessageType.Save - }); - } -}); - ReactDom.render( diff --git a/src/store/view-store.ts b/src/store/view-store.ts index 9f4aa7e98..984ad7bc3 100644 --- a/src/store/view-store.ts +++ b/src/store/view-store.ts @@ -1,5 +1,5 @@ import * as Sender from '../message/client'; -import { isEqual } from 'lodash'; +import { debounce, isEqual } from 'lodash'; import { ServerMessageType } from '../message'; import * as Mobx from 'mobx'; import * as Model from '../model'; @@ -54,6 +54,8 @@ export class ViewStore { public constructor(init: { app: Model.AlvaApp; history: Model.EditHistory }) { this.app = init.app; this.editHistory = init.history; + + this.save = debounce(this.save, 1000); } @Mobx.action @@ -82,6 +84,9 @@ export class ViewStore { app: this.app.toJSON(), project: this.project.toJSON() }); + + // tslint:disable-next-line:no-any + (window as any).requestIdleCallback(() => this.save()); } public connectPatternLibrary(): void { @@ -817,6 +822,32 @@ export class ViewStore { this.project.removePage(page); } + @Mobx.action + public save(): void { + const savedProjects = this.getSavedProjects(); + const savedProject = savedProjects[savedProjects.length - 1]; + + if (savedProject && Model.Project.isEqual(savedProject, this.project.toDisk())) { + return; + } + + if (this.project) { + const serializedProject = this.project.toJSON(); + this.addSavedProject(this.project); + + const payload = { + path: this.project.getPath(), + project: serializedProject + }; + + Sender.send({ + id: uuid.v4(), + payload, + type: ServerMessageType.Save + }); + } + } + @Mobx.action public setActiveAppView(appView: Types.AlvaView): void { this.app.setActiveView(appView);