RevisionDiff.jsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /* eslint-disable react/no-danger */
  2. import React from 'react';
  3. import { createPatch } from 'diff';
  4. import { html } from 'diff2html';
  5. import PropTypes from 'prop-types';
  6. import { useTranslation } from 'react-i18next';
  7. import UserDate from '../User/UserDate';
  8. class RevisionDiff extends React.Component {
  9. render() {
  10. const { t } = this.props;
  11. const currentRevision = this.props.currentRevision;
  12. const previousRevision = this.props.previousRevision;
  13. const revisionDiffOpened = this.props.revisionDiffOpened;
  14. let diffViewHTML = '';
  15. if (currentRevision.body
  16. && previousRevision.body
  17. && revisionDiffOpened) {
  18. let previousText = previousRevision.body;
  19. // comparing ObjectId
  20. // eslint-disable-next-line eqeqeq
  21. if (currentRevision._id == previousRevision._id) {
  22. previousText = '';
  23. }
  24. const patch = createPatch(
  25. currentRevision.pageId, // currentRevision.path is DEPRECATED
  26. previousText,
  27. currentRevision.body,
  28. );
  29. const option = {
  30. drawFileList: false,
  31. outputFormat: 'side-by-side',
  32. };
  33. diffViewHTML = html(patch, option);
  34. }
  35. const diffView = { __html: diffViewHTML };
  36. return (
  37. <>
  38. <div className="comparison-header">
  39. <div className="container pt-1 pr-0">
  40. <div className="row">
  41. <div className="col comparison-source-wrapper pt-1 px-0">
  42. <span className="comparison-source pr-3">{t('page_history.comparing_source')}</span><UserDate dateTime={previousRevision.createdAt} />
  43. <a href={`?revision=${previousRevision._id}`} className="ml-3">
  44. <i className="icon-login"></i>
  45. </a>
  46. </div>
  47. <div className="col comparison-target-wrapper pt-1">
  48. <span className="comparison-target pr-3">{t('page_history.comparing_target')}</span><UserDate dateTime={currentRevision.createdAt} />
  49. <a href={`?revision=${currentRevision._id}`} className="ml-3">
  50. <i className="icon-login"></i>
  51. </a>
  52. </div>
  53. </div>
  54. </div>
  55. </div>
  56. <div className="revision-history-diff pb-1" dangerouslySetInnerHTML={diffView} />
  57. </>
  58. );
  59. }
  60. }
  61. RevisionDiff.propTypes = {
  62. t: PropTypes.func.isRequired,
  63. currentRevision: PropTypes.object.isRequired,
  64. previousRevision: PropTypes.object.isRequired,
  65. revisionDiffOpened: PropTypes.bool.isRequired,
  66. };
  67. const RevisionDiffWrapperFC = (props) => {
  68. const { t } = useTranslation();
  69. return <RevisionDiff t={t} {...props} />;
  70. };
  71. export default RevisionDiffWrapperFC;