SlackNotification.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /* eslint-disable react/prop-types */
  2. import type { FC } from 'react';
  3. import { useTranslation } from 'next-i18next';
  4. import {
  5. FormGroup,
  6. Input,
  7. InputGroup,
  8. InputGroupText,
  9. PopoverBody,
  10. PopoverHeader,
  11. UncontrolledPopover,
  12. } from 'reactstrap';
  13. import styles from './SlackNotification.module.scss';
  14. type SlackNotificationProps = {
  15. id: string;
  16. isSlackEnabled: boolean;
  17. slackChannels: string;
  18. onEnabledFlagChange?: (isSlackEnabled: boolean) => void;
  19. onChannelChange?: (value: string) => void;
  20. };
  21. export const SlackNotification: FC<SlackNotificationProps> = ({
  22. id,
  23. isSlackEnabled,
  24. slackChannels,
  25. onEnabledFlagChange,
  26. onChannelChange,
  27. }) => {
  28. const { t } = useTranslation();
  29. const idForSlackPopover = `${id}ForSlackPopover`;
  30. const updateCheckboxHandler = (event: { target: { checked: boolean } }) => {
  31. const value = event.target.checked;
  32. if (onEnabledFlagChange != null) {
  33. onEnabledFlagChange(value);
  34. }
  35. };
  36. const updateSlackChannelsHandler = (event: { target: { value: string } }) => {
  37. const value = event.target.value;
  38. if (onChannelChange != null) {
  39. onChannelChange(value);
  40. }
  41. };
  42. return (
  43. <InputGroup
  44. className={`d-flex align-items-center ${styles['grw-slack-switch']}`}
  45. >
  46. <InputGroupText className="rounded-pill rounded-end border-end-0 p-0 pe-1 grw-slack-switch">
  47. <FormGroup switch className="position-relative pe-4 py-3 m-0 me-2">
  48. <Input
  49. className="position-absolute bottom-0 start-0 p-0 m-0 w-100 h-100 border-0"
  50. type="switch"
  51. role="switch"
  52. id={id}
  53. checked={isSlackEnabled}
  54. onChange={updateCheckboxHandler}
  55. />
  56. </FormGroup>
  57. </InputGroupText>
  58. <Input
  59. className="rounded-pill rounded-start border-start-0 py-1"
  60. id={idForSlackPopover}
  61. type="text"
  62. value={slackChannels}
  63. placeholder={`${t('slack_notification.input_channels')}`}
  64. onChange={updateSlackChannelsHandler}
  65. />
  66. <UncontrolledPopover
  67. trigger="focus"
  68. placement="top"
  69. target={idForSlackPopover}
  70. >
  71. <PopoverHeader>{t('slack_notification.popover_title')}</PopoverHeader>
  72. <PopoverBody>{t('slack_notification.popover_desc')}</PopoverBody>
  73. </UncontrolledPopover>
  74. </InputGroup>
  75. );
  76. };