CustomBotWithoutProxySettings.jsx 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import React, { useState, useEffect, useCallback } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import PropTypes from 'prop-types';
  4. import AppContainer from '../../../services/AppContainer';
  5. import AdminAppContainer from '../../../services/AdminAppContainer';
  6. import { withUnstatedContainers } from '../../UnstatedUtils';
  7. import { toastSuccess, toastError } from '../../../util/apiNotification';
  8. import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
  9. import SlackGrowiBridging from './SlackGrowiBridging';
  10. const CustomBotWithoutProxySettings = (props) => {
  11. const { appContainer, adminAppContainer } = props;
  12. const { t } = useTranslation();
  13. const [slackSigningSecret, setSlackSigningSecret] = useState('');
  14. const [slackBotToken, setSlackBotToken] = useState('');
  15. const [slackSigningSecretEnv, setSlackSigningSecretEnv] = useState('');
  16. const [slackBotTokenEnv, setSlackBotTokenEnv] = useState('');
  17. const [slackWSNameInWithoutProxy, setSlackWSNameInWithoutProxy] = useState(null);
  18. // get site name from this GROWI
  19. // eslint-disable-next-line no-unused-vars
  20. const [siteName, setSiteName] = useState('');
  21. // eslint-disable-next-line no-unused-vars
  22. const [isSetupSlackBot, setIsSetupSlackBot] = useState(null);
  23. const [isConnectedToSlack, setIsConnectedToSlack] = useState(null);
  24. const currentBotType = 'custom-bot-without-proxy';
  25. useEffect(() => {
  26. const fetchData = async() => {
  27. try {
  28. const res = await appContainer.apiv3.get('/slack-integration/custom-bot-without-proxy/slack-workspace-name');
  29. setSlackWSNameInWithoutProxy(res.data.slackWorkSpaceName);
  30. }
  31. catch (err) {
  32. toastError(err);
  33. }
  34. };
  35. setSlackWSNameInWithoutProxy(null);
  36. if (isConnectedToSlack) {
  37. fetchData();
  38. }
  39. }, [appContainer, isConnectedToSlack]);
  40. const fetchData = useCallback(async() => {
  41. try {
  42. await adminAppContainer.retrieveAppSettingsData();
  43. const res = await appContainer.apiv3.get('/slack-integration/');
  44. const {
  45. slackSigningSecret, slackBotToken, slackSigningSecretEnvVars, slackBotTokenEnvVars, isSetupSlackBot, isConnectedToSlack,
  46. } = res.data.slackBotSettingParams.customBotWithoutProxySettings;
  47. setSlackSigningSecret(slackSigningSecret);
  48. setSlackBotToken(slackBotToken);
  49. setSlackSigningSecretEnv(slackSigningSecretEnvVars);
  50. setSlackBotTokenEnv(slackBotTokenEnvVars);
  51. setSiteName(adminAppContainer.state.title);
  52. setIsSetupSlackBot(isSetupSlackBot);
  53. setIsConnectedToSlack(isConnectedToSlack);
  54. }
  55. catch (err) {
  56. toastError(err);
  57. }
  58. }, [appContainer, adminAppContainer]);
  59. useEffect(() => {
  60. fetchData();
  61. }, [fetchData]);
  62. async function updateHandler() {
  63. try {
  64. await appContainer.apiv3.put('/slack-integration/custom-bot-without-proxy', {
  65. slackSigningSecret,
  66. slackBotToken,
  67. currentBotType,
  68. });
  69. fetchData();
  70. toastSuccess(t('toaster.update_successed', { target: t('admin:slack_integration.custom_bot_without_proxy_settings') }));
  71. }
  72. catch (err) {
  73. toastError(err);
  74. }
  75. }
  76. return (
  77. <>
  78. <h2 className="admin-setting-header">{t('admin:slack_integration.custom_bot_without_proxy_settings')}</h2>
  79. {/* temporarily put bellow component */}
  80. <SlackGrowiBridging
  81. siteName={siteName}
  82. slackWorkSpaceName={slackWSNameInWithoutProxy}
  83. />
  84. <div className="row my-5">
  85. <div className="mx-auto">
  86. <button
  87. type="button"
  88. className="btn btn-primary text-nowrap mx-1"
  89. onClick={() => window.open('https://api.slack.com/apps', '_blank')}
  90. >
  91. {t('admin:slack_integration.without_proxy.create_bot')}
  92. </button>
  93. </div>
  94. </div>
  95. <table className="table settings-table">
  96. <colgroup>
  97. <col className="item-name" />
  98. <col className="from-db" />
  99. <col className="from-env-vars" />
  100. </colgroup>
  101. <thead>
  102. <tr><th></th><th>Database</th><th>Environment variables</th></tr>
  103. </thead>
  104. <tbody>
  105. <tr>
  106. <th>Signing Secret</th>
  107. <td>
  108. <input
  109. className="form-control"
  110. type="text"
  111. value={slackSigningSecret || ''}
  112. onChange={e => setSlackSigningSecret(e.target.value)}
  113. />
  114. </td>
  115. <td>
  116. <input
  117. className="form-control"
  118. type="text"
  119. value={slackSigningSecretEnv || ''}
  120. readOnly
  121. />
  122. <p className="form-text text-muted">
  123. {/* eslint-disable-next-line react/no-danger */}
  124. <small dangerouslySetInnerHTML={{ __html: t('admin:slack_integration.use_env_var_if_empty', { variable: 'SLACK_SIGNING_SECRET' }) }} />
  125. </p>
  126. </td>
  127. </tr>
  128. <tr>
  129. <th>Bot User OAuth Token</th>
  130. <td>
  131. <input
  132. className="form-control"
  133. type="text"
  134. value={slackBotToken || ''}
  135. onChange={e => setSlackBotToken(e.target.value)}
  136. />
  137. </td>
  138. <td>
  139. <input
  140. className="form-control"
  141. type="text"
  142. value={slackBotTokenEnv || ''}
  143. readOnly
  144. />
  145. <p className="form-text text-muted">
  146. {/* eslint-disable-next-line react/no-danger */}
  147. <small dangerouslySetInnerHTML={{ __html: t('admin:slack_integration.use_env_var_if_empty', { variable: 'SLACK_BOT_TOKEN' }) }} />
  148. </p>
  149. </td>
  150. </tr>
  151. </tbody>
  152. </table>
  153. <AdminUpdateButtonRow onClick={updateHandler} disabled={false} />
  154. </>
  155. );
  156. };
  157. const CustomBotWithoutProxySettingsWrapper = withUnstatedContainers(CustomBotWithoutProxySettings, [AppContainer, AdminAppContainer]);
  158. CustomBotWithoutProxySettings.propTypes = {
  159. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  160. adminAppContainer: PropTypes.instanceOf(AdminAppContainer).isRequired,
  161. };
  162. export default CustomBotWithoutProxySettingsWrapper;