"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" import { useI18n } from "@/i18n/provider" 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 t = useI18n() const editorId = useId() const editorRef = useRef(null) const { resolvedTheme } = useTheme() const showModeSwitch = allowedModes.length > 1 const defToolbars = useMemo( () => { const fullscreenToolbar = ( {fullscreen ? ( ) : ( )} ) if (!showModeSwitch) { return [fullscreenToolbar] } return [ , fullscreenToolbar, ] }, [allowedModes, disabled, fullscreen, mode, onModeChange, onToggleFullscreen, showModeSwitch, t] ) const toolbars = useMemo( () => [ ...(showModeSwitch ? [0, "-"] : []), "bold", "underline", "italic", "strikeThrough", "-", "title", "quote", "unorderedList", "orderedList", "-", "codeRow", "code", "link", "image", "-", "revoke", "next", showModeSwitch ? 1 : 0, "=", "preview", "previewOnly", ], [showModeSwitch] ) 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 } />
) } )