mirror of https://github.com/usememos/memos
feat: impl list syntax auto complete to editor
parent
436a6cb084
commit
6d10251cbd
@ -0,0 +1,3 @@
|
|||||||
|
import useAutoComplete from "./useAutoComplete";
|
||||||
|
|
||||||
|
export { useAutoComplete };
|
@ -0,0 +1,40 @@
|
|||||||
|
import { last } from "lodash-es";
|
||||||
|
import { useEffect } from "react";
|
||||||
|
import { NodeType, OrderedListNode, TaskListNode, UnorderedListNode } from "@/types/node";
|
||||||
|
import { EditorRefActions } from "../Editor";
|
||||||
|
|
||||||
|
const useAutoComplete = (actions: EditorRefActions) => {
|
||||||
|
useEffect(() => {
|
||||||
|
const editor = actions.getEditor();
|
||||||
|
if (!editor) return;
|
||||||
|
|
||||||
|
editor.addEventListener("keydown", (event) => {
|
||||||
|
if (event.key === "Enter") {
|
||||||
|
const cursorPosition = actions.getCursorPosition();
|
||||||
|
const prevContent = actions.getContent().substring(0, cursorPosition);
|
||||||
|
const lastNode = last(window.parse(prevContent));
|
||||||
|
if (!lastNode) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let insertText = "";
|
||||||
|
if (lastNode.type === NodeType.TASK_LIST) {
|
||||||
|
const { complete } = lastNode.value as TaskListNode;
|
||||||
|
insertText = complete ? "- [x] " : "- [ ] ";
|
||||||
|
} else if (lastNode.type === NodeType.UNORDERED_LIST) {
|
||||||
|
const { symbol } = lastNode.value as UnorderedListNode;
|
||||||
|
insertText = `${symbol} `;
|
||||||
|
} else if (lastNode.type === NodeType.ORDERED_LIST) {
|
||||||
|
const { number } = lastNode.value as OrderedListNode;
|
||||||
|
insertText = `${Number(number) + 1}. `;
|
||||||
|
}
|
||||||
|
if (insertText) {
|
||||||
|
actions.insertText(`\n${insertText}`);
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default useAutoComplete;
|
Loading…
Reference in New Issue