-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscopes-and-when.ts
More file actions
58 lines (50 loc) · 1.25 KB
/
scopes-and-when.ts
File metadata and controls
58 lines (50 loc) · 1.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import { createShortcuts, type ShortcutRuntime } from 'powerkeys'
export type EditorState = {
modalOpen: boolean
hasSelection: boolean
readOnly: boolean
}
export type EditorActions = {
closeEditor(): void
closeModal(): void
copySelection(): void
}
export function mountEditorShortcuts(
target: HTMLElement,
state: EditorState,
actions: EditorActions,
): {
shortcuts: ShortcutRuntime
syncState(nextState: Partial<EditorState>): void
} {
const shortcuts = createShortcuts({
target,
getActiveScopes: () => (state.modalOpen ? ['modal', 'editor'] : ['editor']),
})
shortcuts.bind({
combo: 'Escape',
scope: 'editor',
handler: () => actions.closeEditor(),
})
shortcuts.bind({
combo: 'Escape',
scope: 'modal',
priority: 10,
handler: () => actions.closeModal(),
})
shortcuts.bind({
combo: 'c',
scope: 'editor',
when: 'editor.hasSelection && !editor.readOnly',
handler: () => actions.copySelection(),
})
const syncState = (nextState: Partial<EditorState>): void => {
Object.assign(state, nextState)
shortcuts.batchContext({
'editor.hasSelection': state.hasSelection,
'editor.readOnly': state.readOnly,
})
}
syncState(state)
return { shortcuts, syncState }
}