HackmdEditor.jsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. const body = data.body;
  28. if (operation === 'notifyBodyChanges') {
  29. this.notifyBodyChangesHandler(body);
  30. }
  31. });
  32. }
  33. /**
  34. *
  35. * @param {object} data
  36. */
  37. postMessageToHackmd(data) {
  38. this.refs.iframe.contentWindow.postMessage(JSON.stringify(data), this.props.hackmdUri);
  39. }
  40. notifyBodyChangesHandler(body) {
  41. // dispatch onChange()
  42. if (this.props.onChange != null) {
  43. this.props.onChange(body);
  44. }
  45. }
  46. loadHandler() {
  47. const data = { operation: 'setValue' };
  48. if (this.props.initializationMarkdown != null) {
  49. data.document = this.props.initializationMarkdown;
  50. }
  51. this.postMessageToHackmd(data);
  52. }
  53. render() {
  54. const src = `${this.props.hackmdUri}/${this.props.pageIdOnHackmd}?both`;
  55. return (
  56. <iframe id='iframe-hackmd'
  57. ref='iframe'
  58. src={src}
  59. onLoad={this.loadHandler}
  60. >
  61. </iframe>
  62. );
  63. }
  64. }
  65. HackmdEditor.propTypes = {
  66. hackmdUri: PropTypes.string.isRequired,
  67. pageIdOnHackmd: PropTypes.string.isRequired,
  68. initializationMarkdown: PropTypes.string,
  69. onChange: PropTypes.func,
  70. };