import React, { useState, useRef, FC } from 'react'; import PropTypes from 'prop-types'; import { Modal, ModalHeader, ModalBody, ModalFooter, } from 'reactstrap'; import { parseISO, format } from 'date-fns'; import { useTranslation } from 'react-i18next'; import { UnControlled as CodeMirror } from 'react-codemirror2'; import PageContainer from '../../client/services/PageContainer'; import EditorContainer from '../../client/services/EditorContainer'; require('codemirror/mode/htmlmixed/htmlmixed'); const DMP = require('diff_match_patch'); Object.keys(DMP).forEach((key) => { window[key] = DMP[key] }); type ConflictDiffModalProps = { isOpen: boolean | null; onCancel: (() => void) | null; pageContainer: PageContainer; editorContainer: EditorContainer; }; export const ConflictDiffModal: FC = (props) => { const { t } = useTranslation(''); const resolvedRevision = useRef(t('modal_resolve_conflict.resolve_conflict_message')); const [isRevisionselected, setIsRevisionSelected] = useState(false); const { pageContainer, editorContainer } = props; const { request, origin, latest } = pageContainer.state.revisionsOnConflict || { request: {}, origin: {}, latest: {} }; const codeMirrorRevisionOption = { mode: 'htmlmixed', lineNumbers: true, tabSize: 2, indentUnit: 2, readOnly: true, }; const onCancel = () => { if (props.onCancel != null) { props.onCancel(); } }; const onResolveConflict = async() : Promise => { // disable button after clicked setIsRevisionSelected(false); try { await pageContainer.resolveConflictAndReload( pageContainer.state.pageId, latest.revisionId, resolvedRevision.current, editorContainer.getCurrentOptionsToSave(), ); } catch (error) { pageContainer.showErrorToastr(error); } }; return ( {t('modal_resolve_conflict.resolve_conflict')} {Object.keys(pageContainer.state.revisionsOnConflict || {}).length > 0 && (

{t('modal_resolve_conflict.resolve_conflict_message')}

{t('modal_resolve_conflict.requested_revision')}

updated by {request.userName}

{format(parseISO(request.createdAt), 'yyyy/MM/dd HH:mm:ss')}

{t('origin_revision')}

updated by {origin.userName}

{format(parseISO(origin.createdAt), 'yyyy/MM/dd HH:mm:ss')}

{t('modal_resolve_conflict.latest_revision')}

updated by {latest.userName}

{format(parseISO(latest.createdAt), 'yyyy/MM/dd HH:mm:ss')}

{t('modal_resolve_conflict.selected_editable_revision')}

{ if (pageBody === '') setIsRevisionSelected(false); resolvedRevision.current = pageBody; }} />
) }
); }; ConflictDiffModal.propTypes = { isOpen: PropTypes.bool, onCancel: PropTypes.func, pageContainer: PropTypes.instanceOf(PageContainer).isRequired, editorContainer: PropTypes.instanceOf(EditorContainer).isRequired, }; ConflictDiffModal.defaultProps = { isOpen: false, };