import React from 'react'; import PropTypes from 'prop-types'; import { CopyToClipboard } from 'react-copy-to-clipboard'; import { useTranslation } from 'react-i18next'; import { Collapse, UncontrolledTooltip, } from 'reactstrap'; import AppContainer from '~/client/services/AppContainer'; import RevisionBody from '../Page/RevisionBody'; import { withUnstatedContainers } from '../UnstatedUtils'; class Draft extends React.Component { constructor(props) { super(props); this.state = { html: '', isRendered: false, isPanelExpanded: false, showCopiedMessage: false, }; this.growiRenderer = this.props.appContainer.getRenderer('draft'); this.changeToolTipLabel = this.changeToolTipLabel.bind(this); this.expandPanelHandler = this.expandPanelHandler.bind(this); this.collapsePanelHandler = this.collapsePanelHandler.bind(this); this.renderHtml = this.renderHtml.bind(this); this.renderAccordionTitle = this.renderAccordionTitle.bind(this); } changeToolTipLabel() { this.setState({ showCopiedMessage: true }); setTimeout(() => { this.setState({ showCopiedMessage: false }); }, 1000); } expandPanelHandler() { this.setState({ isPanelExpanded: true }); if (!this.state.isRendered) { this.renderHtml(); } } collapsePanelHandler() { this.setState({ isPanelExpanded: false }); } async renderHtml() { const context = { markdown: this.props.markdown, }; const growiRenderer = this.growiRenderer; const interceptorManager = this.props.appContainer.interceptorManager; await interceptorManager.process('prePreProcess', context) .then(() => { context.markdown = growiRenderer.preProcess(context.markdown, context); }) .then(() => { return interceptorManager.process('postPreProcess', context) }) .then(() => { const parsedHTML = growiRenderer.process(context.markdown, context); context.parsedHTML = parsedHTML; }) .then(() => { return interceptorManager.process('prePostProcess', context) }) .then(() => { context.parsedHTML = growiRenderer.postProcess(context.parsedHTML, context); }) .then(() => { return interceptorManager.process('postPostProcess', context) }) .then(() => { this.setState({ html: context.parsedHTML, isRendered: true }); }); } renderAccordionTitle(isExist) { const { isPanelExpanded } = this.state; const { t } = this.props; const iconClass = isPanelExpanded ? 'fa-rotate-90' : ''; return ( this.setState({ isPanelExpanded: !isPanelExpanded })}> {this.props.path} { isExist && ( {t('page exists')} ) } { !isExist && ( draft ) } ); } renderControls() { const { t, path, index } = this.props; const tooltipTargetId = `draft-copied-tooltip_${index}`; return (
{this.props.isExist ? null : ( ) } { this.state.showCopiedMessage && ( copied! ) } { !this.state.showCopiedMessage && ( {this.props.t('Copy')} ) } { return this.props.clearDraft(this.props.path) }} >
); } render() { const { isPanelExpanded } = this.state; return (
{this.renderAccordionTitle(this.props.isExist)}
{this.renderControls()}
{/* loading spinner */} { this.state.isPanelExpanded && !this.state.isRendered && (
) } {/* contents */} { this.state.isPanelExpanded && this.state.isRendered && ( ) }
); } } Draft.propTypes = { t: PropTypes.func.isRequired, appContainer: PropTypes.instanceOf(AppContainer).isRequired, index: PropTypes.number.isRequired, path: PropTypes.string.isRequired, markdown: PropTypes.string.isRequired, isExist: PropTypes.bool.isRequired, clearDraft: PropTypes.func.isRequired, }; const DraftWrapperFC = (props) => { const { t } = useTranslation(); return ; }; /** * Wrapper component for using unstated */ const DraftWrapper = withUnstatedContainers(DraftWrapperFC, [AppContainer]); export default DraftWrapper;