11import React , { useState , useRef , useImperativeHandle } from 'react' ;
22import { markdown , markdownLanguage } from '@codemirror/lang-markdown' ;
33import { languages } from '@codemirror/language-data' ;
4- import { EditorView } from '@codemirror/view' ;
4+ import { EditorView , ViewUpdate } from '@codemirror/view' ;
55import CodeMirror , { ReactCodeMirrorProps , ReactCodeMirrorRef } from '@uiw/react-codemirror' ;
6- import MarkdownPreview , { MarkdownPreviewProps , MarkdownPreviewRef } from '@uiw/react-markdown-preview' ;
6+ import MarkdownPreview , { MarkdownPreviewProps } from '@uiw/react-markdown-preview' ;
77import ToolBar , { IToolBarProps } from './components/ToolBar' ;
88import { getCommands , getModeCommands } from './commands' ;
99import { defaultTheme } from './theme' ;
1010import './index.less' ;
1111
1212export * from './commands' ;
13+ export * from '@uiw/react-markdown-preview' ;
1314
1415export const scrollerStyle = EditorView . theme ( {
1516 '&.cm-editor, & .cm-scroller' : {
@@ -29,7 +30,7 @@ export interface IMarkdownEditor extends ReactCodeMirrorProps {
2930 /** Option to hide the tool bar. */
3031 hideToolbar ?: boolean ;
3132 /** Override the default preview component */
32- renderPreview ?: ( props : MarkdownPreviewProps , visible : boolean ) => React . ReactNode ;
33+ renderPreview ?: ( props : MarkdownPreviewProps , initVisible : boolean ) => React . ReactNode ;
3334 /** Tool display settings. */
3435 toolbars ?: IToolBarProps [ 'toolbars' ] ;
3536 /** Tool display settings. */
@@ -40,15 +41,15 @@ export interface IMarkdownEditor extends ReactCodeMirrorProps {
4041
4142export interface ToolBarProps {
4243 editor : React . RefObject < ReactCodeMirrorRef > ;
43- preview : React . RefObject < MarkdownPreviewRef > ;
44+ preview : React . RefObject < HTMLDivElement > ;
4445 container : React . RefObject < HTMLDivElement > ;
4546 containerEditor : React . RefObject < HTMLDivElement > ;
4647 editorProps : IMarkdownEditor ;
4748}
4849
4950export interface MarkdownEditorRef {
5051 editor : React . RefObject < ReactCodeMirrorRef > ;
51- preview ? : React . RefObject < MarkdownPreviewRef > | null ;
52+ preview : React . RefObject < HTMLDivElement > | null ;
5253}
5354
5455export default React . forwardRef < MarkdownEditorRef , IMarkdownEditor > ( MarkdownEditor ) ;
@@ -73,22 +74,22 @@ function MarkdownEditor(
7374 } = props ;
7475 const [ value , setValue ] = useState ( props . value || '' ) ;
7576 const codeMirror = useRef < ReactCodeMirrorRef > ( null ) ;
76- const previewContainer = useRef < MarkdownPreviewRef > ( null ) ;
7777 const container = useRef < HTMLDivElement > ( null ) ;
7878 const containerEditor = useRef < HTMLDivElement > ( null ) ;
79+ const preview = useRef < HTMLDivElement > ( null ) ;
7980
8081 useImperativeHandle (
8182 ref ,
8283 ( ) => ( {
8384 editor : codeMirror ,
84- preview : previewContainer ,
85+ preview : preview ,
8586 } ) ,
86- [ codeMirror , previewContainer ] ,
87+ [ codeMirror ] ,
8788 ) ;
8889
8990 const toolBarProps : ToolBarProps = {
91+ preview : preview ,
9092 editor : codeMirror ,
91- preview : previewContainer ,
9293 container : container ,
9394 containerEditor : containerEditor ,
9495 editorProps : props ,
@@ -99,10 +100,15 @@ function MarkdownEditor(
99100 scrollerStyle ,
100101 ...extensions ,
101102 ] ;
102- previewProps [ 'className' ] = `${ prefixCls } -preview` ;
103+ const clsPreview = `${ prefixCls } -preview` ;
104+ const cls = [ prefixCls , 'wmde-markdown-var' , className ] . filter ( Boolean ) . join ( ' ' ) ;
103105 previewProps [ 'source' ] = value ;
106+ const handleChange = ( value : string , viewUpdate : ViewUpdate ) => {
107+ setValue ( value ) ;
108+ onChange && onChange ( value , viewUpdate ) ;
109+ } ;
104110 return (
105- < div className = { ` ${ prefixCls || '' } wmde-markdown-var ${ className || '' } ` } ref = { container } >
111+ < div className = { cls } ref = { container } >
106112 { hideToolbar && (
107113 < div >
108114 < ToolBar { ...toolBarProps } toolbars = { toolbarsMode } mode />
@@ -118,18 +124,17 @@ function MarkdownEditor(
118124 extensions = { extensionsData }
119125 height = { height }
120126 ref = { codeMirror }
121- onChange = { ( value , viewUpdate ) => {
122- setValue ( value ) ;
123- onChange && onChange ( value , viewUpdate ) ;
124- } }
127+ onChange = { handleChange }
125128 />
126129 ) }
127130 </ div >
128- { renderPreview ? (
129- renderPreview ( previewProps , ! ! visible )
130- ) : (
131- < MarkdownPreview { ...previewProps } data-visible = { ! ! visible } ref = { previewContainer } />
132- ) }
131+ < div className = { clsPreview } ref = { preview } >
132+ { renderPreview ? (
133+ renderPreview ( previewProps , ! ! visible )
134+ ) : (
135+ < MarkdownPreview { ...previewProps } data-visible = { ! ! visible } />
136+ ) }
137+ </ div >
133138 </ div >
134139 </ div >
135140 ) ;
0 commit comments