GrowiArchiveSection.jsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import React, { Fragment } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import * as toastr from 'toastr';
  5. import AppContainer from '~/client/services/AppContainer';
  6. import { apiv3Delete, apiv3Get } from '~/client/util/apiv3-client';
  7. import { withUnstatedContainers } from '../../UnstatedUtils';
  8. // import { toastSuccess, toastError } from '~/client/util/apiNotification';
  9. import ImportForm from './GrowiArchive/ImportForm';
  10. import UploadForm from './GrowiArchive/UploadForm';
  11. class GrowiArchiveSection extends React.Component {
  12. constructor(props) {
  13. super(props);
  14. this.initialState = {
  15. fileName: null,
  16. innerFileStats: null,
  17. isTheSameVersion: null,
  18. };
  19. this.state = this.initialState;
  20. this.handleUpload = this.handleUpload.bind(this);
  21. this.discardData = this.discardData.bind(this);
  22. this.resetState = this.resetState.bind(this);
  23. this.handleMismatchedVersions = this.handleMismatchedVersions.bind(this);
  24. this.renderDefferentVersionAlert = this.renderDefferentVersionAlert.bind(this);
  25. }
  26. async componentWillMount() {
  27. // get uploaded file status
  28. const res = await apiv3Get('/import/status');
  29. if (res.data.zipFileStat != null) {
  30. const { fileName, innerFileStats } = res.data.zipFileStat;
  31. const { isTheSameVersion } = res.data;
  32. this.setState({ fileName, innerFileStats, isTheSameVersion });
  33. }
  34. }
  35. handleUpload({
  36. meta, fileName, innerFileStats,
  37. }) {
  38. this.setState({
  39. fileName,
  40. innerFileStats,
  41. isTheSameVersion: true,
  42. });
  43. }
  44. async discardData() {
  45. try {
  46. const { fileName } = this.state;
  47. await apiv3Delete('/import/all');
  48. this.resetState();
  49. // TODO: toastSuccess, toastError
  50. toastr.success(undefined, `Deleted ${fileName}`, {
  51. closeButton: true,
  52. progressBar: true,
  53. newestOnTop: false,
  54. showDuration: '100',
  55. hideDuration: '100',
  56. timeOut: '1200',
  57. extendedTimeOut: '150',
  58. });
  59. }
  60. catch (err) {
  61. // TODO: toastSuccess, toastError
  62. toastr.error(err, 'Error', {
  63. closeButton: true,
  64. progressBar: true,
  65. newestOnTop: false,
  66. showDuration: '100',
  67. hideDuration: '100',
  68. timeOut: '3000',
  69. });
  70. }
  71. }
  72. handleMismatchedVersions(err) {
  73. this.setState({
  74. isTheSameVersion: false,
  75. });
  76. }
  77. renderDefferentVersionAlert() {
  78. const { t } = this.props;
  79. return (
  80. <div className="alert alert-warning mt-3">
  81. {t('admin:importer_management.growi_settings.errors.different_versions')}
  82. </div>
  83. );
  84. }
  85. resetState() {
  86. this.setState(this.initialState);
  87. }
  88. render() {
  89. const { t } = this.props;
  90. const { isTheSameVersion } = this.state;
  91. return (
  92. <Fragment>
  93. <h2>{t('admin:importer_management.import_growi_archive')}</h2>
  94. <div className="card well mb-4 small">
  95. <ul>
  96. <li>{t('admin:importer_management.skip_username_and_email_when_overlapped')}</li>
  97. <li>{t('admin:importer_management.prepare_new_account_for_migration')}</li>
  98. <li>
  99. <a
  100. href={`${t('admin:importer_management.admin_archive_data_import_guide_url')}`}
  101. target="_blank"
  102. rel="noopener noreferrer"
  103. >{t('admin:importer_management.archive_data_import_detail')}
  104. </a>
  105. </li>
  106. </ul>
  107. </div>
  108. {isTheSameVersion === false && this.renderDefferentVersionAlert()}
  109. {this.state.fileName != null && isTheSameVersion === true ? (
  110. <div className="px-4">
  111. <ImportForm
  112. fileName={this.state.fileName}
  113. innerFileStats={this.state.innerFileStats}
  114. onDiscard={this.discardData}
  115. />
  116. </div>
  117. )
  118. : (
  119. <UploadForm
  120. onUpload={this.handleUpload}
  121. onVersionMismatch={this.handleMismatchedVersions}
  122. />
  123. )}
  124. </Fragment>
  125. );
  126. }
  127. }
  128. GrowiArchiveSection.propTypes = {
  129. t: PropTypes.func.isRequired, // i18next
  130. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  131. };
  132. /**
  133. * Wrapper component for using unstated
  134. */
  135. const GrowiArchiveSectionWrapper = withUnstatedContainers(GrowiArchiveSection, [AppContainer]);
  136. export default withTranslation()(GrowiArchiveSectionWrapper);