'use client'; import { useCodeMirror } from '@/hooks'; import { basicDark } from '@/lib/codemirror'; import { useUser } from '@clerk/nextjs'; 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 { useMutation } from 'convex/react'; import { useTheme } from 'next-themes'; import { useRouter } from 'next/navigation'; import { FormEvent, useEffect, useState } from 'react'; import { api } from '../../convex/_generated/api'; import PostContent from './PostContent'; export default function Editor() { const { user, isSignedIn } = useUser(); const { theme } = useTheme(); const editorTheme = new Compartment(); const [currentDoc, setCurrentDoc] = useState(['']); const createPost = useMutation(api.posts.createPost); const router = useRouter(); const [creating, setCreating] = useState(false); const doc = ['']; 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()); }), ]; const [mode, setMode] = useState<'write' | 'preview'>('write'); const { editorRef, editorView } = useCodeMirror({ doc, extensions }); useEffect(() => { if (editorView === null) { return; } if (theme === 'dark') { editorView.dispatch({ effects: editorTheme.reconfigure([]), }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [theme, editorView]); async function handleSubmit(e: FormEvent) { e.preventDefault(); try { if (isSignedIn !== true) { router.push('/login'); return; } setCreating(true); const result = await createPost({ clerkUserId: user.id, content: currentDoc, }); switch (result) { case 'USER_NOT_FOUND': case 'USER_NOT_AUTHORIZED': case 'CANNOT_POST_ON_BEHALF_OF_ANOTHER_USER': throw Error('Unable to create post'); default: router.push('/'); return; } } catch (error) { console.log(error); } finally { setCreating(false); } } return (
); }