PageHistory.jsx 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import React, { useCallback } from 'react';
  2. import PropTypes from 'prop-types';
  3. import loggerFactory from '~/utils/logger';
  4. import { withUnstatedContainers } from './UnstatedUtils';
  5. import { toastError } from '~/client/util/apiNotification';
  6. import { withLoadingSppiner } from './SuspenseUtils';
  7. import PageRevisionTable from './PageHistory/PageRevisionTable';
  8. import PageHistroyContainer from '~/client/services/PageHistoryContainer';
  9. import PaginationWrapper from './PaginationWrapper';
  10. import RevisionComparer from './RevisionComparer/RevisionComparer';
  11. import RevisionComparerContainer from '~/client/services/RevisionComparerContainer';
  12. const logger = loggerFactory('growi:PageHistory');
  13. function PageHistory(props) {
  14. const { pageHistoryContainer, revisionComparerContainer } = props;
  15. const { getPreviousRevision } = pageHistoryContainer;
  16. const {
  17. activePage, totalPages, pagingLimit, revisions, diffOpened,
  18. } = pageHistoryContainer.state;
  19. const handlePage = useCallback(async(selectedPage) => {
  20. try {
  21. await props.pageHistoryContainer.retrieveRevisions(selectedPage);
  22. }
  23. catch (err) {
  24. toastError(err);
  25. props.pageHistoryContainer.setState({ errorMessage: err.message });
  26. logger.error(err);
  27. }
  28. }, [props.pageHistoryContainer]);
  29. if (pageHistoryContainer.state.errorMessage != null) {
  30. return (
  31. <div className="my-5">
  32. <div className="text-danger">{pageHistoryContainer.state.errorMessage}</div>
  33. </div>
  34. );
  35. }
  36. if (pageHistoryContainer.state.revisions === pageHistoryContainer.dummyRevisions) {
  37. throw new Promise(async() => {
  38. try {
  39. await props.pageHistoryContainer.retrieveRevisions(1);
  40. await props.revisionComparerContainer.initRevisions();
  41. }
  42. catch (err) {
  43. toastError(err);
  44. pageHistoryContainer.setState({ errorMessage: err.message });
  45. logger.error(err);
  46. }
  47. });
  48. }
  49. function pager() {
  50. return (
  51. <PaginationWrapper
  52. activePage={activePage}
  53. changePage={handlePage}
  54. totalItemsCount={totalPages}
  55. pagingLimit={pagingLimit}
  56. align="center"
  57. />
  58. );
  59. }
  60. return (
  61. <div className="revision-history" data-testid="page-history">
  62. <PageRevisionTable
  63. pageHistoryContainer={pageHistoryContainer}
  64. revisionComparerContainer={revisionComparerContainer}
  65. revisions={revisions}
  66. diffOpened={diffOpened}
  67. getPreviousRevision={getPreviousRevision}
  68. />
  69. <div className="my-3">
  70. {pager()}
  71. </div>
  72. <RevisionComparer />
  73. </div>
  74. );
  75. }
  76. const RenderPageHistoryWrapper = withUnstatedContainers(withLoadingSppiner(PageHistory), [PageHistroyContainer, RevisionComparerContainer]);
  77. PageHistory.propTypes = {
  78. pageHistoryContainer: PropTypes.instanceOf(PageHistroyContainer).isRequired,
  79. revisionComparerContainer: PropTypes.instanceOf(RevisionComparerContainer).isRequired,
  80. };
  81. export default RenderPageHistoryWrapper;