PageTimeline.jsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 { withUnstatedContainers } from './UnstatedUtils';
  7. import RevisionLoader from './Page/RevisionLoader';
  8. class PageTimeline extends React.Component {
  9. constructor(props) {
  10. super(props);
  11. const { appContainer } = this.props;
  12. this.showPages = this.showPages.bind(this);
  13. this.state = {
  14. isEnabled: appContainer.getConfig().isEnabledTimeline,
  15. // TODO: remove after when timeline is implemented with React and inject data with props
  16. pages: this.props.pages,
  17. };
  18. }
  19. async showPages() {
  20. const { appContainer, pageContainer } = this.props;
  21. const { path } = pageContainer.state;
  22. const res = await appContainer.apiv3Get('/pages/list', { path });
  23. this.setState({
  24. pages: res.data.pages,
  25. });
  26. }
  27. componentWillMount() {
  28. if (!this.state.isEnabled) {
  29. return;
  30. }
  31. const { appContainer } = this.props;
  32. // initialize GrowiRenderer
  33. this.growiRenderer = appContainer.getRenderer('timeline');
  34. this.showPages();
  35. }
  36. render() {
  37. if (!this.state.isEnabled) {
  38. return <React.Fragment></React.Fragment>;
  39. }
  40. const { pages } = this.state;
  41. if (pages == null) {
  42. return <React.Fragment></React.Fragment>;
  43. }
  44. return pages.map((page) => {
  45. return (
  46. <div className="timeline-body" key={`key-${page.id}`}>
  47. <div className="card card-timeline">
  48. <div className="card-header"><a href={page.path}>{page.path}</a></div>
  49. <div className="card-body">
  50. <RevisionLoader
  51. lazy
  52. growiRenderer={this.growiRenderer}
  53. pageId={page.id}
  54. revisionId={page.revision}
  55. />
  56. </div>
  57. </div>
  58. </div>
  59. );
  60. });
  61. }
  62. }
  63. PageTimeline.propTypes = {
  64. t: PropTypes.func.isRequired, // i18next
  65. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  66. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  67. pages: PropTypes.arrayOf(PropTypes.object),
  68. };
  69. /**
  70. * Wrapper component for using unstated
  71. */
  72. const PageTimelineWrapper = withUnstatedContainers(PageTimeline, [AppContainer, PageContainer]);
  73. export default withTranslation()(PageTimelineWrapper);