From c6e4c2fcf5307a04a106a401460108b3fa7b3bec Mon Sep 17 00:00:00 2001 From: Antonella Sgarlatta Date: Mon, 17 May 2021 16:45:00 -0300 Subject: [PATCH] fix: note flickering and multiple selection staying enabled after browser shortcut --- app/assets/javascripts/services/ioService.ts | 21 +++++++++++++------ .../javascripts/views/notes/notes_view.ts | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/services/ioService.ts b/app/assets/javascripts/services/ioService.ts index 5138fbb85..cbbb0de21 100644 --- a/app/assets/javascripts/services/ioService.ts +++ b/app/assets/javascripts/services/ioService.ts @@ -37,17 +37,20 @@ export class IOService { constructor(private isMac: boolean) { window.addEventListener('keydown', this.handleKeyDown); window.addEventListener('keyup', this.handleKeyUp); + window.addEventListener('blur', this.handleWindowBlur); } public deinit() { this.observers.length = 0; window.removeEventListener('keydown', this.handleKeyDown); window.removeEventListener('keyup', this.handleKeyUp); + window.removeEventListener('blur', this.handleWindowBlur); (this.handleKeyDown as unknown) = undefined; (this.handleKeyUp as unknown) = undefined; + (this.handleWindowBlur as unknown) = undefined; } - handleKeyDown = (event: KeyboardEvent) => { + handleKeyDown = (event: KeyboardEvent): void => { for (const modifier of this.modifiersForEvent(event)) { switch (modifier) { case KeyboardModifier.Meta: { @@ -71,14 +74,20 @@ export class IOService { this.notifyObserver(event, KeyboardKeyEvent.Down); }; - handleKeyUp = (event: KeyboardEvent) => { + handleKeyUp = (event: KeyboardEvent): void => { for (const modifier of this.modifiersForEvent(event)) { this.activeModifiers.delete(modifier); } this.notifyObserver(event, KeyboardKeyEvent.Up); }; - modifiersForEvent(event: KeyboardEvent) { + handleWindowBlur = (): void => { + for (const modifier of this.activeModifiers) { + this.activeModifiers.delete(modifier); + } + }; + + modifiersForEvent(event: KeyboardEvent): KeyboardModifier[] { const allModifiers = Object.values(KeyboardModifier); const eventModifiers = allModifiers.filter((modifier) => { // For a modifier like ctrlKey, must check both event.ctrlKey and event.key. @@ -103,7 +112,7 @@ export class IOService { event: KeyboardEvent, key: KeyboardKey | string, modifiers: KeyboardModifier[] = [] - ) { + ): boolean { const eventModifiers = this.modifiersForEvent(event); if (eventModifiers.length !== modifiers.length) { return false; @@ -122,7 +131,7 @@ export class IOService { return key.toLowerCase() === event.key.toLowerCase(); } - notifyObserver(event: KeyboardEvent, keyEvent: KeyboardKeyEvent) { + notifyObserver(event: KeyboardEvent, keyEvent: KeyboardKeyEvent): void { const target = event.target as HTMLElement; for (const observer of this.observers) { if (observer.element && event.target !== observer.element) { @@ -162,7 +171,7 @@ export class IOService { } } - addKeyObserver(observer: KeyboardObserver) { + addKeyObserver(observer: KeyboardObserver): () => void { this.observers.push(observer); return () => { removeFromArray(this.observers, observer); diff --git a/app/assets/javascripts/views/notes/notes_view.ts b/app/assets/javascripts/views/notes/notes_view.ts index b7453b9b7..31a565bfc 100644 --- a/app/assets/javascripts/views/notes/notes_view.ts +++ b/app/assets/javascripts/views/notes/notes_view.ts @@ -278,7 +278,7 @@ class NotesViewCtrl extends PureViewCtrl { const discarded = activeNote.deleted || activeNote.trashed; if (discarded && !this.appState?.selectedTag?.isTrashTag) { this.selectNextOrCreateNew(); - } else { + } else if (!this.state.selectedNotes[activeNote.uuid]) { this.selectNote(activeNote); } } else {