FileUploadSetting.jsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. // import loggerFactory from '@alias/logger';
  5. import {
  6. TabContent, TabPane, Nav, NavItem, NavLink,
  7. } from 'reactstrap';
  8. import { withUnstatedContainers } from '../../UnstatedUtils';
  9. import AppContainer from '../../../services/AppContainer';
  10. import AdminAppContainer from '../../../services/AdminAppContainer';
  11. import AwsSetting from './AwsSetting';
  12. import GcpSettings from './GcpSettings';
  13. // const logger = loggerFactory('growi:FileUploadSetting');
  14. class FileUploadSetting extends React.Component {
  15. constructor(props) {
  16. super(props);
  17. this.state = {
  18. activeTab: 'aws-setting',
  19. // Prevent unnecessary rendering
  20. activeComponents: new Set(['aws-setting']),
  21. };
  22. }
  23. toggleActiveTab(activeTab) {
  24. this.setState({
  25. activeTab, activeComponents: this.state.activeComponents.add(activeTab),
  26. });
  27. }
  28. render() {
  29. const { t, adminAppContainer } = this.props;
  30. const { activeTab, activeComponents } = this.state;
  31. const fileUploadTypes = ['aws', 'gcp'];
  32. return (
  33. <React.Fragment>
  34. <p className="card well my-3">
  35. {t('admin:app_setting.file_upload')}
  36. <br />
  37. <br />
  38. <span className="text-danger">
  39. <i className="ti-unlink"></i>
  40. {t('admin:app_setting.change_setting')}
  41. </span>
  42. </p>
  43. <div className="row form-group mb-5">
  44. <label className="text-left text-md-right col-md-3 col-form-label">
  45. {t('admin:app_setting.file_upload_method')}
  46. </label>
  47. <div className="col-md-6 py-2">
  48. {fileUploadTypes.map((type) => {
  49. return (
  50. <div key={type} className="custom-control custom-radio custom-control-inline">
  51. <input
  52. type="radio"
  53. className="custom-control-input"
  54. name="transmission-method"
  55. id={`file-upload-nethod-radio-${type}`}
  56. checked={adminAppContainer.state.fileUploadType === type}
  57. onChange={(e) => {
  58. adminAppContainer.changeFileUploadType(type);
  59. }}
  60. />
  61. <label className="custom-control-label" htmlFor={`transmission-nethod-radio-${type}`}>{t(`admin:app_setting.${type}_label`)}</label>
  62. </div>
  63. );
  64. })}
  65. </div>
  66. </div>
  67. <Nav tabs>
  68. <NavItem>
  69. <NavLink
  70. className={`${activeTab === 'aws-setting' && 'active'} `}
  71. onClick={() => { this.toggleActiveTab('aws-setting') }}
  72. href="#smtp-setting"
  73. >
  74. {t('admin:app_setting.aws_settings')}
  75. </NavLink>
  76. </NavItem>
  77. <NavItem>
  78. <NavLink
  79. className={`${activeTab === 'gcp-setting' && 'active'} `}
  80. onClick={() => { this.toggleActiveTab('gcp-setting') }}
  81. href="#ses-setting"
  82. >
  83. {t('admin:app_setting.gcp_settings')}
  84. </NavLink>
  85. </NavItem>
  86. </Nav>
  87. <TabContent activeTab={activeTab} className="pt-3">
  88. <TabPane tabId="aws-setting">
  89. {activeComponents.has('aws-setting') && <AwsSetting />}
  90. </TabPane>
  91. <TabPane tabId="gcp-setting">
  92. {activeComponents.has('gcp-setting') && <GcpSettings />}
  93. </TabPane>
  94. </TabContent>
  95. </React.Fragment>
  96. );
  97. }
  98. }
  99. /**
  100. * Wrapper component for using unstated
  101. */
  102. const FileUploadSettingWrapper = withUnstatedContainers(FileUploadSetting, [AppContainer, AdminAppContainer]);
  103. FileUploadSetting.propTypes = {
  104. t: PropTypes.func.isRequired, // i18next
  105. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  106. adminAppContainer: PropTypes.instanceOf(AdminAppContainer).isRequired,
  107. };
  108. export default withTranslation()(FileUploadSettingWrapper);