PageTimeline.jsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import AppContainer from '../services/AppContainer';
  5. import PageContainer from '../services/PageContainer';
  6. import PaginationWrapper from './PaginationWrapper';
  7. import { withUnstatedContainers } from './UnstatedUtils';
  8. import RevisionLoader from './Page/RevisionLoader';
  9. class PageTimeline extends React.Component {
  10. constructor(props) {
  11. super(props);
  12. const { appContainer } = this.props;
  13. this.state = {
  14. activePage: 1,
  15. totalPageItems: 0,
  16. limit: appContainer.getConfig().recentCreatedLimit,
  17. // TODO: remove after when timeline is implemented with React and inject data with props
  18. pages: this.props.pages,
  19. };
  20. console.log('constructor');
  21. console.log(this.state.activePage);
  22. console.log(this.state.totalPageItems);
  23. console.log(this.state.limit);
  24. this.handlePage = this.handlePage.bind(this);
  25. }
  26. async handlePage(selectedPage) {
  27. const { appContainer, pageContainer } = this.props;
  28. const { path } = pageContainer.state;
  29. const { limit } = this.state;
  30. const offset = (selectedPage - 1) * limit;
  31. const activePage = selectedPage;
  32. const res = await appContainer.apiv3Get('/pages/list', { path, limit, offset });
  33. const totalPageItems = res.data.totalCount;
  34. const pages = res.data.pages;
  35. this.setState({
  36. activePage,
  37. totalPageItems,
  38. pages,
  39. });
  40. }
  41. async componentWillMount() {
  42. const { appContainer } = this.props;
  43. // initialize GrowiRenderer
  44. this.growiRenderer = appContainer.getRenderer('timeline');
  45. await this.handlePage(1);
  46. }
  47. async componentDidMount() {
  48. await this.handlePage(1);
  49. }
  50. render() {
  51. const { pages } = this.state;
  52. if (pages == null) {
  53. return <React.Fragment></React.Fragment>;
  54. }
  55. return (
  56. <div>
  57. { pages.map((page) => {
  58. return (
  59. <div className="timeline-body" key={`key-${page.id}`}>
  60. <div className="card card-timeline">
  61. <div className="card-header"><a href={page.path}>{page.path}</a></div>
  62. <div className="card-body">
  63. <RevisionLoader
  64. lazy
  65. growiRenderer={this.growiRenderer}
  66. pageId={page.id}
  67. revisionId={page.revision}
  68. />
  69. </div>
  70. </div>
  71. </div>
  72. );
  73. }) }
  74. <PaginationWrapper
  75. activePage={this.state.activePage}
  76. changePage={this.handlePage}
  77. totalItemsCount={this.state.totalPageItems}
  78. pagingLimit={this.state.limit}
  79. />
  80. </div>
  81. );
  82. }
  83. }
  84. /**
  85. * Wrapper component for using unstated
  86. */
  87. const PageTimelineWrapper = withUnstatedContainers(PageTimeline, [AppContainer, PageContainer]);
  88. PageTimeline.propTypes = {
  89. t: PropTypes.func.isRequired, // i18next
  90. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  91. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  92. pages: PropTypes.arrayOf(PropTypes.object),
  93. };
  94. export default withTranslation()(PageTimelineWrapper);