CustomBotWithoutProxySettings.jsx 5.8 KB

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