GrowiArchiveSection.jsx 4.6 KB

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