PageHistory.jsx 2.4 KB

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