import React from 'react'; import PropTypes from 'prop-types'; import * as toastr from 'toastr'; import HackmdEditor from './PageEditorByHackmd/HackmdEditor'; export default class PageEditorByHackmd extends React.PureComponent { constructor(props) { super(props); this.state = { isInitialized: false, isInitializing: false, pageIdOnHackmd: this.props.pageIdOnHackmd, }; this.getHackmdUri = this.getHackmdUri.bind(this); this.syncAndStartToEdit = this.syncAndStartToEdit.bind(this); this.resumeToEdit = this.resumeToEdit.bind(this); this.apiErrorHandler = this.apiErrorHandler.bind(this); } componentWillMount() { } getHackmdUri() { const envVars = this.props.crowi.config.env; return envVars.HACKMD_URI; } syncToLatestRevision() { } /** * Start integration with HackMD */ syncAndStartToEdit() { const hackmdUri = this.getHackmdUri(); if (hackmdUri == null) { // do nothing return; } this.setState({ isInitialized: false, isInitializing: true, }); const params = { pageId: this.props.pageId, }; this.props.crowi.apiPost('/hackmd.integrate', params) .then(res => { if (!res.ok) { throw new Error(res.error); } this.setState({ isInitialized: true, pageIdOnHackmd: res.pageIdOnHackmd, revisionIdHackmdSynced: res.revisionIdHackmdSynced, }); }) .catch(this.apiErrorHandler) .then(() => { this.setState({isInitializing: false}); }); } /** * Start to edit w/o any api request */ resumeToEdit() { this.setState({isInitialized: true}); } apiErrorHandler(error) { toastr.error(error.message, 'Error occured', { closeButton: true, progressBar: true, newestOnTop: false, showDuration: '100', hideDuration: '100', timeOut: '3000', }); } render() { const hackmdUri = this.getHackmdUri(); if (this.state.isInitialized) { return ( ); } let content = undefined; const isPageExistsOnHackmd = (this.state.pageIdOnHackmd != null); const isRevisionMatch = (this.props.revisionId === this.props.revisionIdHackmdSynced); // HackMD is not setup if (hackmdUri == null) { content = (

HackMD is not set up.

); } // page is exists, revisions are match, hasDraftOnHackmd is true else if (isPageExistsOnHackmd && isRevisionMatch && this.props.hasDraftOnHackmd) { content = (

HackMD is READY!

Click to edit from the previous continuation.

); } else { content = (

HackMD is READY!

Click to clone page content and start to edit.

); } return (
{content}
); } } PageEditorByHackmd.propTypes = { crowi: PropTypes.object.isRequired, markdown: PropTypes.string.isRequired, pageId: PropTypes.string, revisionId: PropTypes.string, pageIdOnHackmd: PropTypes.string, revisionIdHackmdSynced: PropTypes.string, hasDraftOnHackmd: PropTypes.bool, };