PageHistory.jsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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 { getPreviousRevision, onDiffOpenClicked } = pageHistoryContainer;
  14. const {
  15. activePage, totalPages, pagingLimit, revisions, diffOpened,
  16. } = pageHistoryContainer.state;
  17. const handlePage = useCallback(async(selectedPage) => {
  18. try {
  19. await props.pageHistoryContainer.retrieveRevisions(selectedPage);
  20. }
  21. catch (err) {
  22. toastError(err);
  23. props.pageHistoryContainer.setState({ errorMessage: err.message });
  24. logger.error(err);
  25. }
  26. }, [props.pageHistoryContainer]);
  27. if (pageHistoryContainer.state.errorMessage != null) {
  28. return (
  29. <div className="my-5">
  30. <div className="text-danger">{pageHistoryContainer.state.errorMessage}</div>
  31. </div>
  32. );
  33. }
  34. if (pageHistoryContainer.state.revisions === pageHistoryContainer.dummyRevisions) {
  35. throw new Promise(async() => {
  36. try {
  37. await props.pageHistoryContainer.retrieveRevisions(1);
  38. }
  39. catch (err) {
  40. toastError(err);
  41. pageHistoryContainer.setState({ errorMessage: err.message });
  42. logger.error(err);
  43. }
  44. });
  45. }
  46. function pager() {
  47. return (
  48. <PaginationWrapper
  49. activePage={activePage}
  50. changePage={handlePage}
  51. totalItemsCount={totalPages}
  52. pagingLimit={pagingLimit}
  53. align="center"
  54. />
  55. );
  56. }
  57. return (
  58. <div>
  59. <PageRevisionList
  60. revisions={revisions}
  61. diffOpened={diffOpened}
  62. getPreviousRevision={getPreviousRevision}
  63. onDiffOpenClicked={onDiffOpenClicked}
  64. />
  65. {pager()}
  66. </div>
  67. );
  68. }
  69. const RenderPageHistoryWrapper = withUnstatedContainers(withLoadingSppiner(PageHistory), [PageHistroyContainer]);
  70. PageHistory.propTypes = {
  71. pageHistoryContainer: PropTypes.instanceOf(PageHistroyContainer).isRequired,
  72. };
  73. export default RenderPageHistoryWrapper;