Skip to content

Commit 33b54e2

Browse files
committed
migrate other Live components to fn components
1 parent 0df3e76 commit 33b54e2

File tree

4 files changed

+65
-78
lines changed

4 files changed

+65
-78
lines changed

src/components/Editor/index.js

Lines changed: 48 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,36 @@
1-
import React, { Component, Fragment } from 'react';
1+
import React, { Fragment, useEffect, useState } from 'react';
22
import PropTypes from 'prop-types';
33
import Editor from 'react-simple-code-editor';
44
import Highlight, { Prism } from 'prism-react-renderer';
55
import { theme as liveTheme } from '../../constants/theme';
66

7-
class CodeEditor extends Component {
8-
static propTypes = {
9-
code: PropTypes.string,
10-
disabled: PropTypes.bool,
11-
language: PropTypes.string,
12-
onChange: PropTypes.func,
13-
style: PropTypes.object,
14-
theme: PropTypes.object
15-
};
7+
const CodeEditor = props => {
8+
const [state, setState] = useState({
9+
code: props.code || ''
10+
});
1611

17-
static getDerivedStateFromProps(props, state) {
18-
if (props.code !== state.prevCodeProp) {
19-
return { code: props.code, prevCodeProp: props.code };
12+
useEffect(() => {
13+
if (state.prevCodeProp && props.code !== state.prevCodeProp) {
14+
setState({ code: props.code, prevCodeProp: props.code });
2015
}
16+
}, [props.code]);
2117

22-
return null;
23-
}
24-
25-
state = {
26-
code: ''
18+
const updateContent = code => {
19+
setState({ code });
2720
};
2821

29-
updateContent = code => {
30-
this.setState({ code }, () => {
31-
if (this.props.onChange) {
32-
this.props.onChange(this.state.code);
33-
}
34-
});
35-
};
22+
useEffect(() => {
23+
if (props.onChange) {
24+
props.onChange(state.code);
25+
}
26+
}, [state.code]);
3627

37-
highlightCode = code => (
28+
const highlightCode = code => (
3829
<Highlight
3930
Prism={Prism}
4031
code={code}
41-
theme={this.props.theme || liveTheme}
42-
language={this.props.language}
32+
theme={props.theme || liveTheme}
33+
language={props.language}
4334
>
4435
{({ tokens, getLineProps, getTokenProps }) => (
4536
<Fragment>
@@ -57,30 +48,36 @@ class CodeEditor extends Component {
5748
</Highlight>
5849
);
5950

60-
render() {
61-
// eslint-disable-next-line no-unused-vars
62-
const { style, theme, onChange, ...rest } = this.props;
63-
const { code } = this.state;
51+
// eslint-disable-next-line no-unused-vars
52+
const { style, theme, onChange, ...rest } = props;
53+
const { code } = state;
54+
55+
const baseTheme = theme && typeof theme.plain === 'object' ? theme.plain : {};
6456

65-
const baseTheme =
66-
theme && typeof theme.plain === 'object' ? theme.plain : {};
57+
return (
58+
<Editor
59+
value={code}
60+
padding={10}
61+
highlight={highlightCode}
62+
onValueChange={updateContent}
63+
style={{
64+
whiteSpace: 'pre',
65+
fontFamily: 'monospace',
66+
...baseTheme,
67+
...style
68+
}}
69+
{...rest}
70+
/>
71+
);
72+
};
6773

68-
return (
69-
<Editor
70-
value={code}
71-
padding={10}
72-
highlight={this.highlightCode}
73-
onValueChange={this.updateContent}
74-
style={{
75-
whiteSpace: 'pre',
76-
fontFamily: 'monospace',
77-
...baseTheme,
78-
...style
79-
}}
80-
{...rest}
81-
/>
82-
);
83-
}
84-
}
74+
CodeEditor.propTypes = {
75+
code: PropTypes.string,
76+
disabled: PropTypes.bool,
77+
language: PropTypes.string,
78+
onChange: PropTypes.func,
79+
style: PropTypes.object,
80+
theme: PropTypes.object
81+
};
8582

8683
export default CodeEditor;

src/components/Live/LiveEditor.js

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
1-
import React from 'react';
1+
import React, { useContext } from 'react';
22
import LiveContext from './LiveContext';
33
import Editor from '../Editor';
44

55
export default function LiveEditor(props) {
6+
const { code, language, theme, disabled, onChange } = useContext(LiveContext);
7+
68
return (
7-
<LiveContext.Consumer>
8-
{({ code, language, theme, disabled, onChange }) => (
9-
<Editor
10-
theme={theme}
11-
code={code}
12-
language={language}
13-
disabled={disabled}
14-
onChange={onChange}
15-
{...props}
16-
/>
17-
)}
18-
</LiveContext.Consumer>
9+
<Editor
10+
theme={theme}
11+
code={code}
12+
language={language}
13+
disabled={disabled}
14+
onChange={onChange}
15+
{...props}
16+
/>
1917
);
2018
}

src/components/Live/LiveError.js

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
import React from 'react';
1+
import React, { useContext } from 'react';
22
import LiveContext from './LiveContext';
33

44
export default function LiveError(props) {
5-
return (
6-
<LiveContext.Consumer>
7-
{({ error }) => (error ? <pre {...props}>{error}</pre> : null)}
8-
</LiveContext.Consumer>
9-
);
5+
const { error } = useContext(LiveContext);
6+
return error ? <pre {...props}>{error}</pre> : null;
107
}

src/components/Live/LivePreview.js

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
1-
import React from 'react';
1+
import React, { useContext } from 'react';
22
import PropTypes from 'prop-types';
33
import LiveContext from './LiveContext';
44

55
function LivePreview({ Component, ...rest }) {
6-
return (
7-
<Component {...rest}>
8-
<LiveContext.Consumer>
9-
{({ element: Element }) => Element && <Element />}
10-
</LiveContext.Consumer>
11-
</Component>
12-
);
6+
const { element: Element } = useContext(LiveContext);
7+
return <Component {...rest}>{Element ? <Element /> : null}</Component>;
138
}
149

1510
LivePreview.propTypes = {

0 commit comments

Comments
 (0)