ExportPage.jsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import React, { Fragment } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import ExportZipForm from './ExportZipForm';
  5. import ZipFileTable from './ZipFileTable';
  6. import { createSubscribedElement } from '../../UnstatedUtils';
  7. import AppContainer from '../../../services/AppContainer';
  8. // import { toastSuccess, toastError } from '../../../util/apiNotification';
  9. class ExportPage extends React.Component {
  10. constructor(props) {
  11. super(props);
  12. this.state = {
  13. zipFileStats: [],
  14. };
  15. this.onZipFileStatAdd = this.onZipFileStatAdd.bind(this);
  16. this.onZipFileStatRemove = this.onZipFileStatRemove.bind(this);
  17. }
  18. async componentDidMount() {
  19. // TODO: use apiv3.get
  20. const { zipFileStats } = await this.props.appContainer.apiGet('/v3/export/status', {});
  21. this.setState({ zipFileStats });
  22. // TODO toastSuccess, toastError
  23. }
  24. onZipFileStatAdd(newStat) {
  25. this.setState((prevState) => {
  26. return {
  27. zipFileStats: [...prevState.zipFileStats, newStat],
  28. };
  29. });
  30. }
  31. async onZipFileStatRemove(fileName) {
  32. await this.props.appContainer.apiRequest('delete', `/v3/export/${fileName}`, {});
  33. this.setState((prevState) => {
  34. return {
  35. zipFileStats: prevState.zipFileStats.filter(stat => stat.fileName !== fileName),
  36. };
  37. });
  38. }
  39. render() {
  40. const { t } = this.props;
  41. return (
  42. <Fragment>
  43. <h2>{t('export_management.export_as_zip')}</h2>
  44. <ExportZipForm
  45. zipFileStats={this.state.zipFileStats}
  46. onZipFileStatAdd={this.onZipFileStatAdd}
  47. />
  48. <ZipFileTable
  49. zipFileStats={this.state.zipFileStats}
  50. onZipFileStatRemove={this.onZipFileStatRemove}
  51. />
  52. </Fragment>
  53. );
  54. }
  55. }
  56. ExportPage.propTypes = {
  57. t: PropTypes.func.isRequired, // i18next
  58. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  59. };
  60. /**
  61. * Wrapper component for using unstated
  62. */
  63. const ExportPageFormWrapper = (props) => {
  64. return createSubscribedElement(ExportPage, props, [AppContainer]);
  65. };
  66. export default withTranslation()(ExportPageFormWrapper);