一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
44 行
1.2 KiB
TypeScript
44 行
1.2 KiB
TypeScript
import CommandService from '@joplin/lib/services/CommandService';
|
|
import { useEffect } from 'react';
|
|
import type { Editor, EditorEvent } from 'tinymce';
|
|
|
|
const useKeyboardRefocusHandler = (editor: Editor) => {
|
|
useEffect(() => {
|
|
if (!editor) return () => {};
|
|
|
|
const isAtBeginningOf = (element: Node, parent: HTMLElement) => {
|
|
if (!parent.contains(element)) return false;
|
|
|
|
while (
|
|
element &&
|
|
element.parentNode !== parent &&
|
|
element.parentNode?.firstChild === element
|
|
) {
|
|
element = element.parentNode;
|
|
}
|
|
|
|
return !!element && element.parentNode?.firstChild === element;
|
|
};
|
|
|
|
const eventHandler = (event: EditorEvent<KeyboardEvent>) => {
|
|
if (!event.isDefaultPrevented() && event.key === 'ArrowUp') {
|
|
const selection = editor.selection.getRng();
|
|
if (selection.startOffset === 0 &&
|
|
selection.collapsed &&
|
|
isAtBeginningOf(selection.startContainer, editor.dom.getRoot())
|
|
) {
|
|
event.preventDefault();
|
|
void CommandService.instance().execute('focusElement', 'noteTitle');
|
|
}
|
|
}
|
|
};
|
|
|
|
editor.on('keydown', eventHandler);
|
|
return () => {
|
|
editor.off('keydown', eventHandler);
|
|
};
|
|
}, [editor]);
|
|
};
|
|
|
|
export default useKeyboardRefocusHandler;
|