@knocklabs/react 0.1.9 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/cjs/index.css +1 -1
  3. package/dist/cjs/index.js +1 -1
  4. package/dist/cjs/modules/core/components/Button/styles.css.js +2 -0
  5. package/dist/cjs/modules/core/components/Button/styles.css.js.map +1 -0
  6. package/dist/cjs/modules/core/hooks/useOutsideClick.js +2 -0
  7. package/dist/cjs/modules/core/hooks/useOutsideClick.js.map +1 -0
  8. package/dist/cjs/modules/feed/components/EmptyFeed/styles.css.js +2 -0
  9. package/dist/cjs/modules/feed/components/EmptyFeed/styles.css.js.map +1 -0
  10. package/dist/cjs/modules/feed/components/NotificationCell/styles.css.js +2 -0
  11. package/dist/cjs/modules/feed/components/NotificationCell/styles.css.js.map +1 -0
  12. package/dist/cjs/modules/feed/components/NotificationFeed/styles.css.js +2 -0
  13. package/dist/cjs/modules/feed/components/NotificationFeed/styles.css.js.map +1 -0
  14. package/dist/cjs/modules/feed/components/NotificationFeedContainer/styles.css.js +2 -0
  15. package/dist/cjs/modules/feed/components/NotificationFeedContainer/styles.css.js.map +1 -0
  16. package/dist/cjs/modules/feed/components/NotificationFeedPopover/styles.css.js +2 -0
  17. package/dist/cjs/modules/feed/components/NotificationFeedPopover/styles.css.js.map +1 -0
  18. package/dist/cjs/modules/feed/components/NotificationIconButton/styles.css.js +2 -0
  19. package/dist/cjs/modules/feed/components/NotificationIconButton/styles.css.js.map +1 -0
  20. package/dist/cjs/modules/feed/components/UnseenBadge/styles.css.js +2 -0
  21. package/dist/cjs/modules/feed/components/UnseenBadge/styles.css.js.map +1 -0
  22. package/dist/cjs/modules/slack/components/SlackAddChannelInput/SlackAddChannelInput.js +2 -0
  23. package/dist/cjs/modules/slack/components/SlackAddChannelInput/SlackAddChannelInput.js.map +1 -0
  24. package/dist/cjs/modules/slack/components/SlackAddChannelInput/styles.css.js +2 -0
  25. package/dist/cjs/modules/slack/components/SlackAddChannelInput/styles.css.js.map +1 -0
  26. package/dist/cjs/modules/slack/components/SlackAuthButton/SlackAuthButton.js +2 -0
  27. package/dist/cjs/modules/slack/components/SlackAuthButton/SlackAuthButton.js.map +1 -0
  28. package/dist/cjs/modules/slack/components/SlackAuthButton/styles.css.js +2 -0
  29. package/dist/cjs/modules/slack/components/SlackAuthButton/styles.css.js.map +1 -0
  30. package/dist/cjs/modules/slack/components/SlackAuthContainer/SlackAuthContainer.js +2 -0
  31. package/dist/cjs/modules/slack/components/SlackAuthContainer/SlackAuthContainer.js.map +1 -0
  32. package/dist/cjs/modules/slack/components/SlackAuthContainer/styles.css.js +2 -0
  33. package/dist/cjs/modules/slack/components/SlackAuthContainer/styles.css.js.map +1 -0
  34. package/dist/cjs/modules/slack/components/SlackChannelCombobox/SlackChannelCombobox.js +2 -0
  35. package/dist/cjs/modules/slack/components/SlackChannelCombobox/SlackChannelCombobox.js.map +1 -0
  36. package/dist/cjs/modules/slack/components/SlackChannelCombobox/SlackChannelListBox.js +2 -0
  37. package/dist/cjs/modules/slack/components/SlackChannelCombobox/SlackChannelListBox.js.map +1 -0
  38. package/dist/cjs/modules/slack/components/SlackChannelCombobox/SlackChannelOption.js +2 -0
  39. package/dist/cjs/modules/slack/components/SlackChannelCombobox/SlackChannelOption.js.map +1 -0
  40. package/dist/cjs/modules/slack/components/SlackChannelCombobox/SlackConnectedChannelTag.js +2 -0
  41. package/dist/cjs/modules/slack/components/SlackChannelCombobox/SlackConnectedChannelTag.js.map +1 -0
  42. package/dist/cjs/modules/slack/components/SlackChannelCombobox/SlackConnectedChannelTagList.js +2 -0
  43. package/dist/cjs/modules/slack/components/SlackChannelCombobox/SlackConnectedChannelTagList.js.map +1 -0
  44. package/dist/cjs/modules/slack/components/SlackChannelCombobox/SlackConnectionError.js +2 -0
  45. package/dist/cjs/modules/slack/components/SlackChannelCombobox/SlackConnectionError.js.map +1 -0
  46. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/CheckmarkIcon.js +2 -0
  47. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/CheckmarkIcon.js.map +1 -0
  48. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/CloseIcon.js +2 -0
  49. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/CloseIcon.js.map +1 -0
  50. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/HashtagIcon.js +2 -0
  51. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/HashtagIcon.js.map +1 -0
  52. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/InfoIcon.js +2 -0
  53. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/InfoIcon.js.map +1 -0
  54. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/LockIcon.js +2 -0
  55. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/LockIcon.js.map +1 -0
  56. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/SearchIcon.js +2 -0
  57. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/SearchIcon.js.map +1 -0
  58. package/dist/cjs/modules/slack/components/SlackChannelCombobox/styles.css.js +2 -0
  59. package/dist/cjs/modules/slack/components/SlackChannelCombobox/styles.css.js.map +1 -0
  60. package/dist/cjs/modules/slack/components/SlackIcon/SlackIcon.js +2 -0
  61. package/dist/cjs/modules/slack/components/SlackIcon/SlackIcon.js.map +1 -0
  62. package/dist/cjs/modules/slack/theme.css.js +2 -0
  63. package/dist/cjs/modules/slack/theme.css.js.map +1 -0
  64. package/dist/cjs/theme.css.js.map +1 -0
  65. package/dist/esm/index.mjs +28 -20
  66. package/dist/esm/index.mjs.map +1 -1
  67. package/dist/esm/modules/core/hooks/useOutsideClick.mjs +18 -0
  68. package/dist/esm/modules/core/hooks/useOutsideClick.mjs.map +1 -0
  69. package/dist/esm/modules/slack/components/SlackAddChannelInput/SlackAddChannelInput.mjs +51 -0
  70. package/dist/esm/modules/slack/components/SlackAddChannelInput/SlackAddChannelInput.mjs.map +1 -0
  71. package/dist/esm/modules/slack/components/SlackAuthButton/SlackAuthButton.mjs +81 -0
  72. package/dist/esm/modules/slack/components/SlackAuthButton/SlackAuthButton.mjs.map +1 -0
  73. package/dist/esm/modules/slack/components/SlackAuthContainer/SlackAuthContainer.mjs +22 -0
  74. package/dist/esm/modules/slack/components/SlackAuthContainer/SlackAuthContainer.mjs.map +1 -0
  75. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackChannelCombobox.mjs +195 -0
  76. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackChannelCombobox.mjs.map +1 -0
  77. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackChannelListBox.mjs +31 -0
  78. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackChannelListBox.mjs.map +1 -0
  79. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackChannelOption.mjs +49 -0
  80. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackChannelOption.mjs.map +1 -0
  81. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackConnectedChannelTag.mjs +24 -0
  82. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackConnectedChannelTag.mjs.map +1 -0
  83. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackConnectedChannelTagList.mjs +17 -0
  84. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackConnectedChannelTagList.mjs.map +1 -0
  85. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackConnectionError.mjs +14 -0
  86. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackConnectionError.mjs.map +1 -0
  87. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/CheckmarkIcon.mjs +31 -0
  88. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/CheckmarkIcon.mjs.map +1 -0
  89. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/CloseIcon.mjs +24 -0
  90. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/CloseIcon.mjs.map +1 -0
  91. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/HashtagIcon.mjs +24 -0
  92. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/HashtagIcon.mjs.map +1 -0
  93. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/InfoIcon.mjs +50 -0
  94. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/InfoIcon.mjs.map +1 -0
  95. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/LockIcon.mjs +33 -0
  96. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/LockIcon.mjs.map +1 -0
  97. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/SearchIcon.mjs +21 -0
  98. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/SearchIcon.mjs.map +1 -0
  99. package/dist/esm/modules/slack/components/SlackIcon/SlackIcon.mjs +46 -0
  100. package/dist/esm/modules/slack/components/SlackIcon/SlackIcon.mjs.map +1 -0
  101. package/dist/index.css +1 -1
  102. package/dist/types/App.d.ts.map +1 -1
  103. package/dist/types/index.d.ts +1 -0
  104. package/dist/types/index.d.ts.map +1 -1
  105. package/dist/types/modules/core/components/Button/Button.d.ts +1 -0
  106. package/dist/types/modules/core/components/Button/ButtonGroup.d.ts +1 -0
  107. package/dist/types/modules/core/components/Button/ButtonSpinner.d.ts +1 -0
  108. package/dist/types/modules/core/hooks/index.d.ts +1 -0
  109. package/dist/types/modules/core/hooks/index.d.ts.map +1 -1
  110. package/dist/types/modules/core/hooks/useOutsideClick.d.ts +8 -0
  111. package/dist/types/modules/core/hooks/useOutsideClick.d.ts.map +1 -0
  112. package/dist/types/modules/feed/components/EmptyFeed/EmptyFeed.d.ts +1 -0
  113. package/dist/types/modules/feed/components/NotificationCell/Avatar.d.ts +1 -0
  114. package/dist/types/modules/feed/components/NotificationCell/NotificationCell.d.ts +1 -0
  115. package/dist/types/modules/feed/components/NotificationFeed/Dropdown.d.ts +1 -0
  116. package/dist/types/modules/feed/components/NotificationFeed/MarkAsRead.d.ts +1 -0
  117. package/dist/types/modules/feed/components/NotificationFeed/NotificationFeed.d.ts +1 -0
  118. package/dist/types/modules/feed/components/NotificationFeedContainer/NotificationFeedContainer.d.ts +1 -0
  119. package/dist/types/modules/feed/components/NotificationFeedPopover/NotificationFeedPopover.d.ts +1 -0
  120. package/dist/types/modules/feed/components/NotificationIconButton/NotificationIconButton.d.ts +1 -0
  121. package/dist/types/modules/feed/components/UnseenBadge/UnseenBadge.d.ts +1 -0
  122. package/dist/types/modules/slack/components/SlackAddChannelInput/SlackAddChannelInput.d.ts +12 -0
  123. package/dist/types/modules/slack/components/SlackAddChannelInput/SlackAddChannelInput.d.ts.map +1 -0
  124. package/dist/types/modules/slack/components/SlackAddChannelInput/index.d.ts +2 -0
  125. package/dist/types/modules/slack/components/SlackAddChannelInput/index.d.ts.map +1 -0
  126. package/dist/types/modules/slack/components/SlackAuthButton/SlackAuthButton.d.ts +11 -0
  127. package/dist/types/modules/slack/components/SlackAuthButton/SlackAuthButton.d.ts.map +1 -0
  128. package/dist/types/modules/slack/components/SlackAuthButton/index.d.ts +2 -0
  129. package/dist/types/modules/slack/components/SlackAuthButton/index.d.ts.map +1 -0
  130. package/dist/types/modules/slack/components/SlackAuthContainer/SlackAuthContainer.d.ts +5 -0
  131. package/dist/types/modules/slack/components/SlackAuthContainer/SlackAuthContainer.d.ts.map +1 -0
  132. package/dist/types/modules/slack/components/SlackAuthContainer/index.d.ts +2 -0
  133. package/dist/types/modules/slack/components/SlackAuthContainer/index.d.ts.map +1 -0
  134. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackChannelCombobox.d.ts +25 -0
  135. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackChannelCombobox.d.ts.map +1 -0
  136. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackChannelListBox.d.ts +17 -0
  137. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackChannelListBox.d.ts.map +1 -0
  138. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackChannelOption.d.ts +16 -0
  139. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackChannelOption.d.ts.map +1 -0
  140. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackConnectedChannelTag.d.ts +9 -0
  141. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackConnectedChannelTag.d.ts.map +1 -0
  142. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackConnectedChannelTagList.d.ts +10 -0
  143. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackConnectedChannelTagList.d.ts.map +1 -0
  144. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackConnectionError.d.ts +3 -0
  145. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackConnectionError.d.ts.map +1 -0
  146. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/CheckmarkIcon.d.ts +6 -0
  147. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/CheckmarkIcon.d.ts.map +1 -0
  148. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/CloseIcon.d.ts +3 -0
  149. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/CloseIcon.d.ts.map +1 -0
  150. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/HashtagIcon.d.ts +3 -0
  151. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/HashtagIcon.d.ts.map +1 -0
  152. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/InfoIcon.d.ts +3 -0
  153. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/InfoIcon.d.ts.map +1 -0
  154. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/LockIcon.d.ts +3 -0
  155. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/LockIcon.d.ts.map +1 -0
  156. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/SearchIcon.d.ts +3 -0
  157. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/SearchIcon.d.ts.map +1 -0
  158. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/index.d.ts +6 -0
  159. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/index.d.ts.map +1 -0
  160. package/dist/types/modules/slack/components/SlackChannelCombobox/index.d.ts +2 -0
  161. package/dist/types/modules/slack/components/SlackChannelCombobox/index.d.ts.map +1 -0
  162. package/dist/types/modules/slack/components/SlackIcon/SlackIcon.d.ts +5 -0
  163. package/dist/types/modules/slack/components/SlackIcon/SlackIcon.d.ts.map +1 -0
  164. package/dist/types/modules/slack/components/SlackIcon/index.d.ts +2 -0
  165. package/dist/types/modules/slack/components/SlackIcon/index.d.ts.map +1 -0
  166. package/dist/types/modules/slack/index.d.ts +4 -0
  167. package/dist/types/modules/slack/index.d.ts.map +1 -0
  168. package/package.json +10 -4
@@ -1,41 +1,49 @@
1
1
 
2
2
  import { Button as t } from "./modules/core/components/Button/Button.mjs";
3
- import { ButtonGroup as p } from "./modules/core/components/Button/ButtonGroup.mjs";
4
- import { BellIcon as m } from "./modules/core/components/Icons/Bell.mjs";
3
+ import { ButtonGroup as m } from "./modules/core/components/Button/ButtonGroup.mjs";
4
+ import { BellIcon as i } from "./modules/core/components/Icons/Bell.mjs";
5
5
  import { CheckmarkCircle as x } from "./modules/core/components/Icons/CheckmarkCircle.mjs";
6
6
  import { ChevronDown as c } from "./modules/core/components/Icons/ChevronDown.mjs";
7
- import { CloseCircle as d } from "./modules/core/components/Icons/CloseCircle.mjs";
8
- import { Spinner as u } from "./modules/core/components/Spinner/Spinner.mjs";
9
- import { default as N } from "./modules/core/hooks/useOnBottomScroll.mjs";
7
+ import { CloseCircle as u } from "./modules/core/components/Icons/CloseCircle.mjs";
8
+ import { Spinner as C } from "./modules/core/components/Spinner/Spinner.mjs";
9
+ import { default as k } from "./modules/core/hooks/useOnBottomScroll.mjs";
10
+ import { default as N } from "./modules/core/hooks/useOutsideClick.mjs";
10
11
  import { EmptyFeed as F } from "./modules/feed/components/EmptyFeed/EmptyFeed.mjs";
11
- import { NotificationCell as v } from "./modules/feed/components/NotificationCell/NotificationCell.mjs";
12
- import { Avatar as A } from "./modules/feed/components/NotificationCell/Avatar.mjs";
13
- import { NotificationFeed as S } from "./modules/feed/components/NotificationFeed/NotificationFeed.mjs";
12
+ import { NotificationCell as A } from "./modules/feed/components/NotificationCell/NotificationCell.mjs";
13
+ import { Avatar as b } from "./modules/feed/components/NotificationCell/Avatar.mjs";
14
+ import { NotificationFeed as O } from "./modules/feed/components/NotificationFeed/NotificationFeed.mjs";
14
15
  import { NotificationFeedHeader as w } from "./modules/feed/components/NotificationFeed/NotificationFeedHeader.mjs";
15
16
  import { MarkAsRead as D } from "./modules/feed/components/NotificationFeed/MarkAsRead.mjs";
16
17
  import { NotificationFeedContainer as G } from "./modules/feed/components/NotificationFeedContainer/NotificationFeedContainer.mjs";
17
18
  import { NotificationFeedPopover as M } from "./modules/feed/components/NotificationFeedPopover/NotificationFeedPopover.mjs";
18
- import { NotificationIconButton as P } from "./modules/feed/components/NotificationIconButton/NotificationIconButton.mjs";
19
- import { UnseenBadge as U } from "./modules/feed/components/UnseenBadge/UnseenBadge.mjs";
19
+ import { NotificationIconButton as R } from "./modules/feed/components/NotificationIconButton/NotificationIconButton.mjs";
20
+ import { UnseenBadge as j } from "./modules/feed/components/UnseenBadge/UnseenBadge.mjs";
21
+ import { SlackAuthButton as z } from "./modules/slack/components/SlackAuthButton/SlackAuthButton.mjs";
22
+ import { SlackAuthContainer as K } from "./modules/slack/components/SlackAuthContainer/SlackAuthContainer.mjs";
23
+ import { SlackChannelCombobox as Q } from "./modules/slack/components/SlackChannelCombobox/SlackChannelCombobox.mjs";
20
24
  export * from "@knocklabs/react-core";
21
25
  export {
22
- A as Avatar,
23
- m as BellIcon,
26
+ b as Avatar,
27
+ i as BellIcon,
24
28
  t as Button,
25
- p as ButtonGroup,
29
+ m as ButtonGroup,
26
30
  x as CheckmarkCircle,
27
31
  c as ChevronDown,
28
- d as CloseCircle,
32
+ u as CloseCircle,
29
33
  F as EmptyFeed,
30
34
  D as MarkAsRead,
31
- v as NotificationCell,
32
- S as NotificationFeed,
35
+ A as NotificationCell,
36
+ O as NotificationFeed,
33
37
  G as NotificationFeedContainer,
34
38
  w as NotificationFeedHeader,
35
39
  M as NotificationFeedPopover,
36
- P as NotificationIconButton,
37
- u as Spinner,
38
- U as UnseenBadge,
39
- N as useOnBottomScroll
40
+ R as NotificationIconButton,
41
+ z as SlackAuthButton,
42
+ K as SlackAuthContainer,
43
+ Q as SlackChannelCombobox,
44
+ C as Spinner,
45
+ j as UnseenBadge,
46
+ k as useOnBottomScroll,
47
+ N as useOutsideClick
40
48
  };
41
49
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,18 @@
1
+ import { useEffect as o } from "react";
2
+ const d = ({
3
+ ref: t,
4
+ fn: e,
5
+ isEnabled: u = !0
6
+ }) => {
7
+ const n = (i) => {
8
+ var c;
9
+ !u || !(t != null && t.current) || (c = t == null ? void 0 : t.current) != null && c.contains(i.target) || e();
10
+ };
11
+ o(() => (document.addEventListener("click", n), () => {
12
+ document.removeEventListener("click", n);
13
+ }));
14
+ };
15
+ export {
16
+ d as default
17
+ };
18
+ //# sourceMappingURL=useOutsideClick.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOutsideClick.mjs","sources":["../../../../../src/modules/core/hooks/useOutsideClick.ts"],"sourcesContent":["import { MutableRefObject, useEffect } from \"react\";\n\nconst useOutsideClick = ({\n ref,\n fn,\n isEnabled = true,\n}: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref: MutableRefObject<any>;\n fn: () => void;\n isEnabled?: boolean;\n}) => {\n const handleClick = (event: MouseEvent) => {\n if (!isEnabled || !ref?.current || ref?.current?.contains(event.target)) {\n return;\n }\n fn();\n };\n\n useEffect(() => {\n document.addEventListener(\"click\", handleClick);\n\n return () => {\n document.removeEventListener(\"click\", handleClick);\n };\n });\n};\n\nexport default useOutsideClick;\n"],"names":["useOutsideClick","ref","fn","isEnabled","handleClick","event","_a","useEffect"],"mappings":";AAEA,MAAMA,IAAkB,CAAC;AAAA,EACvB,KAAAC;AAAA,EACA,IAAAC;AAAA,EACA,WAAAC,IAAY;AACd,MAKM;AACE,QAAAC,IAAc,CAACC,MAAsB;;AACrC,IAAA,CAACF,KAAa,EAACF,KAAA,QAAAA,EAAK,aAAWK,IAAAL,KAAA,gBAAAA,EAAK,YAAL,QAAAK,EAAc,SAASD,EAAM,WAG7DH;EAAA;AAGL,EAAAK,EAAU,OACC,SAAA,iBAAiB,SAASH,CAAW,GAEvC,MAAM;AACF,aAAA,oBAAoB,SAASA,CAAW;AAAA,EAAA,EAEpD;AACH;"}
@@ -0,0 +1,51 @@
1
+ import { jsxs as s, jsx as e } from "react/jsx-runtime";
2
+ import { useTranslations as C } from "@knocklabs/react-core";
3
+ import { useState as i } from "react";
4
+ import { Spinner as x } from "../../../core/components/Spinner/Spinner.mjs";
5
+
6
+ import "lodash.debounce";
7
+
8
+ import _ from "../SlackChannelCombobox/SlackConnectionError.mjs";
9
+ import { SlackIcon as S } from "../SlackIcon/SlackIcon.mjs";
10
+
11
+ const w = ({
12
+ inErrorState: h,
13
+ connectedChannels: a = [],
14
+ updateConnectedChannels: p,
15
+ connectedChannelsError: d,
16
+ connectedChannelsUpdating: m
17
+ }) => {
18
+ const { t } = C(), [n, o] = i(null), [r, c] = i(null), u = () => {
19
+ if (!n)
20
+ return;
21
+ if (r && c(null), a.find(
22
+ (f) => f.channel_id === n
23
+ ))
24
+ return o(""), c(t("slackChannelAlreadyConnected") || "");
25
+ const k = [...a, { channel_id: n }];
26
+ p(k), o("");
27
+ };
28
+ return /* @__PURE__ */ s("div", { className: "rsk-connect-channel", children: [
29
+ /* @__PURE__ */ e(
30
+ "input",
31
+ {
32
+ className: `rsk-connect-channel__input ${(h || !!r) && !n && "rsk-connect-channel__input--error"}`,
33
+ tabIndex: -1,
34
+ id: "slack-channel-search",
35
+ type: "text",
36
+ placeholder: r || d || t("slackChannelId"),
37
+ onChange: (l) => o(l.target.value),
38
+ value: n || ""
39
+ }
40
+ ),
41
+ /* @__PURE__ */ s("button", { className: "rsk-connect-channel__button", onClick: u, children: [
42
+ m ? /* @__PURE__ */ e(x, { size: "15px", thickness: 3 }) : /* @__PURE__ */ e(S, { height: "16px", width: "16px" }),
43
+ t("slackConnectChannel")
44
+ ] }),
45
+ /* @__PURE__ */ e(_, {})
46
+ ] });
47
+ };
48
+ export {
49
+ w as default
50
+ };
51
+ //# sourceMappingURL=SlackAddChannelInput.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlackAddChannelInput.mjs","sources":["../../../../../../src/modules/slack/components/SlackAddChannelInput/SlackAddChannelInput.tsx"],"sourcesContent":["import { SlackChannelConnection } from \"@knocklabs/client\";\nimport { useTranslations } from \"@knocklabs/react-core\";\nimport { useState } from \"react\";\n\nimport { Spinner } from \"../../../core\";\nimport \"../../theme.css\";\nimport ConnectionErrorInfoBoxes from \"../SlackChannelCombobox/SlackConnectionError\";\nimport { SlackIcon } from \"../SlackIcon\";\n\nimport \"./styles.css\";\n\nconst SlackAddChannelInput = ({\n inErrorState,\n connectedChannels = [],\n updateConnectedChannels,\n connectedChannelsError,\n connectedChannelsUpdating,\n}: {\n inErrorState: boolean;\n connectedChannels: SlackChannelConnection[];\n updateConnectedChannels: (channels: SlackChannelConnection[]) => void;\n connectedChannelsError: string | null;\n connectedChannelsUpdating: boolean;\n}) => {\n const { t } = useTranslations();\n const [value, setValue] = useState<string | null>(null);\n const [localError, setLocalError] = useState<string | null>(null);\n\n const submitChannel = () => {\n if (!value) {\n return;\n }\n\n if (localError) {\n setLocalError(null);\n }\n\n const alreadyConnected = connectedChannels.find(\n (channel) => channel.channel_id === value,\n );\n\n if (alreadyConnected) {\n setValue(\"\");\n return setLocalError(t(\"slackChannelAlreadyConnected\") || \"\");\n }\n\n const channelsToSendToKnock = [...connectedChannels, { channel_id: value }];\n updateConnectedChannels(channelsToSendToKnock);\n setValue(\"\");\n };\n\n return (\n <div className=\"rsk-connect-channel\">\n <input\n className={`rsk-connect-channel__input ${(inErrorState || !!localError) && !value && \"rsk-connect-channel__input--error\"}`}\n tabIndex={-1}\n id=\"slack-channel-search\"\n type=\"text\"\n placeholder={\n localError || connectedChannelsError || t(\"slackChannelId\")\n }\n onChange={(e) => setValue(e.target.value)}\n value={value || \"\"}\n />\n <button className=\"rsk-connect-channel__button\" onClick={submitChannel}>\n {connectedChannelsUpdating ? (\n <Spinner size=\"15px\" thickness={3} />\n ) : (\n <SlackIcon height=\"16px\" width=\"16px\" />\n )}\n {t(\"slackConnectChannel\")}\n </button>\n <ConnectionErrorInfoBoxes />\n </div>\n );\n};\n\nexport default SlackAddChannelInput;\n"],"names":["SlackAddChannelInput","inErrorState","connectedChannels","updateConnectedChannels","connectedChannelsError","connectedChannelsUpdating","useTranslations","value","setValue","useState","localError","setLocalError","submitChannel","channel","channelsToSendToKnock","jsxs","jsx","e","Spinner","SlackIcon","ConnectionErrorInfoBoxes"],"mappings":";;;;;;;;;;AAWA,MAAMA,IAAuB,CAAC;AAAA,EAC5B,cAAAC;AAAA,EACA,mBAAAC,IAAoB,CAAC;AAAA,EACrB,yBAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,2BAAAC;AACF,MAMM;AACE,QAAA,EAAE,MAAMC,KACR,CAACC,GAAOC,CAAQ,IAAIC,EAAwB,IAAI,GAChD,CAACC,GAAYC,CAAa,IAAIF,EAAwB,IAAI,GAE1DG,IAAgB,MAAM;AAC1B,QAAI,CAACL;AACH;AAWF,QARIG,KACFC,EAAc,IAAI,GAGKT,EAAkB;AAAA,MACzC,CAACW,MAAYA,EAAQ,eAAeN;AAAA,IAAA;AAIpC,aAAAC,EAAS,EAAE,GACJG,EAAc,EAAE,8BAA8B,KAAK,EAAE;AAG9D,UAAMG,IAAwB,CAAC,GAAGZ,GAAmB,EAAE,YAAYK,GAAO;AAC1E,IAAAJ,EAAwBW,CAAqB,GAC7CN,EAAS,EAAE;AAAA,EAAA;AAIX,SAAA,gBAAAO,EAAC,OAAI,EAAA,WAAU,uBACb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,+BAA+Bf,KAAgB,CAAC,CAACS,MAAe,CAACH,KAAS,mCAAmC;AAAA,QACxH,UAAU;AAAA,QACV,IAAG;AAAA,QACH,MAAK;AAAA,QACL,aACEG,KAAcN,KAA0B,EAAE,gBAAgB;AAAA,QAE5D,UAAU,CAACa,MAAMT,EAASS,EAAE,OAAO,KAAK;AAAA,QACxC,OAAOV,KAAS;AAAA,MAAA;AAAA,IAClB;AAAA,IACC,gBAAAQ,EAAA,UAAA,EAAO,WAAU,+BAA8B,SAASH,GACtD,UAAA;AAAA,MAAAP,IACE,gBAAAW,EAAAE,GAAA,EAAQ,MAAK,QAAO,WAAW,EAAA,CAAG,IAEnC,gBAAAF,EAACG,GAAU,EAAA,QAAO,QAAO,OAAM,QAAO;AAAA,MAEvC,EAAE,qBAAqB;AAAA,IAAA,GAC1B;AAAA,sBACCC,GAAyB,EAAA;AAAA,EAC5B,EAAA,CAAA;AAEJ;"}
@@ -0,0 +1,81 @@
1
+ import { jsxs as a, jsx as t } from "react/jsx-runtime";
2
+ import { useTranslations as f, useKnockClient as x, useKnockSlackClient as L, useSlackAuth as S } from "@knocklabs/react-core";
3
+ import { useEffect as C } from "react";
4
+
5
+ import { SlackIcon as l } from "../SlackIcon/SlackIcon.mjs";
6
+
7
+ const m = (d) => {
8
+ const n = window.screenLeft ?? window.screenX, r = window.screenTop ?? window.screenY, c = window.innerWidth ?? document.documentElement.clientWidth ?? screen.width, e = window.innerHeight ?? document.documentElement.clientHeight ?? screen.height, o = c / 2 - 600 / 2 + n, u = `width=600,height=800,top=${e / 2 - 800 / 2 + r},left=${o}`;
9
+ window.open(d, "Slack OAuth", u);
10
+ }, T = ({
11
+ slackClientId: d,
12
+ redirectUrl: k,
13
+ onAuthenticationComplete: s
14
+ }) => {
15
+ const { t: n } = f(), r = x(), {
16
+ setConnectionStatus: c,
17
+ connectionStatus: e,
18
+ setActionLabel: o,
19
+ actionLabel: h,
20
+ errorLabel: u
21
+ } = L(), { buildSlackAuthUrl: p, disconnectFromSlack: _ } = S(
22
+ d,
23
+ k
24
+ );
25
+ C(() => {
26
+ const w = (i) => {
27
+ if (i.origin === r.host)
28
+ try {
29
+ i.data === "authComplete" && c("connected"), i.data === "authFailed" && c("error"), s && s(i.data);
30
+ } catch {
31
+ c("error");
32
+ }
33
+ };
34
+ return window.addEventListener("message", w, !1), () => {
35
+ window.removeEventListener("message", w);
36
+ };
37
+ }, [r.host, s, c]);
38
+ const g = n("slackDisconnect") || null, b = n("slackReconnect") || null;
39
+ return e === "connecting" || e === "disconnecting" ? /* @__PURE__ */ a("div", { className: "rsk-connect__button rsk-connect__button--loading", children: [
40
+ /* @__PURE__ */ t(l, { height: "16px", width: "16px" }),
41
+ /* @__PURE__ */ t("span", { children: n(e === "connecting" ? "slackConnecting" : "slackDisconnecting") })
42
+ ] }) : e === "error" ? /* @__PURE__ */ a(
43
+ "button",
44
+ {
45
+ onClick: () => m(p()),
46
+ className: "rsk-connect__button rsk-connect__button--error",
47
+ onMouseEnter: () => o(b),
48
+ onMouseLeave: () => o(null),
49
+ children: [
50
+ /* @__PURE__ */ t(l, { height: "16px", width: "16px" }),
51
+ /* @__PURE__ */ t("span", { className: "rsk-connect__button__text--error", children: h || u || n("slackError") })
52
+ ]
53
+ }
54
+ ) : e === "disconnected" ? /* @__PURE__ */ a(
55
+ "button",
56
+ {
57
+ onClick: () => m(p()),
58
+ className: "rsk-connect__button rsk-connect__button--disconnected",
59
+ children: [
60
+ /* @__PURE__ */ t(l, { height: "16px", width: "16px" }),
61
+ /* @__PURE__ */ t("span", { children: n("slackConnect") })
62
+ ]
63
+ }
64
+ ) : /* @__PURE__ */ a(
65
+ "button",
66
+ {
67
+ onClick: _,
68
+ className: "rsk-connect__button rsk-connect__button--connected",
69
+ onMouseEnter: () => o(g),
70
+ onMouseLeave: () => o(null),
71
+ children: [
72
+ /* @__PURE__ */ t(l, { height: "16px", width: "16px" }),
73
+ /* @__PURE__ */ t("span", { className: "rsk-connect__button__text--connected", children: h || n("slackConnected") })
74
+ ]
75
+ }
76
+ );
77
+ };
78
+ export {
79
+ T as SlackAuthButton
80
+ };
81
+ //# sourceMappingURL=SlackAuthButton.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlackAuthButton.mjs","sources":["../../../../../../src/modules/slack/components/SlackAuthButton/SlackAuthButton.tsx"],"sourcesContent":["import {\n useKnockClient,\n useKnockSlackClient,\n useSlackAuth,\n useTranslations,\n} from \"@knocklabs/react-core\";\nimport { useEffect } from \"react\";\n\nimport \"../../theme.css\";\nimport { SlackIcon } from \"../SlackIcon\";\n\nimport \"./styles.css\";\n\ntype Props = {\n slackClientId: string;\n redirectUrl?: string;\n onAuthenticationComplete?: (authenticationResp: string) => void;\n};\n\nconst openSlackOauthPopup = (url: string) => {\n const width = 600;\n const height = 800;\n // Calculate the position to center the window\n const screenLeft = window.screenLeft ?? window.screenX;\n const screenTop = window.screenTop ?? window.screenY;\n\n const innerWidth =\n window.innerWidth ?? document.documentElement.clientWidth ?? screen.width;\n const innerHeight =\n window.innerHeight ??\n document.documentElement.clientHeight ??\n screen.height;\n\n const left = innerWidth / 2 - width / 2 + screenLeft;\n const top = innerHeight / 2 - height / 2 + screenTop;\n\n // Window features\n const features = `width=${width},height=${height},top=${top},left=${left}`;\n\n window.open(url, \"Slack OAuth\", features);\n};\n\nexport const SlackAuthButton: React.FC<Props> = ({\n slackClientId,\n redirectUrl,\n onAuthenticationComplete,\n}) => {\n const { t } = useTranslations();\n const knock = useKnockClient();\n\n const {\n setConnectionStatus,\n connectionStatus,\n setActionLabel,\n actionLabel,\n errorLabel,\n } = useKnockSlackClient();\n\n const { buildSlackAuthUrl, disconnectFromSlack } = useSlackAuth(\n slackClientId,\n redirectUrl,\n );\n\n useEffect(() => {\n const receiveMessage = (event: MessageEvent) => {\n if (event.origin !== knock.host) {\n return;\n }\n\n try {\n if (event.data === \"authComplete\") {\n setConnectionStatus(\"connected\");\n }\n\n if (event.data === \"authFailed\") {\n setConnectionStatus(\"error\");\n }\n\n if (onAuthenticationComplete) {\n onAuthenticationComplete(event.data);\n }\n } catch (error) {\n setConnectionStatus(\"error\");\n }\n };\n\n window.addEventListener(\"message\", receiveMessage, false);\n\n // Cleanup the event listener when the component unmounts\n return () => {\n window.removeEventListener(\"message\", receiveMessage);\n };\n }, [knock.host, onAuthenticationComplete, setConnectionStatus]);\n\n const disconnectLabel = t(\"slackDisconnect\") || null;\n const reconnectLabel = t(\"slackReconnect\") || null;\n\n // Loading states\n if (\n connectionStatus === \"connecting\" ||\n connectionStatus === \"disconnecting\"\n ) {\n return (\n <div className=\"rsk-connect__button rsk-connect__button--loading\">\n <SlackIcon height=\"16px\" width=\"16px\" />\n <span>\n {connectionStatus === \"connecting\"\n ? t(\"slackConnecting\")\n : t(\"slackDisconnecting\")}\n </span>\n </div>\n );\n }\n\n // Error state\n if (connectionStatus === \"error\") {\n return (\n <button\n onClick={() => openSlackOauthPopup(buildSlackAuthUrl())}\n className=\"rsk-connect__button rsk-connect__button--error\"\n onMouseEnter={() => setActionLabel(reconnectLabel)}\n onMouseLeave={() => setActionLabel(null)}\n >\n <SlackIcon height=\"16px\" width=\"16px\" />\n <span className=\"rsk-connect__button__text--error\">\n {actionLabel || errorLabel || t(\"slackError\")}\n </span>\n </button>\n );\n }\n\n // Disconnected state\n if (connectionStatus === \"disconnected\") {\n return (\n <button\n onClick={() => openSlackOauthPopup(buildSlackAuthUrl())}\n className=\"rsk-connect__button rsk-connect__button--disconnected\"\n >\n <SlackIcon height=\"16px\" width=\"16px\" />\n <span>{t(\"slackConnect\")}</span>\n </button>\n );\n }\n\n // Connected state\n return (\n <button\n onClick={disconnectFromSlack}\n className=\"rsk-connect__button rsk-connect__button--connected\"\n onMouseEnter={() => setActionLabel(disconnectLabel)}\n onMouseLeave={() => setActionLabel(null)}\n >\n <SlackIcon height=\"16px\" width=\"16px\" />\n <span className=\"rsk-connect__button__text--connected\">\n {actionLabel || t(\"slackConnected\")}\n </span>\n </button>\n );\n};\n"],"names":["openSlackOauthPopup","url","screenLeft","screenTop","innerWidth","innerHeight","left","features","SlackAuthButton","slackClientId","redirectUrl","onAuthenticationComplete","t","useTranslations","knock","useKnockClient","setConnectionStatus","connectionStatus","setActionLabel","actionLabel","errorLabel","useKnockSlackClient","buildSlackAuthUrl","disconnectFromSlack","useSlackAuth","useEffect","receiveMessage","event","disconnectLabel","reconnectLabel","jsxs","jsx","SlackIcon"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { jsxs as i, jsx as r } from "react/jsx-runtime";
2
+ import { useTranslations as a } from "@knocklabs/react-core";
3
+
4
+ import { SlackIcon as e } from "../SlackIcon/SlackIcon.mjs";
5
+
6
+ const d = ({
7
+ actionButton: t
8
+ }) => {
9
+ const { t: s } = a();
10
+ return /* @__PURE__ */ i("div", { className: "rsk-auth", children: [
11
+ /* @__PURE__ */ i("div", { className: "rsk-auth__header", children: [
12
+ /* @__PURE__ */ r(e, { height: "32px", width: "32px" }),
13
+ /* @__PURE__ */ r("div", { children: t })
14
+ ] }),
15
+ /* @__PURE__ */ r("div", { className: "rsk-auth__title", children: "Slack" }),
16
+ /* @__PURE__ */ r("div", { className: "rsk-auth__description", children: s("slackConnectContainerDescription") })
17
+ ] });
18
+ };
19
+ export {
20
+ d as SlackAuthContainer
21
+ };
22
+ //# sourceMappingURL=SlackAuthContainer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlackAuthContainer.mjs","sources":["../../../../../../src/modules/slack/components/SlackAuthContainer/SlackAuthContainer.tsx"],"sourcesContent":["import { useTranslations } from \"@knocklabs/react-core\";\n\nimport \"../../theme.css\";\nimport { SlackIcon } from \"../SlackIcon\";\n\nimport \"./styles.css\";\n\nexport const SlackAuthContainer = ({\n actionButton,\n}: {\n actionButton: React.ReactElement;\n}) => {\n const { t } = useTranslations();\n\n return (\n <div className=\"rsk-auth\">\n <div className=\"rsk-auth__header\">\n <SlackIcon height=\"32px\" width=\"32px\" />\n <div>{actionButton}</div>\n </div>\n <div className=\"rsk-auth__title\">Slack</div>\n <div className=\"rsk-auth__description\">\n {t(\"slackConnectContainerDescription\")}\n </div>\n </div>\n );\n};\n"],"names":["SlackAuthContainer","actionButton","t","useTranslations","jsxs","jsx","SlackIcon"],"mappings":";;;;;AAOO,MAAMA,IAAqB,CAAC;AAAA,EACjC,cAAAC;AACF,MAEM;AACE,QAAA,EAAE,GAAAC,MAAMC;AAGZ,SAAA,gBAAAC,EAAC,OAAI,EAAA,WAAU,YACb,UAAA;AAAA,IAAC,gBAAAA,EAAA,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,MAAA,gBAAAC,EAACC,GAAU,EAAA,QAAO,QAAO,OAAM,QAAO;AAAA,MACtC,gBAAAD,EAAC,SAAK,UAAaJ,EAAA,CAAA;AAAA,IAAA,GACrB;AAAA,IACC,gBAAAI,EAAA,OAAA,EAAI,WAAU,mBAAkB,UAAK,SAAA;AAAA,sBACrC,OAAI,EAAA,WAAU,yBACZ,UAAAH,EAAE,kCAAkC,GACvC;AAAA,EACF,EAAA,CAAA;AAEJ;"}
@@ -0,0 +1,195 @@
1
+ import { jsx as r, jsxs as m } from "react/jsx-runtime";
2
+ import { useTranslations as w, useKnockSlackClient as z, useSlackChannels as G, useConnectedSlackChannels as W } from "@knocklabs/react-core";
3
+ import * as u from "@radix-ui/react-popover";
4
+ import * as X from "@radix-ui/react-visually-hidden";
5
+ import { useState as p, useRef as q, useEffect as O, useMemo as x } from "react";
6
+ import { useFilter as J } from "react-aria";
7
+ import { Spinner as Q } from "../../../core/components/Spinner/Spinner.mjs";
8
+
9
+ import "lodash.debounce";
10
+ import Y from "../../../core/hooks/useOutsideClick.mjs";
11
+
12
+ import Z from "../SlackAddChannelInput/SlackAddChannelInput.mjs";
13
+ import g from "./SlackChannelListBox.mjs";
14
+ import M from "./SlackConnectedChannelTagList.mjs";
15
+ import nn from "./SlackConnectionError.mjs";
16
+ import on from "./icons/SearchIcon.mjs";
17
+
18
+ const en = 1e3, un = ({
19
+ slackChannelsRecipientObject: I,
20
+ queryOptions: R,
21
+ inputProps: U,
22
+ inputContainerProps: $,
23
+ listBoxProps: D,
24
+ channelOptionProps: K,
25
+ inputMessages: n,
26
+ showConnectedChannelTags: P = !1
27
+ }) => {
28
+ const { t: l } = w(), [C, L] = p(!1), [E, N] = p(""), T = q(null);
29
+ Y({
30
+ ref: T,
31
+ fn: () => {
32
+ N(""), L(!1);
33
+ }
34
+ });
35
+ const { connectionStatus: a, errorLabel: v } = z(), { data: t, isLoading: f } = G({ queryOptions: R }), {
36
+ data: h,
37
+ updateConnectedChannels: b,
38
+ loading: V,
39
+ error: d,
40
+ updating: F
41
+ } = W({ slackChannelsRecipientObject: I }), [c, _] = p(null);
42
+ O(() => {
43
+ C && setTimeout(() => {
44
+ var o;
45
+ (o = document.getElementById("slack-channel-search")) == null || o.focus();
46
+ }, 0);
47
+ }, [C]), O(() => {
48
+ const o = new Map(
49
+ t.map((e) => [e.id, e])
50
+ ), i = (h == null ? void 0 : h.filter((e) => o.has(e.channel_id || ""))) || [];
51
+ _(i);
52
+ }, [h, t]);
53
+ const s = x(
54
+ () => a === "disconnected" || a === "error" || d,
55
+ [d, a]
56
+ ), k = x(
57
+ () => a === "connecting" || a === "disconnecting" || f,
58
+ [a, f]
59
+ ), j = x(() => {
60
+ const o = {
61
+ disconnected: l("slackSearchbarDisconnected"),
62
+ multipleChannelsConnected: l("slackSearchbarMultipleChannels"),
63
+ noChannelsConnected: l("slackSearchbarNoChannelsConnected"),
64
+ noSlackChannelsFound: l("slackSearchbarNoChannelsFound"),
65
+ channelsError: l("slackSearchbarChannelsError")
66
+ };
67
+ if (a === "disconnected")
68
+ return (n == null ? void 0 : n.disconnected) || o.disconnected;
69
+ if (a === "error")
70
+ return (n == null ? void 0 : n.error) || v;
71
+ if (!k && t.length === 0)
72
+ return (n == null ? void 0 : n.noSlackChannelsFound) || o.noSlackChannelsFound;
73
+ if (d)
74
+ return d;
75
+ const i = (c == null ? void 0 : c.length) || 0;
76
+ if (c && i === 0)
77
+ return (n == null ? void 0 : n.noChannelsConnected) || o.noChannelsConnected;
78
+ if (c && i === 1) {
79
+ const e = t == null ? void 0 : t.find(
80
+ (S) => {
81
+ var y;
82
+ return S.id === ((y = c[0]) == null ? void 0 : y.channel_id);
83
+ }
84
+ );
85
+ return (n == null ? void 0 : n.singleChannelConnected) || `# ${e == null ? void 0 : e.name}`;
86
+ }
87
+ return c && i > 1 ? (n == null ? void 0 : n.multipleChannelsConnected) || `${i} channels connected` : "";
88
+ }, [
89
+ a,
90
+ k,
91
+ t,
92
+ d,
93
+ c,
94
+ n,
95
+ v,
96
+ l
97
+ ]), A = async (o) => {
98
+ if (!c)
99
+ return;
100
+ if (c.find(
101
+ (e) => e.channel_id === o
102
+ )) {
103
+ const e = c.filter(
104
+ (S) => S.channel_id !== o
105
+ );
106
+ _(e), b(e);
107
+ } else {
108
+ const e = [
109
+ ...c,
110
+ { channel_id: o }
111
+ ];
112
+ _(e), b(e);
113
+ }
114
+ }, { contains: B } = J({ sensitivity: "base" }), H = t.filter(
115
+ (o) => B(o.name, E)
116
+ );
117
+ return t.length > en ? /* @__PURE__ */ r(
118
+ Z,
119
+ {
120
+ inErrorState: !!s,
121
+ connectedChannels: c || [],
122
+ updateConnectedChannels: b,
123
+ connectedChannelsError: d,
124
+ connectedChannelsUpdating: F
125
+ }
126
+ ) : /* @__PURE__ */ m("div", { ref: T, className: "rsk-combobox", children: [
127
+ /* @__PURE__ */ m(
128
+ u.Root,
129
+ {
130
+ open: a !== "disconnected" ? C : !1,
131
+ children: [
132
+ /* @__PURE__ */ r(X.Root, { children: /* @__PURE__ */ r("label", { htmlFor: "slack-channel-search", children: l("slackSearchChannels") }) }),
133
+ /* @__PURE__ */ r(u.Trigger, { asChild: !0, children: /* @__PURE__ */ m("div", { className: "rsk-combobox__searchbar", children: [
134
+ /* @__PURE__ */ m(
135
+ "div",
136
+ {
137
+ className: "rsk-combobox__searchbar__input-container",
138
+ ...$,
139
+ children: [
140
+ /* @__PURE__ */ r(
141
+ "div",
142
+ {
143
+ className: `rsk-combobox__searchbar__input-container__icon ${s && "rsk-combobox__searchbar__input-container__icon--error"}`,
144
+ children: k ? /* @__PURE__ */ r(Q, { size: "15px", thickness: 3 }) : /* @__PURE__ */ r(on, {})
145
+ }
146
+ ),
147
+ /* @__PURE__ */ r(
148
+ "input",
149
+ {
150
+ className: `rsk-combobox__searchbar__input-container__input ${s ? "rsk-combobox__searchbar__input-container__input--error" : ""}`,
151
+ tabIndex: -1,
152
+ id: "slack-channel-search",
153
+ type: "text",
154
+ onFocus: () => t.length > 0 && L(!0),
155
+ onChange: (o) => N(o.target.value),
156
+ value: E,
157
+ placeholder: j || "",
158
+ disabled: !!s,
159
+ ...U
160
+ }
161
+ )
162
+ ]
163
+ }
164
+ ),
165
+ /* @__PURE__ */ r(nn, {})
166
+ ] }) }),
167
+ /* @__PURE__ */ r(u.Content, { children: /* @__PURE__ */ r(
168
+ g,
169
+ {
170
+ isLoading: f || V,
171
+ isUpdating: F,
172
+ connectedChannels: c,
173
+ onClick: A,
174
+ slackChannels: H,
175
+ listBoxProps: D,
176
+ channelOptionProps: K
177
+ }
178
+ ) })
179
+ ]
180
+ }
181
+ ),
182
+ P && /* @__PURE__ */ r(
183
+ M,
184
+ {
185
+ connectedChannels: c,
186
+ slackChannels: t,
187
+ updateConnectedChannels: A
188
+ }
189
+ )
190
+ ] });
191
+ };
192
+ export {
193
+ un as SlackChannelCombobox
194
+ };
195
+ //# sourceMappingURL=SlackChannelCombobox.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlackChannelCombobox.mjs","sources":["../../../../../../src/modules/slack/components/SlackChannelCombobox/SlackChannelCombobox.tsx"],"sourcesContent":["import { SlackChannelConnection } from \"@knocklabs/client\";\nimport {\n ContainerObject,\n SlackChannelQueryOptions,\n useConnectedSlackChannels,\n useKnockSlackClient,\n useSlackChannels,\n useTranslations,\n} from \"@knocklabs/react-core\";\nimport * as Popover from \"@radix-ui/react-popover\";\nimport * as VisuallyHidden from \"@radix-ui/react-visually-hidden\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useFilter } from \"react-aria\";\n\nimport { Spinner, useOutsideClick } from \"../../../core\";\nimport \"../../theme.css\";\nimport SlackAddChannelInput from \"../SlackAddChannelInput/SlackAddChannelInput\";\n\nimport SlackChannelListBox from \"./SlackChannelListBox\";\nimport SlackConnectedChannelTagList from \"./SlackConnectedChannelTagList\";\nimport SlackConnectionError from \"./SlackConnectionError\";\nimport SearchIcon from \"./icons/SearchIcon\";\nimport \"./styles.css\";\n\nconst MAX_ALLOWED_CHANNELS = 1000;\n\ntype SlackChannelComboboxInputMessages = {\n disconnected: string;\n error: string;\n singleChannelConnected: string;\n multipleChannelsConnected: string;\n noChannelsConnected: string;\n noSlackChannelsFound: string;\n};\n\ntype Props = {\n slackChannelsRecipientObject: ContainerObject;\n queryOptions?: SlackChannelQueryOptions;\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>;\n inputContainerProps?: React.HTMLAttributes<HTMLDivElement>;\n listBoxProps?: React.HTMLAttributes<HTMLDivElement>;\n channelOptionProps?: React.HtmlHTMLAttributes<HTMLButtonElement>;\n inputMessages?: SlackChannelComboboxInputMessages;\n showConnectedChannelTags?: boolean;\n};\n\nexport const SlackChannelCombobox = ({\n slackChannelsRecipientObject,\n queryOptions,\n inputProps,\n inputContainerProps,\n listBoxProps,\n channelOptionProps,\n inputMessages,\n showConnectedChannelTags = false,\n}: Props) => {\n const { t } = useTranslations();\n\n const [comboboxListOpen, setComboboxListOpen] = useState<boolean>(false);\n const [inputValue, setInputValue] = useState(\"\");\n\n // Used to close the combobox when clicking outside of it\n const comboboxRef = useRef(null);\n useOutsideClick({\n ref: comboboxRef,\n fn: () => {\n setInputValue(\"\");\n setComboboxListOpen(false);\n },\n });\n\n // Gather API data\n const { connectionStatus, errorLabel: connectionErrorLabel } =\n useKnockSlackClient();\n\n const { data: slackChannels, isLoading: slackChannelsLoading } =\n useSlackChannels({ queryOptions });\n\n const {\n data: connectedChannels,\n updateConnectedChannels,\n loading: connectedChannelsLoading,\n error: connectedChannelsError,\n updating: connectedChannelsUpdating,\n } = useConnectedSlackChannels({ slackChannelsRecipientObject });\n\n const [currentConnectedChannels, setCurrentConnectedChannels] = useState<\n SlackChannelConnection[] | null\n >(null);\n\n useEffect(() => {\n if (comboboxListOpen) {\n // Timeout to allow for the state to update and the component to re-render\n // when we change the `comboboxListOpen` state upon focus\n setTimeout(() => {\n document.getElementById(\"slack-channel-search\")?.focus();\n }, 0);\n }\n }, [comboboxListOpen]);\n\n useEffect(() => {\n // Used to make sure we're only showing currently available channels to select from.\n // There are cases where a channel is \"connected\" in Knock, but it wouldn't be\n // posting to it if the channel is private and the Slackbot doesn't belong to it,\n // so the channel won't show up here and it won't be posted to.\n const slackChannelsMap = new Map(\n slackChannels.map((channel) => [channel.id, channel]),\n );\n\n const channels =\n connectedChannels?.filter((connectedChannel) => {\n return slackChannelsMap.has(connectedChannel.channel_id || \"\");\n }) || [];\n\n setCurrentConnectedChannels(channels);\n }, [connectedChannels, slackChannels]);\n\n const inErrorState = useMemo(\n () =>\n connectionStatus === \"disconnected\" ||\n connectionStatus === \"error\" ||\n connectedChannelsError,\n [connectedChannelsError, connectionStatus],\n );\n\n const inLoadingState = useMemo(\n () =>\n connectionStatus === \"connecting\" ||\n connectionStatus === \"disconnecting\" ||\n slackChannelsLoading,\n\n [connectionStatus, slackChannelsLoading],\n );\n\n // Construct placeholder text\n const searchPlaceholder = useMemo(() => {\n const DEFAULT_INPUT_MESSAGES = {\n disconnected: t(\"slackSearchbarDisconnected\"),\n multipleChannelsConnected: t(\"slackSearchbarMultipleChannels\"),\n noChannelsConnected: t(\"slackSearchbarNoChannelsConnected\"),\n noSlackChannelsFound: t(\"slackSearchbarNoChannelsFound\"),\n channelsError: t(\"slackSearchbarChannelsError\"),\n };\n\n // Connection status message\n if (connectionStatus === \"disconnected\") {\n return inputMessages?.disconnected || DEFAULT_INPUT_MESSAGES.disconnected;\n }\n\n if (connectionStatus === \"error\") {\n return inputMessages?.error || connectionErrorLabel;\n }\n\n // Channels status messages\n if (!inLoadingState && slackChannels.length === 0) {\n return (\n inputMessages?.noSlackChannelsFound ||\n DEFAULT_INPUT_MESSAGES.noSlackChannelsFound\n );\n }\n\n if (connectedChannelsError) {\n return connectedChannelsError;\n }\n\n const numberConnectedChannels = currentConnectedChannels?.length || 0;\n\n if (currentConnectedChannels && numberConnectedChannels === 0) {\n return (\n inputMessages?.noChannelsConnected ||\n DEFAULT_INPUT_MESSAGES.noChannelsConnected\n );\n }\n\n if (currentConnectedChannels && numberConnectedChannels === 1) {\n const connectedChannel = slackChannels?.find(\n (slackChannel) =>\n slackChannel.id === currentConnectedChannels[0]?.channel_id,\n );\n\n return (\n inputMessages?.singleChannelConnected || `# ${connectedChannel?.name}`\n );\n }\n\n if (currentConnectedChannels && numberConnectedChannels > 1) {\n return (\n inputMessages?.multipleChannelsConnected ||\n `${numberConnectedChannels} channels connected`\n );\n }\n\n return \"\";\n }, [\n connectionStatus,\n inLoadingState,\n slackChannels,\n connectedChannelsError,\n currentConnectedChannels,\n inputMessages,\n connectionErrorLabel,\n t,\n ]);\n\n // Handle channel click\n const handleOptionClick = async (channelId: string) => {\n if (!currentConnectedChannels) {\n return;\n }\n\n const isChannelConnected = currentConnectedChannels.find(\n (channel) => channel.channel_id === channelId,\n );\n\n if (isChannelConnected) {\n const channelsToSendToKnock = currentConnectedChannels.filter(\n (connectedChannel) => connectedChannel.channel_id !== channelId,\n );\n\n setCurrentConnectedChannels(channelsToSendToKnock);\n updateConnectedChannels(channelsToSendToKnock);\n } else {\n const channelsToSendToKnock = [\n ...currentConnectedChannels,\n { channel_id: channelId } as SlackChannelConnection,\n ];\n\n setCurrentConnectedChannels(channelsToSendToKnock);\n updateConnectedChannels(channelsToSendToKnock);\n }\n };\n\n // Handle channel search\n const { contains } = useFilter({ sensitivity: \"base\" });\n const matchedChannels = slackChannels.filter((slackChannel) =>\n contains(slackChannel.name, inputValue),\n );\n\n if (slackChannels.length > MAX_ALLOWED_CHANNELS) {\n return (\n <SlackAddChannelInput\n inErrorState={!!inErrorState}\n connectedChannels={currentConnectedChannels || []}\n updateConnectedChannels={updateConnectedChannels}\n connectedChannelsError={connectedChannelsError}\n connectedChannelsUpdating={connectedChannelsUpdating}\n />\n );\n }\n\n return (\n <div ref={comboboxRef} className=\"rsk-combobox\">\n <Popover.Root\n open={connectionStatus !== \"disconnected\" ? comboboxListOpen : false}\n >\n <VisuallyHidden.Root>\n <label htmlFor=\"slack-channel-search\">\n {t(\"slackSearchChannels\")}\n </label>\n </VisuallyHidden.Root>\n <Popover.Trigger asChild>\n <div className=\"rsk-combobox__searchbar\">\n <div\n className={\"rsk-combobox__searchbar__input-container\"}\n {...inputContainerProps}\n >\n <div\n className={`rsk-combobox__searchbar__input-container__icon ${inErrorState && \"rsk-combobox__searchbar__input-container__icon--error\"}`}\n >\n {inLoadingState ? (\n <Spinner size=\"15px\" thickness={3} />\n ) : (\n <SearchIcon />\n )}\n </div>\n\n <input\n className={`rsk-combobox__searchbar__input-container__input ${inErrorState ? \"rsk-combobox__searchbar__input-container__input--error\" : \"\"}`}\n tabIndex={-1}\n id=\"slack-channel-search\"\n type=\"text\"\n onFocus={() =>\n slackChannels.length > 0 && setComboboxListOpen(true)\n }\n onChange={(e) => setInputValue(e.target.value)}\n value={inputValue}\n placeholder={searchPlaceholder || \"\"}\n disabled={!!inErrorState}\n {...inputProps}\n />\n </div>\n\n <SlackConnectionError />\n </div>\n </Popover.Trigger>\n\n <Popover.Content>\n <SlackChannelListBox\n isLoading={slackChannelsLoading || connectedChannelsLoading}\n isUpdating={connectedChannelsUpdating}\n connectedChannels={currentConnectedChannels}\n onClick={handleOptionClick}\n slackChannels={matchedChannels}\n listBoxProps={listBoxProps}\n channelOptionProps={channelOptionProps}\n />\n </Popover.Content>\n </Popover.Root>\n {showConnectedChannelTags && (\n <SlackConnectedChannelTagList\n connectedChannels={currentConnectedChannels}\n slackChannels={slackChannels}\n updateConnectedChannels={handleOptionClick}\n />\n )}\n </div>\n );\n};\n"],"names":["MAX_ALLOWED_CHANNELS","SlackChannelCombobox","slackChannelsRecipientObject","queryOptions","inputProps","inputContainerProps","listBoxProps","channelOptionProps","inputMessages","showConnectedChannelTags","t","useTranslations","comboboxListOpen","setComboboxListOpen","useState","inputValue","setInputValue","comboboxRef","useRef","useOutsideClick","connectionStatus","connectionErrorLabel","useKnockSlackClient","slackChannels","slackChannelsLoading","useSlackChannels","connectedChannels","updateConnectedChannels","connectedChannelsLoading","connectedChannelsError","connectedChannelsUpdating","useConnectedSlackChannels","currentConnectedChannels","setCurrentConnectedChannels","useEffect","_a","slackChannelsMap","channel","channels","connectedChannel","inErrorState","useMemo","inLoadingState","searchPlaceholder","DEFAULT_INPUT_MESSAGES","numberConnectedChannels","slackChannel","handleOptionClick","channelId","channelsToSendToKnock","contains","useFilter","matchedChannels","jsx","SlackAddChannelInput","jsxs","Popover","VisuallyHidden","Spinner","SearchIcon","e","SlackConnectionError","SlackChannelListBox","SlackConnectedChannelTagList"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { jsx as o } from "react/jsx-runtime";
2
+ import b from "./SlackChannelOption.mjs";
3
+
4
+
5
+ const _ = ({
6
+ slackChannels: t,
7
+ isLoading: m,
8
+ connectedChannels: i,
9
+ onClick: p,
10
+ listBoxProps: x,
11
+ channelOptionProps: a,
12
+ isUpdating: d
13
+ }) => /* @__PURE__ */ o("div", { className: "rsk-combobox__list-box", ...x, children: t.map((r) => /* @__PURE__ */ o(
14
+ b,
15
+ {
16
+ tabIndex: 0,
17
+ channel: r,
18
+ isLoading: m,
19
+ isConnected: !!(i != null && i.find(
20
+ (s) => s.channel_id === r.id
21
+ )),
22
+ onClick: p,
23
+ channelOptionProps: a,
24
+ isUpdating: d
25
+ },
26
+ r.id
27
+ )) });
28
+ export {
29
+ _ as default
30
+ };
31
+ //# sourceMappingURL=SlackChannelListBox.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlackChannelListBox.mjs","sources":["../../../../../../src/modules/slack/components/SlackChannelCombobox/SlackChannelListBox.tsx"],"sourcesContent":["import { SlackChannel, SlackChannelConnection } from \"@knocklabs/client\";\nimport { AriaListBoxOptions } from \"@react-aria/listbox\";\n\nimport SlackChannelOption from \"./SlackChannelOption\";\n\nimport \"./styles.css\";\nimport \"../../theme.css\"\n\ntype Props = AriaListBoxOptions<unknown> & {\n slackChannels: SlackChannel[];\n isLoading: boolean;\n connectedChannels: SlackChannelConnection[] | null;\n onClick: (channelId: string) => void;\n listBoxProps?: React.HTMLAttributes<HTMLDivElement>;\n channelOptionProps?: React.HtmlHTMLAttributes<HTMLButtonElement>;\n isUpdating: boolean;\n};\n\nconst SlackChannelListBox = ({\n slackChannels,\n isLoading,\n connectedChannels,\n onClick,\n listBoxProps,\n channelOptionProps,\n isUpdating,\n}: Props) => {\n return (\n <div className=\"rsk-combobox__list-box\" {...listBoxProps}>\n {slackChannels.map((channel) => {\n return (\n <SlackChannelOption\n key={channel.id}\n tabIndex={0}\n channel={channel}\n isLoading={isLoading}\n isConnected={\n !!connectedChannels?.find(\n (connectedChannel) =>\n connectedChannel.channel_id === channel.id,\n )\n }\n onClick={onClick}\n channelOptionProps={channelOptionProps}\n isUpdating={isUpdating}\n />\n );\n })}\n </div>\n );\n};\n\nexport default SlackChannelListBox;\n"],"names":["SlackChannelListBox","slackChannels","isLoading","connectedChannels","onClick","listBoxProps","channelOptionProps","isUpdating","jsx","channel","SlackChannelOption","connectedChannel"],"mappings":";;;;AAkBA,MAAMA,IAAsB,CAAC;AAAA,EAC3B,eAAAC;AAAA,EACA,WAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,cAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,YAAAC;AACF,MAEI,gBAAAC,EAAC,SAAI,WAAU,0BAA0B,GAAGH,GACzC,UAAAJ,EAAc,IAAI,CAACQ,MAEhB,gBAAAD;AAAA,EAACE;AAAA,EAAA;AAAA,IAEC,UAAU;AAAA,IACV,SAAAD;AAAA,IACA,WAAAP;AAAA,IACA,aACE,CAAC,EAACC,KAAA,QAAAA,EAAmB;AAAA,MACnB,CAACQ,MACCA,EAAiB,eAAeF,EAAQ;AAAA;AAAA,IAG9C,SAAAL;AAAA,IACA,oBAAAE;AAAA,IACA,YAAAC;AAAA,EAAA;AAAA,EAZKE,EAAQ;AAAA,CAelB,EACH,CAAA;"}
@@ -0,0 +1,49 @@
1
+ import { jsx as o, jsxs as x } from "react/jsx-runtime";
2
+ import { useState as _, useEffect as f } from "react";
3
+ import "@knocklabs/react-core";
4
+ import { Spinner as k } from "../../../core/components/Spinner/Spinner.mjs";
5
+
6
+ import "lodash.debounce";
7
+
8
+ import v from "./icons/CheckmarkIcon.mjs";
9
+ import h from "./icons/HashtagIcon.mjs";
10
+ import N from "./icons/LockIcon.mjs";
11
+
12
+ const z = ({
13
+ channel: t,
14
+ isLoading: e,
15
+ isConnected: n,
16
+ onClick: a,
17
+ tabIndex: l,
18
+ channelOptionProps: p,
19
+ isUpdating: r
20
+ }) => {
21
+ const [b, c] = _(!1), [i, s] = _(null), u = () => i === t.id && (r || e) ? /* @__PURE__ */ o(k, { thickness: 3 }) : b || n ? /* @__PURE__ */ o(v, { isConnected: n }) : /* @__PURE__ */ o("div", { className: "rsk-combobox__option__text-container__empty-icon" }), d = (m) => {
22
+ s(m), a(m);
23
+ };
24
+ return f(() => {
25
+ if (i && !r)
26
+ return s(null);
27
+ }, [e, r, i]), /* @__PURE__ */ o(
28
+ "button",
29
+ {
30
+ className: "rsk-combobox__option__button",
31
+ onClick: () => !e && d(t.id),
32
+ disabled: e || r,
33
+ onMouseEnter: () => c(!0),
34
+ onMouseLeave: () => c(!1),
35
+ tabIndex: l,
36
+ ...p,
37
+ children: /* @__PURE__ */ x("div", { className: "rsk-combobox__option__text-container", children: [
38
+ /* @__PURE__ */ o("div", { className: "rsk-combobox__option__text-container__connection-icon", children: u() }),
39
+ /* @__PURE__ */ o("div", { className: "rsk-combobox__option__text-container__channel-icon", children: t.is_private ? /* @__PURE__ */ o(N, {}) : /* @__PURE__ */ o(h, {}) }),
40
+ /* @__PURE__ */ o("div", { className: "rsk-combobox__option__text-container__text", children: t.name })
41
+ ] })
42
+ },
43
+ t.id
44
+ );
45
+ };
46
+ export {
47
+ z as default
48
+ };
49
+ //# sourceMappingURL=SlackChannelOption.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlackChannelOption.mjs","sources":["../../../../../../src/modules/slack/components/SlackChannelCombobox/SlackChannelOption.tsx"],"sourcesContent":["import { SlackChannel } from \"@knocklabs/client\";\nimport { useEffect, useState } from \"react\";\n\nimport { Spinner } from \"../../../core\";\nimport \"../../theme.css\";\n\nimport CheckmarkIcon from \"./icons/CheckmarkIcon\";\nimport HashtagIcon from \"./icons/HashtagIcon\";\nimport LockIcon from \"./icons/LockIcon\";\nimport \"./styles.css\";\n\ntype Props = {\n channel: SlackChannel;\n isLoading: boolean;\n isConnected: boolean;\n onClick: (id: string) => void;\n tabIndex: number;\n channelOptionProps?: React.HtmlHTMLAttributes<HTMLButtonElement>;\n isUpdating: boolean;\n};\n\nconst SlackChannelOption = ({\n channel,\n isLoading,\n isConnected,\n onClick,\n tabIndex,\n channelOptionProps,\n isUpdating,\n}: Props) => {\n const [isHovered, setIsHovered] = useState(false);\n const [submittedId, setSubmittedId] = useState<string | null>(null);\n\n const icon = () => {\n if (submittedId === channel.id && (isUpdating || isLoading)) {\n return <Spinner thickness={3} />;\n }\n\n if (isHovered || isConnected) {\n return <CheckmarkIcon isConnected={isConnected} />;\n }\n\n return <div className=\"rsk-combobox__option__text-container__empty-icon\" />;\n };\n\n const handleOptionClick = (channelId: string) => {\n setSubmittedId(channelId);\n onClick(channelId);\n };\n\n useEffect(() => {\n if (submittedId && !isUpdating) {\n return setSubmittedId(null);\n }\n }, [isLoading, isUpdating, submittedId]);\n\n return (\n <button\n key={channel.id}\n className=\"rsk-combobox__option__button\"\n onClick={() => !isLoading && handleOptionClick(channel.id)}\n disabled={isLoading || isUpdating}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n tabIndex={tabIndex}\n {...channelOptionProps}\n >\n <div className=\"rsk-combobox__option__text-container\">\n <div className=\"rsk-combobox__option__text-container__connection-icon\">\n {icon()}\n </div>\n <div className=\"rsk-combobox__option__text-container__channel-icon\">\n {channel.is_private ? <LockIcon /> : <HashtagIcon />}\n </div>\n <div className=\"rsk-combobox__option__text-container__text\">{channel.name}</div>\n </div>\n </button>\n );\n};\n\nexport default SlackChannelOption;\n"],"names":["SlackChannelOption","channel","isLoading","isConnected","onClick","tabIndex","channelOptionProps","isUpdating","isHovered","setIsHovered","useState","submittedId","setSubmittedId","icon","jsx","Spinner","CheckmarkIcon","handleOptionClick","channelId","useEffect","jsxs","LockIcon","HashtagIcon"],"mappings":";;;;;;;;;;;AAqBA,MAAMA,IAAqB,CAAC;AAAA,EAC1B,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,YAAAC;AACF,MAAa;AACX,QAAM,CAACC,GAAWC,CAAY,IAAIC,EAAS,EAAK,GAC1C,CAACC,GAAaC,CAAc,IAAIF,EAAwB,IAAI,GAE5DG,IAAO,MACPF,MAAgBV,EAAQ,OAAOM,KAAcL,KACxC,gBAAAY,EAACC,GAAQ,EAAA,WAAW,EAAG,CAAA,IAG5BP,KAAaL,IACR,gBAAAW,EAACE,KAAc,aAAAb,EAA0B,CAAA,IAG3C,gBAAAW,EAAC,OAAI,EAAA,WAAU,mDAAmD,CAAA,GAGrEG,IAAoB,CAACC,MAAsB;AAC/C,IAAAN,EAAeM,CAAS,GACxBd,EAAQc,CAAS;AAAA,EAAA;AAGnB,SAAAC,EAAU,MAAM;AACV,QAAAR,KAAe,CAACJ;AAClB,aAAOK,EAAe,IAAI;AAAA,EAE3B,GAAA,CAACV,GAAWK,GAAYI,CAAW,CAAC,GAGrC,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,WAAU;AAAA,MACV,SAAS,MAAM,CAACZ,KAAae,EAAkBhB,EAAQ,EAAE;AAAA,MACzD,UAAUC,KAAaK;AAAA,MACvB,cAAc,MAAME,EAAa,EAAI;AAAA,MACrC,cAAc,MAAMA,EAAa,EAAK;AAAA,MACtC,UAAAJ;AAAA,MACC,GAAGC;AAAA,MAEJ,UAAA,gBAAAc,EAAC,OAAI,EAAA,WAAU,wCACb,UAAA;AAAA,QAAA,gBAAAN,EAAC,OAAI,EAAA,WAAU,yDACZ,UAAAD,EAAA,GACH;AAAA,QACA,gBAAAC,EAAC,OAAI,EAAA,WAAU,sDACZ,UAAAb,EAAQ,aAAa,gBAAAa,EAACO,GAAS,CAAA,CAAA,IAAM,gBAAAP,EAAAQ,GAAA,CAAY,CAAA,GACpD;AAAA,QACC,gBAAAR,EAAA,OAAA,EAAI,WAAU,8CAA8C,YAAQ,MAAK;AAAA,MAAA,GAC5E;AAAA,IAAA;AAAA,IAjBKb,EAAQ;AAAA,EAAA;AAoBnB;"}