HackmdEditor.jsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. export default class HackmdEditor extends React.PureComponent {
  4. constructor(props) {
  5. super(props);
  6. this.state = {
  7. };
  8. this.listenMessages = this.listenMessages.bind(this);
  9. this.notifyBodyChangesHandler = this.notifyBodyChangesHandler.bind(this);
  10. this.loadHandler = this.loadHandler.bind(this);
  11. }
  12. componentDidMount() {
  13. const contentWindow = this.refs.iframe.contentWindow;
  14. this.listenMessages(contentWindow);
  15. }
  16. /**
  17. *
  18. * @param {object} targetWindow
  19. */
  20. listenMessages(targetWindow) {
  21. window.addEventListener('message', (e) => {
  22. if (targetWindow !== e.source) {
  23. return;
  24. }
  25. const data = JSON.parse(e.data);
  26. const operation = data.operation;
  27. if (operation === 'notifyBodyChanges') {
  28. this.notifyBodyChangesHandler();
  29. }
  30. });
  31. }
  32. notifyBodyChangesHandler() {
  33. // dispatch onChange()
  34. if (this.props.onChange != null) {
  35. this.props.onChange();
  36. }
  37. }
  38. loadHandler() {
  39. // this.refs.iframe.postMessage('initialize', )
  40. }
  41. render() {
  42. const src = `${this.props.hackmdUri}/${this.props.pageIdOnHackmd}?both`;
  43. return (
  44. <iframe id='iframe-hackmd'
  45. ref='iframe'
  46. src={src}
  47. onLoad={this.loadHandler}
  48. >
  49. </iframe>
  50. );
  51. }
  52. }
  53. HackmdEditor.propTypes = {
  54. markdown: PropTypes.string.isRequired,
  55. hackmdUri: PropTypes.string.isRequired,
  56. pageIdOnHackmd: PropTypes.string.isRequired,
  57. onChange: PropTypes.func,
  58. };