| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- import React from 'react';
- import PropTypes from 'prop-types';
- import Penpal from 'penpal';
- // Penpal.debug = true;
- export default class HackmdEditor extends React.PureComponent {
- constructor(props) {
- super(props);
- this.state = {
- };
- this.hackmd = null;
- this.initHackmdWithPenpal = this.initHackmdWithPenpal.bind(this);
- this.notifyBodyChangesHandler = this.notifyBodyChangesHandler.bind(this);
- this.saveWithShortcutHandler = this.saveWithShortcutHandler.bind(this);
- }
- componentDidMount() {
- // append iframe with penpal
- this.initHackmdWithPenpal();
- }
- initHackmdWithPenpal() {
- const _this = this; // for in methods scope
- const url = `${this.props.hackmdUri}/${this.props.pageIdOnHackmd}?both`;
- const connection = Penpal.connectToChild({
- url,
- appendTo: this.refs.iframeContainer,
- methods: { // expose methods to HackMD
- notifyBodyChanges(document) {
- _this.notifyBodyChangesHandler(document);
- },
- saveWithShortcut(document) {
- _this.saveWithShortcutHandler(document);
- }
- },
- });
- connection.promise.then(child => {
- this.hackmd = child;
- if (this.props.initializationMarkdown != null) {
- child.setValueOnInit(this.props.initializationMarkdown);
- }
- });
- }
- /**
- * return markdown document of HackMD
- * @return {Promise<string>}
- */
- getValue() {
- return this.hackmd.getValue();
- }
- setValue(newValue) {
- this.hackmd.setValue(newValue);
- }
- notifyBodyChangesHandler(body) {
- // dispatch onChange()
- if (this.props.onChange != null) {
- this.props.onChange(body);
- }
- }
- saveWithShortcutHandler(document) {
- if (this.props.onSaveWithShortcut != null) {
- this.props.onSaveWithShortcut(document);
- }
- }
- render() {
- return (
- // will be rendered in componentDidMount
- <div id='iframe-hackmd-container' ref='iframeContainer'></div>
- );
- }
- }
- HackmdEditor.propTypes = {
- hackmdUri: PropTypes.string.isRequired,
- pageIdOnHackmd: PropTypes.string.isRequired,
- initializationMarkdown: PropTypes.string,
- onChange: PropTypes.func,
- onSaveWithShortcut: PropTypes.func,
- };
|