ConflictDiffModal.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import React, { useState, useEffect, FC } from 'react';
  2. import PropTypes from 'prop-types';
  3. import {
  4. Modal, ModalHeader, ModalBody, ModalFooter,
  5. } from 'reactstrap';
  6. import CodeMirror from 'codemirror/lib/codemirror';
  7. import { useTranslation } from 'react-i18next';
  8. require('codemirror/lib/codemirror.css');
  9. require('codemirror/addon/merge/merge');
  10. require('codemirror/addon/merge/merge.css');
  11. const DMP = require('diff_match_patch');
  12. Object.keys(DMP).forEach((key) => { window[key] = DMP[key] });
  13. type ConflictDiffModalProps = {
  14. isOpen: boolean | null;
  15. onCancel: (() => void) | null;
  16. onResolveConflict: (() => void) | null;
  17. };
  18. export const ConflictDiffModal: FC<ConflictDiffModalProps> = (props) => {
  19. const [val, setVal] = useState('value 1');
  20. const [orig, setOrig] = useState('value 2');
  21. const [codeMirrorRef, setCodeMirrorRef] = useState<HTMLDivElement | null>(null);
  22. const { t } = useTranslation('');
  23. useEffect(() => {
  24. if (codeMirrorRef) {
  25. CodeMirror.MergeView(codeMirrorRef, {
  26. value: val,
  27. origLeft: orig,
  28. origRight: null,
  29. connect: 'align',
  30. lineNumbers: true,
  31. collapseIdentical: true,
  32. highlightDifferences: true,
  33. allowEditingOriginals: false,
  34. });
  35. }
  36. }, [codeMirrorRef, orig, val]);
  37. const onCancel = () => {
  38. if (props.onCancel != null) {
  39. props.onCancel();
  40. }
  41. };
  42. const onResolveConflict = () => {
  43. if (props.onResolveConflict != null) {
  44. props.onResolveConflict();
  45. }
  46. };
  47. return (
  48. <Modal isOpen={props.isOpen || false} toggle={onCancel} className="modal-gfm-cheatsheet">
  49. <ModalHeader tag="h4" toggle={onCancel} className="bg-primary text-light">
  50. <i className="icon-fw icon-exclamation" />{t('modal_resolve_conflict.title')}
  51. </ModalHeader>
  52. <ModalBody>
  53. <div ref={(el) => { setCodeMirrorRef(el) }}></div>
  54. </ModalBody>
  55. <ModalFooter>
  56. <button
  57. type="button"
  58. className="btn btn-outline-secondary"
  59. onClick={onCancel}
  60. >
  61. {t('Cancel')}
  62. </button>
  63. <button
  64. type="button"
  65. className="btn btn-outline-primary ml-3"
  66. onClick={onResolveConflict}
  67. >
  68. {t('modal_resolve_conflict.resolve_and_save')}
  69. </button>
  70. </ModalFooter>
  71. </Modal>
  72. );
  73. };
  74. ConflictDiffModal.propTypes = {
  75. isOpen: PropTypes.bool,
  76. onCancel: PropTypes.func,
  77. onResolveConflict: PropTypes.func,
  78. };
  79. ConflictDiffModal.defaultProps = {
  80. isOpen: false,
  81. };