@knocklabs/react-core 0.6.14 → 0.7.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 (220) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/cjs/index.js +2 -0
  3. package/dist/cjs/index.js.map +1 -0
  4. package/dist/cjs/modules/core/constants.js +2 -0
  5. package/dist/cjs/modules/core/constants.js.map +1 -0
  6. package/dist/cjs/modules/core/context/KnockProvider.js +2 -0
  7. package/dist/cjs/modules/core/context/KnockProvider.js.map +1 -0
  8. package/dist/cjs/modules/core/hooks/useAuthenticatedKnockClient.js +2 -0
  9. package/dist/cjs/modules/core/hooks/useAuthenticatedKnockClient.js.map +1 -0
  10. package/dist/cjs/modules/core/hooks/useStableOptions.js +2 -0
  11. package/dist/cjs/modules/core/hooks/useStableOptions.js.map +1 -0
  12. package/dist/cjs/modules/core/utils.js +2 -0
  13. package/dist/cjs/modules/core/utils.js.map +1 -0
  14. package/dist/cjs/modules/feed/context/KnockFeedProvider.js +2 -0
  15. package/dist/cjs/modules/feed/context/KnockFeedProvider.js.map +1 -0
  16. package/dist/cjs/modules/feed/hooks/useFeedSettings.js +2 -0
  17. package/dist/cjs/modules/feed/hooks/useFeedSettings.js.map +1 -0
  18. package/dist/cjs/modules/feed/hooks/useNotificationStore.js +2 -0
  19. package/dist/cjs/modules/feed/hooks/useNotificationStore.js.map +1 -0
  20. package/dist/cjs/modules/feed/hooks/useNotifications.js +2 -0
  21. package/dist/cjs/modules/feed/hooks/useNotifications.js.map +1 -0
  22. package/dist/cjs/modules/guide/context/KnockGuideProvider.js +2 -0
  23. package/dist/cjs/modules/guide/context/KnockGuideProvider.js.map +1 -0
  24. package/dist/cjs/modules/guide/hooks/useGuide.js +2 -0
  25. package/dist/cjs/modules/guide/hooks/useGuide.js.map +1 -0
  26. package/dist/cjs/modules/guide/hooks/useGuideContext.js +2 -0
  27. package/dist/cjs/modules/guide/hooks/useGuideContext.js.map +1 -0
  28. package/dist/cjs/modules/i18n/context/KnockI18nProvider.js +2 -0
  29. package/dist/cjs/modules/i18n/context/KnockI18nProvider.js.map +1 -0
  30. package/dist/cjs/modules/i18n/hooks/useTranslations.js +2 -0
  31. package/dist/cjs/modules/i18n/hooks/useTranslations.js.map +1 -0
  32. package/dist/cjs/modules/i18n/languages/de.js +2 -0
  33. package/dist/cjs/modules/i18n/languages/de.js.map +1 -0
  34. package/dist/cjs/modules/i18n/languages/en.js +2 -0
  35. package/dist/cjs/modules/i18n/languages/en.js.map +1 -0
  36. package/dist/cjs/modules/i18n/languages/index.js +2 -0
  37. package/dist/cjs/modules/i18n/languages/index.js.map +1 -0
  38. package/dist/cjs/modules/ms-teams/context/KnockMsTeamsProvider.js +2 -0
  39. package/dist/cjs/modules/ms-teams/context/KnockMsTeamsProvider.js.map +1 -0
  40. package/dist/cjs/modules/ms-teams/hooks/useConnectedMsTeamsChannels.js +2 -0
  41. package/dist/cjs/modules/ms-teams/hooks/useConnectedMsTeamsChannels.js.map +1 -0
  42. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsAuth.js +2 -0
  43. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsAuth.js.map +1 -0
  44. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsChannels.js +2 -0
  45. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsChannels.js.map +1 -0
  46. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsConnectionStatus.js +2 -0
  47. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsConnectionStatus.js.map +1 -0
  48. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsTeams.js +2 -0
  49. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsTeams.js.map +1 -0
  50. package/dist/cjs/modules/slack/context/KnockSlackProvider.js +2 -0
  51. package/dist/cjs/modules/slack/context/KnockSlackProvider.js.map +1 -0
  52. package/dist/cjs/modules/slack/hooks/useConnectedSlackChannels.js +2 -0
  53. package/dist/cjs/modules/slack/hooks/useConnectedSlackChannels.js.map +1 -0
  54. package/dist/cjs/modules/slack/hooks/useSlackAuth.js +2 -0
  55. package/dist/cjs/modules/slack/hooks/useSlackAuth.js.map +1 -0
  56. package/dist/cjs/modules/slack/hooks/useSlackChannels.js +2 -0
  57. package/dist/cjs/modules/slack/hooks/useSlackChannels.js.map +1 -0
  58. package/dist/cjs/modules/slack/hooks/useSlackConnectionStatus.js +2 -0
  59. package/dist/cjs/modules/slack/hooks/useSlackConnectionStatus.js.map +1 -0
  60. package/dist/esm/index.mjs +66 -0
  61. package/dist/esm/index.mjs.map +1 -0
  62. package/dist/esm/modules/core/constants.mjs +5 -0
  63. package/dist/esm/modules/core/constants.mjs.map +1 -0
  64. package/dist/esm/modules/core/context/KnockProvider.mjs +35 -0
  65. package/dist/esm/modules/core/context/KnockProvider.mjs.map +1 -0
  66. package/dist/esm/modules/core/hooks/useAuthenticatedKnockClient.mjs +29 -0
  67. package/dist/esm/modules/core/hooks/useAuthenticatedKnockClient.mjs.map +1 -0
  68. package/dist/esm/modules/core/hooks/useStableOptions.mjs +13 -0
  69. package/dist/esm/modules/core/hooks/useStableOptions.mjs.map +1 -0
  70. package/dist/esm/modules/core/utils.mjs +49 -0
  71. package/dist/esm/modules/core/utils.mjs.map +1 -0
  72. package/dist/esm/modules/feed/context/KnockFeedProvider.mjs +37 -0
  73. package/dist/esm/modules/feed/context/KnockFeedProvider.mjs.map +1 -0
  74. package/dist/esm/modules/feed/hooks/useFeedSettings.mjs +23 -0
  75. package/dist/esm/modules/feed/hooks/useFeedSettings.mjs.map +1 -0
  76. package/dist/esm/modules/feed/hooks/useNotificationStore.mjs +12 -0
  77. package/dist/esm/modules/feed/hooks/useNotificationStore.mjs.map +1 -0
  78. package/dist/esm/modules/feed/hooks/useNotifications.mjs +34 -0
  79. package/dist/esm/modules/feed/hooks/useNotifications.mjs.map +1 -0
  80. package/dist/esm/modules/guide/context/KnockGuideProvider.mjs +33 -0
  81. package/dist/esm/modules/guide/context/KnockGuideProvider.mjs.map +1 -0
  82. package/dist/esm/modules/guide/hooks/useGuide.mjs +21 -0
  83. package/dist/esm/modules/guide/hooks/useGuide.mjs.map +1 -0
  84. package/dist/esm/modules/guide/hooks/useGuideContext.mjs +12 -0
  85. package/dist/esm/modules/guide/hooks/useGuideContext.mjs.map +1 -0
  86. package/dist/esm/modules/i18n/context/KnockI18nProvider.mjs +11 -0
  87. package/dist/esm/modules/i18n/context/KnockI18nProvider.mjs.map +1 -0
  88. package/dist/esm/modules/i18n/hooks/useTranslations.mjs +17 -0
  89. package/dist/esm/modules/i18n/hooks/useTranslations.mjs.map +1 -0
  90. package/dist/esm/modules/i18n/languages/de.mjs +39 -0
  91. package/dist/esm/modules/i18n/languages/de.mjs.map +1 -0
  92. package/dist/esm/modules/i18n/languages/en.mjs +51 -0
  93. package/dist/esm/modules/i18n/languages/en.mjs.map +1 -0
  94. package/dist/esm/modules/i18n/languages/index.mjs +10 -0
  95. package/dist/esm/modules/i18n/languages/index.mjs.map +1 -0
  96. package/dist/esm/modules/ms-teams/context/KnockMsTeamsProvider.mjs +48 -0
  97. package/dist/esm/modules/ms-teams/context/KnockMsTeamsProvider.mjs.map +1 -0
  98. package/dist/esm/modules/ms-teams/hooks/useConnectedMsTeamsChannels.mjs +78 -0
  99. package/dist/esm/modules/ms-teams/hooks/useConnectedMsTeamsChannels.mjs.map +1 -0
  100. package/dist/esm/modules/ms-teams/hooks/useMsTeamsAuth.mjs +53 -0
  101. package/dist/esm/modules/ms-teams/hooks/useMsTeamsAuth.mjs.map +1 -0
  102. package/dist/esm/modules/ms-teams/hooks/useMsTeamsChannels.mjs +41 -0
  103. package/dist/esm/modules/ms-teams/hooks/useMsTeamsChannels.mjs.map +1 -0
  104. package/dist/esm/modules/ms-teams/hooks/useMsTeamsConnectionStatus.mjs +38 -0
  105. package/dist/esm/modules/ms-teams/hooks/useMsTeamsConnectionStatus.mjs.map +1 -0
  106. package/dist/esm/modules/ms-teams/hooks/useMsTeamsTeams.mjs +51 -0
  107. package/dist/esm/modules/ms-teams/hooks/useMsTeamsTeams.mjs.map +1 -0
  108. package/dist/esm/modules/slack/context/KnockSlackProvider.mjs +49 -0
  109. package/dist/esm/modules/slack/context/KnockSlackProvider.mjs.map +1 -0
  110. package/dist/esm/modules/slack/hooks/useConnectedSlackChannels.mjs +78 -0
  111. package/dist/esm/modules/slack/hooks/useConnectedSlackChannels.mjs.map +1 -0
  112. package/dist/esm/modules/slack/hooks/useSlackAuth.mjs +68 -0
  113. package/dist/esm/modules/slack/hooks/useSlackAuth.mjs.map +1 -0
  114. package/dist/esm/modules/slack/hooks/useSlackChannels.mjs +52 -0
  115. package/dist/esm/modules/slack/hooks/useSlackChannels.mjs.map +1 -0
  116. package/dist/esm/modules/slack/hooks/useSlackConnectionStatus.mjs +47 -0
  117. package/dist/esm/modules/slack/hooks/useSlackConnectionStatus.mjs.map +1 -0
  118. package/dist/types/index.d.ts +8 -0
  119. package/dist/types/index.d.ts.map +1 -0
  120. package/dist/types/interfaces.d.ts +5 -0
  121. package/dist/types/interfaces.d.ts.map +1 -0
  122. package/dist/types/modules/core/constants.d.ts +8 -0
  123. package/dist/types/modules/core/constants.d.ts.map +1 -0
  124. package/dist/types/modules/core/context/KnockProvider.d.ts +41 -0
  125. package/dist/types/modules/core/context/KnockProvider.d.ts.map +1 -0
  126. package/dist/types/modules/core/context/index.d.ts +2 -0
  127. package/dist/types/modules/core/context/index.d.ts.map +1 -0
  128. package/dist/types/modules/core/hooks/index.d.ts +3 -0
  129. package/dist/types/modules/core/hooks/index.d.ts.map +1 -0
  130. package/dist/types/modules/core/hooks/useAuthenticatedKnockClient.d.ts +14 -0
  131. package/dist/types/modules/core/hooks/useAuthenticatedKnockClient.d.ts.map +1 -0
  132. package/dist/types/modules/core/hooks/useStableOptions.d.ts +2 -0
  133. package/dist/types/modules/core/hooks/useStableOptions.d.ts.map +1 -0
  134. package/dist/types/modules/core/index.d.ts +5 -0
  135. package/dist/types/modules/core/index.d.ts.map +1 -0
  136. package/dist/types/modules/core/utils.d.ts +24 -0
  137. package/dist/types/modules/core/utils.d.ts.map +1 -0
  138. package/dist/types/modules/feed/context/KnockFeedProvider.d.ts +19 -0
  139. package/dist/types/modules/feed/context/KnockFeedProvider.d.ts.map +1 -0
  140. package/dist/types/modules/feed/context/index.d.ts +2 -0
  141. package/dist/types/modules/feed/context/index.d.ts.map +1 -0
  142. package/dist/types/modules/feed/hooks/index.d.ts +4 -0
  143. package/dist/types/modules/feed/hooks/index.d.ts.map +1 -0
  144. package/dist/types/modules/feed/hooks/useFeedSettings.d.ts +12 -0
  145. package/dist/types/modules/feed/hooks/useFeedSettings.d.ts.map +1 -0
  146. package/dist/types/modules/feed/hooks/useNotificationStore.d.ts +34 -0
  147. package/dist/types/modules/feed/hooks/useNotificationStore.d.ts.map +1 -0
  148. package/dist/types/modules/feed/hooks/useNotifications.d.ts +4 -0
  149. package/dist/types/modules/feed/hooks/useNotifications.d.ts.map +1 -0
  150. package/dist/types/modules/feed/index.d.ts +3 -0
  151. package/dist/types/modules/feed/index.d.ts.map +1 -0
  152. package/dist/types/modules/guide/context/KnockGuideProvider.d.ts +19 -0
  153. package/dist/types/modules/guide/context/KnockGuideProvider.d.ts.map +1 -0
  154. package/dist/types/modules/guide/context/index.d.ts +2 -0
  155. package/dist/types/modules/guide/context/index.d.ts.map +1 -0
  156. package/dist/types/modules/guide/hooks/index.d.ts +2 -0
  157. package/dist/types/modules/guide/hooks/index.d.ts.map +1 -0
  158. package/dist/types/modules/guide/hooks/useGuide.d.ts +9 -0
  159. package/dist/types/modules/guide/hooks/useGuide.d.ts.map +1 -0
  160. package/dist/types/modules/guide/hooks/useGuideContext.d.ts +7 -0
  161. package/dist/types/modules/guide/hooks/useGuideContext.d.ts.map +1 -0
  162. package/dist/types/modules/guide/index.d.ts +3 -0
  163. package/dist/types/modules/guide/index.d.ts.map +1 -0
  164. package/dist/types/modules/i18n/context/KnockI18nProvider.d.ts +8 -0
  165. package/dist/types/modules/i18n/context/KnockI18nProvider.d.ts.map +1 -0
  166. package/dist/types/modules/i18n/context/index.d.ts +2 -0
  167. package/dist/types/modules/i18n/context/index.d.ts.map +1 -0
  168. package/dist/types/modules/i18n/hooks/index.d.ts +2 -0
  169. package/dist/types/modules/i18n/hooks/index.d.ts.map +1 -0
  170. package/dist/types/modules/i18n/hooks/useTranslations.d.ts +5 -0
  171. package/dist/types/modules/i18n/hooks/useTranslations.d.ts.map +1 -0
  172. package/dist/types/modules/i18n/index.d.ts +4 -0
  173. package/dist/types/modules/i18n/index.d.ts.map +1 -0
  174. package/dist/types/modules/i18n/languages/de.d.ts +4 -0
  175. package/dist/types/modules/i18n/languages/de.d.ts.map +1 -0
  176. package/dist/types/modules/i18n/languages/en.d.ts +4 -0
  177. package/dist/types/modules/i18n/languages/en.d.ts.map +1 -0
  178. package/dist/types/modules/i18n/languages/index.d.ts +54 -0
  179. package/dist/types/modules/i18n/languages/index.d.ts.map +1 -0
  180. package/dist/types/modules/ms-teams/context/KnockMsTeamsProvider.d.ts +20 -0
  181. package/dist/types/modules/ms-teams/context/KnockMsTeamsProvider.d.ts.map +1 -0
  182. package/dist/types/modules/ms-teams/context/index.d.ts +2 -0
  183. package/dist/types/modules/ms-teams/context/index.d.ts.map +1 -0
  184. package/dist/types/modules/ms-teams/hooks/index.d.ts +6 -0
  185. package/dist/types/modules/ms-teams/hooks/index.d.ts.map +1 -0
  186. package/dist/types/modules/ms-teams/hooks/useConnectedMsTeamsChannels.d.ts +15 -0
  187. package/dist/types/modules/ms-teams/hooks/useConnectedMsTeamsChannels.d.ts.map +1 -0
  188. package/dist/types/modules/ms-teams/hooks/useMsTeamsAuth.d.ts +7 -0
  189. package/dist/types/modules/ms-teams/hooks/useMsTeamsAuth.d.ts.map +1 -0
  190. package/dist/types/modules/ms-teams/hooks/useMsTeamsChannels.d.ts +14 -0
  191. package/dist/types/modules/ms-teams/hooks/useMsTeamsChannels.d.ts.map +1 -0
  192. package/dist/types/modules/ms-teams/hooks/useMsTeamsConnectionStatus.d.ts +13 -0
  193. package/dist/types/modules/ms-teams/hooks/useMsTeamsConnectionStatus.d.ts.map +1 -0
  194. package/dist/types/modules/ms-teams/hooks/useMsTeamsTeams.d.ts +13 -0
  195. package/dist/types/modules/ms-teams/hooks/useMsTeamsTeams.d.ts.map +1 -0
  196. package/dist/types/modules/ms-teams/index.d.ts +4 -0
  197. package/dist/types/modules/ms-teams/index.d.ts.map +1 -0
  198. package/dist/types/modules/ms-teams/interfaces.d.ts +11 -0
  199. package/dist/types/modules/ms-teams/interfaces.d.ts.map +1 -0
  200. package/dist/types/modules/slack/context/KnockSlackProvider.d.ts +30 -0
  201. package/dist/types/modules/slack/context/KnockSlackProvider.d.ts.map +1 -0
  202. package/dist/types/modules/slack/context/index.d.ts +2 -0
  203. package/dist/types/modules/slack/context/index.d.ts.map +1 -0
  204. package/dist/types/modules/slack/hooks/index.d.ts +5 -0
  205. package/dist/types/modules/slack/hooks/index.d.ts.map +1 -0
  206. package/dist/types/modules/slack/hooks/useConnectedSlackChannels.d.ts +15 -0
  207. package/dist/types/modules/slack/hooks/useConnectedSlackChannels.d.ts.map +1 -0
  208. package/dist/types/modules/slack/hooks/useSlackAuth.d.ts +11 -0
  209. package/dist/types/modules/slack/hooks/useSlackAuth.d.ts.map +1 -0
  210. package/dist/types/modules/slack/hooks/useSlackChannels.d.ts +13 -0
  211. package/dist/types/modules/slack/hooks/useSlackChannels.d.ts.map +1 -0
  212. package/dist/types/modules/slack/hooks/useSlackConnectionStatus.d.ts +13 -0
  213. package/dist/types/modules/slack/hooks/useSlackConnectionStatus.d.ts.map +1 -0
  214. package/dist/types/modules/slack/index.d.ts +4 -0
  215. package/dist/types/modules/slack/index.d.ts.map +1 -0
  216. package/dist/types/modules/slack/interfaces.d.ts +10 -0
  217. package/dist/types/modules/slack/interfaces.d.ts.map +1 -0
  218. package/package.json +3 -2
  219. package/src/modules/core/context/KnockProvider.tsx +36 -7
  220. package/src/modules/core/hooks/useAuthenticatedKnockClient.ts +47 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 2a0b3e2: Adds support for inline user `identify` calls when authenticating a user via the Knock client.
8
+ You can now pass a `user` object, for example `{ id: "123" }`, directly to the `authenticate` function.
9
+ Additional properties can also be included to update the user record, such as `{ id: "123", name: "Knock" }`.
10
+
11
+ This update also applies to `KnockProvider`, where you can now pass a `user` prop instead of a `userId` prop to achieve the same behavior.
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies [2a0b3e2]
16
+ - @knocklabs/client@0.15.0
17
+
18
+ ## 0.6.15
19
+
20
+ ### Patch Changes
21
+
22
+ - 6539c97: patch fix package contents being built properly
23
+ - Updated dependencies [6539c97]
24
+ - @knocklabs/client@0.14.11
25
+
3
26
  ## 0.6.14
4
27
 
5
28
  ### Patch Changes
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./modules/core/context/KnockProvider.js"),c=require("./modules/core/hooks/useAuthenticatedKnockClient.js"),a=require("./modules/core/hooks/useStableOptions.js"),d=require("./modules/core/constants.js"),e=require("./modules/core/utils.js"),n=require("./modules/feed/context/KnockFeedProvider.js"),l=require("./modules/feed/hooks/useNotifications.js"),k=require("./modules/feed/hooks/useFeedSettings.js"),o=require("./modules/feed/hooks/useNotificationStore.js"),t=require("./modules/guide/context/KnockGuideProvider.js"),K=require("./modules/guide/hooks/useGuide.js"),r=require("./modules/ms-teams/context/KnockMsTeamsProvider.js"),C=require("./modules/ms-teams/hooks/useMsTeamsConnectionStatus.js"),S=require("./modules/ms-teams/hooks/useMsTeamsAuth.js"),m=require("./modules/ms-teams/hooks/useMsTeamsTeams.js"),q=require("./modules/ms-teams/hooks/useMsTeamsChannels.js"),v=require("./modules/ms-teams/hooks/useConnectedMsTeamsChannels.js"),i=require("./modules/slack/context/KnockSlackProvider.js"),P=require("./modules/slack/hooks/useSlackConnectionStatus.js"),T=require("./modules/slack/hooks/useSlackChannels.js"),M=require("./modules/slack/hooks/useConnectedSlackChannels.js"),f=require("./modules/slack/hooks/useSlackAuth.js"),u=require("./modules/i18n/context/KnockI18nProvider.js"),h=require("./modules/i18n/hooks/useTranslations.js"),F=require("./modules/i18n/languages/index.js");exports.KnockProvider=s.KnockProvider;exports.useKnockClient=s.useKnockClient;exports.useAuthenticatedKnockClient=c;exports.useStableOptions=a;exports.FilterStatus=d.FilterStatus;exports.feedProviderKey=e.feedProviderKey;exports.formatBadgeCount=e.formatBadgeCount;exports.formatTimestamp=e.formatTimestamp;exports.msTeamsProviderKey=e.msTeamsProviderKey;exports.renderNodeOrFallback=e.renderNodeOrFallback;exports.slackProviderKey=e.slackProviderKey;exports.toSentenceCase=e.toSentenceCase;exports.KnockFeedProvider=n.KnockFeedProvider;exports.useKnockFeed=n.useKnockFeed;exports.useNotifications=l;exports.useFeedSettings=k;exports.useCreateNotificationStore=o.useCreateNotificationStore;exports.useNotificationStore=o.default;exports.KnockGuideContext=t.KnockGuideContext;exports.KnockGuideProvider=t.KnockGuideProvider;exports.useGuide=K.useGuide;exports.KnockMsTeamsProvider=r.KnockMsTeamsProvider;exports.useKnockMsTeamsClient=r.useKnockMsTeamsClient;exports.useMsTeamsConnectionStatus=C;exports.useMsTeamsAuth=S;exports.useMsTeamsTeams=m;exports.useMsTeamsChannels=q;exports.useConnectedMsTeamsChannels=v;exports.KnockSlackProvider=i.KnockSlackProvider;exports.useKnockSlackClient=i.useKnockSlackClient;exports.useSlackConnectionStatus=P;exports.useSlackChannels=T;exports.useConnectedSlackChannels=M;exports.useSlackAuth=f;exports.I18nContext=u.I18nContext;exports.KnockI18nProvider=u.KnockI18nProvider;exports.useTranslations=h.useTranslations;exports.locales=F.locales;
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var n=(e=>(e.All="all",e.Read="read",e.Unseen="unseen",e.Unread="unread",e))(n||{});exports.FilterStatus=n;
2
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":["../../../../src/modules/core/constants.ts"],"sourcesContent":["export enum FilterStatus {\n All = \"all\",\n Read = \"read\",\n Unseen = \"unseen\",\n Unread = \"unread\",\n}\n\nexport type ColorMode = \"light\" | \"dark\";\n"],"names":["FilterStatus","All","Read","Unseen","Unread"],"mappings":"gFAAYA,IAAAA,GAAAA,IACVC,EAAAA,IAAM,MACNC,EAAAA,KAAO,OACPC,EAAAA,OAAS,SACTC,EAAAA,OAAS,SAJCJ,IAAAA,GAAAA,CAAAA,CAAAA"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("react"),K=require("../../i18n/context/KnockI18nProvider.js"),P=require("../hooks/useAuthenticatedKnockClient.js");require("fast-deep-equal");function m(e){if(e&&typeof e=="object"&&"default"in e)return e;const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const o=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(n,t,o.get?o:{enumerable:!0,get:()=>e[t]})}}return n.default=e,Object.freeze(n)}const r=m(b),a=r.createContext(null),v=({apiKey:e,host:n,logLevel:t,userToken:o,onUserTokenExpiring:u,timeBeforeExpirationInMs:i,children:s,i18n:l,...c})=>{const d=(c==null?void 0:c.user)||(c==null?void 0:c.userId),k=r.useMemo(()=>({host:n,onUserTokenExpiring:u,timeBeforeExpirationInMs:i,logLevel:t}),[n,u,i,t]),f=P(e??"",d,o,k);return r.createElement(a.Provider,{value:{knock:f}},r.createElement(K.KnockI18nProvider,{i18n:l},s))},C=()=>{const e=r.useContext(a);if(!e)throw new Error("useKnockClient must be used within a KnockProvider");return e.knock};exports.KnockProvider=v;exports.useKnockClient=C;
2
+ //# sourceMappingURL=KnockProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnockProvider.js","sources":["../../../../../src/modules/core/context/KnockProvider.tsx"],"sourcesContent":["import Knock, {\n AuthenticateOptions,\n LogLevel,\n UserWithProperties,\n} from \"@knocklabs/client\";\nimport * as React from \"react\";\nimport { PropsWithChildren } from \"react\";\n\nimport { I18nContent, KnockI18nProvider } from \"../../i18n\";\nimport { useAuthenticatedKnockClient } from \"../hooks\";\n\nexport interface KnockProviderState {\n knock: Knock;\n}\n\nconst KnockContext = React.createContext<KnockProviderState | null>(null);\n\nexport type KnockProviderProps = {\n // Knock client props\n apiKey: string | undefined;\n host?: string;\n userToken?: Knock[\"userToken\"];\n onUserTokenExpiring?: AuthenticateOptions[\"onUserTokenExpiring\"];\n timeBeforeExpirationInMs?: AuthenticateOptions[\"timeBeforeExpirationInMs\"];\n // i18n translations\n i18n?: I18nContent;\n logLevel?: LogLevel;\n} & (\n | {\n /**\n * @deprecated The `userId` prop is deprecated and will be removed in a future version.\n * Please pass the `user` prop instead containing an `id` value.\n * example:\n * ```ts\n * <KnockProvider user={{ id: \"user_123\" }}></KnockProvider>\n * ```\n */\n userId: Knock[\"userId\"];\n user?: never;\n }\n | {\n user: UserWithProperties;\n /**\n * @deprecated The `userId` prop is deprecated and will be removed in a future version.\n * Please pass the `user` prop instead containing an `id` value.\n * example:\n * ```ts\n * <KnockProvider user={{ id: \"user_123\" }}></KnockProvider>\n * ```\n */\n userId?: never;\n }\n);\n\nexport const KnockProvider: React.FC<PropsWithChildren<KnockProviderProps>> = ({\n apiKey,\n host,\n logLevel,\n userToken,\n onUserTokenExpiring,\n timeBeforeExpirationInMs,\n children,\n i18n,\n ...props\n}) => {\n const userIdOrUserWithProperties = props?.user || props?.userId;\n\n // We memoize the options here so that we don't create a new object on every re-render\n const authenticateOptions = React.useMemo(\n () => ({\n host,\n onUserTokenExpiring,\n timeBeforeExpirationInMs,\n logLevel,\n }),\n [host, onUserTokenExpiring, timeBeforeExpirationInMs, logLevel],\n );\n\n const knock = useAuthenticatedKnockClient(\n apiKey ?? \"\",\n userIdOrUserWithProperties,\n userToken,\n authenticateOptions,\n );\n\n return (\n <KnockContext.Provider value={{ knock }}>\n <KnockI18nProvider i18n={i18n}>{children}</KnockI18nProvider>\n </KnockContext.Provider>\n );\n};\n\nexport const useKnockClient = (): Knock => {\n const context = React.useContext(KnockContext);\n if (!context) {\n throw new Error(\"useKnockClient must be used within a KnockProvider\");\n }\n return context.knock;\n};\n"],"names":["KnockContext","React","createContext","KnockProvider","apiKey","host","logLevel","userToken","onUserTokenExpiring","timeBeforeExpirationInMs","children","i18n","props","userIdOrUserWithProperties","user","userId","authenticateOptions","useMemo","knock","useAuthenticatedKnockClient","KnockI18nProvider","useKnockClient","context","useContext","Error"],"mappings":"yjBAeMA,EAAeC,EAAMC,cAAyC,IAAI,EAuC3DC,EAAiEA,CAAC,CAC7EC,OAAAA,EACAC,KAAAA,EACAC,SAAAA,EACAC,UAAAA,EACAC,oBAAAA,EACAC,yBAAAA,EACAC,SAAAA,EACAC,KAAAA,EACA,GAAGC,CACL,IAAM,CACEC,MAAAA,GAA6BD,GAAAA,YAAAA,EAAOE,QAAQF,GAAAA,YAAAA,EAAOG,QAGnDC,EAAsBf,EAAMgB,QAChC,KAAO,CACLZ,KAAAA,EACAG,oBAAAA,EACAC,yBAAAA,EACAH,SAAAA,IAEF,CAACD,EAAMG,EAAqBC,EAA0BH,CAAQ,CAChE,EAEMY,EAAQC,EACZf,GAAU,GACVS,EACAN,EACAS,CACF,EAEA,OACGf,EAAA,cAAAD,EAAa,SAAb,CAAsB,MAAO,CAAEkB,MAAAA,CAAAA,CAC9B,EAAAjB,EAAA,cAACmB,EAAAA,kBAAkB,CAAA,KAAAT,CAAA,EAAaD,CAAS,CAC3C,CAEJ,EAEaW,EAAiBA,IAAa,CACnCC,MAAAA,EAAUrB,EAAMsB,WAAWvB,CAAY,EAC7C,GAAI,CAACsB,EACG,MAAA,IAAIE,MAAM,oDAAoD,EAEtE,OAAOF,EAAQJ,KACjB"}
@@ -0,0 +1,2 @@
1
+ "use strict";const q=require("@knocklabs/client"),x=require("react");require("../context/KnockProvider.js");const _=require("./useStableOptions.js");require("date-fns");const i=n=>n&&typeof n=="object"&&"default"in n?n:{default:n},d=i(q),o=i(x);function k(n,t,a,c={}){n.authenticate(t,a,{onUserTokenExpiring:c==null?void 0:c.onUserTokenExpiring,timeBeforeExpirationInMs:c==null?void 0:c.timeBeforeExpirationInMs})}function m(n,t,a,c={}){const l=o.default.useRef(),u=_(c);return o.default.useMemo(()=>{const g=typeof t=="string"?t:t==null?void 0:t.id,e=l.current;if(e&&e.isAuthenticated()&&(e.userId!==g||e.userToken!==a))return k(e,t,a,u),e;e&&e.teardown();const f=new d.default(n,{host:u.host,logLevel:u.logLevel});return k(f,t,a,u),l.current=f,f},[n,t,a,u])}module.exports=m;
2
+ //# sourceMappingURL=useAuthenticatedKnockClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthenticatedKnockClient.js","sources":["../../../../../src/modules/core/hooks/useAuthenticatedKnockClient.ts"],"sourcesContent":["import Knock, {\n AuthenticateOptions,\n KnockOptions,\n UserId,\n UserIdOrUserWithProperties,\n} from \"@knocklabs/client\";\nimport React from \"react\";\n\nimport { useStableOptions } from \"../../core\";\n\nfunction authenticateWithOptions(\n knock: Knock,\n userIdOrUserWithProperties: UserIdOrUserWithProperties,\n userToken?: Knock[\"userToken\"],\n options: AuthenticateOptions = {},\n) {\n knock.authenticate(userIdOrUserWithProperties, userToken, {\n onUserTokenExpiring: options?.onUserTokenExpiring,\n timeBeforeExpirationInMs: options?.timeBeforeExpirationInMs,\n });\n}\n\nexport type AuthenticatedKnockClientOptions = KnockOptions &\n AuthenticateOptions;\n\n/**\n * @deprecated Passing `userId` as a `string` is deprecated and will be removed in a future version.\n * Please pass a `user` object instead containing an `id` value.\n * example:\n * ```ts\n * useAuthenticatedKnockClient(\"pk_test_12345\", { id: \"user_123\" });\n * ```\n */\nfunction useAuthenticatedKnockClient(\n apiKey: string,\n userIdOrUserWithProperties: UserId,\n userToken?: Knock[\"userToken\"],\n options?: AuthenticatedKnockClientOptions,\n): Knock;\nfunction useAuthenticatedKnockClient(\n apiKey: string,\n userIdOrUserWithProperties: UserIdOrUserWithProperties,\n userToken?: Knock[\"userToken\"],\n options?: AuthenticatedKnockClientOptions,\n): Knock;\nfunction useAuthenticatedKnockClient(\n apiKey: string,\n userIdOrUserWithProperties: UserIdOrUserWithProperties,\n userToken?: Knock[\"userToken\"],\n options: AuthenticatedKnockClientOptions = {},\n) {\n const knockRef = React.useRef<Knock | undefined>();\n const stableOptions = useStableOptions(options);\n\n return React.useMemo(() => {\n const userId =\n typeof userIdOrUserWithProperties === \"string\"\n ? userIdOrUserWithProperties\n : userIdOrUserWithProperties?.id;\n\n const currentKnock = knockRef.current;\n\n // If the userId and the userToken changes then just reauth\n if (\n currentKnock &&\n currentKnock.isAuthenticated() &&\n (currentKnock.userId !== userId || currentKnock.userToken !== userToken)\n ) {\n authenticateWithOptions(\n currentKnock,\n userIdOrUserWithProperties,\n userToken,\n stableOptions,\n );\n return currentKnock;\n }\n\n if (currentKnock) {\n currentKnock.teardown();\n }\n\n // Otherwise instantiate a new Knock client\n const knock = new Knock(apiKey, {\n host: stableOptions.host,\n logLevel: stableOptions.logLevel,\n });\n\n authenticateWithOptions(\n knock,\n userIdOrUserWithProperties,\n userToken,\n stableOptions,\n );\n knockRef.current = knock;\n\n return knock;\n }, [apiKey, userIdOrUserWithProperties, userToken, stableOptions]);\n}\n\nexport default useAuthenticatedKnockClient;\n"],"names":["authenticateWithOptions","knock","userIdOrUserWithProperties","userToken","options","authenticate","onUserTokenExpiring","timeBeforeExpirationInMs","useAuthenticatedKnockClient","apiKey","knockRef","React","useRef","stableOptions","useStableOptions","useMemo","userId","id","currentKnock","current","isAuthenticated","teardown","Knock","host","logLevel"],"mappings":"qPAUA,SAASA,EACPC,EACAC,EACAC,EACAC,EAA+B,CAAA,EAC/B,CACMC,EAAAA,aAAaH,EAA4BC,EAAW,CACxDG,oBAAqBF,GAAAA,YAAAA,EAASE,oBAC9BC,yBAA0BH,GAAAA,YAAAA,EAASG,wBAAAA,CACpC,CACH,CAyBA,SAASC,EACPC,EACAP,EACAC,EACAC,EAA2C,CAAA,EAC3C,CACMM,MAAAA,EAAWC,UAAMC,OAA0B,EAC3CC,EAAgBC,EAAiBV,CAAO,EAEvCO,OAAAA,EAAAA,QAAMI,QAAQ,IAAM,CACzB,MAAMC,EACJ,OAAOd,GAA+B,SAClCA,EACAA,GAAAA,YAAAA,EAA4Be,GAE5BC,EAAeR,EAASS,QAI5BD,GAAAA,GACAA,EAAaE,gBAAgB,IAC5BF,EAAaF,SAAWA,GAAUE,EAAaf,YAAcA,GAG5De,OAAAA,EAAAA,EACAhB,EACAC,EACAU,CACF,EACOK,EAGLA,GACFA,EAAaG,SAAS,EAIlBpB,MAAAA,EAAQ,IAAIqB,EAAAA,QAAMb,EAAQ,CAC9Bc,KAAMV,EAAcU,KACpBC,SAAUX,EAAcW,QAAAA,CACzB,EAGCvB,OAAAA,EAAAA,EACAC,EACAC,EACAU,CACF,EACAH,EAASS,QAAUlB,EAEZA,GACN,CAACQ,EAAQP,EAA4BC,EAAWU,CAAa,CAAC,CACnE"}
@@ -0,0 +1,2 @@
1
+ "use strict";const n=require("fast-deep-equal"),r=require("react"),s=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},c=s(n);function a(t){const u=r.useRef();return r.useMemo(()=>{const e=u.current;return e&&c.default(t,e)?e:(u.current=t,t)},[t])}module.exports=a;
2
+ //# sourceMappingURL=useStableOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStableOptions.js","sources":["../../../../../src/modules/core/hooks/useStableOptions.ts"],"sourcesContent":["import fastDeepEqual from \"fast-deep-equal\";\nimport { useMemo, useRef } from \"react\";\n\nexport default function useStableOptions<T>(options: T): T {\n const optionsRef = useRef<T>();\n\n return useMemo(() => {\n const currentOptions = optionsRef.current;\n\n if (currentOptions && fastDeepEqual(options, currentOptions)) {\n return currentOptions;\n }\n\n optionsRef.current = options;\n return options;\n }, [options]);\n}\n"],"names":["useStableOptions","options","optionsRef","useRef","useMemo","currentOptions","current","fastDeepEqual"],"mappings":"kIAGA,SAAwBA,EAAoBC,EAAe,CACzD,MAAMC,EAAaC,EAAAA,OAAU,EAE7B,OAAOC,UAAQ,IAAM,CACnB,MAAMC,EAAiBH,EAAWI,QAElC,OAAID,GAAkBE,EAAAA,QAAcN,EAASI,CAAc,EAClDA,GAGTH,EAAWI,QAAUL,EACdA,EAAAA,EACN,CAACA,CAAO,CAAC,CACd"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("date-fns");function i(e){return e>9?"9+":e}function c(e,t={}){try{const r=o.parseISO(e);return o.intlFormatDistance(r,new Date,{locale:t.locale})}catch{return e}}function d(e){return e.charAt(0).toUpperCase()+e.slice(1)}function l(e,t){return e!==void 0?e:t}function u(e,t,r={}){return[e,t,r.source,r.tenant,r.has_tenant,r.archived].filter(n=>n!=null).join("-")}function s({knockSlackChannelId:e,tenantId:t,connectionStatus:r,errorLabel:n}){return[e,t,r,n].filter(a=>a!=null).join("-")}function f({knockMsTeamsChannelId:e,tenantId:t,connectionStatus:r,errorLabel:n}){return[e,t,r,n].filter(a=>a!=null).join("-")}exports.feedProviderKey=u;exports.formatBadgeCount=i;exports.formatTimestamp=c;exports.msTeamsProviderKey=f;exports.renderNodeOrFallback=l;exports.slackProviderKey=s;exports.toSentenceCase=d;
2
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../../../../src/modules/core/utils.ts"],"sourcesContent":["import Knock, { FeedClientOptions } from \"@knocklabs/client\";\nimport { intlFormatDistance, parseISO } from \"date-fns\";\nimport { ReactNode } from \"react\";\n\nexport function formatBadgeCount(count: number): string | number {\n return count > 9 ? \"9+\" : count;\n}\n\ntype FormatTimestampOptions = {\n locale?: string | string[];\n};\n\nexport function formatTimestamp(\n ts: string,\n options: FormatTimestampOptions = {},\n) {\n try {\n const parsedTs = parseISO(ts);\n const formatted = intlFormatDistance(parsedTs, new Date(), {\n locale: options.locale,\n });\n\n return formatted;\n } catch (_e) {\n return ts;\n }\n}\n\nexport function toSentenceCase(string: string): string {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nexport function renderNodeOrFallback(node: ReactNode, fallback: ReactNode) {\n return node !== undefined ? node : fallback;\n}\n\n/*\n Used to build a consistent key for the KnockFeedProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function feedProviderKey(\n userId: Knock[\"userId\"],\n feedId: string,\n options: FeedClientOptions = {},\n) {\n return [\n userId,\n feedId,\n options.source,\n options.tenant,\n options.has_tenant,\n options.archived,\n ]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n\n/*\n Used to build a consistent key for the KnockSlackProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function slackProviderKey({\n knockSlackChannelId,\n tenantId,\n connectionStatus,\n errorLabel,\n}: {\n knockSlackChannelId: string;\n tenantId: string;\n connectionStatus: string;\n errorLabel: string | null;\n}) {\n return [knockSlackChannelId, tenantId, connectionStatus, errorLabel]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n\n/*\n Used to build a consistent key for the KnockMsTeamsProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function msTeamsProviderKey({\n knockMsTeamsChannelId,\n tenantId,\n connectionStatus,\n errorLabel,\n}: {\n knockMsTeamsChannelId: string;\n tenantId: string;\n connectionStatus: string;\n errorLabel: string | null;\n}) {\n return [knockMsTeamsChannelId, tenantId, connectionStatus, errorLabel]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n"],"names":["formatBadgeCount","count","formatTimestamp","ts","options","parsedTs","parseISO","formatted","intlFormatDistance","Date","locale","toSentenceCase","string","charAt","toUpperCase","slice","renderNodeOrFallback","node","fallback","undefined","feedProviderKey","userId","feedId","source","tenant","has_tenant","archived","filter","f","join","slackProviderKey","knockSlackChannelId","tenantId","connectionStatus","errorLabel","msTeamsProviderKey","knockMsTeamsChannelId"],"mappings":"4GAIO,SAASA,EAAiBC,EAAgC,CACxDA,OAAAA,EAAQ,EAAI,KAAOA,CAC5B,CAMO,SAASC,EACdC,EACAC,EAAkC,GAClC,CACI,GAAA,CACIC,MAAAA,EAAWC,WAASH,CAAE,EAKrBI,OAJWC,EAAAA,mBAAmBH,EAAU,IAAII,KAAQ,CACzDC,OAAQN,EAAQM,MAAAA,CACjB,OAGU,CACJP,OAAAA,CAAAA,CAEX,CAEO,SAASQ,EAAeC,EAAwB,CAC9CA,OAAAA,EAAOC,OAAO,CAAC,EAAEC,cAAgBF,EAAOG,MAAM,CAAC,CACxD,CAEgBC,SAAAA,EAAqBC,EAAiBC,EAAqB,CAClED,OAAAA,IAASE,OAAYF,EAAOC,CACrC,CAMO,SAASE,EACdC,EACAC,EACAlB,EAA6B,CAAA,EAC7B,CACO,MAAA,CACLiB,EACAC,EACAlB,EAAQmB,OACRnB,EAAQoB,OACRpB,EAAQqB,WACRrB,EAAQsB,QAAQ,EAEfC,UAAcC,GAAM,IAAuB,EAC3CC,KAAK,GAAG,CACb,CAMO,SAASC,EAAiB,CAC/BC,oBAAAA,EACAC,SAAAA,EACAC,iBAAAA,EACAC,WAAAA,CAMF,EAAG,CACD,MAAO,CAACH,EAAqBC,EAAUC,EAAkBC,CAAU,EAChEP,OAAcC,GAAAA,GAAM,IAAuB,EAC3CC,KAAK,GAAG,CACb,CAMO,SAASM,EAAmB,CACjCC,sBAAAA,EACAJ,SAAAA,EACAC,iBAAAA,EACAC,WAAAA,CAMF,EAAG,CACD,MAAO,CAACE,EAAuBJ,EAAUC,EAAkBC,CAAU,EAClEP,OAAcC,GAAAA,GAAM,IAAuB,EAC3CC,KAAK,GAAG,CACb"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("react"),a=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("fast-deep-equal");const l=require("../../core/utils.js"),f=require("../hooks/useNotifications.js"),k=require("../hooks/useNotificationStore.js");function v(e){if(e&&typeof e=="object"&&"default"in e)return e;const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const o=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,o.get?o:{enumerable:!0,get:()=>e[t]})}}return r.default=e,Object.freeze(r)}const c=v(d),u=c.createContext(void 0),K=({feedId:e,children:r,defaultFeedOptions:t={},colorMode:o="light"})=>{let n;try{n=a.useKnockClient()}catch{throw new Error("KnockFeedProvider must be used within a KnockProvider.")}const i=f(n,e??"",t),s=k.useCreateNotificationStore(i);return c.createElement(u.Provider,{key:l.feedProviderKey(n.userId,e??"",t),value:{knock:n,feedClient:i,useFeedStore:s,colorMode:o}},r)},b=()=>{const e=c.useContext(u);if(!e)throw new Error("useKnockFeed must be used within a KnockFeedProvider");return e};exports.KnockFeedProvider=K;exports.useKnockFeed=b;
2
+ //# sourceMappingURL=KnockFeedProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnockFeedProvider.js","sources":["../../../../../src/modules/feed/context/KnockFeedProvider.tsx"],"sourcesContent":["import Knock, { Feed, FeedClientOptions } from \"@knocklabs/client\";\nimport * as React from \"react\";\nimport { PropsWithChildren } from \"react\";\n\nimport { useKnockClient } from \"../../core\";\nimport { ColorMode } from \"../../core/constants\";\nimport { feedProviderKey } from \"../../core/utils\";\nimport { useCreateNotificationStore } from \"../hooks\";\nimport useNotifications from \"../hooks/useNotifications\";\n\nexport interface KnockFeedProviderState {\n knock: Knock;\n feedClient: Feed;\n useFeedStore: ReturnType<typeof useCreateNotificationStore>;\n colorMode: ColorMode;\n}\n\nconst KnockFeedContext = React.createContext<\n KnockFeedProviderState | undefined\n>(undefined);\n\nexport interface KnockFeedProviderProps {\n // Feed props\n feedId: string | undefined;\n\n // Extra options\n colorMode?: ColorMode;\n\n // Feed client options\n defaultFeedOptions?: FeedClientOptions;\n}\n\nexport const KnockFeedProvider: React.FC<\n PropsWithChildren<KnockFeedProviderProps>\n> = ({ feedId, children, defaultFeedOptions = {}, colorMode = \"light\" }) => {\n let knock: Knock;\n try {\n knock = useKnockClient();\n } catch (_) {\n throw new Error(\"KnockFeedProvider must be used within a KnockProvider.\");\n }\n\n const feedClient = useNotifications(knock, feedId ?? \"\", defaultFeedOptions);\n const useFeedStore = useCreateNotificationStore(feedClient);\n\n return (\n <KnockFeedContext.Provider\n key={feedProviderKey(knock.userId, feedId ?? \"\", defaultFeedOptions)}\n value={{\n knock,\n feedClient,\n useFeedStore,\n colorMode,\n }}\n >\n {children}\n </KnockFeedContext.Provider>\n );\n};\n\nexport const useKnockFeed = (): KnockFeedProviderState => {\n const context = React.useContext(KnockFeedContext);\n if (!context) {\n throw new Error(\"useKnockFeed must be used within a KnockFeedProvider\");\n }\n\n return context;\n};\n"],"names":["KnockFeedContext","React","createContext","undefined","KnockFeedProvider","feedId","children","defaultFeedOptions","colorMode","knock","useKnockClient","Error","feedClient","useNotifications","useFeedStore","useCreateNotificationStore","feedProviderKey","userId","useKnockFeed","context","useContext"],"mappings":"4pBAiBMA,EAAmBC,EAAMC,cAE7BC,MAAS,EAaEC,EAETA,CAAC,CAAEC,OAAAA,EAAQC,SAAAA,EAAUC,mBAAAA,EAAqB,CAAC,EAAGC,UAAAA,EAAY,OAAQ,IAAM,CACtEC,IAAAA,EACA,GAAA,CACFA,EAAQC,EAAAA,eAAe,OACb,CACJ,MAAA,IAAIC,MAAM,wDAAwD,CAAA,CAG1E,MAAMC,EAAaC,EAAiBJ,EAAOJ,GAAU,GAAIE,CAAkB,EACrEO,EAAeC,6BAA2BH,CAAU,EAE1D,OACGX,EAAA,cAAAD,EAAiB,SAAjB,CACC,IAAKgB,EAAAA,gBAAgBP,EAAMQ,OAAQZ,GAAU,GAAIE,CAAkB,EACnE,MAAO,CACLE,MAAAA,EACAG,WAAAA,EACAE,aAAAA,EACAN,UAAAA,IAGDF,CACH,CAEJ,EAEaY,EAAeA,IAA8B,CAClDC,MAAAA,EAAUlB,EAAMmB,WAAWpB,CAAgB,EACjD,GAAI,CAACmB,EACG,MAAA,IAAIR,MAAM,sDAAsD,EAGjEQ,OAAAA,CACT"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e=require("react");function g(t){const[i,c]=e.useState(null),[u,s]=e.useState(!1);return e.useEffect(()=>{async function a(){const n=t.knock,r=n.client(),d=`/v1/users/${n.userId}/feeds/${t.feedId}/settings`;s(!0);const o=await r.makeRequest({method:"GET",url:d});o.error||c(o.body),s(!1)}a()},[]),{settings:i,loading:u}}module.exports=g;
2
+ //# sourceMappingURL=useFeedSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFeedSettings.js","sources":["../../../../../src/modules/feed/hooks/useFeedSettings.ts"],"sourcesContent":["import { Feed } from \"@knocklabs/client\";\nimport { useEffect, useState } from \"react\";\n\nexport type FeedSettings = {\n features: {\n branding_required: boolean;\n };\n};\n\nfunction useFeedSettings(feedClient: Feed): {\n settings: FeedSettings | null;\n loading: boolean;\n} {\n const [settings, setSettings] = useState(null);\n const [isLoading, setIsLoading] = useState(false);\n\n // TODO: consider moving this into the feed client and into the feed store state when\n // we're using this in other areas of the feed\n useEffect(() => {\n async function getSettings() {\n const knock = feedClient.knock;\n const apiClient = knock.client();\n const feedSettingsPath = `/v1/users/${knock.userId}/feeds/${feedClient.feedId}/settings`;\n setIsLoading(true);\n\n const response = await apiClient.makeRequest({\n method: \"GET\",\n url: feedSettingsPath,\n });\n\n if (!response.error) {\n setSettings(response.body);\n }\n\n setIsLoading(false);\n }\n\n getSettings();\n // TODO: Check if we can remove this disable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return { settings, loading: isLoading };\n}\n\nexport default useFeedSettings;\n"],"names":["useFeedSettings","feedClient","settings","setSettings","useState","isLoading","setIsLoading","useEffect","getSettings","knock","apiClient","client","feedSettingsPath","userId","feedId","response","makeRequest","method","url","error","body","loading"],"mappings":"sCASA,SAASA,EAAgBC,EAGvB,CACA,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,IAAI,EACvC,CAACC,EAAWC,CAAY,EAAIF,EAAAA,SAAS,EAAK,EAIhDG,OAAAA,EAAAA,UAAU,IAAM,CACd,eAAeC,GAAc,CAC3B,MAAMC,EAAQR,EAAWQ,MACnBC,EAAYD,EAAME,OAAO,EACzBC,EAAmB,aAAaH,EAAMI,MAAM,UAAUZ,EAAWa,MAAM,YAC7ER,EAAa,EAAI,EAEXS,MAAAA,EAAW,MAAML,EAAUM,YAAY,CAC3CC,OAAQ,MACRC,IAAKN,CAAAA,CACN,EAEIG,EAASI,OACZhB,EAAYY,EAASK,IAAI,EAG3Bd,EAAa,EAAK,CAAA,CAGRE,EAAA,CAGd,EAAG,EAAE,EAEE,CAAEN,SAAAA,EAAUmB,QAAShB,CAAU,CACxC"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("@tanstack/react-store");function r(e){return t=>i.useStore(e.store.store,t??(o=>o))}function n(e,t){return r(e)(t??(u=>u))}exports.default=n;exports.useCreateNotificationStore=r;
2
+ //# sourceMappingURL=useNotificationStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNotificationStore.js","sources":["../../../../../src/modules/feed/hooks/useNotificationStore.ts"],"sourcesContent":["import { Feed, type FeedStoreState } from \"@knocklabs/client\";\nimport { useStore } from \"@tanstack/react-store\";\n\nexport type Selector<T> = (state: FeedStoreState) => T;\n\n/**\n * Create a hook factory that provides access to the TanStack Store with optional selector support.\n * This pattern allows for flexible store access with or without selectors while maintaining\n * type safety. The selector can be passed either to useCreateNotificationStore or\n * useNotificationStore, with the latter taking precedence.\n */\nfunction useCreateNotificationStore(feedClient: Feed) {\n return <T = FeedStoreState>(selector?: Selector<T>) => {\n // Keep selector optional for external use\n // useStore requires a selector so we'll pass in a default one when not provided\n // eslint-disable-next-line\n return useStore(\n feedClient.store.store,\n selector ?? ((state) => state as T),\n );\n };\n}\n\n/**\n * A hook used to access content within the notification store.\n *\n * @example\n *\n * ```ts\n * const { items, metadata } = useNotificationStore(feedClient);\n * ```\n *\n * A selector can be used to access a subset of the store state.\n *\n * @example\n *\n * ```ts\n * const { items, metadata } = useNotificationStore(feedClient, (state) => ({\n * items: state.items,\n * metadata: state.metadata,\n * }));\n * ```\n */\nfunction useNotificationStore(feedClient: Feed): FeedStoreState;\nfunction useNotificationStore<T>(feedClient: Feed, selector: Selector<T>): T;\nfunction useNotificationStore<T>(\n feedClient: Feed,\n selector?: Selector<T>,\n): T | FeedStoreState {\n const useStoreLocal = useCreateNotificationStore(feedClient);\n return useStoreLocal(selector ?? ((state) => state as T));\n}\n\nexport { useCreateNotificationStore };\nexport default useNotificationStore;\n"],"names":["useCreateNotificationStore","feedClient","selector","useStore","store","state","useNotificationStore","useStoreLocal"],"mappings":"qJAWA,SAASA,EAA2BC,EAAkB,CACpD,OAA4BC,GAInBC,WACLF,EAAWG,MAAMA,MACjBF,OAAwBG,EAC1B,CAEJ,CAwBA,SAASC,EACPL,EACAC,EACoB,CAEbK,OADeP,EAA2BC,CAAU,EACtCC,IAAcG,GAAUA,EAAW,CAC1D"}
@@ -0,0 +1,2 @@
1
+ "use strict";const i=require("react");require("../../core/context/KnockProvider.js");require("@knocklabs/client");const a=require("../../core/hooks/useStableOptions.js");require("date-fns");function p(u,s,l={}){const n=i.useCallback((o,c)=>{const f=u.feeds.initialize(o,c);return f.listenForUpdates(),f},[u]),e=a(l),[t,d]=i.useState(()=>({feedClient:n(s,e),options:e})),r=i.useRef(!1);return i.useEffect(()=>{const o=r.current;if(t.feedClient.feedId!==s||t.options!==e||o){r.current=!1,d({feedClient:n(s,e),options:e});return}return()=>{r.current=!0,t.feedClient.dispose()}},[n,s,e,t]),t.feedClient}module.exports=p;
2
+ //# sourceMappingURL=useNotifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNotifications.js","sources":["../../../../../src/modules/feed/hooks/useNotifications.ts"],"sourcesContent":["import Knock, { Feed, FeedClientOptions } from \"@knocklabs/client\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useStableOptions } from \"../../core\";\n\ninterface State {\n feedClient: Feed;\n options: FeedClientOptions;\n}\n\nfunction useNotifications(\n knock: Knock,\n feedChannelId: string,\n options: FeedClientOptions = {},\n): Feed {\n const initFeedClient = useCallback(\n (feedChannelId: string, options: FeedClientOptions) => {\n const feedClient = knock.feeds.initialize(feedChannelId, options);\n\n feedClient.listenForUpdates();\n\n return feedClient;\n },\n [knock],\n );\n\n const stableOptions = useStableOptions(options);\n const [state, setState] = useState<State>(() => ({\n // FIXME In strict mode, useState initializer functions are called twice,\n // which results in one extra instance of the feed client being created\n // and not disposed of. This only affects strict mode.\n feedClient: initFeedClient(feedChannelId, stableOptions),\n options: stableOptions,\n }));\n const disposedRef = useRef(false);\n\n useEffect(() => {\n const isDisposed = disposedRef.current;\n\n // Initialize a new feed client if the feed ID has changed,\n // options have changed, or the current feed client has been disposed\n const needsReinit =\n state.feedClient.feedId !== feedChannelId ||\n state.options !== stableOptions ||\n isDisposed;\n\n if (needsReinit) {\n disposedRef.current = false;\n setState({\n feedClient: initFeedClient(feedChannelId, stableOptions),\n options: stableOptions,\n });\n return;\n }\n\n return () => {\n disposedRef.current = true;\n state.feedClient.dispose();\n };\n }, [initFeedClient, feedChannelId, stableOptions, state]);\n\n return state.feedClient;\n}\n\nexport default useNotifications;\n"],"names":["useNotifications","knock","feedChannelId","options","initFeedClient","useCallback","feedClient","feeds","initialize","listenForUpdates","stableOptions","useStableOptions","state","setState","useState","disposedRef","useRef","useEffect","isDisposed","current","feedId","dispose"],"mappings":"8LAUA,SAASA,EACPC,EACAC,EACAC,EAA6B,CAAA,EACvB,CACN,MAAMC,EAAiBC,EAAAA,YACrB,CAACH,EAAuBC,IAA+B,CACrD,MAAMG,EAAaL,EAAMM,MAAMC,WAAWN,EAAeC,CAAO,EAEhEG,OAAAA,EAAWG,iBAAiB,EAErBH,CAAAA,EAET,CAACL,CAAK,CACR,EAEMS,EAAgBC,EAAiBR,CAAO,EACxC,CAACS,EAAOC,CAAQ,EAAIC,WAAgB,KAAO,CAI/CR,WAAYF,EAAeF,EAAeQ,CAAa,EACvDP,QAASO,CAAAA,EACT,EACIK,EAAcC,SAAO,EAAK,EAEhCC,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAaH,EAAYI,QAS/B,GAJEP,EAAMN,WAAWc,SAAWlB,GAC5BU,EAAMT,UAAYO,GAClBQ,EAEe,CACfH,EAAYI,QAAU,GACbN,EAAA,CACPP,WAAYF,EAAeF,EAAeQ,CAAa,EACvDP,QAASO,CAAAA,CACV,EACD,MAAA,CAGF,MAAO,IAAM,CACXK,EAAYI,QAAU,GACtBP,EAAMN,WAAWe,QAAQ,CAC3B,GACC,CAACjB,EAAgBF,EAAeQ,EAAeE,CAAK,CAAC,EAEjDA,EAAMN,UACf"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("@knocklabs/client"),b=require("react"),k=require("../../core/context/KnockProvider.js"),p=require("../../core/hooks/useStableOptions.js");require("date-fns");function v(e){if(e&&typeof e=="object"&&"default"in e)return e;const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const o=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,o.get?o:{enumerable:!0,get:()=>e[t]})}}return r.default=e,Object.freeze(r)}const c=v(b),a=c.createContext(void 0),K=({channelId:e,readyToTarget:r,listenForUpdates:t=!0,colorMode:o="light",targetParams:l={},trackLocationFromWindow:u=!0,children:d})=>{let i;try{i=k.useKnockClient()}catch{throw new Error("KnockGuideProvider must be used within a KnockProvider")}const s=p(l),n=c.useMemo(()=>new f.KnockGuideClient(i,e,s,{trackLocationFromWindow:u}),[i,e,s,u]);return c.useEffect(()=>(r&&(n.fetch(),t&&n.subscribe()),()=>n.cleanup()),[r,t,n]),c.createElement(a.Provider,{value:{client:n,colorMode:o}},d)};exports.KnockGuideContext=a;exports.KnockGuideProvider=K;
2
+ //# sourceMappingURL=KnockGuideProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnockGuideProvider.js","sources":["../../../../../src/modules/guide/context/KnockGuideProvider.tsx"],"sourcesContent":["import Knock, {\n KnockGuideClient,\n KnockGuideTargetParams,\n} from \"@knocklabs/client\";\nimport * as React from \"react\";\n\nimport { useKnockClient, useStableOptions } from \"../../core\";\nimport { ColorMode } from \"../../core/constants\";\n\ntype KnockGuideProviderValue = {\n client: KnockGuideClient;\n colorMode: ColorMode;\n};\n\nexport const KnockGuideContext = React.createContext<\n KnockGuideProviderValue | undefined\n>(undefined);\n\ntype Props = {\n channelId: string;\n readyToTarget: boolean;\n listenForUpdates?: boolean;\n colorMode?: ColorMode;\n targetParams?: KnockGuideTargetParams;\n trackLocationFromWindow?: boolean;\n};\n\nexport const KnockGuideProvider: React.FC<React.PropsWithChildren<Props>> = ({\n channelId,\n readyToTarget,\n listenForUpdates = true,\n colorMode = \"light\",\n targetParams = {},\n trackLocationFromWindow = true,\n children,\n}) => {\n let knock: Knock;\n\n try {\n knock = useKnockClient();\n } catch (_) {\n throw new Error(\"KnockGuideProvider must be used within a KnockProvider\");\n }\n\n const stableTargetParams = useStableOptions(targetParams);\n\n const knockGuideClient = React.useMemo(() => {\n return new KnockGuideClient(knock, channelId, stableTargetParams, {\n trackLocationFromWindow,\n });\n }, [knock, channelId, stableTargetParams, trackLocationFromWindow]);\n\n React.useEffect(() => {\n if (readyToTarget) {\n knockGuideClient.fetch();\n if (listenForUpdates) knockGuideClient.subscribe();\n }\n\n return () => knockGuideClient.cleanup();\n }, [readyToTarget, listenForUpdates, knockGuideClient]);\n\n return (\n <KnockGuideContext.Provider\n value={{\n client: knockGuideClient,\n colorMode,\n }}\n >\n {children}\n </KnockGuideContext.Provider>\n );\n};\n"],"names":["KnockGuideContext","React","createContext","undefined","KnockGuideProvider","channelId","readyToTarget","listenForUpdates","colorMode","targetParams","trackLocationFromWindow","children","knock","useKnockClient","Error","stableTargetParams","useStableOptions","knockGuideClient","useMemo","KnockGuideClient","useEffect","fetch","subscribe","cleanup","client"],"mappings":"0kBAcaA,EAAoBC,EAAMC,cAErCC,MAAS,EAWEC,EAA+DA,CAAC,CAC3EC,UAAAA,EACAC,cAAAA,EACAC,iBAAAA,EAAmB,GACnBC,UAAAA,EAAY,QACZC,aAAAA,EAAe,CAAC,EAChBC,wBAAAA,EAA0B,GAC1BC,SAAAA,CACF,IAAM,CACAC,IAAAA,EAEA,GAAA,CACFA,EAAQC,EAAAA,eAAe,OACb,CACJ,MAAA,IAAIC,MAAM,wDAAwD,CAAA,CAGpEC,MAAAA,EAAqBC,EAAiBP,CAAY,EAElDQ,EAAmBhB,EAAMiB,QAAQ,IAC9B,IAAIC,EAAAA,iBAAiBP,EAAOP,EAAWU,EAAoB,CAChEL,wBAAAA,CAAAA,CACD,EACA,CAACE,EAAOP,EAAWU,EAAoBL,CAAuB,CAAC,EAElET,OAAAA,EAAMmB,UAAU,KACVd,IACFW,EAAiBI,MAAM,EACnBd,KAAmCe,UAAU,GAG5C,IAAML,EAAiBM,QAAQ,GACrC,CAACjB,EAAeC,EAAkBU,CAAgB,CAAC,EAGnDhB,EAAA,cAAAD,EAAkB,SAAlB,CACC,MAAO,CACLwB,OAAQP,EACRT,UAAAA,IAGDG,CACH,CAEJ"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("@tanstack/react-store"),c=require("./useGuideContext.js"),d=e=>{const u=c.useGuideContext();if(!e.key&&!e.type)throw new Error("useGuide must be used with at least one filter: either a guide key or a guide type");const{client:t,colorMode:r}=u,[o]=n.useStore(t.store,s=>t.select(s,e)),i=o&&o.steps.find(s=>!s.message.archived_at);return{client:t,colorMode:r,guide:o,step:i}};exports.useGuide=d;
2
+ //# sourceMappingURL=useGuide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGuide.js","sources":["../../../../../src/modules/guide/hooks/useGuide.ts"],"sourcesContent":["import {\n KnockGuide,\n KnockGuideFilterParams,\n KnockGuideStep,\n} from \"@knocklabs/client\";\nimport { useStore } from \"@tanstack/react-store\";\n\nimport { UseGuideContextReturn, useGuideContext } from \"./useGuideContext\";\n\ninterface UseGuideReturn extends UseGuideContextReturn {\n guide: KnockGuide | undefined;\n step: KnockGuideStep | undefined;\n}\n\nexport const useGuide = (filters: KnockGuideFilterParams): UseGuideReturn => {\n const context = useGuideContext();\n\n if (!filters.key && !filters.type) {\n throw new Error(\n \"useGuide must be used with at least one filter: either a guide key or a guide type\",\n );\n }\n\n const { client, colorMode } = context;\n\n const [guide] = useStore(client.store, (state) =>\n client.select(state, filters),\n );\n\n const step = guide && guide.steps.find((s) => !s.message.archived_at);\n\n return { client, colorMode, guide, step };\n};\n"],"names":["useGuide","filters","context","useGuideContext","key","type","Error","client","colorMode","guide","useStore","store","state","select","step","steps","find","s","message","archived_at"],"mappings":"2JAcaA,EAAYC,GAAoD,CAC3E,MAAMC,EAAUC,EAAAA,gBAAgB,EAEhC,GAAI,CAACF,EAAQG,KAAO,CAACH,EAAQI,KACrB,MAAA,IAAIC,MACR,oFACF,EAGI,KAAA,CAAEC,OAAAA,EAAQC,UAAAA,CAAAA,EAAcN,EAExB,CAACO,CAAK,EAAIC,EAASH,SAAAA,EAAOI,MAAQC,GACtCL,EAAOM,OAAOD,EAAOX,CAAO,CAC9B,EAEMa,EAAOL,GAASA,EAAMM,MAAMC,KAAY,GAAA,CAACC,EAAEC,QAAQC,WAAW,EAE7D,MAAA,CAAEZ,OAAAA,EAAQC,UAAAA,EAAWC,MAAAA,EAAOK,KAAAA,CAAK,CAC1C"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react"),u=require("../context/KnockGuideProvider.js");function c(e){if(e&&typeof e=="object"&&"default"in e)return e;const o=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(o,t,n.get?n:{enumerable:!0,get:()=>e[t]})}}return o.default=e,Object.freeze(o)}const i=c(r),s=()=>{const e=i.useContext(u.KnockGuideContext);if(!e)throw new Error("useGuide must be used within a KnockGuideProvider");return e};exports.useGuideContext=s;
2
+ //# sourceMappingURL=useGuideContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGuideContext.js","sources":["../../../../../src/modules/guide/hooks/useGuideContext.ts"],"sourcesContent":["import { KnockGuideClient } from \"@knocklabs/client\";\nimport * as React from \"react\";\n\nimport { KnockGuideContext } from \"../context\";\n\nexport interface UseGuideContextReturn {\n client: KnockGuideClient;\n colorMode: \"light\" | \"dark\";\n}\n\nexport const useGuideContext = (): UseGuideContextReturn => {\n const context = React.useContext(KnockGuideContext);\n if (!context) {\n throw new Error(\"useGuide must be used within a KnockGuideProvider\");\n }\n\n return context;\n};\n"],"names":["useGuideContext","context","React","useContext","KnockGuideContext","Error"],"mappings":"keAUaA,EAAkBA,IAA6B,CACpDC,MAAAA,EAAUC,EAAMC,WAAWC,mBAAiB,EAClD,GAAI,CAACH,EACG,MAAA,IAAII,MAAM,mDAAmD,EAG9DJ,OAAAA,CACT"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react"),t=require("../languages/index.js"),a=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},n=a(c),o=n.default.createContext(t.locales.en),l=({i18n:e=t.locales.en,...r})=>n.default.createElement(o.Provider,{...r,value:e});exports.I18nContext=o;exports.KnockI18nProvider=l;
2
+ //# sourceMappingURL=KnockI18nProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnockI18nProvider.js","sources":["../../../../../src/modules/i18n/context/KnockI18nProvider.tsx"],"sourcesContent":["import React from \"react\";\nimport { FunctionComponent, PropsWithChildren } from \"react\";\n\nimport { I18nContent, locales } from \"../languages\";\n\nexport const I18nContext = React.createContext<I18nContent>(locales.en);\n\nexport interface KnockI18nProviderProps {\n i18n?: I18nContent;\n}\n\nexport const KnockI18nProvider: FunctionComponent<\n PropsWithChildren<KnockI18nProviderProps>\n> = ({ i18n = locales.en, ...props }) => {\n return <I18nContext.Provider {...props} value={i18n} />;\n};\n"],"names":["I18nContext","React","createContext","locales","en","KnockI18nProvider","i18n","props"],"mappings":"2MAKaA,EAAcC,EAAAA,QAAMC,cAA2BC,EAAAA,QAAQC,EAAE,EAMzDC,EAETA,CAAC,CAAEC,KAAAA,EAAOH,EAAQC,QAAAA,GAAI,GAAGG,CAAM,4BACzBP,EAAY,SAAZ,CAAyBO,GAAAA,EAAO,MAAOD,EAAQ"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react"),o=require("../context/KnockI18nProvider.js"),s=require("../languages/index.js");function a(){const{translations:n,locale:t}=r.useContext(o.I18nContext);return{locale:t,t:e=>n[e]||s.locales.en.translations[e]}}exports.useTranslations=a;
2
+ //# sourceMappingURL=useTranslations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTranslations.js","sources":["../../../../../src/modules/i18n/hooks/useTranslations.ts"],"sourcesContent":["import { useContext } from \"react\";\n\nimport { I18nContext } from \"../context/KnockI18nProvider\";\nimport { I18nContent, locales } from \"../languages\";\n\nexport function useTranslations() {\n const { translations, locale } = useContext<I18nContent>(I18nContext);\n\n return {\n locale,\n t: (key: keyof typeof translations) => {\n // We always use english as the default translation when a key doesn't exist\n return translations[key] || locales.en.translations[key];\n },\n };\n}\n"],"names":["useTranslations","translations","locale","useContext","I18nContext","t","key","locales","en"],"mappings":"yLAKO,SAASA,GAAkB,CAC1B,KAAA,CAAEC,aAAAA,EAAcC,OAAAA,CAAAA,EAAWC,EAAAA,WAAwBC,EAAAA,WAAW,EAE7D,MAAA,CACLF,OAAAA,EACAG,EAAIC,GAEKL,EAAaK,CAAG,GAAKC,EAAQC,QAAAA,GAAGP,aAAaK,CAAG,CAE3D,CACF"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e={translations:{archiveNotification:"Benachrichtigung archivieren",archiveRead:"Gelesenes Archivieren",markAllAsRead:"Alle als gelesen markieren",notifications:"Benachrichtigungen",emptyFeedTitle:"Noch keine Benachrichtigungen",emptyFeedBody:"Wir werden dich benachrichtigen, sobald wir etwas Neues für dich haben.",all:"Alle",unread:"Ungelesen",read:"Gelesen",unseen:"Ungesehen",slackConnectChannel:"Kanal verbinden",slackChannelId:"Slack Kanal ID",slackConnecting:"Verbinden mit Slack...",slackDisconnecting:"Trennen der Verbindung...",slackConnect:"Mit Slack verbinden",slackConnected:"Verbunden",slackConnectContainerDescription:"Verbinden, um Benachrichtigungen in Ihrem Slack-Arbeitsbereich zu erhalten.",slackSearchbarDisconnected:"Slack ist nicht verbunden.",slackSearchbarNoChannelsConnected:"Suchkanäle",slackSearchbarNoChannelsFound:"Keine schlaffen Kanäle.",slackSearchbarChannelsError:"Fehler beim Abrufen von Kanälen.",slackSearchChannels:"Suchkanäle",slackConnectionErrorExists:"Versuchen Sie, sich erneut mit Slack zu verbinden, um Kanäle in Ihrem Arbeitsbereich zu finden und auszuwählen.",slackConnectionErrorOccurred:"Es ist ein Fehler beim Verbinden mit Slack aufgetreten. Versuchen Sie, sich erneut zu verbinden, um Kanäle in Ihrem Arbeitsbereich zu finden und auszuwählen.",slackChannelAlreadyConnected:"Fehler: bereits verbunden",slackError:"Fehler",slackDisconnect:"Trennen Sie die Verbindung.",slackChannelSetError:"Fehlereinstellung Kanal.",slackAccessTokenNotSet:"Zugriffstoken nicht gesetzt.",slackReconnect:"Neu verbinden"},locale:"de"};module.exports=e;
2
+ //# sourceMappingURL=de.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"de.js","sources":["../../../../../src/modules/i18n/languages/de.ts"],"sourcesContent":["import { I18nContent } from \".\";\n\nconst de: I18nContent = {\n translations: {\n archiveNotification: \"Benachrichtigung archivieren\",\n archiveRead: \"Gelesenes Archivieren\",\n markAllAsRead: \"Alle als gelesen markieren\",\n notifications: \"Benachrichtigungen\",\n emptyFeedTitle: \"Noch keine Benachrichtigungen\",\n emptyFeedBody:\n \"Wir werden dich benachrichtigen, sobald wir etwas Neues für dich haben.\",\n all: \"Alle\",\n unread: \"Ungelesen\",\n read: \"Gelesen\",\n unseen: \"Ungesehen\",\n slackConnectChannel: \"Kanal verbinden\",\n slackChannelId: \"Slack Kanal ID\",\n slackConnecting: \"Verbinden mit Slack...\",\n slackDisconnecting: \"Trennen der Verbindung...\",\n slackConnect: \"Mit Slack verbinden\",\n slackConnected: \"Verbunden\",\n slackConnectContainerDescription:\n \"Verbinden, um Benachrichtigungen in Ihrem Slack-Arbeitsbereich zu erhalten.\",\n slackSearchbarDisconnected: \"Slack ist nicht verbunden.\",\n slackSearchbarNoChannelsConnected: \"Suchkanäle\",\n slackSearchbarNoChannelsFound: \"Keine schlaffen Kanäle.\",\n slackSearchbarChannelsError: \"Fehler beim Abrufen von Kanälen.\",\n slackSearchChannels: \"Suchkanäle\",\n slackConnectionErrorExists:\n \"Versuchen Sie, sich erneut mit Slack zu verbinden, um Kanäle in Ihrem Arbeitsbereich zu finden und auszuwählen.\",\n slackConnectionErrorOccurred:\n \"Es ist ein Fehler beim Verbinden mit Slack aufgetreten. Versuchen Sie, sich erneut zu verbinden, um Kanäle in Ihrem Arbeitsbereich zu finden und auszuwählen.\",\n slackChannelAlreadyConnected: \"Fehler: bereits verbunden\",\n slackError: \"Fehler\",\n slackDisconnect: \"Trennen Sie die Verbindung.\",\n slackChannelSetError: \"Fehlereinstellung Kanal.\",\n slackAccessTokenNotSet: \"Zugriffstoken nicht gesetzt.\",\n slackReconnect: \"Neu verbinden\",\n },\n locale: \"de\",\n};\n\nexport default de;\n"],"names":["de","translations","archiveNotification","archiveRead","markAllAsRead","notifications","emptyFeedTitle","emptyFeedBody","all","unread","read","unseen","slackConnectChannel","slackChannelId","slackConnecting","slackDisconnecting","slackConnect","slackConnected","slackConnectContainerDescription","slackSearchbarDisconnected","slackSearchbarNoChannelsConnected","slackSearchbarNoChannelsFound","slackSearchbarChannelsError","slackSearchChannels","slackConnectionErrorExists","slackConnectionErrorOccurred","slackChannelAlreadyConnected","slackError","slackDisconnect","slackChannelSetError","slackAccessTokenNotSet","slackReconnect","locale"],"mappings":"aAEA,MAAMA,EAAkB,CACtBC,aAAc,CACZC,oBAAqB,+BACrBC,YAAa,wBACbC,cAAe,6BACfC,cAAe,qBACfC,eAAgB,gCAChBC,cACE,0EACFC,IAAK,OACLC,OAAQ,YACRC,KAAM,UACNC,OAAQ,YACRC,oBAAqB,kBACrBC,eAAgB,iBAChBC,gBAAiB,yBACjBC,mBAAoB,4BACpBC,aAAc,sBACdC,eAAgB,YAChBC,iCACE,8EACFC,2BAA4B,6BAC5BC,kCAAmC,aACnCC,8BAA+B,0BAC/BC,4BAA6B,mCAC7BC,oBAAqB,aACrBC,2BACE,kHACFC,6BACE,gKACFC,6BAA8B,4BAC9BC,WAAY,SACZC,gBAAiB,8BACjBC,qBAAsB,2BACtBC,uBAAwB,+BACxBC,eAAgB,eAClB,EACAC,OAAQ,IACV"}
@@ -0,0 +1,2 @@
1
+ "use strict";const n={translations:{archiveNotification:"Archive this notification",archiveRead:"Archive Read",markAllAsRead:"Mark all as read",notifications:"Notifications",emptyFeedTitle:"No notifications yet",emptyFeedBody:"We'll let you know when we've got something new for you.",all:"All",unread:"Unread",read:"Read",unseen:"Unseen",msTeamsChannelSetError:"Error setting channel.",msTeamsConnect:"Connect to Microsoft Teams",msTeamsConnected:"Connected",msTeamsConnecting:"Connecting to Microsoft Teams…",msTeamsConnectionErrorExists:"Try reconnecting to Microsoft Teams to find and select channels from your teams.",msTeamsConnectionErrorOccurred:"There was an error connecting to Microsoft Teams. Try reconnecting to find and select channels from your teams.",msTeamsConnectContainerDescription:"Connect to get notifications in Microsoft Teams",msTeamsDisconnect:"Disconnect",msTeamsDisconnecting:"Disconnecting from Microsoft Teams…",msTeamsError:"Error",msTeamsReconnect:"Reconnect",msTeamsTenantIdNotSet:"Microsoft Teams tenant ID not set.",slackConnectChannel:"Connect channel",slackChannelId:"Slack channel ID",slackConnecting:"Connecting to Slack...",slackDisconnecting:"Disconnecting...",slackConnect:"Connect to Slack",slackConnected:"Connected",slackConnectContainerDescription:"Connect to get notifications in your Slack workspace.",slackSearchbarDisconnected:"Slack is not connected.",slackSearchbarNoChannelsConnected:"Search channels",slackSearchbarNoChannelsFound:"No slack channels.",slackSearchbarChannelsError:"Error fetching channels.",slackSearchChannels:"Search channels",slackConnectionErrorExists:"Try reconnecting to Slack to find and select channels from your workspace.",slackConnectionErrorOccurred:"There was an error connecting to Slack. Try reconnecting to find and select channels from your workspace.",slackChannelAlreadyConnected:"Error: already connected",slackError:"Error",slackDisconnect:"Disconnect",slackChannelSetError:"Error setting channel.",slackAccessTokenNotSet:"Access token not set.",slackReconnect:"Reconnect"},locale:"en"};module.exports=n;
2
+ //# sourceMappingURL=en.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.js","sources":["../../../../../src/modules/i18n/languages/en.ts"],"sourcesContent":["import { I18nContent } from \".\";\n\nconst en: I18nContent = {\n translations: {\n archiveNotification: \"Archive this notification\",\n archiveRead: \"Archive Read\",\n markAllAsRead: \"Mark all as read\",\n notifications: \"Notifications\",\n emptyFeedTitle: \"No notifications yet\",\n emptyFeedBody: \"We'll let you know when we've got something new for you.\",\n all: \"All\",\n unread: \"Unread\",\n read: \"Read\",\n unseen: \"Unseen\",\n msTeamsChannelSetError: \"Error setting channel.\",\n msTeamsConnect: \"Connect to Microsoft Teams\",\n msTeamsConnected: \"Connected\",\n msTeamsConnecting: \"Connecting to Microsoft Teams…\",\n msTeamsConnectionErrorExists:\n \"Try reconnecting to Microsoft Teams to find and select channels from your teams.\",\n msTeamsConnectionErrorOccurred:\n \"There was an error connecting to Microsoft Teams. Try reconnecting to find and select channels from your teams.\",\n msTeamsConnectContainerDescription:\n \"Connect to get notifications in Microsoft Teams\",\n msTeamsDisconnect: \"Disconnect\",\n msTeamsDisconnecting: \"Disconnecting from Microsoft Teams…\",\n msTeamsError: \"Error\",\n msTeamsReconnect: \"Reconnect\",\n msTeamsTenantIdNotSet: \"Microsoft Teams tenant ID not set.\",\n slackConnectChannel: \"Connect channel\",\n slackChannelId: \"Slack channel ID\",\n slackConnecting: \"Connecting to Slack...\",\n slackDisconnecting: \"Disconnecting...\",\n slackConnect: \"Connect to Slack\",\n slackConnected: \"Connected\",\n slackConnectContainerDescription:\n \"Connect to get notifications in your Slack workspace.\",\n slackSearchbarDisconnected: \"Slack is not connected.\",\n slackSearchbarNoChannelsConnected: \"Search channels\",\n slackSearchbarNoChannelsFound: \"No slack channels.\",\n slackSearchbarChannelsError: \"Error fetching channels.\",\n slackSearchChannels: \"Search channels\",\n slackConnectionErrorExists:\n \"Try reconnecting to Slack to find and select channels from your workspace.\",\n slackConnectionErrorOccurred:\n \"There was an error connecting to Slack. Try reconnecting to find and select channels from your workspace.\",\n slackChannelAlreadyConnected: \"Error: already connected\",\n slackError: \"Error\",\n slackDisconnect: \"Disconnect\",\n slackChannelSetError: \"Error setting channel.\",\n slackAccessTokenNotSet: \"Access token not set.\",\n slackReconnect: \"Reconnect\",\n },\n locale: \"en\",\n};\n\nexport default en;\n"],"names":["en","translations","archiveNotification","archiveRead","markAllAsRead","notifications","emptyFeedTitle","emptyFeedBody","all","unread","read","unseen","msTeamsChannelSetError","msTeamsConnect","msTeamsConnected","msTeamsConnecting","msTeamsConnectionErrorExists","msTeamsConnectionErrorOccurred","msTeamsConnectContainerDescription","msTeamsDisconnect","msTeamsDisconnecting","msTeamsError","msTeamsReconnect","msTeamsTenantIdNotSet","slackConnectChannel","slackChannelId","slackConnecting","slackDisconnecting","slackConnect","slackConnected","slackConnectContainerDescription","slackSearchbarDisconnected","slackSearchbarNoChannelsConnected","slackSearchbarNoChannelsFound","slackSearchbarChannelsError","slackSearchChannels","slackConnectionErrorExists","slackConnectionErrorOccurred","slackChannelAlreadyConnected","slackError","slackDisconnect","slackChannelSetError","slackAccessTokenNotSet","slackReconnect","locale"],"mappings":"aAEA,MAAMA,EAAkB,CACtBC,aAAc,CACZC,oBAAqB,4BACrBC,YAAa,eACbC,cAAe,mBACfC,cAAe,gBACfC,eAAgB,uBAChBC,cAAe,2DACfC,IAAK,MACLC,OAAQ,SACRC,KAAM,OACNC,OAAQ,SACRC,uBAAwB,yBACxBC,eAAgB,6BAChBC,iBAAkB,YAClBC,kBAAmB,iCACnBC,6BACE,mFACFC,+BACE,kHACFC,mCACE,kDACFC,kBAAmB,aACnBC,qBAAsB,sCACtBC,aAAc,QACdC,iBAAkB,YAClBC,sBAAuB,qCACvBC,oBAAqB,kBACrBC,eAAgB,mBAChBC,gBAAiB,yBACjBC,mBAAoB,mBACpBC,aAAc,mBACdC,eAAgB,YAChBC,iCACE,wDACFC,2BAA4B,0BAC5BC,kCAAmC,kBACnCC,8BAA+B,qBAC/BC,4BAA6B,2BAC7BC,oBAAqB,kBACrBC,2BACE,6EACFC,6BACE,4GACFC,6BAA8B,2BAC9BC,WAAY,QACZC,gBAAiB,aACjBC,qBAAsB,yBACtBC,uBAAwB,wBACxBC,eAAgB,WAClB,EACAC,OAAQ,IACV"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./de.js"),o=require("./en.js"),t={en:o,de:e};exports.locales=t;
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/modules/i18n/languages/index.ts"],"sourcesContent":["import de from \"./de\";\nimport en from \"./en\";\n\nexport interface Translations {\n readonly archiveRead: string;\n readonly emptyFeedTitle: string;\n readonly emptyFeedBody: string;\n readonly notifications: string;\n readonly poweredBy: string;\n readonly markAllAsRead: string;\n readonly archiveNotification: string;\n readonly all: string;\n readonly unread: string;\n readonly read: string;\n readonly unseen: string;\n readonly msTeamsChannelSetError: string;\n readonly msTeamsConnect: string;\n readonly msTeamsConnected: string;\n readonly msTeamsConnecting: string;\n readonly msTeamsConnectionErrorExists: string;\n readonly msTeamsConnectionErrorOccurred: string;\n readonly msTeamsConnectContainerDescription: string;\n readonly msTeamsDisconnect: string;\n readonly msTeamsDisconnecting: string;\n readonly msTeamsError: string;\n readonly msTeamsReconnect: string;\n readonly msTeamsTenantIdNotSet: string;\n readonly slackConnectChannel: string;\n readonly slackChannelId: string;\n readonly slackConnecting: string;\n readonly slackDisconnecting: string;\n readonly slackConnect: string;\n readonly slackConnected: string;\n readonly slackConnectContainerDescription: string;\n readonly slackSearchbarDisconnected: string;\n readonly slackSearchbarNoChannelsConnected: string;\n readonly slackSearchbarNoChannelsFound: string;\n readonly slackSearchbarChannelsError: string;\n readonly slackSearchChannels: string;\n readonly slackConnectionErrorOccurred: string;\n readonly slackConnectionErrorExists: string;\n readonly slackChannelAlreadyConnected: string;\n readonly slackError: string;\n readonly slackDisconnect: string;\n readonly slackChannelSetError: string;\n readonly slackAccessTokenNotSet: string;\n readonly slackReconnect: string;\n}\n\nexport interface I18nContent {\n readonly translations: Partial<Translations>;\n readonly locale: string;\n}\n\nexport const locales = { en, de };\n"],"names":["locales","en","de"],"mappings":"gIAsDaA,EAAU,CAAEC,GAAAA,EAAIC,GAAAA,CAAG"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("react"),f=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("fast-deep-equal");const d=require("../../core/utils.js"),v=require("../hooks/useMsTeamsConnectionStatus.js");require("swr/infinite");require("swr");require("../../i18n/context/KnockI18nProvider.js");function P(e){if(e&&typeof e=="object"&&"default"in e)return e;const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,o.get?o:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const n=P(b),i=n.createContext(null),p=({knockMsTeamsChannelId:e,tenantId:t,children:r})=>{const o=f.useKnockClient(),{connectionStatus:s,setConnectionStatus:u,errorLabel:c,setErrorLabel:a,actionLabel:l,setActionLabel:m}=v(o,e,t);return n.createElement(i.Provider,{key:d.msTeamsProviderKey({knockMsTeamsChannelId:e,tenantId:t,connectionStatus:s,errorLabel:c}),value:{connectionStatus:s,setConnectionStatus:u,errorLabel:c,setErrorLabel:a,actionLabel:l,setActionLabel:m,knockMsTeamsChannelId:e,tenantId:t}},r)},q=()=>{const e=n.useContext(i);if(!e)throw new Error("useKnockMsTeamsClient must be used within a KnockMsTeamsProvider");return e};exports.KnockMsTeamsProvider=p;exports.useKnockMsTeamsClient=q;
2
+ //# sourceMappingURL=KnockMsTeamsProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnockMsTeamsProvider.js","sources":["../../../../../src/modules/ms-teams/context/KnockMsTeamsProvider.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { PropsWithChildren } from \"react\";\n\nimport { useKnockClient } from \"../../core\";\nimport { msTeamsProviderKey } from \"../../core/utils\";\nimport { useMsTeamsConnectionStatus } from \"../hooks\";\nimport { ConnectionStatus } from \"../hooks/useMsTeamsConnectionStatus\";\n\nexport interface KnockMsTeamsProviderState {\n knockMsTeamsChannelId: string;\n tenantId: string;\n connectionStatus: ConnectionStatus;\n setConnectionStatus: (connectionStatus: ConnectionStatus) => void;\n errorLabel: string | null;\n setErrorLabel: (label: string) => void;\n actionLabel: string | null;\n setActionLabel: (label: string | null) => void;\n}\n\nconst MsTeamsProviderStateContext =\n React.createContext<KnockMsTeamsProviderState | null>(null);\n\nexport interface KnockMsTeamsProviderProps {\n knockMsTeamsChannelId: string;\n tenantId: string;\n}\n\nexport const KnockMsTeamsProvider: React.FC<\n PropsWithChildren<KnockMsTeamsProviderProps>\n> = ({ knockMsTeamsChannelId, tenantId, children }) => {\n const knock = useKnockClient();\n\n const {\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n } = useMsTeamsConnectionStatus(knock, knockMsTeamsChannelId, tenantId);\n\n return (\n <MsTeamsProviderStateContext.Provider\n key={msTeamsProviderKey({\n knockMsTeamsChannelId,\n tenantId,\n connectionStatus,\n errorLabel,\n })}\n value={{\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n knockMsTeamsChannelId,\n tenantId,\n }}\n >\n {children}\n </MsTeamsProviderStateContext.Provider>\n );\n};\n\nexport const useKnockMsTeamsClient = (): KnockMsTeamsProviderState => {\n const context = React.useContext(MsTeamsProviderStateContext);\n if (!context) {\n throw new Error(\n \"useKnockMsTeamsClient must be used within a KnockMsTeamsProvider\",\n );\n }\n return context;\n};\n"],"names":["MsTeamsProviderStateContext","React","createContext","KnockMsTeamsProvider","knockMsTeamsChannelId","tenantId","children","knock","useKnockClient","connectionStatus","setConnectionStatus","errorLabel","setErrorLabel","actionLabel","setActionLabel","useMsTeamsConnectionStatus","msTeamsProviderKey","useKnockMsTeamsClient","context","useContext","Error"],"mappings":"ktBAmBMA,EACJC,EAAMC,cAAgD,IAAI,EAO/CC,EAETA,CAAC,CAAEC,sBAAAA,EAAuBC,SAAAA,EAAUC,SAAAA,CAAS,IAAM,CACrD,MAAMC,EAAQC,EAAAA,eAAe,EAEvB,CACJC,iBAAAA,EACAC,oBAAAA,EACAC,WAAAA,EACAC,cAAAA,EACAC,YAAAA,EACAC,eAAAA,CACEC,EAAAA,EAA2BR,EAAOH,EAAuBC,CAAQ,EAErE,OACGJ,EAAA,cAAAD,EAA4B,SAA5B,CACC,IAAKgB,qBAAmB,CACtBZ,sBAAAA,EACAC,SAAAA,EACAI,iBAAAA,EACAE,WAAAA,CACD,CAAA,EACD,MAAO,CACLF,iBAAAA,EACAC,oBAAAA,EACAC,WAAAA,EACAC,cAAAA,EACAC,YAAAA,EACAC,eAAAA,EACAV,sBAAAA,EACAC,SAAAA,IAGDC,CACH,CAEJ,EAEaW,EAAwBA,IAAiC,CAC9DC,MAAAA,EAAUjB,EAAMkB,WAAWnB,CAA2B,EAC5D,GAAI,CAACkB,EACG,MAAA,IAAIE,MACR,kEACF,EAEKF,OAAAA,CACT"}
@@ -0,0 +1,2 @@
1
+ "use strict";const S=require("../context/KnockMsTeamsProvider.js"),i=require("react");require("../../i18n/context/KnockI18nProvider.js");const E=require("../../i18n/hooks/useTranslations.js");require("@knocklabs/client");const T=require("../../core/context/KnockProvider.js");require("fast-deep-equal");require("date-fns");require("swr/infinite");const _=require("swr"),g=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},k=g(_),M="MS_TEAMS_CONNECTED_CHANNELS";function D({msTeamsChannelsRecipientObject:{objectId:e,collection:a}}){const{t:l}=E.useTranslations(),r=T.useKnockClient(),{connectionStatus:d,knockMsTeamsChannelId:s}=S.useKnockMsTeamsClient(),[C,c]=i.useState(null),[h,o]=i.useState(!1),{data:p,mutate:m,isValidating:f,isLoading:q}=k.default(d==="connected"?[M,s,a,e]:null,async()=>r.objects.getChannelData({collection:a,objectId:e,channelId:s}).then(t=>{var n;return((n=t.data)==null?void 0:n.connections)??[]}).catch(()=>[]),{onSuccess:()=>{c(null)}});return{data:p??null,updateConnectedChannels:async t=>{o(!0);try{await m(()=>r.objects.setChannelData({objectId:e,collection:a,channelId:s,data:{connections:t}}).then(n=>{var u;return((u=n.data)==null?void 0:u.connections)??[]}),{populateCache:!0,revalidate:!1,optimisticData:t})}catch{c(l("msTeamsChannelSetError")||"")}o(!1)},updating:h,loading:q||f,error:C}}module.exports=D;
2
+ //# sourceMappingURL=useConnectedMsTeamsChannels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useConnectedMsTeamsChannels.js","sources":["../../../../../src/modules/ms-teams/hooks/useConnectedMsTeamsChannels.ts"],"sourcesContent":["import { useKnockMsTeamsClient } from \"..\";\nimport { MsTeamsChannelConnection } from \"@knocklabs/client\";\nimport { GenericData } from \"@knocklabs/types\";\nimport { useState } from \"react\";\nimport useSWR from \"swr\";\n\nimport { RecipientObject } from \"../../..\";\nimport { useKnockClient } from \"../../core\";\nimport { useTranslations } from \"../../i18n\";\n\nconst QUERY_KEY = \"MS_TEAMS_CONNECTED_CHANNELS\";\n\ntype UseConnectedMsTeamsChannelsProps = {\n msTeamsChannelsRecipientObject: RecipientObject;\n};\n\ntype UseConnectedMsTeamsChannelsOutput = {\n data: MsTeamsChannelConnection[] | null;\n updateConnectedChannels: (\n connectedChannels: MsTeamsChannelConnection[],\n ) => Promise<void>;\n loading: boolean;\n error: string | null;\n updating: boolean;\n};\n\nfunction useConnectedMsTeamsChannels({\n msTeamsChannelsRecipientObject: { objectId, collection },\n}: UseConnectedMsTeamsChannelsProps): UseConnectedMsTeamsChannelsOutput {\n const { t } = useTranslations();\n const knock = useKnockClient();\n const { connectionStatus, knockMsTeamsChannelId } = useKnockMsTeamsClient();\n\n const [error, setError] = useState<string | null>(null);\n const [isUpdating, setIsUpdating] = useState(false);\n\n const {\n data: connectedChannels,\n mutate,\n isValidating,\n isLoading,\n } = useSWR<MsTeamsChannelConnection[]>(\n // Only fetch when Microsoft Teams is connected\n connectionStatus === \"connected\"\n ? [QUERY_KEY, knockMsTeamsChannelId, collection, objectId]\n : null,\n async () => {\n return knock.objects\n .getChannelData({\n collection,\n objectId,\n channelId: knockMsTeamsChannelId,\n })\n .then((res) => res.data?.connections ?? [])\n .catch(() => []);\n },\n {\n onSuccess: () => {\n setError(null);\n },\n },\n );\n\n const updateConnectedChannels = async (\n channelsToSendToKnock: MsTeamsChannelConnection[],\n ) => {\n setIsUpdating(true);\n try {\n await mutate(\n () =>\n knock.objects\n .setChannelData({\n objectId,\n collection,\n channelId: knockMsTeamsChannelId,\n data: { connections: channelsToSendToKnock },\n })\n .then((res) => (res as GenericData).data?.connections ?? []),\n {\n populateCache: true,\n revalidate: false,\n optimisticData: channelsToSendToKnock,\n },\n );\n } catch (_error) {\n setError(t(\"msTeamsChannelSetError\") || \"\");\n }\n setIsUpdating(false);\n };\n\n return {\n data: connectedChannels ?? null,\n updateConnectedChannels,\n updating: isUpdating,\n loading: isLoading || isValidating,\n error,\n };\n}\n\nexport default useConnectedMsTeamsChannels;\n"],"names":["QUERY_KEY","useConnectedMsTeamsChannels","msTeamsChannelsRecipientObject","objectId","collection","t","useTranslations","knock","useKnockClient","connectionStatus","knockMsTeamsChannelId","useKnockMsTeamsClient","error","setError","useState","isUpdating","setIsUpdating","data","connectedChannels","mutate","isValidating","isLoading","useSWR","objects","getChannelData","channelId","then","res","connections","catch","onSuccess","updateConnectedChannels","channelsToSendToKnock","setChannelData","populateCache","revalidate","optimisticData","updating","loading"],"mappings":"ibAUMA,EAAY,8BAgBlB,SAASC,EAA4B,CACnCC,+BAAgC,CAAEC,SAAAA,EAAUC,WAAAA,CAAAA,CACZ,EAAsC,CAChE,KAAA,CAAEC,EAAAA,GAAMC,kBAAgB,EACxBC,EAAQC,EAAAA,eAAe,EACvB,CAAEC,iBAAAA,EAAkBC,sBAAAA,GAA0BC,wBAAsB,EAEpE,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAwB,IAAI,EAChD,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAS,EAAK,EAE5C,CACJG,KAAMC,EACNC,OAAAA,EACAC,aAAAA,EACAC,UAAAA,CAAAA,EACEC,EAAAA,QAEFb,IAAqB,YACjB,CAACT,EAAWU,EAAuBN,EAAYD,CAAQ,EACvD,KACJ,SACSI,EAAMgB,QACVC,eAAe,CACdpB,WAAAA,EACAD,SAAAA,EACAsB,UAAWf,CACZ,CAAA,EACAgB,KAAMC,GAAAA,OAAQA,QAAAA,EAAAA,EAAIV,OAAJU,YAAAA,EAAUC,cAAe,GAAE,EACzCC,MAAM,IAAM,EAAE,EAEnB,CACEC,UAAWA,IAAM,CACfjB,EAAS,IAAI,CAAA,CACf,CAEJ,EA6BO,MAAA,CACLI,KAAMC,GAAqB,KAC3Ba,wBA7B8B,MAC9BC,GACG,CACHhB,EAAc,EAAI,EACd,GAAA,CACF,MAAMG,EACJ,IACEZ,EAAMgB,QACHU,eAAe,CACd9B,SAAAA,EACAC,WAAAA,EACAqB,UAAWf,EACXO,KAAM,CAAEW,YAAaI,CAAAA,CAAsB,CAC5C,EACAN,KAAMC,GAAAA,OAASA,QAAAA,EAAAA,EAAoBV,OAApBU,YAAAA,EAA0BC,cAAe,CAAA,EAAE,EAC/D,CACEM,cAAe,GACfC,WAAY,GACZC,eAAgBJ,CAAAA,CAEpB,OACe,CACN3B,EAAAA,EAAE,wBAAwB,GAAK,EAAE,CAAA,CAE5CW,EAAc,EAAK,CACrB,EAKEqB,SAAUtB,EACVuB,QAASjB,GAAaD,EACtBR,MAAAA,CACF,CACF"}
@@ -0,0 +1,2 @@
1
+ "use strict";const m=require("../context/KnockMsTeamsProvider.js"),o=require("react");require("../../i18n/context/KnockI18nProvider.js");const T=require("@knocklabs/client"),_=require("../../core/context/KnockProvider.js");require("fast-deep-equal");require("date-fns");require("swr/infinite");require("swr");const d="https://login.microsoftonline.com/organizations/adminconsent",h="/providers/ms-teams/authenticate";function C(c,i){const e=_.useKnockClient(),{setConnectionStatus:n,knockMsTeamsChannelId:t,tenantId:s,setActionLabel:a}=m.useKnockMsTeamsClient(),u=o.useMemo(()=>e.host+h,[e.host]),k=o.useCallback(()=>{const r={state:JSON.stringify({redirect_url:i,ms_teams_tenant_object:{object_id:s,collection:T.TENANT_OBJECT_COLLECTION},channel_id:t,public_key:e.apiKey,user_token:e.userToken}),client_id:c,redirect_uri:u};return`${d}?${new URLSearchParams(r)}`},[i,s,t,e.apiKey,e.userToken,c,u]),l=o.useCallback(async()=>{a(null),n("disconnecting");try{const r=await e.msTeams.revokeAccessToken({tenant:s,knockChannelId:t});n(r==="ok"?"disconnected":"error")}catch{n("error")}},[n,e.msTeams,s,t,a]);return{buildMsTeamsAuthUrl:k,disconnectFromMsTeams:l}}module.exports=C;
2
+ //# sourceMappingURL=useMsTeamsAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMsTeamsAuth.js","sources":["../../../../../src/modules/ms-teams/hooks/useMsTeamsAuth.ts"],"sourcesContent":["import { useKnockMsTeamsClient } from \"..\";\nimport { TENANT_OBJECT_COLLECTION } from \"@knocklabs/client\";\nimport { useCallback, useMemo } from \"react\";\n\nimport { useKnockClient } from \"../../core\";\n\nconst MS_TEAMS_ADMINCONSENT_URL =\n \"https://login.microsoftonline.com/organizations/adminconsent\";\n\nconst AUTH_REDIRECT_PATH = \"/providers/ms-teams/authenticate\";\n\ninterface UseMsTeamsAuthOutput {\n buildMsTeamsAuthUrl: () => string;\n disconnectFromMsTeams: () => void;\n}\n\nfunction useMsTeamsAuth(\n msTeamsBotId: string,\n redirectUrl?: string,\n): UseMsTeamsAuthOutput {\n const knock = useKnockClient();\n const {\n setConnectionStatus,\n knockMsTeamsChannelId,\n tenantId,\n setActionLabel,\n } = useKnockMsTeamsClient();\n\n const authRedirectUri = useMemo(\n () => knock.host + AUTH_REDIRECT_PATH,\n [knock.host],\n );\n\n const buildMsTeamsAuthUrl = useCallback(() => {\n const rawParams = {\n state: JSON.stringify({\n redirect_url: redirectUrl,\n ms_teams_tenant_object: {\n object_id: tenantId,\n collection: TENANT_OBJECT_COLLECTION,\n },\n channel_id: knockMsTeamsChannelId,\n public_key: knock.apiKey,\n user_token: knock.userToken,\n }),\n client_id: msTeamsBotId,\n redirect_uri: authRedirectUri,\n };\n return `${MS_TEAMS_ADMINCONSENT_URL}?${new URLSearchParams(rawParams)}`;\n }, [\n redirectUrl,\n tenantId,\n knockMsTeamsChannelId,\n knock.apiKey,\n knock.userToken,\n msTeamsBotId,\n authRedirectUri,\n ]);\n\n const disconnectFromMsTeams = useCallback(async () => {\n setActionLabel(null);\n setConnectionStatus(\"disconnecting\");\n try {\n const revokeResult = await knock.msTeams.revokeAccessToken({\n tenant: tenantId,\n knockChannelId: knockMsTeamsChannelId,\n });\n\n setConnectionStatus(revokeResult === \"ok\" ? \"disconnected\" : \"error\");\n } catch (_error) {\n setConnectionStatus(\"error\");\n }\n }, [\n setConnectionStatus,\n knock.msTeams,\n tenantId,\n knockMsTeamsChannelId,\n setActionLabel,\n ]);\n\n return { buildMsTeamsAuthUrl, disconnectFromMsTeams };\n}\n\nexport default useMsTeamsAuth;\n"],"names":["MS_TEAMS_ADMINCONSENT_URL","AUTH_REDIRECT_PATH","useMsTeamsAuth","msTeamsBotId","redirectUrl","knock","useKnockClient","setConnectionStatus","knockMsTeamsChannelId","tenantId","setActionLabel","useKnockMsTeamsClient","authRedirectUri","useMemo","host","buildMsTeamsAuthUrl","useCallback","rawParams","state","JSON","stringify","redirect_url","ms_teams_tenant_object","object_id","collection","TENANT_OBJECT_COLLECTION","channel_id","public_key","apiKey","user_token","userToken","client_id","redirect_uri","URLSearchParams","disconnectFromMsTeams","revokeResult","msTeams","revokeAccessToken","tenant","knockChannelId"],"mappings":"qTAMA,MAAMA,EACJ,+DAEIC,EAAqB,mCAO3B,SAASC,EACPC,EACAC,EACsB,CACtB,MAAMC,EAAQC,EAAAA,eAAe,EACvB,CACJC,oBAAAA,EACAC,sBAAAA,EACAC,SAAAA,EACAC,eAAAA,GACEC,wBAAsB,EAEpBC,EAAkBC,UACtB,IAAMR,EAAMS,KAAOb,EACnB,CAACI,EAAMS,IAAI,CACb,EAEMC,EAAsBC,EAAAA,YAAY,IAAM,CAC5C,MAAMC,EAAY,CAChBC,MAAOC,KAAKC,UAAU,CACpBC,aAAcjB,EACdkB,uBAAwB,CACtBC,UAAWd,EACXe,WAAYC,EAAAA,wBACd,EACAC,WAAYlB,EACZmB,WAAYtB,EAAMuB,OAClBC,WAAYxB,EAAMyB,SAAAA,CACnB,EACDC,UAAW5B,EACX6B,aAAcpB,CAChB,EACA,MAAO,GAAGZ,CAAyB,IAAI,IAAIiC,gBAAgBhB,CAAS,CAAC,EACvE,EAAG,CACDb,EACAK,EACAD,EACAH,EAAMuB,OACNvB,EAAMyB,UACN3B,EACAS,CAAe,CAChB,EAEKsB,EAAwBlB,EAAAA,YAAY,SAAY,CACpDN,EAAe,IAAI,EACnBH,EAAoB,eAAe,EAC/B,GAAA,CACF,MAAM4B,EAAe,MAAM9B,EAAM+B,QAAQC,kBAAkB,CACzDC,OAAQ7B,EACR8B,eAAgB/B,CAAAA,CACjB,EAEmB2B,EAAAA,IAAiB,KAAO,eAAiB,OAAO,OACrD,CACf5B,EAAoB,OAAO,CAAA,CAC7B,EACC,CACDA,EACAF,EAAM+B,QACN3B,EACAD,EACAE,CAAc,CACf,EAEM,MAAA,CAAEK,oBAAAA,EAAqBmB,sBAAAA,CAAsB,CACtD"}
@@ -0,0 +1,2 @@
1
+ "use strict";const u=require("swr"),f=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("react");require("fast-deep-equal");require("date-fns");const d=require("../context/KnockMsTeamsProvider.js"),k=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},C=k(u),h="MS_TEAMS_CHANNELS";function m({teamId:e,queryOptions:n}){const t=f.useKnockClient(),{knockMsTeamsChannelId:a,tenantId:c}=d.useKnockMsTeamsClient(),l=()=>t.msTeams.getChannels({knockChannelId:a,tenant:c,teamId:e,queryOptions:{$filter:n==null?void 0:n.filter,$select:n==null?void 0:n.select}}),{data:s,isLoading:o,isValidating:r,mutate:i}=C.default(e?[h,e]:null,l,{revalidateOnFocus:!1});return{data:(s==null?void 0:s.ms_teams_channels)??[],isLoading:o||r,refetch:()=>i()}}module.exports=m;
2
+ //# sourceMappingURL=useMsTeamsChannels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMsTeamsChannels.js","sources":["../../../../../src/modules/ms-teams/hooks/useMsTeamsChannels.ts"],"sourcesContent":["import { GetMsTeamsChannelsResponse, MsTeamsChannel } from \"@knocklabs/client\";\nimport useSWR from \"swr\";\n\nimport { useKnockClient } from \"../../core\";\nimport { useKnockMsTeamsClient } from \"../context\";\nimport { MsTeamsChannelQueryOptions } from \"../interfaces\";\n\nconst QUERY_KEY = \"MS_TEAMS_CHANNELS\";\n\ntype UseMsTeamsChannelsProps = {\n teamId?: string;\n queryOptions?: MsTeamsChannelQueryOptions;\n};\n\ntype UseMsTeamsChannelsOutput = {\n data: MsTeamsChannel[];\n isLoading: boolean;\n refetch: () => void;\n};\n\nfunction useMsTeamsChannels({\n teamId,\n queryOptions,\n}: UseMsTeamsChannelsProps): UseMsTeamsChannelsOutput {\n const knock = useKnockClient();\n const { knockMsTeamsChannelId, tenantId } = useKnockMsTeamsClient();\n\n const fetchChannels = () =>\n knock.msTeams.getChannels({\n knockChannelId: knockMsTeamsChannelId,\n tenant: tenantId,\n teamId: teamId!,\n queryOptions: {\n $filter: queryOptions?.filter,\n $select: queryOptions?.select,\n },\n });\n\n const { data, isLoading, isValidating, mutate } =\n useSWR<GetMsTeamsChannelsResponse>(\n teamId ? [QUERY_KEY, teamId] : null,\n fetchChannels,\n { revalidateOnFocus: false },\n );\n\n return {\n data: data?.ms_teams_channels ?? [],\n isLoading: isLoading || isValidating,\n refetch: () => mutate(),\n };\n}\n\nexport default useMsTeamsChannels;\n"],"names":["QUERY_KEY","useMsTeamsChannels","teamId","queryOptions","knock","useKnockClient","knockMsTeamsChannelId","tenantId","useKnockMsTeamsClient","fetchChannels","msTeams","getChannels","knockChannelId","tenant","$filter","filter","$select","select","data","isLoading","isValidating","mutate","useSWR","revalidateOnFocus","ms_teams_channels","refetch"],"mappings":"uSAOMA,EAAY,oBAalB,SAASC,EAAmB,CAC1BC,OAAAA,EACAC,aAAAA,CACuB,EAA6B,CACpD,MAAMC,EAAQC,EAAAA,eAAe,EACvB,CAAEC,sBAAAA,EAAuBC,SAAAA,GAAaC,wBAAsB,EAE5DC,EAAgBA,IACpBL,EAAMM,QAAQC,YAAY,CACxBC,eAAgBN,EAChBO,OAAQN,EACRL,OAAAA,EACAC,aAAc,CACZW,QAASX,GAAAA,YAAAA,EAAcY,OACvBC,QAASb,GAAAA,YAAAA,EAAcc,MAAAA,CACzB,CACD,EAEG,CAAEC,KAAAA,EAAMC,UAAAA,EAAWC,aAAAA,EAAcC,OAAAA,CAAAA,EACrCC,EAAAA,QACEpB,EAAS,CAACF,EAAWE,CAAM,EAAI,KAC/BO,EACA,CAAEc,kBAAmB,EAAA,CACvB,EAEK,MAAA,CACLL,MAAMA,GAAAA,YAAAA,EAAMM,oBAAqB,CAAE,EACnCL,UAAWA,GAAaC,EACxBK,QAASA,IAAMJ,EAAO,CACxB,CACF"}
@@ -0,0 +1,2 @@
1
+ "use strict";const n=require("react");require("../../i18n/context/KnockI18nProvider.js");const T=require("../../i18n/hooks/useTranslations.js");function E(c,o,r){const{t:a}=T.useTranslations(),[s,e]=n.useState("connecting"),[f,h]=n.useState(null),[d,m]=n.useState(null);return n.useEffect(()=>{(async()=>{var u,i,l,S;if(s==="connecting")try{const t=await c.msTeams.authCheck({tenant:r,knockChannelId:o});if(((u=t.connection)==null?void 0:u.ok)===!0)return e("connected");if(((i=t.connection)==null?void 0:i.ok)===!1||t.code==="ERR_BAD_REQUEST"&&((S=(l=t.response)==null?void 0:l.data)==null?void 0:S.message)===a("msTeamsTenantIdNotSet"))return e("disconnected");e("error")}catch{e("error")}})()},[s,r,o,c.msTeams,a]),{connectionStatus:s,setConnectionStatus:e,errorLabel:f,setErrorLabel:h,actionLabel:d,setActionLabel:m}}module.exports=E;
2
+ //# sourceMappingURL=useMsTeamsConnectionStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMsTeamsConnectionStatus.js","sources":["../../../../../src/modules/ms-teams/hooks/useMsTeamsConnectionStatus.ts"],"sourcesContent":["import Knock from \"@knocklabs/client\";\nimport { useEffect, useState } from \"react\";\n\nimport { useTranslations } from \"../../i18n\";\n\nexport type ConnectionStatus =\n | \"connecting\"\n | \"connected\"\n | \"disconnected\"\n | \"error\"\n | \"disconnecting\";\n\ntype UseMsTeamsConnectionStatusOutput = {\n connectionStatus: ConnectionStatus;\n setConnectionStatus: (status: ConnectionStatus) => void;\n errorLabel: string | null;\n setErrorLabel: (errorLabel: string) => void;\n actionLabel: string | null;\n setActionLabel: (actionLabel: string | null) => void;\n};\n\nfunction useMsTeamsConnectionStatus(\n knock: Knock,\n knockMsTeamsChannelId: string,\n tenantId: string,\n): UseMsTeamsConnectionStatusOutput {\n const { t } = useTranslations();\n\n const [connectionStatus, setConnectionStatus] =\n useState<ConnectionStatus>(\"connecting\");\n const [errorLabel, setErrorLabel] = useState<string | null>(null);\n const [actionLabel, setActionLabel] = useState<string | null>(null);\n\n useEffect(() => {\n const checkAuthStatus = async () => {\n if (connectionStatus !== \"connecting\") return;\n\n try {\n const authRes = await knock.msTeams.authCheck({\n tenant: tenantId,\n knockChannelId: knockMsTeamsChannelId,\n });\n\n if (authRes.connection?.ok === true) {\n return setConnectionStatus(\"connected\");\n }\n\n if (authRes.connection?.ok === false) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is a normal response for a tenant that doesn't have\n // ms_teams_tenant_id set on it, meaning it's not connected to MS Teams,\n // so we give it a \"disconnected\" status instead of an error status.\n if (\n authRes.code === \"ERR_BAD_REQUEST\" &&\n authRes.response?.data?.message === t(\"msTeamsTenantIdNotSet\")\n ) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is for any Knock errors that would require a reconnect.\n setConnectionStatus(\"error\");\n } catch (_error) {\n setConnectionStatus(\"error\");\n }\n };\n\n checkAuthStatus();\n }, [connectionStatus, tenantId, knockMsTeamsChannelId, knock.msTeams, t]);\n\n return {\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n };\n}\n\nexport default useMsTeamsConnectionStatus;\n"],"names":["useMsTeamsConnectionStatus","knock","knockMsTeamsChannelId","tenantId","t","useTranslations","connectionStatus","setConnectionStatus","useState","errorLabel","setErrorLabel","actionLabel","setActionLabel","useEffect","authRes","msTeams","authCheck","tenant","knockChannelId","connection","ok","code","response","data","message"],"mappings":"gJAqBA,SAASA,EACPC,EACAC,EACAC,EACkC,CAC5B,KAAA,CAAEC,EAAAA,GAAMC,kBAAgB,EAExB,CAACC,EAAkBC,CAAmB,EAC1CC,EAAAA,SAA2B,YAAY,EACnC,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAwB,IAAI,EAC1D,CAACG,EAAaC,CAAc,EAAIJ,EAAAA,SAAwB,IAAI,EAElEK,OAAAA,EAAAA,UAAU,IAAM,EACU,SAAY,aAClC,GAAIP,IAAqB,aAErB,GAAA,CACF,MAAMQ,EAAU,MAAMb,EAAMc,QAAQC,UAAU,CAC5CC,OAAQd,EACRe,eAAgBhB,CAAAA,CACjB,EAEGY,KAAAA,EAAAA,EAAQK,aAARL,YAAAA,EAAoBM,MAAO,GAC7B,OAAOb,EAAoB,WAAW,EAWtCO,KAREA,EAAAA,EAAQK,aAARL,YAAAA,EAAoBM,MAAO,IAQ7BN,EAAQO,OAAS,qBACjBP,GAAAA,EAAAA,EAAQQ,WAARR,YAAAA,EAAkBS,OAAlBT,YAAAA,EAAwBU,WAAYpB,EAAE,uBAAuB,EAE7D,OAAOG,EAAoB,cAAc,EAI3CA,EAAoB,OAAO,OACZ,CACfA,EAAoB,OAAO,CAAA,CAE/B,GAEgB,CAAA,EACf,CAACD,EAAkBH,EAAUD,EAAuBD,EAAMc,QAASX,CAAC,CAAC,EAEjE,CACLE,iBAAAA,EACAC,oBAAAA,EACAE,WAAAA,EACAC,cAAAA,EACAC,YAAAA,EACAC,eAAAA,CACF,CACF"}
@@ -0,0 +1,2 @@
1
+ "use strict";const r=require("react"),S=require("swr/infinite"),h=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("fast-deep-equal");require("date-fns");const g=require("../context/KnockMsTeamsProvider.js"),E=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},I=E(S),P=1e3,_="MS_TEAMS_TEAMS";function x(e,n){return e===0?[_,""]:n&&["",null].includes(n.skip_token)?null:[_,n.skip_token??""]}function R({queryOptions:e={}}){const n=h.useKnockClient(),{knockMsTeamsChannelId:u,tenantId:T,connectionStatus:l}=g.useKnockMsTeamsClient(),M=t=>n.msTeams.getTeams({knockChannelId:u,tenant:T,queryOptions:{$skiptoken:t==null?void 0:t[1],$top:e==null?void 0:e.limitPerPage,$filter:e==null?void 0:e.filter,$select:e==null?void 0:e.select}}),{data:s,error:o,isLoading:c,isValidating:a,setSize:f,mutate:C}=I.default(x,M,{initialSize:0,revalidateOnFocus:!1,revalidateFirstPage:!1}),m=s==null?void 0:s.at(-1),k=m===void 0||!!m.skip_token,i=r.useMemo(()=>(s??[]).flatMap(t=>t==null?void 0:t.ms_teams_teams).filter(t=>!!t),[s]),d=(e==null?void 0:e.maxCount)||P;return r.useEffect(()=>{l==="connected"&&!o&&k&&!c&&!a&&i.length<d&&f(t=>t+1)},[i.length,f,k,c,a,d,o,l]),{data:i,isLoading:c||a,refetch:()=>C()}}module.exports=R;
2
+ //# sourceMappingURL=useMsTeamsTeams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMsTeamsTeams.js","sources":["../../../../../src/modules/ms-teams/hooks/useMsTeamsTeams.ts"],"sourcesContent":["import { GetMsTeamsTeamsResponse, MsTeamsTeam } from \"@knocklabs/client\";\nimport { useEffect, useMemo } from \"react\";\nimport useSWRInfinite from \"swr/infinite\";\n\nimport { useKnockClient } from \"../../core\";\nimport { useKnockMsTeamsClient } from \"../context\";\nimport { MsTeamsTeamQueryOptions } from \"../interfaces\";\n\nconst MAX_COUNT = 1000;\n\nconst QUERY_KEY = \"MS_TEAMS_TEAMS\";\n\ntype UseMsTeamsTeamsOptions = {\n queryOptions?: MsTeamsTeamQueryOptions;\n};\n\ntype UseMsTeamsTeamsOutput = {\n data: MsTeamsTeam[];\n isLoading: boolean;\n refetch: () => void;\n};\n\ntype QueryKey = [key: string, skiptoken: string] | null;\n\nfunction getQueryKey(\n pageIndex: number,\n previousPageData: GetMsTeamsTeamsResponse,\n): QueryKey {\n // First page so just pass empty\n if (pageIndex === 0) {\n return [QUERY_KEY, \"\"];\n }\n\n // If there's no more data then return an empty next skiptoken\n if (previousPageData && [\"\", null].includes(previousPageData.skip_token)) {\n return null;\n }\n\n // Next skiptoken exists so pass it\n return [QUERY_KEY, previousPageData.skip_token ?? \"\"];\n}\n\nfunction useMsTeamsTeams({\n queryOptions = {},\n}: UseMsTeamsTeamsOptions): UseMsTeamsTeamsOutput {\n const knock = useKnockClient();\n const { knockMsTeamsChannelId, tenantId, connectionStatus } =\n useKnockMsTeamsClient();\n\n const fetchTeams = (queryKey: QueryKey) =>\n knock.msTeams.getTeams({\n knockChannelId: knockMsTeamsChannelId,\n tenant: tenantId,\n queryOptions: {\n $skiptoken: queryKey?.[1],\n $top: queryOptions?.limitPerPage,\n $filter: queryOptions?.filter,\n $select: queryOptions?.select,\n },\n });\n\n const { data, error, isLoading, isValidating, setSize, mutate } =\n useSWRInfinite<GetMsTeamsTeamsResponse>(getQueryKey, fetchTeams, {\n initialSize: 0,\n revalidateOnFocus: false,\n revalidateFirstPage: false,\n });\n\n const lastPage = data?.at(-1);\n const hasNextPage = lastPage === undefined || !!lastPage.skip_token;\n\n const teams = useMemo(\n () =>\n (data ?? [])\n .flatMap((page) => page?.ms_teams_teams)\n .filter((team) => !!team),\n [data],\n );\n\n const maxCount = queryOptions?.maxCount || MAX_COUNT;\n\n useEffect(() => {\n if (\n connectionStatus === \"connected\" &&\n !error &&\n hasNextPage &&\n !isLoading &&\n !isValidating &&\n teams.length < maxCount\n ) {\n // Fetch a page at a time until we have nothing else left to fetch\n // or we've already hit the max amount of teams to fetch\n setSize((size) => size + 1);\n }\n }, [\n teams.length,\n setSize,\n hasNextPage,\n isLoading,\n isValidating,\n maxCount,\n error,\n connectionStatus,\n ]);\n\n return {\n data: teams,\n isLoading: isLoading || isValidating,\n refetch: () => mutate(),\n };\n}\n\nexport default useMsTeamsTeams;\n"],"names":["MAX_COUNT","QUERY_KEY","getQueryKey","pageIndex","previousPageData","includes","skip_token","useMsTeamsTeams","queryOptions","knock","useKnockClient","knockMsTeamsChannelId","tenantId","connectionStatus","useKnockMsTeamsClient","fetchTeams","queryKey","msTeams","getTeams","knockChannelId","tenant","$skiptoken","$top","limitPerPage","$filter","filter","$select","select","data","error","isLoading","isValidating","setSize","mutate","useSWRInfinite","initialSize","revalidateOnFocus","revalidateFirstPage","lastPage","at","hasNextPage","undefined","teams","useMemo","flatMap","page","ms_teams_teams","team","maxCount","useEffect","length","size","refetch"],"mappings":"kTAQMA,EAAY,IAEZC,EAAY,iBAclB,SAASC,EACPC,EACAC,EACU,CAEV,OAAID,IAAc,EACT,CAACF,EAAW,EAAE,EAInBG,GAAoB,CAAC,GAAI,IAAI,EAAEC,SAASD,EAAiBE,UAAU,EAC9D,KAIF,CAACL,EAAWG,EAAiBE,YAAc,EAAE,CACtD,CAEA,SAASC,EAAgB,CACvBC,aAAAA,EAAe,CAAA,CACO,EAA0B,CAChD,MAAMC,EAAQC,EAAAA,eAAe,EACvB,CAAEC,sBAAAA,EAAuBC,SAAAA,EAAUC,iBAAAA,GACvCC,wBAAsB,EAElBC,EAAcC,GAClBP,EAAMQ,QAAQC,SAAS,CACrBC,eAAgBR,EAChBS,OAAQR,EACRJ,aAAc,CACZa,WAAYL,GAAAA,YAAAA,EAAW,GACvBM,KAAMd,GAAAA,YAAAA,EAAce,aACpBC,QAAShB,GAAAA,YAAAA,EAAciB,OACvBC,QAASlB,GAAAA,YAAAA,EAAcmB,MAAAA,CACzB,CACD,EAEG,CAAEC,KAAAA,EAAMC,MAAAA,EAAOC,UAAAA,EAAWC,aAAAA,EAAcC,QAAAA,EAASC,OAAAA,CAAAA,EACrDC,EAAwChC,QAAAA,EAAaa,EAAY,CAC/DoB,YAAa,EACbC,kBAAmB,GACnBC,oBAAqB,EAAA,CACtB,EAEGC,EAAWV,GAAAA,YAAAA,EAAMW,GAAG,IACpBC,EAAcF,IAAaG,QAAa,CAAC,CAACH,EAAShC,WAEnDoC,EAAQC,EAAAA,QACZ,KACGf,GAAQ,IACNgB,QAAkBC,GAAAA,GAAAA,YAAAA,EAAMC,cAAc,EACtCrB,UAAiB,CAAC,CAACsB,CAAI,EAC5B,CAACnB,CAAI,CACP,EAEMoB,GAAWxC,GAAAA,YAAAA,EAAcwC,WAAYhD,EAE3CiD,OAAAA,EAAAA,UAAU,IAAM,CAEZpC,IAAqB,aACrB,CAACgB,GACDW,GACA,CAACV,GACD,CAACC,GACDW,EAAMQ,OAASF,GAING,EAAAA,GAASA,EAAO,CAAC,CAE9B,EAAG,CACDT,EAAMQ,OACNlB,EACAQ,EACAV,EACAC,EACAiB,EACAnB,EACAhB,CAAgB,CACjB,EAEM,CACLe,KAAMc,EACNZ,UAAWA,GAAaC,EACxBqB,QAASA,IAAMnB,EAAO,CACxB,CACF"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const S=require("../hooks/useSlackConnectionStatus.js"),b=require("react");require("swr/infinite");const f=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("fast-deep-equal");const v=require("../../core/utils.js");require("swr");require("../../i18n/context/KnockI18nProvider.js");function C(e){if(e&&typeof e=="object"&&"default"in e)return e;const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const o=C(b),i=o.createContext(null),P=e=>{const{knockSlackChannelId:t,children:r}=e,n="tenantId"in e?e.tenantId:e.tenant,u=f.useKnockClient(),{connectionStatus:c,setConnectionStatus:l,errorLabel:a,setErrorLabel:s,actionLabel:k,setActionLabel:d}=S(u,t,n);return o.createElement(i.Provider,{key:v.slackProviderKey({knockSlackChannelId:t,tenantId:n,connectionStatus:c,errorLabel:a}),value:{connectionStatus:c,setConnectionStatus:l,errorLabel:a,setErrorLabel:s,actionLabel:k,setActionLabel:d,knockSlackChannelId:t,tenant:n,tenantId:n}},r)},q=()=>{const e=o.useContext(i);if(e===void 0)throw new Error("useKnockSlackClient must be used within a KnockSlackProvider");return e};exports.KnockSlackProvider=P;exports.useKnockSlackClient=q;
2
+ //# sourceMappingURL=KnockSlackProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnockSlackProvider.js","sources":["../../../../../src/modules/slack/context/KnockSlackProvider.tsx"],"sourcesContent":["import { useSlackConnectionStatus } from \"..\";\nimport * as React from \"react\";\nimport { PropsWithChildren } from \"react\";\n\nimport { slackProviderKey } from \"../../core\";\nimport { useKnockClient } from \"../../core\";\nimport { ConnectionStatus } from \"../hooks/useSlackConnectionStatus\";\n\nexport interface KnockSlackProviderState {\n knockSlackChannelId: string;\n tenantId: string;\n /**\n * @deprecated Use `tenantId` instead. This field will be removed in a future release.\n */\n tenant: string;\n connectionStatus: ConnectionStatus;\n setConnectionStatus: (connectionStatus: ConnectionStatus) => void;\n errorLabel: string | null;\n setErrorLabel: (label: string) => void;\n actionLabel: string | null;\n setActionLabel: (label: string | null) => void;\n}\n\nconst SlackProviderStateContext =\n React.createContext<KnockSlackProviderState | null>(null);\n\nexport type KnockSlackProviderProps =\n | {\n knockSlackChannelId: string;\n /**\n * @deprecated Use `tenantId` instead. This field will be removed in a future release.\n */\n tenant: string;\n }\n | {\n knockSlackChannelId: string;\n tenantId: string;\n };\n\nexport const KnockSlackProvider: React.FC<\n PropsWithChildren<KnockSlackProviderProps>\n> = (props) => {\n const { knockSlackChannelId, children } = props;\n const tenantId = \"tenantId\" in props ? props.tenantId : props.tenant;\n\n const knock = useKnockClient();\n\n const {\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n } = useSlackConnectionStatus(knock, knockSlackChannelId, tenantId);\n\n return (\n <SlackProviderStateContext.Provider\n key={slackProviderKey({\n knockSlackChannelId,\n tenantId,\n connectionStatus,\n errorLabel,\n })}\n value={{\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n knockSlackChannelId,\n // Assign the same value to both tenant and tenantId for backwards compatibility\n tenant: tenantId,\n tenantId,\n }}\n >\n {children}\n </SlackProviderStateContext.Provider>\n );\n};\n\nexport const useKnockSlackClient = (): KnockSlackProviderState => {\n const context = React.useContext(\n SlackProviderStateContext,\n ) as KnockSlackProviderState;\n if (context === undefined) {\n throw new Error(\n \"useKnockSlackClient must be used within a KnockSlackProvider\",\n );\n }\n return context as KnockSlackProviderState;\n};\n"],"names":["SlackProviderStateContext","React","createContext","KnockSlackProvider","props","knockSlackChannelId","children","tenantId","tenant","knock","useKnockClient","connectionStatus","setConnectionStatus","errorLabel","setErrorLabel","actionLabel","setActionLabel","useSlackConnectionStatus","slackProviderKey","useKnockSlackClient","context","useContext","undefined","Error"],"mappings":"stBAuBMA,EACJC,EAAMC,cAA8C,IAAI,EAe7CC,EAEEC,GAAA,CACP,KAAA,CAAEC,oBAAAA,EAAqBC,SAAAA,CAAAA,EAAaF,EACpCG,EAAW,aAAcH,EAAQA,EAAMG,SAAWH,EAAMI,OAExDC,EAAQC,EAAAA,eAAe,EAEvB,CACJC,iBAAAA,EACAC,oBAAAA,EACAC,WAAAA,EACAC,cAAAA,EACAC,YAAAA,EACAC,eAAAA,CACEC,EAAAA,EAAyBR,EAAOJ,EAAqBE,CAAQ,EAEjE,OACGN,EAAA,cAAAD,EAA0B,SAA1B,CACC,IAAKkB,mBAAiB,CACpBb,oBAAAA,EACAE,SAAAA,EACAI,iBAAAA,EACAE,WAAAA,CACD,CAAA,EACD,MAAO,CACLF,iBAAAA,EACAC,oBAAAA,EACAC,WAAAA,EACAC,cAAAA,EACAC,YAAAA,EACAC,eAAAA,EACAX,oBAAAA,EAEAG,OAAQD,EACRA,SAAAA,IAGDD,CACH,CAEJ,EAEaa,EAAsBA,IAA+B,CAC1DC,MAAAA,EAAUnB,EAAMoB,WACpBrB,CACF,EACA,GAAIoB,IAAYE,OACR,MAAA,IAAIC,MACR,8DACF,EAEKH,OAAAA,CACT"}
@@ -0,0 +1,2 @@
1
+ "use strict";const q=require("../context/KnockSlackProvider.js"),i=require("react");require("../../i18n/context/KnockI18nProvider.js");const g=require("../../i18n/hooks/useTranslations.js");require("swr/infinite");const E=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("fast-deep-equal");require("date-fns");const _=require("swr"),D=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},K=D(_),R="SLACK_CONNECTED_CHANNELS";function y({slackChannelsRecipientObject:{objectId:e,collection:a}}){const{t:l}=g.useTranslations(),c=E.useKnockClient(),{connectionStatus:d,knockSlackChannelId:s}=q.useKnockSlackClient(),[C,r]=i.useState(null),[h,o]=i.useState(!1),{data:k,mutate:p,isValidating:S,isLoading:f}=K.default(d==="connected"?[R,s,a,e]:null,async()=>c.objects.getChannelData({collection:a,objectId:e,channelId:s}).then(t=>{var n;return((n=t.data)==null?void 0:n.connections)??[]}).catch(()=>[]),{onSuccess:()=>{r(null)}});return{data:k??null,updateConnectedChannels:async t=>{o(!0);try{await p(()=>c.objects.setChannelData({objectId:e,collection:a,channelId:s,data:{connections:t}}).then(n=>{var u;return((u=n.data)==null?void 0:u.connections)??[]}),{populateCache:!0,revalidate:!1,optimisticData:t})}catch{r(l("slackChannelSetError")||"")}o(!1)},updating:h,loading:f||S,error:C}}module.exports=y;
2
+ //# sourceMappingURL=useConnectedSlackChannels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useConnectedSlackChannels.js","sources":["../../../../../src/modules/slack/hooks/useConnectedSlackChannels.ts"],"sourcesContent":["import { useKnockSlackClient } from \"..\";\nimport { SlackChannelConnection } from \"@knocklabs/client\";\nimport { GenericData } from \"@knocklabs/types\";\nimport { useState } from \"react\";\nimport useSWR from \"swr\";\n\nimport { RecipientObject } from \"../../..\";\nimport { useKnockClient } from \"../../core\";\nimport { useTranslations } from \"../../i18n\";\n\nconst QUERY_KEY = \"SLACK_CONNECTED_CHANNELS\";\n\ntype UseConnectedSlackChannelsProps = {\n slackChannelsRecipientObject: RecipientObject;\n};\n\ntype UseConnectedSlackChannelsOutput = {\n data: SlackChannelConnection[] | null;\n updateConnectedChannels: (\n connectedChannels: SlackChannelConnection[],\n ) => Promise<void>;\n loading: boolean;\n error: string | null;\n updating: boolean;\n};\n\nfunction useConnectedSlackChannels({\n slackChannelsRecipientObject: { objectId, collection },\n}: UseConnectedSlackChannelsProps): UseConnectedSlackChannelsOutput {\n const { t } = useTranslations();\n const knock = useKnockClient();\n const { connectionStatus, knockSlackChannelId } = useKnockSlackClient();\n\n const [error, setError] = useState<string | null>(null);\n const [isUpdating, setIsUpdating] = useState(false);\n\n const {\n data: connectedChannels,\n mutate,\n isValidating,\n isLoading,\n } = useSWR<SlackChannelConnection[]>(\n // Only fetch when Slack is connected\n connectionStatus === \"connected\"\n ? [QUERY_KEY, knockSlackChannelId, collection, objectId]\n : null,\n async () => {\n return knock.objects\n .getChannelData({\n collection,\n objectId,\n channelId: knockSlackChannelId,\n })\n .then((res) => res.data?.connections ?? [])\n .catch(() => []);\n },\n {\n onSuccess: () => {\n setError(null);\n },\n },\n );\n\n const updateConnectedChannels = async (\n channelsToSendToKnock: SlackChannelConnection[],\n ) => {\n setIsUpdating(true);\n try {\n await mutate(\n () =>\n knock.objects\n .setChannelData({\n objectId,\n collection,\n channelId: knockSlackChannelId,\n data: { connections: channelsToSendToKnock },\n })\n .then((res) => (res as GenericData).data?.connections ?? []),\n {\n populateCache: true,\n revalidate: false,\n optimisticData: channelsToSendToKnock,\n },\n );\n } catch (_error) {\n setError(t(\"slackChannelSetError\") || \"\");\n }\n setIsUpdating(false);\n };\n\n return {\n data: connectedChannels ?? null,\n updateConnectedChannels,\n updating: isUpdating,\n loading: isLoading || isValidating,\n error,\n };\n}\n\nexport default useConnectedSlackChannels;\n"],"names":["QUERY_KEY","useConnectedSlackChannels","slackChannelsRecipientObject","objectId","collection","t","useTranslations","knock","useKnockClient","connectionStatus","knockSlackChannelId","useKnockSlackClient","error","setError","useState","isUpdating","setIsUpdating","data","connectedChannels","mutate","isValidating","isLoading","useSWR","objects","getChannelData","channelId","then","res","connections","catch","onSuccess","updateConnectedChannels","channelsToSendToKnock","setChannelData","populateCache","revalidate","optimisticData","updating","loading"],"mappings":"+aAUMA,EAAY,2BAgBlB,SAASC,EAA0B,CACjCC,6BAA8B,CAAEC,SAAAA,EAAUC,WAAAA,CAAAA,CACZ,EAAoC,CAC5D,KAAA,CAAEC,EAAAA,GAAMC,kBAAgB,EACxBC,EAAQC,EAAAA,eAAe,EACvB,CAAEC,iBAAAA,EAAkBC,oBAAAA,GAAwBC,sBAAoB,EAEhE,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAwB,IAAI,EAChD,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAS,EAAK,EAE5C,CACJG,KAAMC,EACNC,OAAAA,EACAC,aAAAA,EACAC,UAAAA,CAAAA,EACEC,EAAAA,QAEFb,IAAqB,YACjB,CAACT,EAAWU,EAAqBN,EAAYD,CAAQ,EACrD,KACJ,SACSI,EAAMgB,QACVC,eAAe,CACdpB,WAAAA,EACAD,SAAAA,EACAsB,UAAWf,CACZ,CAAA,EACAgB,KAAMC,GAAAA,OAAQA,QAAAA,EAAAA,EAAIV,OAAJU,YAAAA,EAAUC,cAAe,GAAE,EACzCC,MAAM,IAAM,EAAE,EAEnB,CACEC,UAAWA,IAAM,CACfjB,EAAS,IAAI,CAAA,CACf,CAEJ,EA6BO,MAAA,CACLI,KAAMC,GAAqB,KAC3Ba,wBA7B8B,MAC9BC,GACG,CACHhB,EAAc,EAAI,EACd,GAAA,CACF,MAAMG,EACJ,IACEZ,EAAMgB,QACHU,eAAe,CACd9B,SAAAA,EACAC,WAAAA,EACAqB,UAAWf,EACXO,KAAM,CAAEW,YAAaI,CAAAA,CAAsB,CAC5C,EACAN,KAAMC,GAAAA,OAASA,QAAAA,EAAAA,EAAoBV,OAApBU,YAAAA,EAA0BC,cAAe,CAAA,EAAE,EAC/D,CACEM,cAAe,GACfC,WAAY,GACZC,eAAgBJ,CAAAA,CAEpB,OACe,CACN3B,EAAAA,EAAE,sBAAsB,GAAK,EAAE,CAAA,CAE1CW,EAAc,EAAK,CACrB,EAKEqB,SAAUtB,EACVuB,QAASjB,GAAaD,EACtBR,MAAAA,CACF,CACF"}
@@ -0,0 +1,2 @@
1
+ "use strict";const _=require("../context/KnockSlackProvider.js"),l=require("react");require("../../i18n/context/KnockI18nProvider.js");require("swr/infinite");const h=require("../../core/context/KnockProvider.js"),A=require("@knocklabs/client");require("fast-deep-equal");require("date-fns");require("swr");const C="https://slack.com/oauth/v2/authorize",s=["chat:write","chat:write.public","channels:read","groups:read"];function b(e){return e?Array.isArray(e)?{scopes:s,additionalScopes:e}:{scopes:e.scopes??s,additionalScopes:e.additionalScopes??[]}:{scopes:s,additionalScopes:[]}}function q(e,a,k){const c=h.useKnockClient(),{setConnectionStatus:n,knockSlackChannelId:r,tenantId:o,setActionLabel:i}=_.useKnockSlackClient(),{scopes:d,additionalScopes:S}=b(k),u=Array.from(new Set(d.concat(S))),p=l.useCallback(async()=>{i(null),n("disconnecting");try{const t=await c.slack.revokeAccessToken({tenant:o,knockChannelId:r});n(t==="ok"?"disconnected":"error")}catch{n("error")}},[n,c.slack,o,r,i]);return{buildSlackAuthUrl:l.useCallback(()=>{const t={state:JSON.stringify({redirect_url:a,access_token_object:{object_id:o,collection:A.TENANT_OBJECT_COLLECTION},channel_id:r,public_key:c.apiKey,user_token:c.userToken}),client_id:e,scope:u.join(",")};return`${C}?${new URLSearchParams(t)}`},[a,o,r,c.apiKey,c.userToken,e,u]),disconnectFromSlack:p}}module.exports=q;
2
+ //# sourceMappingURL=useSlackAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSlackAuth.js","sources":["../../../../../src/modules/slack/hooks/useSlackAuth.ts"],"sourcesContent":["import { useKnockSlackClient } from \"..\";\nimport { TENANT_OBJECT_COLLECTION } from \"@knocklabs/client\";\nimport { useCallback } from \"react\";\n\nimport { useKnockClient } from \"../../core\";\n\nconst SLACK_AUTHORIZE_URL = \"https://slack.com/oauth/v2/authorize\";\nconst DEFAULT_SLACK_SCOPES = [\n \"chat:write\",\n \"chat:write.public\",\n \"channels:read\",\n \"groups:read\",\n];\n\ntype UseSlackAuthOutput = {\n buildSlackAuthUrl: () => string;\n disconnectFromSlack: () => void;\n};\n\ntype UseSlackAuthOptions = {\n // When provided, the default scopes will be overridden with the provided scopes\n scopes?: string[];\n // Additional scopes to add to the default scopes\n additionalScopes?: string[];\n};\n\n// Here we normalize the options to be a single object with scopes and additionalScopes\n// The \"options\" parameter can be an array of scopes, an object with scopes and additionalScopes, or undefined\n// We handle the array case because it was the previous way to pass options so we're being backward compatible\nfunction normalizeOptions(options?: UseSlackAuthOptions | string[]): {\n scopes: string[];\n additionalScopes: string[];\n} {\n if (!options) {\n return { scopes: DEFAULT_SLACK_SCOPES, additionalScopes: [] };\n }\n\n if (Array.isArray(options)) {\n return { scopes: DEFAULT_SLACK_SCOPES, additionalScopes: options };\n }\n\n return {\n scopes: options.scopes ?? DEFAULT_SLACK_SCOPES,\n additionalScopes: options.additionalScopes ?? [],\n };\n}\n\nfunction useSlackAuth(\n slackClientId: string,\n redirectUrl?: string,\n options?: UseSlackAuthOptions | string[],\n): UseSlackAuthOutput {\n const knock = useKnockClient();\n const { setConnectionStatus, knockSlackChannelId, tenantId, setActionLabel } =\n useKnockSlackClient();\n\n const { scopes, additionalScopes } = normalizeOptions(options);\n const combinedScopes = Array.from(new Set(scopes.concat(additionalScopes)));\n\n const disconnectFromSlack = useCallback(async () => {\n setActionLabel(null);\n setConnectionStatus(\"disconnecting\");\n try {\n const revoke = await knock.slack.revokeAccessToken({\n tenant: tenantId,\n knockChannelId: knockSlackChannelId,\n });\n\n if (revoke === \"ok\") {\n setConnectionStatus(\"disconnected\");\n } else {\n setConnectionStatus(\"error\");\n }\n } catch (_error) {\n setConnectionStatus(\"error\");\n }\n }, [\n setConnectionStatus,\n knock.slack,\n tenantId,\n knockSlackChannelId,\n setActionLabel,\n ]);\n\n const buildSlackAuthUrl = useCallback(() => {\n const rawParams = {\n state: JSON.stringify({\n redirect_url: redirectUrl,\n access_token_object: {\n object_id: tenantId,\n collection: TENANT_OBJECT_COLLECTION,\n },\n channel_id: knockSlackChannelId,\n public_key: knock.apiKey,\n user_token: knock.userToken,\n }),\n client_id: slackClientId,\n scope: combinedScopes.join(\",\"),\n };\n return `${SLACK_AUTHORIZE_URL}?${new URLSearchParams(rawParams)}`;\n }, [\n redirectUrl,\n tenantId,\n knockSlackChannelId,\n knock.apiKey,\n knock.userToken,\n slackClientId,\n combinedScopes,\n ]);\n\n return {\n buildSlackAuthUrl,\n disconnectFromSlack,\n };\n}\n\nexport default useSlackAuth;\n"],"names":["SLACK_AUTHORIZE_URL","DEFAULT_SLACK_SCOPES","normalizeOptions","options","Array","isArray","scopes","additionalScopes","useSlackAuth","slackClientId","redirectUrl","knock","useKnockClient","setConnectionStatus","knockSlackChannelId","tenantId","setActionLabel","useKnockSlackClient","combinedScopes","from","Set","concat","disconnectFromSlack","useCallback","revoke","slack","revokeAccessToken","tenant","knockChannelId","buildSlackAuthUrl","rawParams","state","JSON","stringify","redirect_url","access_token_object","object_id","collection","TENANT_OBJECT_COLLECTION","channel_id","public_key","apiKey","user_token","userToken","client_id","scope","join","URLSearchParams"],"mappings":"mTAMA,MAAMA,EAAsB,uCACtBC,EAAuB,CAC3B,aACA,oBACA,gBACA,aAAa,EAkBf,SAASC,EAAiBC,EAGxB,CACA,OAAKA,EAIDC,MAAMC,QAAQF,CAAO,EAChB,CAAEG,OAAQL,EAAsBM,iBAAkBJ,CAAQ,EAG5D,CACLG,OAAQH,EAAQG,QAAUL,EAC1BM,iBAAkBJ,EAAQI,kBAAoB,CAAA,CAChD,EAVS,CAAED,OAAQL,EAAsBM,iBAAkB,CAAA,CAAG,CAWhE,CAEA,SAASC,EACPC,EACAC,EACAP,EACoB,CACpB,MAAMQ,EAAQC,EAAAA,eAAe,EACvB,CAAEC,oBAAAA,EAAqBC,oBAAAA,EAAqBC,SAAAA,EAAUC,eAAAA,GAC1DC,sBAAoB,EAEhB,CAAEX,OAAAA,EAAQC,iBAAAA,CAAAA,EAAqBL,EAAiBC,CAAO,EACvDe,EAAiBd,MAAMe,KAAK,IAAIC,IAAId,EAAOe,OAAOd,CAAgB,CAAC,CAAC,EAEpEe,EAAsBC,EAAAA,YAAY,SAAY,CAClDP,EAAe,IAAI,EACnBH,EAAoB,eAAe,EAC/B,GAAA,CACF,MAAMW,EAAS,MAAMb,EAAMc,MAAMC,kBAAkB,CACjDC,OAAQZ,EACRa,eAAgBd,CAAAA,CACjB,EAGCD,EADEW,IAAW,KACO,eAEA,OAFc,OAIrB,CACfX,EAAoB,OAAO,CAAA,CAC7B,EACC,CACDA,EACAF,EAAMc,MACNV,EACAD,EACAE,CAAc,CACf,EA4BM,MAAA,CACLa,kBA3BwBN,EAAAA,YAAY,IAAM,CAC1C,MAAMO,EAAY,CAChBC,MAAOC,KAAKC,UAAU,CACpBC,aAAcxB,EACdyB,oBAAqB,CACnBC,UAAWrB,EACXsB,WAAYC,EAAAA,wBACd,EACAC,WAAYzB,EACZ0B,WAAY7B,EAAM8B,OAClBC,WAAY/B,EAAMgC,SAAAA,CACnB,EACDC,UAAWnC,EACXoC,MAAO3B,EAAe4B,KAAK,GAAG,CAChC,EACA,MAAO,GAAG9C,CAAmB,IAAI,IAAI+C,gBAAgBjB,CAAS,CAAC,EACjE,EAAG,CACDpB,EACAK,EACAD,EACAH,EAAM8B,OACN9B,EAAMgC,UACNlC,EACAS,CAAc,CACf,EAICI,oBAAAA,CACF,CACF"}
@@ -0,0 +1,2 @@
1
+ "use strict";const P=require("../context/KnockSlackProvider.js"),d=require("react");require("../../i18n/context/KnockI18nProvider.js");const m=require("swr/infinite"),x=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("fast-deep-equal");require("date-fns");require("swr");const I=n=>n&&typeof n=="object"&&"default"in n?n:{default:n},L=I(m),N=1e3,g=200,A="private_channel,public_channel",C="SLACK_CHANNELS";function R(n,e){return n===0?[C,""]:e&&["",null].includes(e.next_cursor)?null:[C,e.next_cursor??""]}function M({queryOptions:n}){const e=x.useKnockClient(),{knockSlackChannelId:_,tenantId:h,connectionStatus:i}=P.useKnockSlackClient(),S=t=>e.slack.getChannels({tenant:h,knockChannelId:_,queryOptions:{...n,cursor:t==null?void 0:t[1],limit:(n==null?void 0:n.limitPerPage)||g,types:(n==null?void 0:n.types)||A}}),{data:c,error:r,isLoading:l,isValidating:a,setSize:o,mutate:E}=L.default(R,S,{initialSize:0,revalidateFirstPage:!1}),u=c==null?void 0:c.at(-1),f=u===void 0||!!u.next_cursor,s=d.useMemo(()=>(c??[]).flatMap(t=>t==null?void 0:t.slack_channels).filter(t=>!!t),[c]),k=(n==null?void 0:n.maxCount)||N;return d.useEffect(()=>{i==="connected"&&!r&&f&&!l&&!a&&s.length<k&&o(t=>t+1)},[s.length,o,f,l,a,k,r,i]),{data:s,isLoading:l||a,refetch:()=>E()}}module.exports=M;
2
+ //# sourceMappingURL=useSlackChannels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSlackChannels.js","sources":["../../../../../src/modules/slack/hooks/useSlackChannels.ts"],"sourcesContent":["import { SlackChannelQueryOptions, useKnockSlackClient } from \"..\";\nimport { GetSlackChannelsResponse, SlackChannel } from \"@knocklabs/client\";\nimport { useEffect, useMemo } from \"react\";\nimport useSWRInfinite from \"swr/infinite\";\n\nimport { useKnockClient } from \"../../core\";\n\nconst MAX_COUNT = 1000;\nconst LIMIT_PER_PAGE = 200;\nconst CHANNEL_TYPES = \"private_channel,public_channel\";\n\nconst QUERY_KEY = \"SLACK_CHANNELS\";\n\ntype UseSlackChannelsOptions = {\n queryOptions?: SlackChannelQueryOptions;\n};\n\ntype UseSlackChannelOutput = {\n data: SlackChannel[];\n isLoading: boolean;\n refetch: () => void;\n};\n\ntype QueryKey = [key: string, cursor: string] | null;\n\nfunction getQueryKey(\n pageIndex: number,\n previousPageData: GetSlackChannelsResponse,\n): QueryKey {\n // First page so just pass empty\n if (pageIndex === 0) {\n return [QUERY_KEY, \"\"];\n }\n\n // If there's no more data then return an empty next cursor\n if (previousPageData && [\"\", null].includes(previousPageData.next_cursor)) {\n return null;\n }\n\n // Next cursor exists so pass it\n return [QUERY_KEY, previousPageData.next_cursor ?? \"\"];\n}\n\nfunction useSlackChannels({\n queryOptions,\n}: UseSlackChannelsOptions): UseSlackChannelOutput {\n const knock = useKnockClient();\n const { knockSlackChannelId, tenantId, connectionStatus } =\n useKnockSlackClient();\n\n const fetchChannels = (queryKey: QueryKey) => {\n return knock.slack.getChannels({\n tenant: tenantId,\n knockChannelId: knockSlackChannelId,\n queryOptions: {\n ...queryOptions,\n cursor: queryKey?.[1],\n limit: queryOptions?.limitPerPage || LIMIT_PER_PAGE,\n types: queryOptions?.types || CHANNEL_TYPES,\n },\n });\n };\n\n const { data, error, isLoading, isValidating, setSize, mutate } =\n useSWRInfinite<GetSlackChannelsResponse>(getQueryKey, fetchChannels, {\n initialSize: 0,\n revalidateFirstPage: false,\n });\n\n const lastPage = data?.at(-1);\n const hasNextPage = lastPage === undefined || !!lastPage.next_cursor;\n\n const slackChannels: SlackChannel[] = useMemo(\n () =>\n (data ?? [])\n .flatMap((page) => page?.slack_channels)\n .filter((channel) => !!channel),\n [data],\n );\n\n const maxCount = queryOptions?.maxCount || MAX_COUNT;\n\n useEffect(() => {\n if (\n connectionStatus === \"connected\" &&\n !error &&\n hasNextPage &&\n !isLoading &&\n !isValidating &&\n slackChannels.length < maxCount\n ) {\n // Fetch a page at a time until we have nothing else left to fetch\n // or we've already hit the max amount of channels to fetch\n setSize((size) => size + 1);\n }\n }, [\n slackChannels.length,\n setSize,\n hasNextPage,\n isLoading,\n isValidating,\n maxCount,\n error,\n connectionStatus,\n ]);\n\n return {\n data: slackChannels,\n isLoading: isLoading || isValidating,\n refetch: () => mutate(),\n };\n}\n\nexport default useSlackChannels;\n"],"names":["MAX_COUNT","LIMIT_PER_PAGE","CHANNEL_TYPES","QUERY_KEY","getQueryKey","pageIndex","previousPageData","includes","next_cursor","useSlackChannels","queryOptions","knock","useKnockClient","knockSlackChannelId","tenantId","connectionStatus","useKnockSlackClient","fetchChannels","queryKey","slack","getChannels","tenant","knockChannelId","cursor","limit","limitPerPage","types","data","error","isLoading","isValidating","setSize","mutate","useSWRInfinite","initialSize","revalidateFirstPage","lastPage","at","hasNextPage","undefined","slackChannels","useMemo","flatMap","page","slack_channels","filter","channel","maxCount","useEffect","length","size","refetch"],"mappings":"wXAOMA,EAAY,IACZC,EAAiB,IACjBC,EAAgB,iCAEhBC,EAAY,iBAclB,SAASC,EACPC,EACAC,EACU,CAEV,OAAID,IAAc,EACT,CAACF,EAAW,EAAE,EAInBG,GAAoB,CAAC,GAAI,IAAI,EAAEC,SAASD,EAAiBE,WAAW,EAC/D,KAIF,CAACL,EAAWG,EAAiBE,aAAe,EAAE,CACvD,CAEA,SAASC,EAAiB,CACxBC,aAAAA,CACuB,EAA0B,CACjD,MAAMC,EAAQC,EAAAA,eAAe,EACvB,CAAEC,oBAAAA,EAAqBC,SAAAA,EAAUC,iBAAAA,GACrCC,sBAAoB,EAEhBC,EAAiBC,GACdP,EAAMQ,MAAMC,YAAY,CAC7BC,OAAQP,EACRQ,eAAgBT,EAChBH,aAAc,CACZ,GAAGA,EACHa,OAAQL,GAAAA,YAAAA,EAAW,GACnBM,OAAOd,GAAAA,YAAAA,EAAce,eAAgBxB,EACrCyB,OAAOhB,GAAAA,YAAAA,EAAcgB,QAASxB,CAAAA,CAChC,CACD,EAGG,CAAEyB,KAAAA,EAAMC,MAAAA,EAAOC,UAAAA,EAAWC,aAAAA,EAAcC,QAAAA,EAASC,OAAAA,CAAAA,EACrDC,EAAyC7B,QAAAA,EAAaa,EAAe,CACnEiB,YAAa,EACbC,oBAAqB,EAAA,CACtB,EAEGC,EAAWT,GAAAA,YAAAA,EAAMU,GAAG,IACpBC,EAAcF,IAAaG,QAAa,CAAC,CAACH,EAAS5B,YAEnDgC,EAAgCC,EAAAA,QACpC,KACGd,GAAQ,IACNe,QAAkBC,GAAAA,GAAAA,YAAAA,EAAMC,cAAc,EACtCC,UAAoB,CAAC,CAACC,CAAO,EAClC,CAACnB,CAAI,CACP,EAEMoB,GAAWrC,GAAAA,YAAAA,EAAcqC,WAAY/C,EAE3CgD,OAAAA,EAAAA,UAAU,IAAM,CAEZjC,IAAqB,aACrB,CAACa,GACDU,GACA,CAACT,GACD,CAACC,GACDU,EAAcS,OAASF,GAIdG,EAAAA,GAASA,EAAO,CAAC,CAE9B,EAAG,CACDV,EAAcS,OACdlB,EACAO,EACAT,EACAC,EACAiB,EACAnB,EACAb,CAAgB,CACjB,EAEM,CACLY,KAAMa,EACNX,UAAWA,GAAaC,EACxBqB,QAASA,IAAMnB,EAAO,CACxB,CACF"}
@@ -0,0 +1,2 @@
1
+ "use strict";const r=require("react");require("../../i18n/context/KnockI18nProvider.js");const A=require("../../i18n/hooks/useTranslations.js"),R=c=>{const n=c.substring(0,1).toUpperCase(),o=c.substring(1);return n==null?void 0:n.concat(o).replace("_"," ")};function C(c,n,o){const{t:a}=A.useTranslations(),[s,e]=r.useState("connecting"),[d,u]=r.useState(null),[E,g]=r.useState(null);return r.useEffect(()=>{(async()=>{var i,l,S,k,f,h,b;if(s==="connecting")try{const t=await c.slack.authCheck({tenant:o,knockChannelId:n});if((i=t.connection)!=null&&i.ok)return e("connected");if(!((l=t.connection)!=null&&l.ok)||t.code==="ERR_BAD_REQUEST"&&((k=(S=t.response)==null?void 0:S.data)==null?void 0:k.message)===a("slackAccessTokenNotSet"))return e("disconnected");if(!((f=t.connection)!=null&&f.ok)&&((h=t.connection)!=null&&h.error)){const p=R((b=t.connection)==null?void 0:b.error);u(p),e("error");return}e("error")}catch{e("error")}})()},[s,o,n,c.slack,a]),{connectionStatus:s,setConnectionStatus:e,errorLabel:d,setErrorLabel:u,actionLabel:E,setActionLabel:g}}module.exports=C;
2
+ //# sourceMappingURL=useSlackConnectionStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSlackConnectionStatus.js","sources":["../../../../../src/modules/slack/hooks/useSlackConnectionStatus.ts"],"sourcesContent":["import Knock from \"@knocklabs/client\";\nimport { useEffect, useState } from \"react\";\n\nimport { useTranslations } from \"../../i18n\";\n\nexport type ConnectionStatus =\n | \"connecting\"\n | \"connected\"\n | \"disconnected\"\n | \"error\"\n | \"disconnecting\";\n\ntype UseSlackConnectionStatusOutput = {\n connectionStatus: ConnectionStatus;\n setConnectionStatus: (status: ConnectionStatus) => void;\n errorLabel: string | null;\n setErrorLabel: (errorLabel: string) => void;\n actionLabel: string | null;\n setActionLabel: (actionLabel: string | null) => void;\n};\n\n/**\n * Transforms a slack error message into\n * a formatted one. Slack error messages: https://api.slack.com/methods/auth.test#errors\n *\n * Ex.: \"account_inactive\" -> \"Account inactive\"\n */\nconst formatSlackErrorMessage = (errorMessage: string) => {\n const firstLetter = errorMessage.substring(0, 1).toUpperCase();\n const rest = errorMessage.substring(1);\n return firstLetter?.concat(rest).replace(\"_\", \" \");\n};\n\nfunction useSlackConnectionStatus(\n knock: Knock,\n knockSlackChannelId: string,\n tenantId: string,\n): UseSlackConnectionStatusOutput {\n const { t } = useTranslations();\n const [connectionStatus, setConnectionStatus] =\n useState<ConnectionStatus>(\"connecting\");\n const [errorLabel, setErrorLabel] = useState<string | null>(null);\n const [actionLabel, setActionLabel] = useState<string | null>(null);\n\n useEffect(() => {\n const checkAuthStatus = async () => {\n if (connectionStatus !== \"connecting\") return;\n\n try {\n const authRes = await knock.slack.authCheck({\n tenant: tenantId,\n knockChannelId: knockSlackChannelId,\n });\n\n if (authRes.connection?.ok) {\n return setConnectionStatus(\"connected\");\n }\n\n if (!authRes.connection?.ok) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is a normal response for a tenant that doesn't have an access\n // token set on it, meaning it's not connected to Slack, so we\n // give it a \"disconnected\" status instead of an error status.\n if (\n authRes.code === \"ERR_BAD_REQUEST\" &&\n authRes.response?.data?.message === t(\"slackAccessTokenNotSet\")\n ) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is for an error coming directly from Slack.\n if (!authRes.connection?.ok && authRes.connection?.error) {\n const errorLabel = formatSlackErrorMessage(authRes.connection?.error);\n setErrorLabel(errorLabel);\n setConnectionStatus(\"error\");\n return;\n }\n\n // This is for any Knock errors that would require a reconnect.\n\n setConnectionStatus(\"error\");\n } catch (_error) {\n setConnectionStatus(\"error\");\n }\n };\n\n checkAuthStatus();\n }, [connectionStatus, tenantId, knockSlackChannelId, knock.slack, t]);\n\n return {\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n };\n}\n\nexport default useSlackConnectionStatus;\n"],"names":["formatSlackErrorMessage","errorMessage","firstLetter","substring","toUpperCase","rest","concat","replace","useSlackConnectionStatus","knock","knockSlackChannelId","tenantId","t","useTranslations","connectionStatus","setConnectionStatus","useState","errorLabel","setErrorLabel","actionLabel","setActionLabel","useEffect","authRes","slack","authCheck","tenant","knockChannelId","connection","ok","code","response","data","message","error"],"mappings":"gJA2BMA,EAA2BC,GAAyB,CACxD,MAAMC,EAAcD,EAAaE,UAAU,EAAG,CAAC,EAAEC,YAAY,EACvDC,EAAOJ,EAAaE,UAAU,CAAC,EACrC,OAAOD,GAAAA,YAAAA,EAAaI,OAAOD,GAAME,QAAQ,IAAK,IAChD,EAEA,SAASC,EACPC,EACAC,EACAC,EACgC,CAC1B,KAAA,CAAEC,EAAAA,GAAMC,kBAAgB,EACxB,CAACC,EAAkBC,CAAmB,EAC1CC,EAAAA,SAA2B,YAAY,EACnC,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAwB,IAAI,EAC1D,CAACG,EAAaC,CAAc,EAAIJ,EAAAA,SAAwB,IAAI,EAElEK,OAAAA,EAAAA,UAAU,IAAM,EACU,SAAY,mBAClC,GAAIP,IAAqB,aAErB,GAAA,CACF,MAAMQ,EAAU,MAAMb,EAAMc,MAAMC,UAAU,CAC1CC,OAAQd,EACRe,eAAgBhB,CAAAA,CACjB,EAEGY,IAAAA,EAAAA,EAAQK,aAARL,MAAAA,EAAoBM,GACtB,OAAOb,EAAoB,WAAW,EAWtCO,GARE,GAACA,EAAAA,EAAQK,aAARL,MAAAA,EAAoBM,KAQvBN,EAAQO,OAAS,qBACjBP,GAAAA,EAAAA,EAAQQ,WAARR,YAAAA,EAAkBS,OAAlBT,YAAAA,EAAwBU,WAAYpB,EAAE,wBAAwB,EAE9D,OAAOG,EAAoB,cAAc,EAI3C,GAAI,GAACO,EAAAA,EAAQK,aAARL,MAAAA,EAAoBM,OAAMN,EAAAA,EAAQK,aAARL,MAAAA,EAAoBW,OAAO,CACxD,MAAMhB,EAAajB,GAAwBsB,EAAAA,EAAQK,aAARL,YAAAA,EAAoBW,KAAK,EACpEf,EAAcD,CAAU,EACxBF,EAAoB,OAAO,EAC3B,MAAA,CAKFA,EAAoB,OAAO,OACZ,CACfA,EAAoB,OAAO,CAAA,CAE/B,GAEgB,CAAA,EACf,CAACD,EAAkBH,EAAUD,EAAqBD,EAAMc,MAAOX,CAAC,CAAC,EAE7D,CACLE,iBAAAA,EACAC,oBAAAA,EACAE,WAAAA,EACAC,cAAAA,EACAC,YAAAA,EACAC,eAAAA,CACF,CACF"}