import React from 'react'; import PropTypes from 'prop-types'; import { translate } from 'react-i18next'; /** * * @author Yuki Takei * * @export * @class PageStatusAlert * @extends {React.Component} */ class PageStatusAlert extends React.Component { constructor(props) { super(props); this.state = { initialRevisionId: this.props.revisionId, revisionId: this.props.revisionId, revisionIdHackmdSynced: this.props.revisionIdHackmdSynced, lastUpdateUsername: undefined, hasDraftOnHackmd: this.props.hasDraftOnHackmd, isDraftUpdatingInRealtime: false, }; this.renderSomeoneEditingAlert = this.renderSomeoneEditingAlert.bind(this); this.renderDraftExistsAlert = this.renderDraftExistsAlert.bind(this); this.renderUpdatedAlert = this.renderUpdatedAlert.bind(this); } /** * clear status (invoked when page is updated by myself) */ clearRevisionStatus(updatedRevisionId, updatedRevisionIdHackmdSynced) { this.setState({ initialRevisionId: updatedRevisionId, revisionId: updatedRevisionId, revisionIdHackmdSynced: updatedRevisionIdHackmdSynced, hasDraftOnHackmd: false, isDraftUpdatingInRealtime: false, }); } setRevisionId(revisionId, revisionIdHackmdSynced) { this.setState({ revisionId, revisionIdHackmdSynced }); } setLastUpdateUsername(lastUpdateUsername) { this.setState({ lastUpdateUsername }); } setHasDraftOnHackmd(hasDraftOnHackmd) { this.setState({ hasDraftOnHackmd, isDraftUpdatingInRealtime: true, }); } renderSomeoneEditingAlert() { return (
Someone editing this page on HackMD     Open HackMD Editor
); } renderDraftExistsAlert(isRealtime) { return (
This page has a draft on HackMD     Open HackMD Editor
); } renderUpdatedAlert() { const { t } = this.props; const label1 = t('edited this page'); const label2 = t('Load latest'); return (
{this.state.lastUpdateUsername} {label1}     {label2}
); } render() { let content = ; const isRevisionOutdated = this.state.initialRevisionId !== this.state.revisionId; const isHackmdDocumentOutdated = this.state.revisionId !== this.state.revisionIdHackmdSynced; if (isHackmdDocumentOutdated && isRevisionOutdated) { content = this.renderUpdatedAlert(); } else { if (this.state.isDraftUpdatingInRealtime) { content = this.renderSomeoneEditingAlert(); } else if (this.state.hasDraftOnHackmd) { content = this.renderDraftExistsAlert(); } } return content; } } PageStatusAlert.propTypes = { t: PropTypes.func.isRequired, // i18next crowi: PropTypes.object.isRequired, hasDraftOnHackmd: PropTypes.bool.isRequired, revisionId: PropTypes.string, revisionIdHackmdSynced: PropTypes.string, }; PageStatusAlert.defaultProps = { }; export default translate()(PageStatusAlert);