Skip to content

Commit 58275e8

Browse files
committed
fix: Fix renderPreview props issue.
1 parent c36b4e3 commit 58275e8

File tree

4 files changed

+45
-40
lines changed

4 files changed

+45
-40
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -224,12 +224,12 @@ export interface IMarkdownEditor extends ReactCodeMirrorProps {
224224
visibleEditor?: boolean;
225225
/** Option to hide the tool bar. */
226226
hideToolbar?: boolean;
227+
/** Override the default preview component */
228+
renderPreview?: (props: MarkdownPreviewProps, initVisible: boolean) => React.ReactNode;
227229
/** Tool display settings. */
228230
toolbars?: IToolBarProps['toolbars'];
229231
/** Tool display settings. */
230232
toolbarsMode?: IToolBarProps['toolbars'];
231-
/** Override the default preview component */
232-
renderPreview?: (props: MarkdownPreviewProps, visible: boolean) => React.ReactNode;
233233
/** [@uiw/react-markdown-preview](https://github.com/uiwjs/react-markdown-preview#options-props) options */
234234
previewProps?: MarkdownPreviewProps;
235235
}
@@ -240,8 +240,8 @@ import React from 'react';
240240
import { ReactCodeMirrorRef } from '@uiw/react-codemirror';
241241
import { MarkdownPreviewProps, MarkdownPreviewRef } from '@uiw/react-markdown-preview';
242242
export interface ToolBarProps {
243-
editor?: ReactCodeMirrorRef;
244-
preview: React.RefObject<MarkdownPreviewRef>;
243+
editor: React.RefObject<ReactCodeMirrorRef>;
244+
preview: React.RefObject<HTMLDivElement>;
245245
container: React.RefObject<HTMLDivElement>;
246246
containerEditor: React.RefObject<HTMLDivElement>;
247247
editorProps: IMarkdownEditor;

src/commands/preview.tsx

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,34 @@ import { IMarkdownEditor, ToolBarProps } from '../';
44

55
const Preview: React.FC<{ command: ICommand; editorProps: IMarkdownEditor & ToolBarProps }> = (props) => {
66
const { editorProps } = props;
7-
const { preview, containerEditor } = editorProps;
7+
const { containerEditor, preview } = editorProps;
88
const [visible, setVisible] = useState(props.editorProps.visible);
99
useEffect(() => setVisible(props.editorProps.visible), [props.editorProps.visible]);
1010
useEffect(() => {
11-
if (editorProps && editorProps.preview.current) {
12-
const preview = editorProps.preview.current.mdp.current;
11+
if (preview.current) {
12+
const $preview = preview.current;
1313
if (preview) {
14-
preview.style.borderBottomRightRadius = '3px';
14+
$preview.style.borderBottomRightRadius = '3px';
1515
}
16-
17-
if (preview && visible) {
18-
preview.style.width = '50%';
19-
preview.style.overflow = 'auto';
20-
preview.style.borderLeft = '1px solid var(--color-border-muted)';
21-
preview.style.padding = '20px';
16+
if ($preview && visible) {
17+
$preview.style.width = '50%';
18+
$preview.style.overflow = 'auto';
19+
$preview.style.borderLeft = '1px solid var(--color-border-muted)';
20+
$preview.style.padding = '20px';
2221
if (containerEditor.current) {
2322
containerEditor.current.style.width = '50%';
2423
}
25-
} else if (preview) {
26-
preview.style.width = '0%';
27-
preview.style.overflow = 'hidden';
28-
preview.style.borderLeft = '0px';
29-
preview.style.padding = '0';
24+
} else if ($preview) {
25+
$preview.style.width = '0%';
26+
$preview.style.overflow = 'hidden';
27+
$preview.style.borderLeft = '0px';
28+
$preview.style.padding = '0';
3029
if (containerEditor.current) {
3130
containerEditor.current.style.width = '100%';
3231
}
3332
}
3433
}
35-
}, [preview, editorProps, visible, containerEditor]);
34+
}, [visible, containerEditor, preview]);
3635

3736
return (
3837
<button onClick={() => setVisible(!visible)} type="button" className={visible ? 'active' : ''}>

src/index.less

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
top: 0;
4848
bottom: 0;
4949
box-sizing: border-box;
50+
background-color: var(--color-canvas-default);
5051
}
5152
h1,
5253
h2,

src/index.tsx

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import React, { useState, useRef, useImperativeHandle } from 'react';
22
import { markdown, markdownLanguage } from '@codemirror/lang-markdown';
33
import { languages } from '@codemirror/language-data';
4-
import { EditorView } from '@codemirror/view';
4+
import { EditorView, ViewUpdate } from '@codemirror/view';
55
import 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';
77
import ToolBar, { IToolBarProps } from './components/ToolBar';
88
import { getCommands, getModeCommands } from './commands';
99
import { defaultTheme } from './theme';
1010
import './index.less';
1111

1212
export * from './commands';
13+
export * from '@uiw/react-markdown-preview';
1314

1415
export 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

4142
export 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

4950
export interface MarkdownEditorRef {
5051
editor: React.RefObject<ReactCodeMirrorRef>;
51-
preview?: React.RefObject<MarkdownPreviewRef> | null;
52+
preview: React.RefObject<HTMLDivElement> | null;
5253
}
5354

5455
export 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

Comments
 (0)