RevisionDiff.jsx 2.3 KB

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