"use client" import { forwardRef, useId, useImperativeHandle, useMemo, useRef, } from "react" import { Maximize2Icon, Minimize2Icon } from "lucide-react" import { MdEditor, NormalToolbar, type ExposeParam } from "md-editor-rt" import { useTheme } from "next-themes" import "./markdown-editor.css" import { EditorModeSwitch } from "./editor-mode-switch" import type { ContentMode, UploadImageHandler } from "./types" export type MarkdownEditorRef = { focus: () => void } type MarkdownEditorProps = { value: string onChange: (nextValue: string) => void mode: ContentMode allowedModes: ReadonlyArray onModeChange: (nextMode: ContentMode) => void fullscreen: boolean onToggleFullscreen: () => void placeholder?: string disabled?: boolean onUploadImage?: UploadImageHandler height: string } export const MarkdownEditor = forwardRef( function MarkdownEditor( { value, onChange, mode, allowedModes, onModeChange, fullscreen, onToggleFullscreen, placeholder = "", disabled = false, onUploadImage, height, }, ref ) { const editorId = useId() const editorRef = useRef(null) const { resolvedTheme } = useTheme() const defToolbars = useMemo( () => [ , {fullscreen ? ( ) : ( )} , ], [allowedModes, disabled, fullscreen, mode, onModeChange, onToggleFullscreen] ) useImperativeHandle(ref, () => ({ focus() { editorRef.current?.focus() }, })) return (
{ const uploadedUrls: string[] = [] for (const file of files) { const uploaded = await onUploadImage(file) if (uploaded?.url) { uploadedUrls.push(uploaded.url) } } callback(uploadedUrls) } : undefined } />
) } )