2
0

SmtpSetting.jsx 6.3 KB

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