'use client'; import { useCodeMirror, useRouter } from '@/hooks'; import { basicDark } from '@/lib/codemirror'; import { indentWithTab } from '@codemirror/commands'; import { markdown, markdownLanguage } from '@codemirror/lang-markdown'; import { languages } from '@codemirror/language-data'; import { Compartment, EditorState, Text } from '@codemirror/state'; import { EditorView, keymap } from '@codemirror/view'; import { basicSetup } from 'codemirror'; import { FormEvent, useEffect, useState } from 'react'; import { Doc, Id } from '../../convex/_generated/dataModel'; import PostContent from './PostContent'; export type SubmitActionParams = { clerkUserId: string; parentPostId?: Id<'posts'>; post?: Doc<'posts'>; currentDoc: string[]; }; export default function Editor({ clerkUserId, parentPostId, post, submitAction, autofocus = true, }: { clerkUserId: string; parentPostId?: Id<'posts'>; post?: Doc<'posts'>; submitAction: ({ clerkUserId, parentPostId, post, currentDoc, }: SubmitActionParams) => Promise; autofocus?: boolean; }) { const editorTheme = new Compartment(); const [currentDoc, setCurrentDoc] = useState(post?.content ?? ['']); const router = useRouter(); const [creatingOrUpdating, setCreatingOrUpdating] = useState(false); const extensions = [ basicSetup, markdown({ base: markdownLanguage, codeLanguages: languages }), EditorState.tabSize.of(2), editorTheme.of(basicDark), keymap.of([indentWithTab]), EditorView.updateListener.of(vu => { setCurrentDoc(vu.state.doc.toJSON()); }), EditorView.lineWrapping, ]; const [mode, setMode] = useState<'write' | 'preview'>('write'); const { editorRef, editorView } = useCodeMirror({ doc: currentDoc, extensions, }); useEffect(() => { if (editorView !== null && autofocus) { editorView.focus(); } }, [autofocus, editorView]); async function handleSubmit(e: FormEvent) { e.preventDefault(); try { setCreatingOrUpdating(true); await submitAction({ clerkUserId, parentPostId, post, currentDoc, }); } catch (error) { console.log(error); } finally { console.log('here'); setCreatingOrUpdating(false); setCurrentDoc(['']); editorView?.dispatch({ changes: { from: 0, to: editorView.state.doc.length, insert: '' }, }); } } return (
); }