import React from 'react'; import PropTypes from 'prop-types'; import { withTranslation } from 'react-i18next'; import AppContainer from '../services/AppContainer'; import PageContainer from '../services/PageContainer'; import { createSubscribedElement } from './UnstatedUtils'; /** * * @author Yuki Takei * * @export * @class PageStatusAlert * @extends {React.Component} */ class PageStatusAlert extends React.Component { constructor(props) { super(props); this.state = { }; this.renderSomeoneEditingAlert = this.renderSomeoneEditingAlert.bind(this); this.renderDraftExistsAlert = this.renderDraftExistsAlert.bind(this); this.renderUpdatedAlert = this.renderUpdatedAlert.bind(this); } componentWillMount() { this.props.appContainer.registerComponentInstance('PageStatusAlert', this); } refreshPage() { window.location.reload(); } 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.props.pageContainer.state.lastUpdateUsername} {label1}     {label2}
); } render() { let content = ; const { revisionId, revisionIdHackmdSynced, remoteRevisionId, hasDraftOnHackmd, isHackmdDraftUpdatingInRealtime, } = this.props.pageContainer.state; const isRevisionOutdated = revisionId !== remoteRevisionId; const isHackmdDocumentOutdated = revisionIdHackmdSynced !== remoteRevisionId; // when remote revision is newer than both if (isHackmdDocumentOutdated && isRevisionOutdated) { content = this.renderUpdatedAlert(); } // when someone editing with HackMD else if (isHackmdDraftUpdatingInRealtime) { content = this.renderSomeoneEditingAlert(); } // when the draft of HackMD is newest else if (hasDraftOnHackmd) { content = this.renderDraftExistsAlert(); } return content; } } /** * Wrapper component for using unstated */ const PageStatusAlertWrapper = (props) => { return createSubscribedElement(PageStatusAlert, props, [AppContainer, PageContainer]); }; PageStatusAlert.propTypes = { t: PropTypes.func.isRequired, // i18next appContainer: PropTypes.instanceOf(AppContainer).isRequired, pageContainer: PropTypes.instanceOf(PageContainer).isRequired, }; export default withTranslation()(PageStatusAlertWrapper);