53 lines
1.5 KiB
TypeScript
53 lines
1.5 KiB
TypeScript
import { Extension, type Editor } from "@tiptap/core"
|
|
import { Plugin, PluginKey } from "@tiptap/pm/state"
|
|
import {
|
|
docsEditFindReplace,
|
|
docsEditPastePlain,
|
|
} from "@/lib/drive/docs-edit-actions"
|
|
import type { DocsShortcutId } from "@/lib/drive/docs-keyboard-shortcuts-config"
|
|
import { useDocsKeyboardShortcutsStore } from "@/lib/stores/docs-keyboard-shortcuts-store"
|
|
|
|
const PLUGIN_KEY = new PluginKey("docsEditorShortcuts")
|
|
|
|
function runEditorShortcut(id: DocsShortcutId, editor: Editor): boolean {
|
|
switch (id) {
|
|
case "edit.redo":
|
|
return editor.commands.redo()
|
|
case "edit.pastePlain":
|
|
void docsEditPastePlain(editor)
|
|
return true
|
|
case "edit.findReplace":
|
|
docsEditFindReplace(editor)
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
/** Editor shortcuts driven by the centralized docs keyboard-shortcuts config/store. */
|
|
export const DocsEditorShortcuts = Extension.create({
|
|
name: "docsEditorShortcuts",
|
|
addProseMirrorPlugins() {
|
|
const editor = this.editor
|
|
|
|
return [
|
|
new Plugin({
|
|
key: PLUGIN_KEY,
|
|
props: {
|
|
handleKeyDown: (_view, event) => {
|
|
const id = useDocsKeyboardShortcutsStore.getState().matchEvent(
|
|
event,
|
|
(definition) =>
|
|
definition.scope === "editor" && definition.handler === "custom"
|
|
)
|
|
if (!id) return false
|
|
if (!runEditorShortcut(id, editor)) return false
|
|
event.preventDefault()
|
|
return true
|
|
},
|
|
},
|
|
}),
|
|
]
|
|
},
|
|
})
|