fix: note flickering and multiple selection staying enabled after browser shortcut

This commit is contained in:
Antonella Sgarlatta
2021-05-17 16:45:00 -03:00
parent 4fc2c58daf
commit c6e4c2fcf5
2 changed files with 16 additions and 7 deletions

View File

@@ -37,17 +37,20 @@ export class IOService {
constructor(private isMac: boolean) { constructor(private isMac: boolean) {
window.addEventListener('keydown', this.handleKeyDown); window.addEventListener('keydown', this.handleKeyDown);
window.addEventListener('keyup', this.handleKeyUp); window.addEventListener('keyup', this.handleKeyUp);
window.addEventListener('blur', this.handleWindowBlur);
} }
public deinit() { public deinit() {
this.observers.length = 0; this.observers.length = 0;
window.removeEventListener('keydown', this.handleKeyDown); window.removeEventListener('keydown', this.handleKeyDown);
window.removeEventListener('keyup', this.handleKeyUp); window.removeEventListener('keyup', this.handleKeyUp);
window.removeEventListener('blur', this.handleWindowBlur);
(this.handleKeyDown as unknown) = undefined; (this.handleKeyDown as unknown) = undefined;
(this.handleKeyUp 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)) { for (const modifier of this.modifiersForEvent(event)) {
switch (modifier) { switch (modifier) {
case KeyboardModifier.Meta: { case KeyboardModifier.Meta: {
@@ -71,14 +74,20 @@ export class IOService {
this.notifyObserver(event, KeyboardKeyEvent.Down); this.notifyObserver(event, KeyboardKeyEvent.Down);
}; };
handleKeyUp = (event: KeyboardEvent) => { handleKeyUp = (event: KeyboardEvent): void => {
for (const modifier of this.modifiersForEvent(event)) { for (const modifier of this.modifiersForEvent(event)) {
this.activeModifiers.delete(modifier); this.activeModifiers.delete(modifier);
} }
this.notifyObserver(event, KeyboardKeyEvent.Up); 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 allModifiers = Object.values(KeyboardModifier);
const eventModifiers = allModifiers.filter((modifier) => { const eventModifiers = allModifiers.filter((modifier) => {
// For a modifier like ctrlKey, must check both event.ctrlKey and event.key. // For a modifier like ctrlKey, must check both event.ctrlKey and event.key.
@@ -103,7 +112,7 @@ export class IOService {
event: KeyboardEvent, event: KeyboardEvent,
key: KeyboardKey | string, key: KeyboardKey | string,
modifiers: KeyboardModifier[] = [] modifiers: KeyboardModifier[] = []
) { ): boolean {
const eventModifiers = this.modifiersForEvent(event); const eventModifiers = this.modifiersForEvent(event);
if (eventModifiers.length !== modifiers.length) { if (eventModifiers.length !== modifiers.length) {
return false; return false;
@@ -122,7 +131,7 @@ export class IOService {
return key.toLowerCase() === event.key.toLowerCase(); return key.toLowerCase() === event.key.toLowerCase();
} }
notifyObserver(event: KeyboardEvent, keyEvent: KeyboardKeyEvent) { notifyObserver(event: KeyboardEvent, keyEvent: KeyboardKeyEvent): void {
const target = event.target as HTMLElement; const target = event.target as HTMLElement;
for (const observer of this.observers) { for (const observer of this.observers) {
if (observer.element && event.target !== observer.element) { 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); this.observers.push(observer);
return () => { return () => {
removeFromArray(this.observers, observer); removeFromArray(this.observers, observer);

View File

@@ -278,7 +278,7 @@ class NotesViewCtrl extends PureViewCtrl<unknown, NotesCtrlState> {
const discarded = activeNote.deleted || activeNote.trashed; const discarded = activeNote.deleted || activeNote.trashed;
if (discarded && !this.appState?.selectedTag?.isTrashTag) { if (discarded && !this.appState?.selectedTag?.isTrashTag) {
this.selectNextOrCreateNew(); this.selectNextOrCreateNew();
} else { } else if (!this.state.selectedNotes[activeNote.uuid]) {
this.selectNote(activeNote); this.selectNote(activeNote);
} }
} else { } else {