HackmdEditor.jsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. notifyBodyChangesHandler(body) {
  34. // dispatch onChange()
  35. if (this.props.onChange != null) {
  36. this.props.onChange(body);
  37. }
  38. }
  39. loadHandler() {
  40. // this.refs.iframe.postMessage('initialize', )
  41. }
  42. render() {
  43. const src = `${this.props.hackmdUri}/${this.props.pageIdOnHackmd}?both`;
  44. return (
  45. <iframe id='iframe-hackmd'
  46. ref='iframe'
  47. src={src}
  48. onLoad={this.loadHandler}
  49. >
  50. </iframe>
  51. );
  52. }
  53. }
  54. HackmdEditor.propTypes = {
  55. markdown: PropTypes.string.isRequired,
  56. hackmdUri: PropTypes.string.isRequired,
  57. pageIdOnHackmd: PropTypes.string.isRequired,
  58. onChange: PropTypes.func,
  59. };