import React, { ComponentProps, useRef } from "react"; import { twMerge } from "tailwind-merge"; import MarkdownEditorPreviewComponent from "./MarkdownEditorPreviewComponent"; import MarkdownEditorComponent from "./MarkdownEditorComponent"; import MarkdownEditorSelectorButtons from "./MarkdownEditorSelectorButtons"; import Row from "../../layout/Row"; import Stack from "../../layout/Stack"; import AceEditor from "../../editors/AceEditor"; import useStatus from "../../hooks/useStatus"; type Props = { value?: string; setValue?: React.Dispatch>; defaultSideBySide?: boolean; changeHandler?: (content: string) => void; editorProps?: ComponentProps; maxHeight?: string; noToggleButtons?: boolean; }; export default function MarkdownEditor({ value: existingValue, setValue: setExistingValue, defaultSideBySide, changeHandler, editorProps, maxHeight: existingMaxHeight, noToggleButtons, }: Props) { const [value, setValue] = React.useState(existingValue || ``); const [sideBySide, setSideBySide] = React.useState( defaultSideBySide || false, ); const [preview, setPreview] = React.useState(false); const { refresh, setRefresh } = useStatus(); const updatingFromExtValueRef = useRef(false); const maxHeight = existingMaxHeight || "600px"; React.useEffect(() => { if (updatingFromExtValueRef.current) return; setExistingValue?.(value); changeHandler?.(value); }, [value]); React.useEffect(() => { if (!existingValue) return; updatingFromExtValueRef.current = true; setValue(existingValue); setTimeout(() => { updatingFromExtValueRef.current = false; setRefresh((prev) => prev + 1); }, 500); }, [existingValue]); return ( {!noToggleButtons && ( )} {sideBySide ? ( ) : ( {preview ? ( ) : ( )} )} ); }