@knocklabs/react 0.1.9 → 0.2.0

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 (138) hide show
  1. package/CHANGELOG.md +14 -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/SlackConnectionError.js +2 -0
  41. package/dist/cjs/modules/slack/components/SlackChannelCombobox/SlackConnectionError.js.map +1 -0
  42. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/CheckmarkIcon.js +2 -0
  43. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/CheckmarkIcon.js.map +1 -0
  44. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/HashtagIcon.js +2 -0
  45. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/HashtagIcon.js.map +1 -0
  46. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/InfoIcon.js +2 -0
  47. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/InfoIcon.js.map +1 -0
  48. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/LockIcon.js +2 -0
  49. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/LockIcon.js.map +1 -0
  50. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/SearchIcon.js +2 -0
  51. package/dist/cjs/modules/slack/components/SlackChannelCombobox/icons/SearchIcon.js.map +1 -0
  52. package/dist/cjs/modules/slack/components/SlackChannelCombobox/styles.css.js +2 -0
  53. package/dist/cjs/modules/slack/components/SlackChannelCombobox/styles.css.js.map +1 -0
  54. package/dist/cjs/modules/slack/components/SlackIcon/SlackIcon.js +2 -0
  55. package/dist/cjs/modules/slack/components/SlackIcon/SlackIcon.js.map +1 -0
  56. package/dist/cjs/modules/slack/theme.css.js +2 -0
  57. package/dist/cjs/modules/slack/theme.css.js.map +1 -0
  58. package/dist/cjs/theme.css.js +2 -0
  59. package/dist/cjs/theme.css.js.map +1 -0
  60. package/dist/esm/index.mjs +28 -20
  61. package/dist/esm/index.mjs.map +1 -1
  62. package/dist/esm/modules/core/hooks/useOutsideClick.mjs +18 -0
  63. package/dist/esm/modules/core/hooks/useOutsideClick.mjs.map +1 -0
  64. package/dist/esm/modules/slack/components/SlackAddChannelInput/SlackAddChannelInput.mjs +51 -0
  65. package/dist/esm/modules/slack/components/SlackAddChannelInput/SlackAddChannelInput.mjs.map +1 -0
  66. package/dist/esm/modules/slack/components/SlackAuthButton/SlackAuthButton.mjs +80 -0
  67. package/dist/esm/modules/slack/components/SlackAuthButton/SlackAuthButton.mjs.map +1 -0
  68. package/dist/esm/modules/slack/components/SlackAuthContainer/SlackAuthContainer.mjs +22 -0
  69. package/dist/esm/modules/slack/components/SlackAuthContainer/SlackAuthContainer.mjs.map +1 -0
  70. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackChannelCombobox.mjs +183 -0
  71. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackChannelCombobox.mjs.map +1 -0
  72. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackChannelListBox.mjs +31 -0
  73. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackChannelListBox.mjs.map +1 -0
  74. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackChannelOption.mjs +49 -0
  75. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackChannelOption.mjs.map +1 -0
  76. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackConnectionError.mjs +14 -0
  77. package/dist/esm/modules/slack/components/SlackChannelCombobox/SlackConnectionError.mjs.map +1 -0
  78. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/CheckmarkIcon.mjs +31 -0
  79. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/CheckmarkIcon.mjs.map +1 -0
  80. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/HashtagIcon.mjs +24 -0
  81. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/HashtagIcon.mjs.map +1 -0
  82. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/InfoIcon.mjs +50 -0
  83. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/InfoIcon.mjs.map +1 -0
  84. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/LockIcon.mjs +33 -0
  85. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/LockIcon.mjs.map +1 -0
  86. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/SearchIcon.mjs +21 -0
  87. package/dist/esm/modules/slack/components/SlackChannelCombobox/icons/SearchIcon.mjs.map +1 -0
  88. package/dist/esm/modules/slack/components/SlackIcon/SlackIcon.mjs +46 -0
  89. package/dist/esm/modules/slack/components/SlackIcon/SlackIcon.mjs.map +1 -0
  90. package/dist/index.css +1 -1
  91. package/dist/types/App.d.ts.map +1 -1
  92. package/dist/types/index.d.ts +1 -0
  93. package/dist/types/index.d.ts.map +1 -1
  94. package/dist/types/modules/core/hooks/index.d.ts +1 -0
  95. package/dist/types/modules/core/hooks/index.d.ts.map +1 -1
  96. package/dist/types/modules/core/hooks/useOutsideClick.d.ts +8 -0
  97. package/dist/types/modules/core/hooks/useOutsideClick.d.ts.map +1 -0
  98. package/dist/types/modules/slack/components/SlackAddChannelInput/SlackAddChannelInput.d.ts +10 -0
  99. package/dist/types/modules/slack/components/SlackAddChannelInput/SlackAddChannelInput.d.ts.map +1 -0
  100. package/dist/types/modules/slack/components/SlackAddChannelInput/index.d.ts +2 -0
  101. package/dist/types/modules/slack/components/SlackAddChannelInput/index.d.ts.map +1 -0
  102. package/dist/types/modules/slack/components/SlackAuthButton/SlackAuthButton.d.ts +8 -0
  103. package/dist/types/modules/slack/components/SlackAuthButton/SlackAuthButton.d.ts.map +1 -0
  104. package/dist/types/modules/slack/components/SlackAuthButton/index.d.ts +2 -0
  105. package/dist/types/modules/slack/components/SlackAuthButton/index.d.ts.map +1 -0
  106. package/dist/types/modules/slack/components/SlackAuthContainer/SlackAuthContainer.d.ts +4 -0
  107. package/dist/types/modules/slack/components/SlackAuthContainer/SlackAuthContainer.d.ts.map +1 -0
  108. package/dist/types/modules/slack/components/SlackAuthContainer/index.d.ts +2 -0
  109. package/dist/types/modules/slack/components/SlackAuthContainer/index.d.ts.map +1 -0
  110. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackChannelCombobox.d.ts +22 -0
  111. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackChannelCombobox.d.ts.map +1 -0
  112. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackChannelListBox.d.ts +15 -0
  113. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackChannelListBox.d.ts.map +1 -0
  114. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackChannelOption.d.ts +14 -0
  115. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackChannelOption.d.ts.map +1 -0
  116. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackConnectionError.d.ts +3 -0
  117. package/dist/types/modules/slack/components/SlackChannelCombobox/SlackConnectionError.d.ts.map +1 -0
  118. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/CheckmarkIcon.d.ts +6 -0
  119. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/CheckmarkIcon.d.ts.map +1 -0
  120. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/HashtagIcon.d.ts +3 -0
  121. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/HashtagIcon.d.ts.map +1 -0
  122. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/InfoIcon.d.ts +3 -0
  123. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/InfoIcon.d.ts.map +1 -0
  124. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/LockIcon.d.ts +3 -0
  125. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/LockIcon.d.ts.map +1 -0
  126. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/SearchIcon.d.ts +3 -0
  127. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/SearchIcon.d.ts.map +1 -0
  128. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/index.d.ts +6 -0
  129. package/dist/types/modules/slack/components/SlackChannelCombobox/icons/index.d.ts.map +1 -0
  130. package/dist/types/modules/slack/components/SlackChannelCombobox/index.d.ts +2 -0
  131. package/dist/types/modules/slack/components/SlackChannelCombobox/index.d.ts.map +1 -0
  132. package/dist/types/modules/slack/components/SlackIcon/SlackIcon.d.ts +5 -0
  133. package/dist/types/modules/slack/components/SlackIcon/SlackIcon.d.ts.map +1 -0
  134. package/dist/types/modules/slack/components/SlackIcon/index.d.ts +2 -0
  135. package/dist/types/modules/slack/components/SlackIcon/index.d.ts.map +1 -0
  136. package/dist/types/modules/slack/index.d.ts +4 -0
  137. package/dist/types/modules/slack/index.d.ts.map +1 -0
  138. 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,80 @@
1
+ import { jsxs as l, jsx as t } from "react/jsx-runtime";
2
+ import { useTranslations as b, useKnockClient as f, useKnockSlackClient as x, useSlackAuth as L } from "@knocklabs/react-core";
3
+ import { useEffect as C } from "react";
4
+
5
+ import { SlackIcon as a } from "../SlackIcon/SlackIcon.mjs";
6
+
7
+ const m = (d) => {
8
+ const s = window.screenLeft ?? window.screenX, c = window.screenTop ?? window.screenY, e = window.innerWidth ?? document.documentElement.clientWidth ?? screen.width, o = window.innerHeight ?? document.documentElement.clientHeight ?? screen.height, i = e / 2 - 600 / 2 + s, r = `width=600,height=800,top=${o / 2 - 800 / 2 + c},left=${i}`;
9
+ window.open(d, "Slack OAuth", r);
10
+ }, H = ({
11
+ slackClientId: d,
12
+ redirectUrl: u
13
+ }) => {
14
+ const { t: n } = b(), s = f(), {
15
+ setConnectionStatus: c,
16
+ connectionStatus: e,
17
+ setActionLabel: o,
18
+ actionLabel: i,
19
+ errorLabel: k
20
+ } = x(), { buildSlackAuthUrl: r, disconnectFromSlack: w } = L(
21
+ d,
22
+ u
23
+ );
24
+ C(() => {
25
+ const p = (h) => {
26
+ if (h.origin === s.host)
27
+ try {
28
+ h.data === "authComplete" && c("connected"), h.data === "authFailed" && c("error");
29
+ } catch {
30
+ c("error");
31
+ }
32
+ };
33
+ return window.addEventListener("message", p, !1), () => {
34
+ window.removeEventListener("message", p);
35
+ };
36
+ }, [s.host, c]);
37
+ const _ = n("slackDisconnect") || null, g = n("slackReconnect") || null;
38
+ return e === "connecting" || e === "disconnecting" ? /* @__PURE__ */ l("div", { className: "rsk-connect__button rsk-connect__button--loading", children: [
39
+ /* @__PURE__ */ t(a, { height: "16px", width: "16px" }),
40
+ /* @__PURE__ */ t("span", { children: n(e === "connecting" ? "slackConnecting" : "slackDisconnecting") })
41
+ ] }) : e === "error" ? /* @__PURE__ */ l(
42
+ "button",
43
+ {
44
+ onClick: () => m(r()),
45
+ className: "rsk-connect__button rsk-connect__button--error",
46
+ onMouseEnter: () => o(g),
47
+ onMouseLeave: () => o(null),
48
+ children: [
49
+ /* @__PURE__ */ t(a, { height: "16px", width: "16px" }),
50
+ /* @__PURE__ */ t("span", { className: "rsk-connect__button__text--error", children: i || k || n("slackError") })
51
+ ]
52
+ }
53
+ ) : e === "disconnected" ? /* @__PURE__ */ l(
54
+ "button",
55
+ {
56
+ onClick: () => m(r()),
57
+ className: "rsk-connect__button rsk-connect__button--disconnected",
58
+ children: [
59
+ /* @__PURE__ */ t(a, { height: "16px", width: "16px" }),
60
+ /* @__PURE__ */ t("span", { children: n("slackConnect") })
61
+ ]
62
+ }
63
+ ) : /* @__PURE__ */ l(
64
+ "button",
65
+ {
66
+ onClick: w,
67
+ className: "rsk-connect__button rsk-connect__button--connected",
68
+ onMouseEnter: () => o(_),
69
+ onMouseLeave: () => o(null),
70
+ children: [
71
+ /* @__PURE__ */ t(a, { height: "16px", width: "16px" }),
72
+ /* @__PURE__ */ t("span", { className: "rsk-connect__button__text--connected", children: i || n("slackConnected") })
73
+ ]
74
+ }
75
+ );
76
+ };
77
+ export {
78
+ H as SlackAuthButton
79
+ };
80
+ //# 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};\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}) => {\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 } 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, setConnectionStatus]);\n\nconst disconnectLabel = t(\"slackDisconnect\") || null\nconst 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","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,183 @@
1
+ import { jsx as c, jsxs as S } from "react/jsx-runtime";
2
+ import { useTranslations as H, useKnockSlackClient as w, useSlackChannels as z, useConnectedSlackChannels as G } from "@knocklabs/react-core";
3
+ import * as u from "@radix-ui/react-popover";
4
+ import * as W from "@radix-ui/react-visually-hidden";
5
+ import { useState as x, useRef as X, useEffect as y, useMemo as p } from "react";
6
+ import { useFilter as q } from "react-aria";
7
+ import { Spinner as J } from "../../../core/components/Spinner/Spinner.mjs";
8
+
9
+ import "lodash.debounce";
10
+ import Q from "../../../core/hooks/useOutsideClick.mjs";
11
+
12
+ import Y from "../SlackAddChannelInput/SlackAddChannelInput.mjs";
13
+ import Z from "./SlackChannelListBox.mjs";
14
+ import g from "./SlackConnectionError.mjs";
15
+ import M from "./icons/SearchIcon.mjs";
16
+
17
+ const nn = 1e3, _n = ({
18
+ slackChannelsRecipientObject: O,
19
+ queryOptions: I,
20
+ inputProps: R,
21
+ inputContainerProps: U,
22
+ listBoxProps: $,
23
+ channelOptionProps: D,
24
+ inputMessages: n
25
+ }) => {
26
+ const { t: l } = H(), [m, E] = x(!1), [L, N] = x(""), T = X(null);
27
+ Q({
28
+ ref: T,
29
+ fn: () => {
30
+ N(""), E(!1);
31
+ }
32
+ });
33
+ const { connectionStatus: t, errorLabel: v } = w(), { data: a, isLoading: C } = z({ queryOptions: I }), {
34
+ data: h,
35
+ updateConnectedChannels: b,
36
+ loading: K,
37
+ error: d,
38
+ updating: F
39
+ } = G({ slackChannelsRecipientObject: O }), [r, f] = x(null);
40
+ y(() => {
41
+ m && setTimeout(() => {
42
+ var o;
43
+ (o = document.getElementById("slack-channel-search")) == null || o.focus();
44
+ }, 0);
45
+ }, [m]), y(() => {
46
+ const o = new Map(
47
+ a.map((e) => [e.id, e])
48
+ ), i = (h == null ? void 0 : h.filter((e) => o.has(e.channel_id || ""))) || [];
49
+ f(i);
50
+ }, [h, a]);
51
+ const s = p(
52
+ () => t === "disconnected" || t === "error" || d,
53
+ [d, t]
54
+ ), _ = p(
55
+ () => t === "connecting" || t === "disconnecting" || C,
56
+ [t, C]
57
+ ), P = p(() => {
58
+ const o = {
59
+ disconnected: l("slackSearchbarDisconnected"),
60
+ multipleChannelsConnected: l("slackSearchbarMultipleChannels"),
61
+ noChannelsConnected: l("slackSearchbarNoChannelsConnected"),
62
+ noSlackChannelsFound: l("slackSearchbarNoChannelsFound"),
63
+ channelsError: l("slackSearchbarChannelsError")
64
+ };
65
+ if (t === "disconnected")
66
+ return (n == null ? void 0 : n.disconnected) || o.disconnected;
67
+ if (t === "error")
68
+ return (n == null ? void 0 : n.error) || v;
69
+ if (!_ && a.length === 0)
70
+ return (n == null ? void 0 : n.noSlackChannelsFound) || o.noSlackChannelsFound;
71
+ if (d)
72
+ return d;
73
+ const i = (r == null ? void 0 : r.length) || 0;
74
+ if (r && i === 0)
75
+ return (n == null ? void 0 : n.noChannelsConnected) || o.noChannelsConnected;
76
+ if (r && i === 1) {
77
+ const e = a == null ? void 0 : a.find(
78
+ (k) => {
79
+ var A;
80
+ return k.id === ((A = r[0]) == null ? void 0 : A.channel_id);
81
+ }
82
+ );
83
+ return (n == null ? void 0 : n.singleChannelConnected) || `# ${e == null ? void 0 : e.name}`;
84
+ }
85
+ return r && i > 1 ? (n == null ? void 0 : n.multipleChannelsConnected) || `${i} channels connected` : "";
86
+ }, [
87
+ t,
88
+ _,
89
+ a,
90
+ d,
91
+ r,
92
+ n,
93
+ v,
94
+ l
95
+ ]), V = async (o) => {
96
+ if (!r)
97
+ return;
98
+ if (r.find(
99
+ (e) => e.channel_id === o
100
+ )) {
101
+ const e = r.filter(
102
+ (k) => k.channel_id !== o
103
+ );
104
+ f(e), b(e);
105
+ } else {
106
+ const e = [
107
+ ...r,
108
+ { channel_id: o }
109
+ ];
110
+ f(e), b(e);
111
+ }
112
+ }, { contains: j } = q({ sensitivity: "base" }), B = a.filter(
113
+ (o) => j(o.name, L)
114
+ );
115
+ return a.length > nn ? /* @__PURE__ */ c(
116
+ Y,
117
+ {
118
+ inErrorState: !!s,
119
+ connectedChannels: r || [],
120
+ updateConnectedChannels: b,
121
+ connectedChannelsError: d,
122
+ connectedChannelsUpdating: F
123
+ }
124
+ ) : /* @__PURE__ */ c("div", { ref: T, className: "rsk-combobox", children: /* @__PURE__ */ S(
125
+ u.Root,
126
+ {
127
+ open: t !== "disconnected" ? m : !1,
128
+ children: [
129
+ /* @__PURE__ */ c(W.Root, { children: /* @__PURE__ */ c("label", { htmlFor: "slack-channel-search", children: l("slackSearchChannels") }) }),
130
+ /* @__PURE__ */ c(u.Trigger, { asChild: !0, children: /* @__PURE__ */ S("div", { className: "rsk-combobox__searchbar", children: [
131
+ /* @__PURE__ */ S(
132
+ "div",
133
+ {
134
+ className: "rsk-combobox__searchbar__input-container",
135
+ ...U,
136
+ children: [
137
+ /* @__PURE__ */ c(
138
+ "div",
139
+ {
140
+ className: `rsk-combobox__searchbar__input-container__icon ${s && "rsk-combobox__searchbar__input-container__icon--error"}`,
141
+ children: _ ? /* @__PURE__ */ c(J, { size: "15px", thickness: 3 }) : /* @__PURE__ */ c(M, {})
142
+ }
143
+ ),
144
+ /* @__PURE__ */ c(
145
+ "input",
146
+ {
147
+ className: `rsk-combobox__searchbar__input-container__input ${s ? "rsk-combobox__searchbar__input-container__input--error" : ""}`,
148
+ tabIndex: -1,
149
+ id: "slack-channel-search",
150
+ type: "text",
151
+ onFocus: () => a.length > 0 && E(!0),
152
+ onChange: (o) => N(o.target.value),
153
+ value: L,
154
+ placeholder: P || "",
155
+ disabled: !!s,
156
+ ...R
157
+ }
158
+ )
159
+ ]
160
+ }
161
+ ),
162
+ /* @__PURE__ */ c(g, {})
163
+ ] }) }),
164
+ /* @__PURE__ */ c(u.Content, { children: /* @__PURE__ */ c(
165
+ Z,
166
+ {
167
+ isLoading: C || K,
168
+ isUpdating: F,
169
+ connectedChannels: r,
170
+ onClick: V,
171
+ slackChannels: B,
172
+ listBoxProps: $,
173
+ channelOptionProps: D
174
+ }
175
+ ) })
176
+ ]
177
+ }
178
+ ) });
179
+ };
180
+ export {
181
+ _n as SlackChannelCombobox
182
+ };
183
+ //# 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 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};\n\nexport const SlackChannelCombobox = ({\n slackChannelsRecipientObject,\n queryOptions,\n inputProps,\n inputContainerProps,\n listBoxProps,\n channelOptionProps,\n inputMessages,\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 </div>\n );\n};\n"],"names":["MAX_ALLOWED_CHANNELS","SlackChannelCombobox","slackChannelsRecipientObject","queryOptions","inputProps","inputContainerProps","listBoxProps","channelOptionProps","inputMessages","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"],"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;"}
@@ -0,0 +1,14 @@
1
+ import { jsxs as c, jsx as r } from "react/jsx-runtime";
2
+ import { useTranslations as e, useKnockSlackClient as s } from "@knocklabs/react-core";
3
+ import t from "./icons/InfoIcon.mjs";
4
+ const l = () => {
5
+ const { t: n } = e(), { connectionStatus: o } = s();
6
+ return o === "disconnected" || o === "error" ? /* @__PURE__ */ c("div", { className: "rsk-combobox__error", children: [
7
+ /* @__PURE__ */ r("span", { children: /* @__PURE__ */ r(t, {}) }),
8
+ /* @__PURE__ */ r("div", { className: "rsk-combobox__error__text", children: n(o === "disconnected" ? "slackConnectionErrorOccurred" : "slackConnectionErrorExists") })
9
+ ] }) : /* @__PURE__ */ r("div", {});
10
+ };
11
+ export {
12
+ l as default
13
+ };
14
+ //# sourceMappingURL=SlackConnectionError.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlackConnectionError.mjs","sources":["../../../../../../src/modules/slack/components/SlackChannelCombobox/SlackConnectionError.tsx"],"sourcesContent":["import { useKnockSlackClient, useTranslations } from \"@knocklabs/react-core\";\n\nimport InfoIcon from \"./icons/InfoIcon\";\n\nconst SlackConnectionError = () => {\n const { t } = useTranslations();\n const { connectionStatus } = useKnockSlackClient();\n\n if (connectionStatus === \"disconnected\" || connectionStatus === \"error\") {\n return (\n <div className=\"rsk-combobox__error\">\n <span>\n <InfoIcon />\n </span>\n\n <div className=\"rsk-combobox__error__text\">\n {connectionStatus === \"disconnected\"\n ? t(\"slackConnectionErrorOccurred\")\n : t(\"slackConnectionErrorExists\")}\n </div>\n </div>\n );\n }\n\n return <div />;\n};\n\nexport default SlackConnectionError;\n"],"names":["SlackConnectionError","t","useTranslations","connectionStatus","useKnockSlackClient","jsxs","jsx","InfoIcon"],"mappings":";;;AAIA,MAAMA,IAAuB,MAAM;AAC3B,QAAA,EAAE,GAAAC,MAAMC,KACR,EAAE,kBAAAC,MAAqBC;AAEzB,SAAAD,MAAqB,kBAAkBA,MAAqB,UAE5D,gBAAAE,EAAC,OAAI,EAAA,WAAU,uBACb,UAAA;AAAA,IAAC,gBAAAC,EAAA,QAAA,EACC,UAAC,gBAAAA,EAAAC,GAAA,CAAS,CAAA,GACZ;AAAA,IAEA,gBAAAD,EAAC,OAAI,EAAA,WAAU,6BACZ,UACGL,EADHE,MAAqB,iBAChB,iCACA,4BAD8B,EAEtC,CAAA;AAAA,EACF,EAAA,CAAA,sBAII,OAAI,CAAA,CAAA;AACd;"}