import React, { useCallback, useRef, useState } from 'react' import ReactMarkdown from 'react-markdown' function ToolbarButton({ title, onClick, children }) { return ( ) } export default function MarkdownEditor({ id, value, onChange, placeholder, error, rows = 5 }) { const [tab, setTab] = useState('write') const textareaRef = useRef(null) const wrapSelection = useCallback((before, after) => { const textarea = textareaRef.current if (!textarea) return const current = String(value || '') const start = textarea.selectionStart const end = textarea.selectionEnd const selected = current.slice(start, end) const replacement = before + (selected || 'text') + after const next = current.slice(0, start) + replacement + current.slice(end) onChange?.(next) requestAnimationFrame(() => { textarea.focus() textarea.selectionStart = selected ? start + replacement.length : start + before.length textarea.selectionEnd = selected ? start + replacement.length : start + before.length + 4 }) }, [onChange, value]) const prefixLines = useCallback((prefix) => { const textarea = textareaRef.current if (!textarea) return const current = String(value || '') const start = textarea.selectionStart const end = textarea.selectionEnd const selected = current.slice(start, end) const lines = (selected || '').split('\n') const normalized = (lines.length ? lines : ['']).map((line) => `${prefix}${line}`).join('\n') const next = current.slice(0, start) + normalized + current.slice(end) onChange?.(next) requestAnimationFrame(() => { textarea.focus() textarea.selectionStart = start textarea.selectionEnd = start + normalized.length }) }, [onChange, value]) const insertLink = useCallback(() => { const textarea = textareaRef.current if (!textarea) return const current = String(value || '') const start = textarea.selectionStart const end = textarea.selectionEnd const selected = current.slice(start, end) const replacement = selected && /^https?:\/\//i.test(selected) ? `[link](${selected})` : `[${selected || 'link'}](https://)` const next = current.slice(0, start) + replacement + current.slice(end) onChange?.(next) requestAnimationFrame(() => { textarea.focus() }) }, [onChange, value]) const handleKeyDown = useCallback((event) => { const withModifier = event.ctrlKey || event.metaKey if (!withModifier) return switch (event.key.toLowerCase()) { case 'b': event.preventDefault() wrapSelection('**', '**') break case 'i': event.preventDefault() wrapSelection('*', '*') break case 'k': event.preventDefault() insertLink() break case 'e': event.preventDefault() wrapSelection('`', '`') break default: break } }, [insertLink, wrapSelection]) return (