SmtpSetting.jsx 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import React, { useState } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import loggerFactory from '@alias/logger';
  5. import {
  6. Modal, ModalHeader, ModalBody,
  7. } from 'reactstrap';
  8. import { withUnstatedContainers } from '../../UnstatedUtils';
  9. import { toastSuccess, toastError } from '../../../util/apiNotification';
  10. import AppContainer from '../../../services/AppContainer';
  11. import AdminAppContainer from '../../../services/AdminAppContainer';
  12. const logger = loggerFactory('growi:smtpSettings');
  13. function SmtpSetting(props) {
  14. const { adminAppContainer, t } = props;
  15. const [isInitializeValueModalOpen, setIsInitializeValueModalOpen] = useState(false);
  16. function openInitializeValueModal() {
  17. setIsInitializeValueModalOpen(true);
  18. }
  19. function closeInitializeValueModal() {
  20. setIsInitializeValueModalOpen(false);
  21. }
  22. async function submitHandler() {
  23. const { t, adminAppContainer } = props;
  24. try {
  25. await adminAppContainer.updateMailSettingHandler();
  26. toastSuccess(t('toaster.update_successed', { target: t('admin:app_setting.mail_settings') }));
  27. }
  28. catch (err) {
  29. toastError(err);
  30. logger.error(err);
  31. }
  32. }
  33. async function initialize() {
  34. const { t, adminAppContainer } = props;
  35. try {
  36. const mailSettingParams = await adminAppContainer.initializeMailSettingHandler();
  37. toastSuccess(t('toaster.initialize_successed', { target: t('admin:app_setting.smtp_settings') }));
  38. // convert values to '' if value is null for overwriting values of inputs with refs
  39. // this.hostInput.current.value = mailSettingParams.smtpHost || '';
  40. // this.portInput.current.value = mailSettingParams.smtpPort || '';
  41. // this.userInput.current.value = mailSettingParams.smtpUser || '';
  42. // this.passwordInput.current.value = mailSettingParams.smtpPassword || '';
  43. closeInitializeValueModal();
  44. }
  45. catch (err) {
  46. toastError(err);
  47. logger.error(err);
  48. }
  49. }
  50. return (
  51. <React.Fragment>
  52. <div id="mail-smtp" className="tab-pane active mt-5">
  53. <div className="row form-group mb-5">
  54. <label className="col-md-3 col-form-label text-left">{t('admin:app_setting.smtp_settings')}</label>
  55. <div className="col-md-4">
  56. <label>{t('admin:app_setting.host')}</label>
  57. <input
  58. className="form-control"
  59. type="text"
  60. // ref={this.hostInput}
  61. defaultValue={adminAppContainer.state.smtpHost || ''}
  62. onChange={(e) => { adminAppContainer.changeSmtpHost(e.target.value) }}
  63. />
  64. </div>
  65. <div className="col-md-2">
  66. <label>{t('admin:app_setting.port')}</label>
  67. <input
  68. className="form-control"
  69. // ref={this.portInput}
  70. defaultValue={adminAppContainer.state.smtpPort || ''}
  71. onChange={(e) => { adminAppContainer.changeSmtpPort(e.target.value) }}
  72. />
  73. </div>
  74. </div>
  75. <div className="row form-group mb-5">
  76. <div className="col-md-3 offset-md-3">
  77. <label>{t('admin:app_setting.user')}</label>
  78. <input
  79. className="form-control"
  80. type="text"
  81. // ref={this.userInput}
  82. defaultValue={adminAppContainer.state.smtpUser || ''}
  83. onChange={(e) => { adminAppContainer.changeSmtpUser(e.target.value) }}
  84. />
  85. </div>
  86. <div className="col-md-3">
  87. <label>{t('Password')}</label>
  88. <input
  89. className="form-control"
  90. type="password"
  91. // ref={this.passwordInput}
  92. defaultValue={adminAppContainer.state.smtpPassword || ''}
  93. onChange={(e) => { adminAppContainer.changeSmtpPassword(e.target.value) }}
  94. />
  95. </div>
  96. </div>
  97. <div className="row my-3">
  98. <div className="offset-5">
  99. <button type="button" className="btn btn-primary" onClick={submitHandler} disabled={adminAppContainer.state.retrieveError != null}>
  100. { t('Update') }
  101. </button>
  102. </div>
  103. <div className="offset-1">
  104. <button
  105. type="button"
  106. className="btn btn-secondary"
  107. onClick={openInitializeValueModal}
  108. disabled={adminAppContainer.state.retrieveError != null}
  109. >
  110. {t('admin:app_setting.initialize_mail_settings')}
  111. </button>
  112. </div>
  113. </div>
  114. </div>
  115. <Modal isOpen={isInitializeValueModalOpen} toggle={closeInitializeValueModal} className="initialize-mail-settings">
  116. <ModalHeader tag="h4" toggle={closeInitializeValueModal} className="bg-danger text-light">
  117. {t('admin:app_setting.initialize_mail_modal_header')}
  118. </ModalHeader>
  119. <ModalBody>
  120. <div className="text-center mb-4">
  121. {t('admin:app_setting.confirm_to_initialize_mail_settings')}
  122. </div>
  123. <div className="text-center my-2">
  124. <button type="button" className="btn btn-outline-secondary mr-4" onClick={closeInitializeValueModal}>
  125. {t('Cancel')}
  126. </button>
  127. <button type="button" className="btn btn-danger" onClick={initialize}>
  128. {t('Reset')}
  129. </button>
  130. </div>
  131. </ModalBody>
  132. </Modal>
  133. </React.Fragment>
  134. );
  135. }
  136. /**
  137. * Wrapper component for using unstated
  138. */
  139. const SmtpSettingWrapper = withUnstatedContainers(SmtpSetting, [AppContainer, AdminAppContainer]);
  140. SmtpSetting.propTypes = {
  141. t: PropTypes.func.isRequired, // i18next
  142. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  143. adminAppContainer: PropTypes.instanceOf(AdminAppContainer).isRequired,
  144. };
  145. export default withTranslation()(SmtpSettingWrapper);