Use codeMirror editor for Custom CSS

[MAILPOET-2455]
This commit is contained in:
Rostislav Wolny
2019-11-19 16:29:49 +01:00
committed by Jack Kitterhing
parent a1b1f173d2
commit 0ba2e15a1c
2 changed files with 55 additions and 4 deletions

View File

@@ -0,0 +1,42 @@
import React, { useEffect, useRef } from 'react';
import codemirror from 'codemirror';
import 'codemirror/mode/css/css'; // Side effect
import PropTypes from 'prop-types';
const CodemirrorWrap = ({ options, value, onChange }) => {
const textArea = useRef(null);
const editor = useRef(null);
useEffect(() => {
editor.current = codemirror.fromTextArea(textArea.current, options);
editor.current.on('change', (doc) => onChange(doc.getValue()));
return () => {
if (editor.current) {
editor.current.toTextArea();
}
};
}, [options, onChange]);
return (
<textarea
ref={textArea}
name="name"
defaultValue={value}
autoComplete="off"
/>
);
};
CodemirrorWrap.propTypes = {
value: PropTypes.string.isRequired,
onChange: PropTypes.func.isRequired,
options: PropTypes.shape({
lineNumbers: PropTypes.bool.isRequired,
tabMode: PropTypes.string.isRequired,
matchBrackets: PropTypes.bool.isRequired,
theme: PropTypes.string.isRequired,
mode: PropTypes.string.isRequired,
}).isRequired,
};
export default CodemirrorWrap;

View File

@@ -1,24 +1,33 @@
import React from 'react';
import React, { useRef } from 'react';
import {
Panel,
PanelBody,
TextareaControl,
} from '@wordpress/components';
import MailPoet from 'mailpoet';
import { useSelect, useDispatch } from '@wordpress/data';
import CodeMirror from './codemirror_wrap.jsx';
export default () => {
const styles = useSelect(
(select) => select('mailpoet-form-editor').getFormStyles(),
[]
);
const options = useRef({
lineNumbers: true,
tabMode: 'indent',
matchBrackets: true,
theme: 'neo',
mode: 'css',
});
const { changeFormStyles } = useDispatch('mailpoet-form-editor');
return (
<Panel>
<PanelBody title={MailPoet.I18n.t('customCss')} initialOpen={false}>
<TextareaControl
<CodeMirror
value={styles}
rows={10}
options={options.current}
onChange={changeFormStyles}
/>
</PanelBody>