import React from 'react'; import PropTypes from 'prop-types'; import { useTranslation } from 'react-i18next'; import AppContainer from '~/client/services/AppContainer'; import PageContainer from '~/client/services/PageContainer'; import { withUnstatedContainers } from './UnstatedUtils'; /** * * @author Yuki Takei * * @export * @class PageStatusAlert * @extends {React.Component} */ class PageStatusAlert extends React.Component { constructor(props) { super(props); this.state = { }; this.getContentsForSomeoneEditingAlert = this.getContentsForSomeoneEditingAlert.bind(this); this.getContentsForDraftExistsAlert = this.getContentsForDraftExistsAlert.bind(this); this.getContentsForUpdatedAlert = this.getContentsForUpdatedAlert.bind(this); this.onClickResolveConflict = this.onClickResolveConflict.bind(this); } refreshPage() { window.location.reload(); } onClickResolveConflict() { this.props.pageContainer.setState({ isConflictDiffModalOpen: true, }); } getContentsForSomeoneEditingAlert() { const { t } = this.props; return [ ['bg-success', 'd-hackmd-none'], <> {t('hackmd.someone_editing')} , Open HackMD Editor , ]; } getContentsForDraftExistsAlert(isRealtime) { const { t } = this.props; return [ ['bg-success', 'd-hackmd-none'], <> {t('hackmd.this_page_has_draft')} , Open HackMD Editor , ]; } getContentsForUpdatedAlert() { const { t, appContainer, pageContainer } = this.props; const pageEditor = appContainer.getComponentInstance('PageEditor'); let isConflictOnEdit = false; if (pageEditor != null) { const markdownOnEdit = pageEditor.getMarkdown(); isConflictOnEdit = markdownOnEdit !== pageContainer.state.markdown; } const label1 = isConflictOnEdit ? t('modal_resolve_conflict.file_conflicting_with_newer_remote') : `${pageContainer.state.lastUpdateUsername} ${t('edited this page')}`; return [ ['bg-warning'], <> {label1} , <> { isConflictOnEdit && ( )} , ]; } render() { const { revisionId, revisionIdHackmdSynced, remoteRevisionId, hasDraftOnHackmd, isHackmdDraftUpdatingInRealtime, } = this.props.pageContainer.state; const isRevisionOutdated = revisionId !== remoteRevisionId; const isHackmdDocumentOutdated = revisionIdHackmdSynced !== remoteRevisionId; let getContentsFunc = null; // when remote revision is newer than both if (isHackmdDocumentOutdated && isRevisionOutdated) { getContentsFunc = this.getContentsForUpdatedAlert; } // when someone editing with HackMD else if (isHackmdDraftUpdatingInRealtime) { getContentsFunc = this.getContentsForSomeoneEditingAlert; } // when the draft of HackMD is newest else if (hasDraftOnHackmd) { getContentsFunc = this.getContentsForDraftExistsAlert; } // do not render anything else { return null; } const [additionalClasses, label, btn] = getContentsFunc(); return (

{label}

{btn}

); } } PageStatusAlert.propTypes = { t: PropTypes.func.isRequired, // i18next appContainer: PropTypes.instanceOf(AppContainer).isRequired, pageContainer: PropTypes.instanceOf(PageContainer).isRequired, }; const PageStatusAlertWrapperFC = (props) => { const { t } = useTranslation(); return ; }; /** * Wrapper component for using unstated */ const PageStatusAlertWrapper = withUnstatedContainers(PageStatusAlertWrapperFC, [AppContainer, PageContainer]); export default PageStatusAlertWrapper;