AwsSetting.jsx 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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 { createSubscribedElement } from '../../UnstatedUtils';
  6. import { toastSuccess, toastError } from '../../../util/apiNotification';
  7. import AppContainer from '../../../services/AppContainer';
  8. import AdminAppContainer from '../../../services/AdminAppContainer';
  9. const logger = loggerFactory('growi:appSettings');
  10. class AwsSetting extends React.Component {
  11. constructor(props) {
  12. super(props);
  13. this.submitHandler = this.submitHandler.bind(this);
  14. }
  15. async submitHandler() {
  16. const { t, adminAppContainer } = this.props;
  17. try {
  18. await adminAppContainer.updateAwsSettingHandler();
  19. toastSuccess(t('app_setting.updated_app_setting'));
  20. }
  21. catch (err) {
  22. toastError(err);
  23. logger.error(err);
  24. }
  25. }
  26. render() {
  27. const { t, adminAppContainer } = this.props;
  28. return (
  29. <React.Fragment>
  30. <p className="well">
  31. {t('app_setting.AWS_access')}
  32. <br />
  33. {t('app_setting.No_SMTP_setting')}
  34. <br />
  35. <br />
  36. <span className="text-danger">
  37. <i className="ti-unlink"></i>
  38. {t('app_setting.change_setting')}
  39. </span>
  40. </p>
  41. <div className="row">
  42. <div className="col-md-12">
  43. <div className="form-group">
  44. <label htmlFor="settingForm[app:region]" className="col-xs-3 control-label">
  45. {t('app_setting.region')}
  46. </label>
  47. <div className="col-xs-6">
  48. <input
  49. className="form-control"
  50. id="settingForm[app:region]"
  51. type="text"
  52. name="settingForm[aws:region]"
  53. placeholder={`${t('eg')} ap-northeast-1`}
  54. defaultValue={adminAppContainer.state.region}
  55. onChange={(e) => {
  56. adminAppContainer.changeRegion(e.target.value);
  57. }}
  58. />
  59. </div>
  60. </div>
  61. </div>
  62. </div>
  63. <div className="row">
  64. <div className="col-md-12">
  65. <div className="form-group">
  66. <label htmlFor="settingForm[aws:customEndpoint]" className="col-xs-3 control-label">
  67. {t('app_setting.custom endpoint')}
  68. </label>
  69. <div className="col-xs-6">
  70. <input
  71. className="form-control"
  72. id="settingForm[aws:customEndpoint]"
  73. type="text"
  74. name="settingForm[aws:customEndpoint]"
  75. placeholder={`${t('eg')} http://localhost:9000`}
  76. defaultValue={adminAppContainer.state.customEndpoint}
  77. onChange={(e) => {
  78. adminAppContainer.changeCustomEndpoint(e.target.value);
  79. }}
  80. />
  81. <p className="help-block">{t('app_setting.custom_endpoint_change')}</p>
  82. </div>
  83. </div>
  84. </div>
  85. </div>
  86. <div className="row">
  87. <div className="col-md-12">
  88. <div className="form-group">
  89. <label htmlFor="settingForm[aws:bucket]" className="col-xs-3 control-label">
  90. {t('app_setting.bucket name')}
  91. </label>
  92. <div className="col-xs-6">
  93. <input
  94. className="form-control"
  95. id="settingForm[aws:bucket]"
  96. type="text"
  97. name="settingForm[aws:bucket]"
  98. placeholder={`${t('eg')} crowi`}
  99. defaultValue={adminAppContainer.state.bucket}
  100. onChange={(e) => {
  101. adminAppContainer.changeBucket(e.target.value);
  102. }}
  103. />
  104. </div>
  105. </div>
  106. </div>
  107. </div>
  108. <div className="row">
  109. <div className="col-md-12">
  110. <div className="form-group">
  111. <label htmlFor="settingForm[aws:accessKeyId]" className="col-xs-3 control-label">
  112. Access Key ID
  113. </label>
  114. <div className="col-xs-6">
  115. <input
  116. className="form-control"
  117. id="settingForm[aws:accessKeyId]"
  118. type="text"
  119. name="settingForm[aws:accessKeyId]"
  120. defaultValue={adminAppContainer.state.accessKeyId}
  121. onChange={(e) => {
  122. adminAppContainer.changeAccessKeyId(e.target.value);
  123. }}
  124. />
  125. </div>
  126. </div>
  127. </div>
  128. </div>
  129. <div className="row">
  130. <div className="col-md-12">
  131. <div className="form-group">
  132. <label htmlFor="settingForm[aws:secretAccessKey]" className="col-xs-3 control-label">
  133. Secret Access Key
  134. </label>
  135. <div className="col-xs-6">
  136. <input
  137. className="form-control"
  138. id="settingForm[aws:secretAccessKey]"
  139. type="text"
  140. name="settingForm[aws:secretAccessKey]"
  141. defaultValue={adminAppContainer.state.secretKey}
  142. onChange={(e) => {
  143. adminAppContainer.changeSecretKey(e.target.value);
  144. }}
  145. />
  146. </div>
  147. </div>
  148. </div>
  149. </div>
  150. <div className="row">
  151. <div className="col-md-12">
  152. <div className="form-group">
  153. <div className="col-xs-offset-3 col-xs-6">
  154. <button type="submit" className="btn btn-primary" onClick={this.submitHandler}>
  155. {t('app_setting.Update')}
  156. </button>
  157. </div>
  158. </div>
  159. </div>
  160. </div>
  161. </React.Fragment>
  162. );
  163. }
  164. }
  165. /**
  166. * Wrapper component for using unstated
  167. */
  168. const AwsSettingWrapper = (props) => {
  169. return createSubscribedElement(AwsSetting, props, [AppContainer, AdminAppContainer]);
  170. };
  171. AwsSetting.propTypes = {
  172. t: PropTypes.func.isRequired, // i18next
  173. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  174. adminAppContainer: PropTypes.instanceOf(AdminAppContainer).isRequired,
  175. };
  176. export default withTranslation()(AwsSettingWrapper);