CustomBotWithoutProxySecretTokenSection.jsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import React, { useState, useEffect } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import PropTypes from 'prop-types';
  4. import { apiv3Put } from '~/client/util/apiv3-client';
  5. import { toastSuccess, toastError } from '~/client/util/toastr';
  6. import { withUnstatedContainers } from '../../UnstatedUtils';
  7. import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
  8. const CustomBotWithoutProxySecretTokenSection = (props) => {
  9. const {
  10. slackSigningSecret, slackBotToken, slackSigningSecretEnv, slackBotTokenEnv, onUpdatedSecretToken,
  11. } = props;
  12. const { t } = useTranslation();
  13. const [inputSigningSecret, setInputSigningSecret] = useState(slackSigningSecret || '');
  14. const [inputBotToken, setInputBotToken] = useState(slackBotToken || '');
  15. // update states when props are updated
  16. useEffect(() => {
  17. setInputSigningSecret(slackSigningSecret || '');
  18. }, [slackSigningSecret]);
  19. useEffect(() => {
  20. setInputBotToken(slackBotToken || '');
  21. }, [slackBotToken]);
  22. const updatedSecretToken = async() => {
  23. try {
  24. await apiv3Put('/slack-integration-settings/without-proxy/update-settings', {
  25. slackSigningSecret: inputSigningSecret,
  26. slackBotToken: inputBotToken,
  27. });
  28. if (onUpdatedSecretToken != null) {
  29. onUpdatedSecretToken(inputSigningSecret, inputBotToken);
  30. }
  31. toastSuccess(t('toaster.update_successed', { target: t('admin:slack_integration.custom_bot_without_proxy_settings'), ns: 'commons' }));
  32. }
  33. catch (err) {
  34. toastError(err);
  35. }
  36. };
  37. return (
  38. <div className="w-75 mx-auto">
  39. <h3>Signing Secret</h3>
  40. <div className="row">
  41. <div className="col-sm">
  42. <p>Database</p>
  43. <input
  44. className="form-control"
  45. type="text"
  46. value={inputSigningSecret}
  47. onChange={e => setInputSigningSecret(e.target.value)}
  48. />
  49. </div>
  50. <div className="col-sm">
  51. <p>Environment variables</p>
  52. <input
  53. className="form-control"
  54. type="text"
  55. defaultValue={slackSigningSecretEnv}
  56. readOnly
  57. />
  58. <p className="form-text text-muted">
  59. {/* eslint-disable-next-line max-len, react/no-danger */}
  60. <small dangerouslySetInnerHTML={{ __html: t('admin:slack_integration.use_env_var_if_empty', { variable: 'SLACKBOT_WITHOUT_PROXY_SIGNING_SECRET' }) }} />
  61. </p>
  62. </div>
  63. </div>
  64. <h3>Bot User OAuth Token</h3>
  65. <div className="row">
  66. <div className="col-sm">
  67. <p>Database</p>
  68. <input
  69. className="form-control"
  70. type="text"
  71. value={inputBotToken}
  72. onChange={e => setInputBotToken(e.target.value)}
  73. />
  74. </div>
  75. <div className="col-sm">
  76. <p>Environment variables</p>
  77. <input
  78. className="form-control"
  79. type="text"
  80. defaultValue={slackBotTokenEnv}
  81. readOnly
  82. />
  83. <p className="form-text text-muted">
  84. {/* eslint-disable-next-line react/no-danger */}
  85. <small dangerouslySetInnerHTML={{ __html: t('admin:slack_integration.use_env_var_if_empty', { variable: 'SLACKBOT_WITHOUT_PROXY_BOT_TOKEN' }) }} />
  86. </p>
  87. </div>
  88. </div>
  89. <AdminUpdateButtonRow onClick={updatedSecretToken} disabled={false} />
  90. </div>
  91. );
  92. };
  93. CustomBotWithoutProxySecretTokenSection.propTypes = {
  94. onUpdatedSecretToken: PropTypes.func,
  95. slackSigningSecret: PropTypes.string,
  96. slackSigningSecretEnv: PropTypes.string,
  97. slackBotToken: PropTypes.string,
  98. slackBotTokenEnv: PropTypes.string,
  99. };
  100. export default CustomBotWithoutProxySecretTokenSection;