chore: fix keyboard shortcut priority

This commit is contained in:
Aman Harwara
2023-05-04 22:25:58 +05:30
parent 9fa6919618
commit c7d28d2b2f
3 changed files with 21 additions and 9 deletions

View File

@@ -1,5 +1,4 @@
import { Environment, Platform } from '@standardnotes/snjs' import { Environment, Platform } from '@standardnotes/snjs'
import { removeFromArray } from '@standardnotes/utils'
import { eventMatchesKeyAndModifiers } from './eventMatchesKeyAndModifiers' import { eventMatchesKeyAndModifiers } from './eventMatchesKeyAndModifiers'
import { KeyboardCommand } from './KeyboardCommands' import { KeyboardCommand } from './KeyboardCommands'
import { KeyboardKeyEvent } from './KeyboardKeyEvent' import { KeyboardKeyEvent } from './KeyboardKeyEvent'
@@ -10,7 +9,7 @@ import { getKeyboardShortcuts } from './getKeyboardShortcuts'
export class KeyboardService { export class KeyboardService {
readonly activeModifiers = new Set<KeyboardModifier>() readonly activeModifiers = new Set<KeyboardModifier>()
private commandHandlers: KeyboardCommandHandler[] = [] private commandHandlers = new Set<KeyboardCommandHandler>()
private commandMap = new Map<KeyboardCommand, KeyboardShortcut>() private commandMap = new Map<KeyboardCommand, KeyboardShortcut>()
constructor(private platform: Platform, environment: Environment) { constructor(private platform: Platform, environment: Environment) {
@@ -29,7 +28,7 @@ export class KeyboardService {
} }
public deinit() { public deinit() {
this.commandHandlers.length = 0 this.commandHandlers.clear()
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) window.removeEventListener('blur', this.handleWindowBlur)
@@ -130,7 +129,7 @@ export class KeyboardService {
private handleCommand(command: KeyboardCommand, event: KeyboardEvent, keyEvent: KeyboardKeyEvent): void { private handleCommand(command: KeyboardCommand, event: KeyboardEvent, keyEvent: KeyboardKeyEvent): void {
const target = event.target as HTMLElement const target = event.target as HTMLElement
for (const observer of this.commandHandlers) { for (const observer of Array.from(this.commandHandlers).reverse()) {
if (observer.command !== command) { if (observer.command !== command) {
continue continue
} }
@@ -166,7 +165,7 @@ export class KeyboardService {
} }
public triggerCommand(command: KeyboardCommand, data?: unknown): void { public triggerCommand(command: KeyboardCommand, data?: unknown): void {
for (const observer of this.commandHandlers) { for (const observer of Array.from(this.commandHandlers).reverse()) {
if (observer.command !== command) { if (observer.command !== command) {
continue continue
} }
@@ -186,13 +185,12 @@ export class KeyboardService {
} }
addCommandHandler(observer: KeyboardCommandHandler): () => void { addCommandHandler(observer: KeyboardCommandHandler): () => void {
this.commandHandlers.push(observer) this.commandHandlers.add(observer)
const thislessObservers = this.commandHandlers
return () => { return () => {
observer.onKeyDown = undefined observer.onKeyDown = undefined
observer.onKeyDown = undefined observer.onKeyDown = undefined
removeFromArray(thislessObservers, observer) this.commandHandlers.delete(observer)
} }
} }

View File

@@ -93,7 +93,7 @@ const EditorWidthSelectionModal = ({
command: ESCAPE_COMMAND, command: ESCAPE_COMMAND,
onKeyDown() { onKeyDown() {
close() close()
return return true
}, },
}) })
}, [application.keyboardService, close]) }, [application.keyboardService, close])

View File

@@ -9,6 +9,8 @@ import { useAndroidBackHandler } from '@/NativeMobileWeb/useAndroidBackHandler'
import Modal from '../Modal/Modal' import Modal from '../Modal/Modal'
import { classNames } from '@standardnotes/snjs' import { classNames } from '@standardnotes/snjs'
import { isIOS } from '@/Utils' import { isIOS } from '@/Utils'
import { useCommandService } from '../CommandProvider'
import { ESCAPE_COMMAND } from '@standardnotes/ui-services'
const PreferencesView: FunctionComponent<PreferencesProps> = ({ const PreferencesView: FunctionComponent<PreferencesProps> = ({
application, application,
@@ -17,6 +19,8 @@ const PreferencesView: FunctionComponent<PreferencesProps> = ({
userProvider, userProvider,
mfaProvider, mfaProvider,
}) => { }) => {
const commandService = useCommandService()
const menu = useMemo( const menu = useMemo(
() => new PreferencesMenu(application, viewControllerManager.enableUnfinishedFeatures), () => new PreferencesMenu(application, viewControllerManager.enableUnfinishedFeatures),
[viewControllerManager.enableUnfinishedFeatures, application], [viewControllerManager.enableUnfinishedFeatures, application],
@@ -42,6 +46,16 @@ const PreferencesView: FunctionComponent<PreferencesProps> = ({
} }
}, [addAndroidBackHandler, closePreferences]) }, [addAndroidBackHandler, closePreferences])
useEffect(() => {
return commandService.addCommandHandler({
command: ESCAPE_COMMAND,
onKeyDown: () => {
closePreferences()
return true
},
})
}, [commandService, closePreferences])
return ( return (
<Modal <Modal
close={closePreferences} close={closePreferences}