RevisionDiff.jsx 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { createPatch } from 'diff';
  4. import { html } from 'diff2html';
  5. export default class RevisionDiff extends React.Component {
  6. render() {
  7. const currentRevision = this.props.currentRevision;
  8. const previousRevision = this.props.previousRevision;
  9. const revisionDiffOpened = this.props.revisionDiffOpened;
  10. let diffViewHTML = '';
  11. if (currentRevision.body
  12. && previousRevision.body
  13. && revisionDiffOpened) {
  14. let previousText = previousRevision.body;
  15. // comparing ObjectId
  16. // eslint-disable-next-line eqeqeq
  17. if (currentRevision._id == previousRevision._id) {
  18. previousText = '';
  19. }
  20. const patch = createPatch(
  21. currentRevision.path,
  22. previousText,
  23. currentRevision.body,
  24. );
  25. const option = {
  26. drawFileList: false,
  27. outputFormat: 'side-by-side',
  28. };
  29. diffViewHTML = html(patch, option);
  30. }
  31. const diffView = { __html: diffViewHTML };
  32. // eslint-disable-next-line react/no-danger
  33. return <div className="revision-history-diff d-table w-100" dangerouslySetInnerHTML={diffView} />;
  34. }
  35. }
  36. RevisionDiff.propTypes = {
  37. currentRevision: PropTypes.object.isRequired,
  38. previousRevision: PropTypes.object.isRequired,
  39. revisionDiffOpened: PropTypes.bool.isRequired,
  40. };