Skip to content

Commit 48749bc

Browse files
authored
Merge pull request #266 from FormidableLabs/jp-use-editable
switch from react-simple-code-editor to use-editable
2 parents 984f2a7 + 2265d8d commit 48749bc

File tree

5 files changed

+65
-65
lines changed

5 files changed

+65
-65
lines changed

demo/components/LiveEdit.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ const StyledPreview = styled(LivePreview)`
5757
color: black;
5858
height: auto;
5959
overflow: hidden;
60+
text-align: center;
6061
6162
${column};
6263
`;

demo/pages/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ const Container = styled.div`
1212
width: ${polished.rem(1024)};
1313
padding: ${polished.rem(20)};
1414
padding-bottom: ${polished.rem(100)};
15-
text-align: center;
1615
`;
1716

1817
const Description = styled.p`
1918
color: ${foreground};
2019
font-size: ${polished.modularScale(1)};
2120
margin-bottom: ${polished.rem(20)};
2221
margin-top: ${polished.rem(50)};
22+
text-align: center;
2323
`;
2424

2525
const componentClassExample = `

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
"dom-iterator": "^1.0.0",
2626
"prism-react-renderer": "^1.2.1",
2727
"prop-types": "^15.7.2",
28-
"react-simple-code-editor": "^0.11.0",
29-
"unescape": "^1.0.1"
28+
"unescape": "^1.0.1",
29+
"use-editable": "^2.3.3"
3030
},
3131
"devDependencies": {
3232
"@babel/core": "^7.15.0",

src/components/Editor/index.js

Lines changed: 56 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,76 @@
1-
import React, { Fragment, useEffect, useState } from "react";
1+
import React, { useEffect, useState, useRef, useCallback } from "react";
22
import PropTypes from "prop-types";
3-
import Editor from "react-simple-code-editor";
3+
import { useEditable } from "use-editable";
44
import Highlight, { Prism } from "prism-react-renderer";
55
import { theme as liveTheme } from "../../constants/theme";
66

77
const CodeEditor = (props) => {
8-
const [state, setState] = useState({
9-
code: props.code || "",
10-
});
8+
const editorRef = useRef(null);
9+
const [code, setCode] = useState(props.code || "");
1110

12-
useEffect(() => {
13-
if (state.prevCodeProp && props.code !== state.prevCodeProp) {
14-
setState({ code: props.code, prevCodeProp: props.code });
15-
}
16-
}, [props.code]);
11+
const onEditableChange = useCallback((_code) => {
12+
setCode(_code.slice(0, -1));
13+
}, []);
1714

18-
const updateContent = (code) => {
19-
setState({ code });
20-
};
15+
useEditable(editorRef, onEditableChange, {
16+
disabled: props.disabled,
17+
indentation: 2,
18+
});
2119

2220
useEffect(() => {
2321
if (props.onChange) {
24-
props.onChange(state.code);
22+
props.onChange(code);
2523
}
26-
}, [state.code]);
27-
28-
const highlightCode = (code) => (
29-
<Highlight
30-
Prism={Prism}
31-
code={code}
32-
theme={props.theme || liveTheme}
33-
language={props.language}
34-
>
35-
{({ tokens, getLineProps, getTokenProps }) => (
36-
<Fragment>
37-
{tokens.map((line, i) => (
38-
// eslint-disable-next-line react/jsx-key
39-
<div {...getLineProps({ line, key: i })}>
40-
{line.map((token, key) => (
41-
// eslint-disable-next-line react/jsx-key
42-
<span {...getTokenProps({ token, key })} />
43-
))}
44-
</div>
45-
))}
46-
</Fragment>
47-
)}
48-
</Highlight>
49-
);
50-
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 : {};
24+
}, [code]);
5625

5726
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-
/>
27+
<div className={props.className}>
28+
<Highlight
29+
Prism={Prism}
30+
code={code}
31+
theme={props.theme || liveTheme}
32+
language={props.language}
33+
>
34+
{({
35+
className: _className,
36+
tokens,
37+
getLineProps,
38+
getTokenProps,
39+
style: _style,
40+
}) => (
41+
<pre
42+
className={_className}
43+
style={{
44+
margin: 0,
45+
outline: "none",
46+
padding: 10,
47+
...(!props.className || !props.theme ? {} : _style),
48+
}}
49+
ref={editorRef}
50+
>
51+
{tokens.map((line, lineIndex) => (
52+
// eslint-disable-next-line react/jsx-key
53+
<div {...getLineProps({ line, key: `line-${lineIndex}` })}>
54+
{line
55+
.filter((token) => !token.empty)
56+
.map((token, tokenIndex) => (
57+
// eslint-disable-next-line react/jsx-key
58+
<span
59+
{...getTokenProps({ token, key: `token-${tokenIndex}` })}
60+
/>
61+
))}
62+
{"\n"}
63+
</div>
64+
))}
65+
</pre>
66+
)}
67+
</Highlight>
68+
</div>
7169
);
7270
};
7371

7472
CodeEditor.propTypes = {
73+
className: PropTypes.string,
7574
code: PropTypes.string,
7675
disabled: PropTypes.bool,
7776
language: PropTypes.string,

yarn.lock

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10125,11 +10125,6 @@ react-router@6.2.1, react-router@^6.0.0:
1012510125
dependencies:
1012610126
history "^5.2.0"
1012710127

10128-
react-simple-code-editor@^0.11.0:
10129-
version "0.11.0"
10130-
resolved "https://registry.yarnpkg.com/react-simple-code-editor/-/react-simple-code-editor-0.11.0.tgz#bb57c7c29b570f2ab229872599eac184f5bc673c"
10131-
integrity sha512-xGfX7wAzspl113ocfKQAR8lWPhavGWHL3xSzNLeseDRHysT+jzRBi/ExdUqevSMos+7ZtdfeuBOXtgk9HTwsrw==
10132-
1013310128
react-sizeme@^3.0.1:
1013410129
version "3.0.1"
1013510130
resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-3.0.1.tgz#4d12f4244e0e6a0fb97253e7af0314dc7c83a5a0"
@@ -11996,6 +11991,11 @@ use-composed-ref@^1.0.0:
1199611991
dependencies:
1199711992
ts-essentials "^2.0.3"
1199811993

11994+
use-editable@^2.3.3:
11995+
version "2.3.3"
11996+
resolved "https://registry.yarnpkg.com/use-editable/-/use-editable-2.3.3.tgz#a292fe9ba4c291cd28d1cc2728c75a5fc8d9a33f"
11997+
integrity sha512-7wVD2JbfAFJ3DK0vITvXBdpd9JAz5BcKAAolsnLBuBn6UDDwBGuCIAGvR3yA2BNKm578vAMVHFCWaOcA+BhhiA==
11998+
1199911999
use-isomorphic-layout-effect@^1.0.0:
1200012000
version "1.1.1"
1200112001
resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz#7bb6589170cd2987a152042f9084f9effb75c225"

0 commit comments

Comments
 (0)