GrowiArchiveSection.jsx 3.6 KB

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