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 (