From 8f4f1887330ac2ed071f8a2a7a1f0120319d12e2 Mon Sep 17 00:00:00 2001 From: Mo Date: Wed, 12 Jan 2022 11:27:10 -0600 Subject: [PATCH] fix: base keyboard modifier state on latest event --- app/assets/javascripts/services/ioService.ts | 42 ++++++++----- .../ui_models/app_state/notes_state.ts | 59 ++++++++++--------- 2 files changed, 56 insertions(+), 45 deletions(-) diff --git a/app/assets/javascripts/services/ioService.ts b/app/assets/javascripts/services/ioService.ts index 5883ba1aa..315c892fa 100644 --- a/app/assets/javascripts/services/ioService.ts +++ b/app/assets/javascripts/services/ioService.ts @@ -87,27 +87,37 @@ export class IOService { this.activeModifiers.delete(modifier); }; - handleKeyDown = (event: KeyboardEvent): void => { - for (const modifier of this.modifiersForEvent(event)) { - this.addActiveModifier(modifier); - } - this.notifyObserver(event, KeyboardKeyEvent.Down); - }; - - handleComponentKeyDown = (modifier: KeyboardModifier | undefined): void => { + public handleComponentKeyDown = ( + modifier: KeyboardModifier | undefined + ): void => { this.addActiveModifier(modifier); }; - handleKeyUp = (event: KeyboardEvent): void => { - for (const modifier of this.modifiersForEvent(event)) { - this.removeActiveModifier(modifier); - } + public handleComponentKeyUp = ( + modifier: KeyboardModifier | undefined + ): void => { + this.removeActiveModifier(modifier); + }; + + private handleKeyDown = (event: KeyboardEvent): void => { + this.updateAllModifiersFromEvent(event); + this.notifyObserver(event, KeyboardKeyEvent.Down); + }; + + private handleKeyUp = (event: KeyboardEvent): void => { + this.updateAllModifiersFromEvent(event); this.notifyObserver(event, KeyboardKeyEvent.Up); }; - handleComponentKeyUp = (modifier: KeyboardModifier | undefined): void => { - this.removeActiveModifier(modifier); - }; + private updateAllModifiersFromEvent(event: KeyboardEvent): void { + for (const modifier of Object.values(KeyboardModifier)) { + if (event.getModifierState(modifier)) { + this.addActiveModifier(modifier); + } else { + this.removeActiveModifier(modifier); + } + } + } handleWindowBlur = (): void => { for (const modifier of this.activeModifiers) { @@ -136,7 +146,7 @@ export class IOService { return eventModifiers; } - eventMatchesKeyAndModifiers( + private eventMatchesKeyAndModifiers( event: KeyboardEvent, key: KeyboardKey | string, modifiers: KeyboardModifier[] = [] diff --git a/app/assets/javascripts/ui_models/app_state/notes_state.ts b/app/assets/javascripts/ui_models/app_state/notes_state.ts index d4ec3db1e..496cedaf0 100644 --- a/app/assets/javascripts/ui_models/app_state/notes_state.ts +++ b/app/assets/javascripts/ui_models/app_state/notes_state.ts @@ -114,42 +114,43 @@ export class NotesState { async selectNote(uuid: UuidString, userTriggered?: boolean): Promise { const note = this.application.findItem(uuid) as SNNote; + if (!note) { + return; + } const hasMeta = this.io.activeModifiers.has(KeyboardModifier.Meta); const hasCtrl = this.io.activeModifiers.has(KeyboardModifier.Ctrl); const hasShift = this.io.activeModifiers.has(KeyboardModifier.Shift); - if (note) { - if (userTriggered && (hasMeta || hasCtrl)) { - if (this.selectedNotes[uuid]) { - delete this.selectedNotes[uuid]; - } else if (await this.application.authorizeNoteAccess(note)) { - runInAction(() => { - this.selectedNotes[uuid] = note; - this.lastSelectedNote = note; - }); - } - } else if (userTriggered && hasShift) { - await this.selectNotesRange(note); - } else { - const shouldSelectNote = - this.selectedNotesCount > 1 || !this.selectedNotes[uuid]; - if ( - shouldSelectNote && - (await this.application.authorizeNoteAccess(note)) - ) { - runInAction(() => { - this.selectedNotes = { - [note.uuid]: note, - }; - this.lastSelectedNote = note; - }); - } + if (userTriggered && (hasMeta || hasCtrl)) { + if (this.selectedNotes[uuid]) { + delete this.selectedNotes[uuid]; + } else if (await this.application.authorizeNoteAccess(note)) { + runInAction(() => { + this.selectedNotes[uuid] = note; + this.lastSelectedNote = note; + }); } + } else if (userTriggered && hasShift) { + await this.selectNotesRange(note); + } else { + const shouldSelectNote = + this.selectedNotesCount > 1 || !this.selectedNotes[uuid]; + if ( + shouldSelectNote && + (await this.application.authorizeNoteAccess(note)) + ) { + runInAction(() => { + this.selectedNotes = { + [note.uuid]: note, + }; + this.lastSelectedNote = note; + }); + } + } - if (this.selectedNotesCount === 1) { - await this.openNote(Object.keys(this.selectedNotes)[0]); - } + if (this.selectedNotesCount === 1) { + await this.openNote(Object.keys(this.selectedNotes)[0]); } }