2016-06-16 19:20:36 -03:00
|
|
|
import React, { PropTypes } from 'react';
|
2017-06-23 14:42:40 -04:00
|
|
|
import registry from '../../../../lib/registry';
|
2017-07-18 19:14:40 -04:00
|
|
|
import { markdownToRemark, remarkToMarkdown } from '../unified';
|
2017-06-09 23:49:14 -04:00
|
|
|
import RawEditor from './RawEditor';
|
|
|
|
import VisualEditor from './VisualEditor';
|
2017-06-23 14:42:40 -04:00
|
|
|
import { StickyContainer } from '../../../UI/Sticky/Sticky';
|
2016-08-03 10:30:42 -03:00
|
|
|
|
2016-12-27 23:17:33 -08:00
|
|
|
const MODE_STORAGE_KEY = 'cms.md-mode';
|
|
|
|
|
2017-07-18 19:14:40 -04:00
|
|
|
/**
|
2017-07-27 18:03:13 -04:00
|
|
|
* The markdown field value is persisted as a markdown string, but stringifying
|
|
|
|
* on every keystroke is a big perf hit, so we'll register functions to perform
|
|
|
|
* those actions only when necessary, such as after loading and before
|
|
|
|
* persisting.
|
2017-07-18 19:14:40 -04:00
|
|
|
*/
|
|
|
|
registry.registerWidgetValueSerializer('markdown', {
|
|
|
|
serialize: remarkToMarkdown,
|
|
|
|
deserialize: markdownToRemark,
|
|
|
|
});
|
|
|
|
|
2017-03-17 23:17:14 -04:00
|
|
|
export default class MarkdownControl extends React.Component {
|
2016-10-03 14:33:48 +02:00
|
|
|
static propTypes = {
|
|
|
|
onChange: PropTypes.func.isRequired,
|
2017-01-10 22:23:22 -02:00
|
|
|
onAddAsset: PropTypes.func.isRequired,
|
2017-03-17 23:17:14 -04:00
|
|
|
onRemoveAsset: PropTypes.func.isRequired,
|
2017-01-10 22:23:22 -02:00
|
|
|
getAsset: PropTypes.func.isRequired,
|
2017-07-18 19:14:40 -04:00
|
|
|
value: PropTypes.object,
|
2016-10-03 14:33:48 +02:00
|
|
|
};
|
2016-08-11 18:21:32 -03:00
|
|
|
|
2016-11-01 16:55:21 -07:00
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
2016-12-27 23:17:33 -08:00
|
|
|
this.state = { mode: localStorage.getItem(MODE_STORAGE_KEY) || 'visual' };
|
2016-11-01 16:55:21 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
handleMode = (mode) => {
|
|
|
|
this.setState({ mode });
|
2016-12-27 23:17:33 -08:00
|
|
|
localStorage.setItem(MODE_STORAGE_KEY, mode);
|
2016-10-03 14:25:27 +02:00
|
|
|
};
|
2016-08-11 18:21:32 -03:00
|
|
|
|
2016-09-27 13:07:52 +02:00
|
|
|
render() {
|
2017-01-10 22:23:22 -02:00
|
|
|
const { onChange, onAddAsset, onRemoveAsset, getAsset, value } = this.props;
|
2016-11-01 16:55:21 -07:00
|
|
|
const { mode } = this.state;
|
2017-03-23 17:15:48 -04:00
|
|
|
const visualEditor = (
|
|
|
|
<div className="cms-editor-visual">
|
|
|
|
<VisualEditor
|
|
|
|
onChange={onChange}
|
|
|
|
onAddAsset={onAddAsset}
|
|
|
|
onRemoveAsset={onRemoveAsset}
|
|
|
|
onMode={this.handleMode}
|
|
|
|
getAsset={getAsset}
|
|
|
|
value={value}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
const rawEditor = (
|
|
|
|
<div className="cms-editor-raw">
|
2016-11-01 16:55:21 -07:00
|
|
|
<RawEditor
|
|
|
|
onChange={onChange}
|
2017-01-10 22:23:22 -02:00
|
|
|
onAddAsset={onAddAsset}
|
|
|
|
onRemoveAsset={onRemoveAsset}
|
2016-11-01 16:55:21 -07:00
|
|
|
onMode={this.handleMode}
|
2017-01-10 22:23:22 -02:00
|
|
|
getAsset={getAsset}
|
2016-11-01 16:55:21 -07:00
|
|
|
value={value}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
);
|
2017-03-23 17:15:48 -04:00
|
|
|
return <StickyContainer>{ mode === 'visual' ? visualEditor : rawEditor }</StickyContainer>;
|
2016-08-11 18:21:32 -03:00
|
|
|
}
|
2016-05-30 16:55:32 -07:00
|
|
|
}
|