diff --git a/apps/web/packages/platform/implementations/WebTemporaryFiles.ts b/apps/web/packages/platform/implementations/WebTemporaryFiles.ts index 3cc774f5..24839ff8 100644 --- a/apps/web/packages/platform/implementations/WebTemporaryFiles.ts +++ b/apps/web/packages/platform/implementations/WebTemporaryFiles.ts @@ -20,7 +20,7 @@ export class WebTemporaryFiles implements TemporaryFiles { public exists = async () => { const storage = await renderer.getLocalStorage(); - return !!storage.getItem(this.temporaryFileKey); + return !!(await storage.getItem(this.temporaryFileKey)); }; public delete = (): void => { renderer diff --git a/packages/common/main/files/UnsavedDataManager.ts b/packages/common/main/files/UnsavedDataManager.ts index d95692af..b40a945c 100644 --- a/packages/common/main/files/UnsavedDataManager.ts +++ b/packages/common/main/files/UnsavedDataManager.ts @@ -31,7 +31,14 @@ export class UnsavedDataManager implements Manager { private checkForUnsavedData = async () => { this.logger.verbose('Checking for unsaved data...'); - if (await this.temporaryFiles.exists()) { + const hasTemporaryData = await this.temporaryFiles.exists(); + const hasUnsavedData = + hasTemporaryData && + this.fileHistory.isNonEmptyHistory( + JSON.parse(await this.temporaryFiles.get()) + ); + + if (hasUnsavedData) { this.logger.verbose('Unsaved data found.'); this.rendererDelegate.send('show-dialog', { type: 'alert', diff --git a/packages/common/main/files/extensions/FileDataExtension.ts b/packages/common/main/files/extensions/FileDataExtension.ts index 43221fd2..a0087794 100644 --- a/packages/common/main/files/extensions/FileDataExtension.ts +++ b/packages/common/main/files/extensions/FileDataExtension.ts @@ -7,6 +7,19 @@ export interface VersionedExtensionData { data?: T; } +export const onVersion = ( + extensionData: VersionedExtensionData | null, + handlers: { [version: number]: () => R; invalid: () => R } +): R => { + const version = extensionData?.version; + + if (version && version in handlers) { + return handlers[version](); + } else { + return handlers.invalid(); + } +}; + export interface FileDataExtension< KeyT extends FileDataExtensionKey = FileDataExtensionKey > { diff --git a/packages/common/main/history/FileHistory.ts b/packages/common/main/history/FileHistory.ts index 67d374ba..86caed36 100644 --- a/packages/common/main/history/FileHistory.ts +++ b/packages/common/main/history/FileHistory.ts @@ -1,5 +1,6 @@ import { FileDataExtension, + onVersion, VersionedExtensionData, } from '@lyricistant/common/files/extensions/FileDataExtension'; import { diff_match_patch, patch_obj as Patch } from 'diff-match-patch'; @@ -32,13 +33,26 @@ export class FileHistory implements FileDataExtension<'history'> { extensionData: VersionedExtensionData | null ): void => { this.lastKnownLyrics = ''; - if (extensionData && extensionData.version === 1) { - this.loadV1(extensionData.data); - } else { - this.delta = []; - } + onVersion(extensionData, { + 1: () => (this.delta = this.loadV1(extensionData.data)), + invalid: () => (this.delta = []), + }); }; + public isNonEmptyHistory = ( + extensionData: VersionedExtensionData | null + ): boolean => + onVersion(extensionData, { + 1: () => { + const history = this.loadV1(extensionData.data); + + return ( + history.length > 0 && history.some((data) => data.patches.length > 0) + ); + }, + invalid: () => false, + }); + public add = (lyrics: string) => { const newPatches = this.differ.patch_make(this.lastKnownLyrics, lyrics); this.delta.push({ @@ -63,11 +77,11 @@ export class FileHistory implements FileDataExtension<'history'> { return this.lastKnownLyrics; }; - private loadV1 = (data: string) => { + private loadV1 = (data: string): HistoryData[] => { if (data.trim().length === 0) { - this.delta = []; + return []; } else { - this.delta = JSON.parse(data); + return JSON.parse(data); } }; }