GrowiArchiveSection.jsx 4.1 KB

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