PageHistory.jsx 3.0 KB

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