@knocklabs/react-core 0.3.0-rc-2.0 → 0.3.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 (124) hide show
  1. package/CHANGELOG.md +26 -5
  2. package/dist/cjs/index.js +1 -1
  3. package/dist/cjs/modules/core/context/KnockProvider.js +1 -1
  4. package/dist/cjs/modules/core/context/KnockProvider.js.map +1 -1
  5. package/dist/cjs/modules/core/hooks/useStableOptions.js +1 -1
  6. package/dist/cjs/modules/core/hooks/useStableOptions.js.map +1 -1
  7. package/dist/cjs/modules/core/utils.js +1 -1
  8. package/dist/cjs/modules/core/utils.js.map +1 -1
  9. package/dist/cjs/modules/feed/context/KnockFeedProvider.js +1 -1
  10. package/dist/cjs/modules/feed/context/KnockFeedProvider.js.map +1 -1
  11. package/dist/cjs/modules/i18n/languages/en.js +1 -1
  12. package/dist/cjs/modules/i18n/languages/en.js.map +1 -1
  13. package/dist/cjs/modules/i18n/languages/index.js.map +1 -1
  14. package/dist/cjs/modules/ms-teams/context/KnockMsTeamsProvider.js +2 -0
  15. package/dist/cjs/modules/ms-teams/context/KnockMsTeamsProvider.js.map +1 -0
  16. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsAuth.js +2 -0
  17. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsAuth.js.map +1 -0
  18. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsConnectionStatus.js +2 -0
  19. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsConnectionStatus.js.map +1 -0
  20. package/dist/cjs/modules/slack/context/KnockSlackProvider.js +1 -1
  21. package/dist/cjs/modules/slack/hooks/useConnectedSlackChannels.js +1 -1
  22. package/dist/cjs/modules/slack/hooks/useConnectedSlackChannels.js.map +1 -1
  23. package/dist/cjs/modules/slack/hooks/useSlackAuth.js +1 -1
  24. package/dist/cjs/modules/slack/hooks/useSlackAuth.js.map +1 -1
  25. package/dist/cjs/modules/slack/hooks/useSlackChannels.js +1 -1
  26. package/dist/cjs/modules/slack/hooks/useSlackConnectionStatus.js.map +1 -1
  27. package/dist/esm/index.mjs +42 -40
  28. package/dist/esm/index.mjs.map +1 -1
  29. package/dist/esm/modules/core/context/KnockProvider.mjs +15 -15
  30. package/dist/esm/modules/core/context/KnockProvider.mjs.map +1 -1
  31. package/dist/esm/modules/core/hooks/useStableOptions.mjs +8 -8
  32. package/dist/esm/modules/core/hooks/useStableOptions.mjs.map +1 -1
  33. package/dist/esm/modules/core/utils.mjs +13 -4
  34. package/dist/esm/modules/core/utils.mjs.map +1 -1
  35. package/dist/esm/modules/feed/context/KnockFeedProvider.mjs +14 -20
  36. package/dist/esm/modules/feed/context/KnockFeedProvider.mjs.map +1 -1
  37. package/dist/esm/modules/i18n/languages/en.mjs +9 -0
  38. package/dist/esm/modules/i18n/languages/en.mjs.map +1 -1
  39. package/dist/esm/modules/i18n/languages/index.mjs.map +1 -1
  40. package/dist/esm/modules/ms-teams/context/KnockMsTeamsProvider.mjs +45 -0
  41. package/dist/esm/modules/ms-teams/context/KnockMsTeamsProvider.mjs.map +1 -0
  42. package/dist/esm/modules/ms-teams/hooks/useMsTeamsAuth.mjs +51 -0
  43. package/dist/esm/modules/ms-teams/hooks/useMsTeamsAuth.mjs.map +1 -0
  44. package/dist/esm/modules/ms-teams/hooks/useMsTeamsConnectionStatus.mjs +38 -0
  45. package/dist/esm/modules/ms-teams/hooks/useMsTeamsConnectionStatus.mjs.map +1 -0
  46. package/dist/esm/modules/slack/context/KnockSlackProvider.mjs +1 -1
  47. package/dist/esm/modules/slack/hooks/useConnectedSlackChannels.mjs +3 -3
  48. package/dist/esm/modules/slack/hooks/useConnectedSlackChannels.mjs.map +1 -1
  49. package/dist/esm/modules/slack/hooks/useSlackAuth.mjs +1 -1
  50. package/dist/esm/modules/slack/hooks/useSlackAuth.mjs.map +1 -1
  51. package/dist/esm/modules/slack/hooks/useSlackChannels.mjs +1 -1
  52. package/dist/esm/modules/slack/hooks/useSlackConnectionStatus.mjs.map +1 -1
  53. package/dist/types/index.d.ts +1 -1
  54. package/dist/types/index.d.ts.map +1 -1
  55. package/dist/types/modules/core/context/KnockProvider.d.ts +0 -1
  56. package/dist/types/modules/core/context/KnockProvider.d.ts.map +1 -1
  57. package/dist/types/modules/core/hooks/useAuthenticatedKnockClient.d.ts +0 -1
  58. package/dist/types/modules/core/utils.d.ts +6 -1
  59. package/dist/types/modules/core/utils.d.ts.map +1 -1
  60. package/dist/types/modules/feed/context/KnockFeedProvider.d.ts +0 -1
  61. package/dist/types/modules/feed/context/KnockFeedProvider.d.ts.map +1 -1
  62. package/dist/types/modules/feed/hooks/useFeedSettings.d.ts +0 -1
  63. package/dist/types/modules/feed/hooks/useNotificationStore.d.ts +0 -1
  64. package/dist/types/modules/feed/hooks/useNotifications.d.ts +0 -1
  65. package/dist/types/modules/i18n/context/KnockI18nProvider.d.ts +0 -1
  66. package/dist/types/modules/i18n/languages/de.d.ts +0 -1
  67. package/dist/types/modules/i18n/languages/en.d.ts +0 -1
  68. package/dist/types/modules/i18n/languages/en.d.ts.map +1 -1
  69. package/dist/types/modules/i18n/languages/index.d.ts +9 -0
  70. package/dist/types/modules/i18n/languages/index.d.ts.map +1 -1
  71. package/dist/types/modules/ms-teams/context/KnockMsTeamsProvider.d.ts +20 -0
  72. package/dist/types/modules/ms-teams/context/KnockMsTeamsProvider.d.ts.map +1 -0
  73. package/dist/types/modules/ms-teams/context/index.d.ts +2 -0
  74. package/dist/types/modules/ms-teams/context/index.d.ts.map +1 -0
  75. package/dist/types/modules/ms-teams/hooks/index.d.ts +3 -0
  76. package/dist/types/modules/ms-teams/hooks/index.d.ts.map +1 -0
  77. package/dist/types/modules/ms-teams/hooks/useMsTeamsAuth.d.ts +7 -0
  78. package/dist/types/modules/ms-teams/hooks/useMsTeamsAuth.d.ts.map +1 -0
  79. package/dist/types/modules/ms-teams/hooks/useMsTeamsConnectionStatus.d.ts +13 -0
  80. package/dist/types/modules/ms-teams/hooks/useMsTeamsConnectionStatus.d.ts.map +1 -0
  81. package/dist/types/modules/ms-teams/index.d.ts.map +1 -0
  82. package/dist/types/modules/slack/hooks/useConnectedSlackChannels.d.ts +0 -1
  83. package/dist/types/modules/slack/hooks/useSlackChannels.d.ts +0 -1
  84. package/dist/types/modules/slack/hooks/useSlackConnectionStatus.d.ts +0 -1
  85. package/package.json +8 -10
  86. package/src/index.ts +1 -1
  87. package/src/modules/core/context/KnockProvider.tsx +8 -6
  88. package/src/modules/core/hooks/useStableOptions.ts +2 -2
  89. package/src/modules/core/utils.ts +21 -1
  90. package/src/modules/feed/context/KnockFeedProvider.tsx +6 -11
  91. package/src/modules/i18n/languages/en.ts +10 -0
  92. package/src/modules/i18n/languages/index.ts +9 -0
  93. package/src/modules/ms-teams/context/KnockMsTeamsProvider.tsx +74 -0
  94. package/src/modules/ms-teams/context/index.ts +1 -0
  95. package/src/modules/ms-teams/hooks/index.ts +2 -0
  96. package/src/modules/ms-teams/hooks/useMsTeamsAuth.ts +84 -0
  97. package/src/modules/ms-teams/hooks/useMsTeamsConnectionStatus.ts +82 -0
  98. package/src/modules/ms-teams/index.ts +2 -0
  99. package/src/modules/slack/hooks/useConnectedSlackChannels.ts +1 -1
  100. package/src/modules/slack/hooks/useSlackAuth.ts +1 -1
  101. package/src/modules/slack/hooks/useSlackConnectionStatus.ts +1 -1
  102. package/dist/cjs/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.js +0 -2
  103. package/dist/cjs/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.js.map +0 -1
  104. package/dist/cjs/modules/in-app-messages/hooks/useInAppMessages.js +0 -2
  105. package/dist/cjs/modules/in-app-messages/hooks/useInAppMessages.js.map +0 -1
  106. package/dist/esm/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.mjs +0 -33
  107. package/dist/esm/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.mjs.map +0 -1
  108. package/dist/esm/modules/in-app-messages/hooks/useInAppMessages.mjs +0 -41
  109. package/dist/esm/modules/in-app-messages/hooks/useInAppMessages.mjs.map +0 -1
  110. package/dist/types/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.d.ts +0 -16
  111. package/dist/types/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.d.ts.map +0 -1
  112. package/dist/types/modules/in-app-messages/context/index.d.ts +0 -2
  113. package/dist/types/modules/in-app-messages/context/index.d.ts.map +0 -1
  114. package/dist/types/modules/in-app-messages/hooks/index.d.ts +0 -2
  115. package/dist/types/modules/in-app-messages/hooks/index.d.ts.map +0 -1
  116. package/dist/types/modules/in-app-messages/hooks/useInAppMessages.d.ts +0 -21
  117. package/dist/types/modules/in-app-messages/hooks/useInAppMessages.d.ts.map +0 -1
  118. package/dist/types/modules/in-app-messages/index.d.ts.map +0 -1
  119. package/src/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.tsx +0 -68
  120. package/src/modules/in-app-messages/context/index.ts +0 -1
  121. package/src/modules/in-app-messages/hooks/index.ts +0 -1
  122. package/src/modules/in-app-messages/hooks/useInAppMessages.ts +0 -87
  123. package/src/modules/in-app-messages/index.ts +0 -3
  124. /package/dist/types/modules/{in-app-messages → ms-teams}/index.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/modules/core/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE/D;AAED,KAAK,sBAAsB,GAAG;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,sBAA2B,UAYrC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,aAExE;AAMD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,UAYhC;AAMD,wBAAgB,gBAAgB,CAAC,EAC/B,mBAAmB,EACnB,MAAM,EACN,gBAAgB,EAChB,UAAU,GACX,EAAE;IACD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,UAIA"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/modules/core/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE/D;AAED,KAAK,sBAAsB,GAAG;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,sBAA2B,UAYrC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,aAExE;AAMD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,UAYhC;AAMD,wBAAgB,gBAAgB,CAAC,EAC/B,mBAAmB,EACnB,MAAM,EACN,gBAAgB,EAChB,UAAU,GACX,EAAE;IACD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,UAIA;AAMD,wBAAgB,kBAAkB,CAAC,EACjC,qBAAqB,EACrB,QAAQ,EACR,gBAAgB,EAChB,UAAU,GACX,EAAE;IACD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,UAIA"}
@@ -2,7 +2,6 @@ import { default as Knock, Feed, FeedClientOptions, FeedStoreState } from '@knoc
2
2
  import { PropsWithChildren } from 'react';
3
3
  import { UseBoundStore } from 'zustand';
4
4
  import { ColorMode } from '../../core/constants';
5
-
6
5
  import * as React from "react";
7
6
  export interface KnockFeedProviderState {
8
7
  knock: Knock;
@@ -1 +1 @@
1
- {"version":3,"file":"KnockFeedProvider.d.ts","sourceRoot":"","sources":["../../../../../src/modules/feed/context/KnockFeedProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,IAAI,EACJ,iBAAiB,EACjB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKjD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,IAAI,CAAC;IACjB,YAAY,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC5C,SAAS,EAAE,SAAS,CAAC;CACtB;AAMD,MAAM,WAAW,sBAAsB;IAErC,MAAM,EAAE,MAAM,CAAC;IAGf,SAAS,CAAC,EAAE,SAAS,CAAC;IAGtB,kBAAkB,CAAC,EAAE,iBAAiB,CAAC;CACxC;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CACtC,iBAAiB,CAAC,sBAAsB,CAAC,CAyB1C,CAAC;AAEF,eAAO,MAAM,YAAY,QAAO,sBAO/B,CAAC"}
1
+ {"version":3,"file":"KnockFeedProvider.d.ts","sourceRoot":"","sources":["../../../../../src/modules/feed/context/KnockFeedProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,IAAI,EACJ,iBAAiB,EACjB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKjD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,IAAI,CAAC;IACjB,YAAY,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC5C,SAAS,EAAE,SAAS,CAAC;CACtB;AAMD,MAAM,WAAW,sBAAsB;IAErC,MAAM,EAAE,MAAM,CAAC;IAGf,SAAS,CAAC,EAAE,SAAS,CAAC;IAGtB,kBAAkB,CAAC,EAAE,iBAAiB,CAAC;CACxC;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CACtC,iBAAiB,CAAC,sBAAsB,CAAC,CAmB1C,CAAC;AAEF,eAAO,MAAM,YAAY,QAAO,sBAQ/B,CAAC"}
@@ -1,5 +1,4 @@
1
1
  import { Feed } from '@knocklabs/client';
2
-
3
2
  export type FeedSettings = {
4
3
  features: {
5
4
  branding_required: boolean;
@@ -1,6 +1,5 @@
1
1
  import { Feed, FeedStoreState } from '@knocklabs/client';
2
2
  import { StateSelector } from 'zustand';
3
-
4
3
  declare function useCreateNotificationStore(feedClient: Feed): import('zustand').UseBoundStore<FeedStoreState, import('zustand').StoreApi<FeedStoreState>>;
5
4
  declare function useNotificationStore(feedClient: Feed, selector?: StateSelector<FeedStoreState, FeedStoreState>): FeedStoreState;
6
5
  export { useCreateNotificationStore };
@@ -1,5 +1,4 @@
1
1
  import { default as Knock, Feed, FeedClientOptions } from '@knocklabs/client';
2
-
3
2
  declare function useNotifications(knock: Knock, feedChannelId: string, options?: FeedClientOptions): Feed;
4
3
  export default useNotifications;
5
4
  //# sourceMappingURL=useNotifications.d.ts.map
@@ -1,6 +1,5 @@
1
1
  import { default as React, FunctionComponent, PropsWithChildren } from 'react';
2
2
  import { I18nContent } from '../languages';
3
-
4
3
  export declare const I18nContext: React.Context<I18nContent>;
5
4
  export interface KnockI18nProviderProps {
6
5
  i18n?: I18nContent;
@@ -1,5 +1,4 @@
1
1
  import { I18nContent } from '.';
2
-
3
2
  declare const de: I18nContent;
4
3
  export default de;
5
4
  //# sourceMappingURL=de.d.ts.map
@@ -1,5 +1,4 @@
1
1
  import { I18nContent } from '.';
2
-
3
2
  declare const en: I18nContent;
4
3
  export default en;
5
4
  //# sourceMappingURL=en.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../../../src/modules/i18n/languages/en.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,CAAC;AAEhC,QAAA,MAAM,EAAE,EAAE,WAsCT,CAAC;AAEF,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../../../src/modules/i18n/languages/en.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,CAAC;AAEhC,QAAA,MAAM,EAAE,EAAE,WAgDT,CAAC;AAEF,eAAe,EAAE,CAAC"}
@@ -10,6 +10,15 @@ export interface Translations {
10
10
  readonly unread: string;
11
11
  readonly read: string;
12
12
  readonly unseen: string;
13
+ readonly msTeamsConnect: string;
14
+ readonly msTeamsConnected: string;
15
+ readonly msTeamsConnecting: string;
16
+ readonly msTeamsConnectContainerDescription: string;
17
+ readonly msTeamsDisconnect: string;
18
+ readonly msTeamsDisconnecting: string;
19
+ readonly msTeamsError: string;
20
+ readonly msTeamsReconnect: string;
21
+ readonly msTeamsTenantIdNotSet: string;
13
22
  readonly slackConnectChannel: string;
14
23
  readonly slackChannelId: string;
15
24
  readonly slackConnecting: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/modules/i18n/languages/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gCAAgC,EAAE,MAAM,CAAC;IAClD,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,8BAA8B,EAAE,MAAM,CAAC;IAChD,QAAQ,CAAC,iCAAiC,EAAE,MAAM,CAAC;IACnD,QAAQ,CAAC,6BAA6B,EAAE,MAAM,CAAC;IAC/C,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAC;IAC7C,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,4BAA4B,EAAE,MAAM,CAAC;IAC9C,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,4BAA4B,EAAE,MAAM,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,OAAO;;;CAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/modules/i18n/languages/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,kCAAkC,EAAE,MAAM,CAAC;IACpD,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gCAAgC,EAAE,MAAM,CAAC;IAClD,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,8BAA8B,EAAE,MAAM,CAAC;IAChD,QAAQ,CAAC,iCAAiC,EAAE,MAAM,CAAC;IACnD,QAAQ,CAAC,6BAA6B,EAAE,MAAM,CAAC;IAC/C,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAC;IAC7C,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,4BAA4B,EAAE,MAAM,CAAC;IAC9C,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,4BAA4B,EAAE,MAAM,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,OAAO;;;CAAa,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { PropsWithChildren } from 'react';
2
+ import { ConnectionStatus } from '../hooks/useMsTeamsConnectionStatus';
3
+ import * as React from "react";
4
+ export interface KnockMsTeamsProviderState {
5
+ knockMsTeamsChannelId: string;
6
+ tenantId: string;
7
+ connectionStatus: ConnectionStatus;
8
+ setConnectionStatus: (connectionStatus: ConnectionStatus) => void;
9
+ errorLabel: string | null;
10
+ setErrorLabel: (label: string) => void;
11
+ actionLabel: string | null;
12
+ setActionLabel: (label: string | null) => void;
13
+ }
14
+ export interface KnockMsTeamsProviderProps {
15
+ knockMsTeamsChannelId: string;
16
+ tenantId: string;
17
+ }
18
+ export declare const KnockMsTeamsProvider: React.FC<PropsWithChildren<KnockMsTeamsProviderProps>>;
19
+ export declare const useKnockMsTeamsClient: () => KnockMsTeamsProviderState;
20
+ //# sourceMappingURL=KnockMsTeamsProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnockMsTeamsProvider.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ms-teams/context/KnockMsTeamsProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAK1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAEvE,MAAM,WAAW,yBAAyB;IACxC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,mBAAmB,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAChD;AAKD,MAAM,WAAW,yBAAyB;IACxC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CACzC,iBAAiB,CAAC,yBAAyB,CAAC,CAmC7C,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAO,yBAQxC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './KnockMsTeamsProvider';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ms-teams/context/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as useMsTeamsConnectionStatus } from './useMsTeamsConnectionStatus';
2
+ export { default as useMsTeamsAuth } from './useMsTeamsAuth';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ms-teams/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface UseMsTeamsAuthOutput {
2
+ buildMsTeamsAuthUrl: () => string;
3
+ disconnectFromMsTeams: () => void;
4
+ }
5
+ declare function useMsTeamsAuth(msTeamsBotId: string, redirectUrl?: string): UseMsTeamsAuthOutput;
6
+ export default useMsTeamsAuth;
7
+ //# sourceMappingURL=useMsTeamsAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMsTeamsAuth.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ms-teams/hooks/useMsTeamsAuth.ts"],"names":[],"mappings":"AAWA,UAAU,oBAAoB;IAC5B,mBAAmB,EAAE,MAAM,MAAM,CAAC;IAClC,qBAAqB,EAAE,MAAM,IAAI,CAAC;CACnC;AAED,iBAAS,cAAc,CACrB,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,GACnB,oBAAoB,CA8DtB;AAED,eAAe,cAAc,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { default as Knock } from '@knocklabs/client';
2
+ export type ConnectionStatus = "connecting" | "connected" | "disconnected" | "error" | "disconnecting";
3
+ type UseMsTeamsConnectionStatusOutput = {
4
+ connectionStatus: ConnectionStatus;
5
+ setConnectionStatus: (status: ConnectionStatus) => void;
6
+ errorLabel: string | null;
7
+ setErrorLabel: (errorLabel: string) => void;
8
+ actionLabel: string | null;
9
+ setActionLabel: (actionLabel: string | null) => void;
10
+ };
11
+ declare function useMsTeamsConnectionStatus(knock: Knock, knockMsTeamsChannelId: string, tenantId: string): UseMsTeamsConnectionStatusOutput;
12
+ export default useMsTeamsConnectionStatus;
13
+ //# sourceMappingURL=useMsTeamsConnectionStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMsTeamsConnectionStatus.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ms-teams/hooks/useMsTeamsConnectionStatus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,mBAAmB,CAAC;AAKtC,MAAM,MAAM,gBAAgB,GACxB,YAAY,GACZ,WAAW,GACX,cAAc,GACd,OAAO,GACP,eAAe,CAAC;AAEpB,KAAK,gCAAgC,GAAG;IACtC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,mBAAmB,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACxD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACtD,CAAC;AAEF,iBAAS,0BAA0B,CACjC,KAAK,EAAE,KAAK,EACZ,qBAAqB,EAAE,MAAM,EAC7B,QAAQ,EAAE,MAAM,GACf,gCAAgC,CAsDlC;AAED,eAAe,0BAA0B,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/ms-teams/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC"}
@@ -1,6 +1,5 @@
1
1
  import { ContainerObject } from '..';
2
2
  import { SlackChannelConnection } from '@knocklabs/client';
3
-
4
3
  type UseSlackChannelsProps = {
5
4
  slackChannelsRecipientObject: ContainerObject;
6
5
  };
@@ -1,6 +1,5 @@
1
1
  import { SlackChannelQueryOptions } from '..';
2
2
  import { SlackChannel } from '@knocklabs/client';
3
-
4
3
  type UseSlackChannelsProps = {
5
4
  queryOptions?: SlackChannelQueryOptions;
6
5
  };
@@ -1,5 +1,4 @@
1
1
  import { default as Knock } from '@knocklabs/client';
2
-
3
2
  export type ConnectionStatus = "connecting" | "connected" | "disconnected" | "error" | "disconnecting";
4
3
  type UseSlackConnectionStatusOutput = {
5
4
  connectionStatus: ConnectionStatus;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@knocklabs/react-core",
3
3
  "description": "A set of React components to build notification experiences powered by Knock",
4
4
  "author": "@knocklabs",
5
- "version": "0.3.0-rc-2.0",
5
+ "version": "0.3.0",
6
6
  "license": "MIT",
7
7
  "main": "dist/cjs/index.js",
8
8
  "module": "dist/esm/index.mjs",
@@ -49,30 +49,28 @@
49
49
  "react": "^16.11.0 || ^17.0.0 || ^18.0.0"
50
50
  },
51
51
  "dependencies": {
52
- "@knocklabs/client": "^0.11.0-rc-2.0",
53
- "@tanstack/react-store": "^0.5.5",
52
+ "@knocklabs/client": "^0.11.0",
54
53
  "date-fns": "^4.0.0",
55
- "fast-deep-equal": "^3.1.3",
56
54
  "swr": "^2.2.5",
57
55
  "zustand": "^3.7.2"
58
56
  },
59
57
  "devDependencies": {
60
58
  "@testing-library/react": "^14.2.0",
61
59
  "@types/react": "^18.3.6",
62
- "@typescript-eslint/eslint-plugin": "^6.20.0",
63
- "@typescript-eslint/parser": "^8.8.1",
64
- "@vitejs/plugin-react": "^4.3.3",
60
+ "@typescript-eslint/eslint-plugin": "^8.19.1",
61
+ "@typescript-eslint/parser": "^8.16.0",
62
+ "@vitejs/plugin-react": "^4.3.4",
65
63
  "babel-plugin-react-require": "^4.0.3",
66
64
  "eslint": "^8.56.0",
67
65
  "eslint-plugin-react-hooks": "^5.0.0",
68
- "eslint-plugin-react-refresh": "^0.4.4",
69
- "jsdom": "^24.0.0",
66
+ "eslint-plugin-react-refresh": "^0.4.14",
67
+ "jsdom": "^25.0.1",
70
68
  "react": "^18.2.0",
71
69
  "rimraf": "^6.0.1",
72
70
  "rollup-plugin-execute": "^1.1.1",
73
71
  "typescript": "^5.6.3",
74
72
  "vite": "^5.0.0",
75
- "vite-plugin-dts": "^3.6.3",
73
+ "vite-plugin-dts": "^4.3.0",
76
74
  "vite-plugin-no-bundle": "^4.0.0",
77
75
  "vitest": "^2.1.4"
78
76
  }
package/src/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export * from "./modules/core";
2
2
  export * from "./modules/feed";
3
- export * from "./modules/in-app-messages";
3
+ export * from "./modules/ms-teams";
4
4
  export * from "./modules/slack";
5
5
  export * from "./modules/i18n";
@@ -9,7 +9,9 @@ export interface KnockProviderState {
9
9
  knock: Knock;
10
10
  }
11
11
 
12
- const KnockContext = React.createContext<KnockProviderState | null>(null);
12
+ const ProviderStateContext = React.createContext<KnockProviderState | null>(
13
+ null,
14
+ );
13
15
 
14
16
  export interface KnockProviderProps {
15
17
  // Knock client props
@@ -57,20 +59,20 @@ export const KnockProvider: React.FC<PropsWithChildren<KnockProviderProps>> = ({
57
59
  );
58
60
 
59
61
  return (
60
- <KnockContext.Provider
62
+ <ProviderStateContext.Provider
61
63
  value={{
62
64
  knock,
63
65
  }}
64
66
  >
65
67
  <KnockI18nProvider i18n={i18n}>{children}</KnockI18nProvider>
66
- </KnockContext.Provider>
68
+ </ProviderStateContext.Provider>
67
69
  );
68
70
  };
69
71
 
70
72
  export const useKnockClient = (): Knock => {
71
- const context = React.useContext(KnockContext);
72
- if (!context) {
73
- throw new Error("useKnockClient must be used within a KnockProvider");
73
+ const context = React.useContext(ProviderStateContext) as KnockProviderState;
74
+ if (context === undefined) {
75
+ throw new Error("useKnock must be used within a KnockProvider");
74
76
  }
75
77
  return context.knock;
76
78
  };
@@ -1,5 +1,5 @@
1
- import fastDeepEqual from "fast-deep-equal";
2
1
  import { useMemo, useRef } from "react";
2
+ import shallow from "zustand/shallow";
3
3
 
4
4
  export default function useStableOptions<T>(options: T): T {
5
5
  const optionsRef = useRef<T>();
@@ -7,7 +7,7 @@ export default function useStableOptions<T>(options: T): T {
7
7
  return useMemo(() => {
8
8
  const currentOptions = optionsRef.current;
9
9
 
10
- if (currentOptions && fastDeepEqual(options, currentOptions)) {
10
+ if (currentOptions && shallow(options, currentOptions)) {
11
11
  return currentOptions;
12
12
  }
13
13
 
@@ -21,7 +21,7 @@ export function formatTimestamp(
21
21
  });
22
22
 
23
23
  return formatted;
24
- } catch (e) {
24
+ } catch (_e) {
25
25
  return ts;
26
26
  }
27
27
  }
@@ -74,3 +74,23 @@ export function slackProviderKey({
74
74
  .filter((f) => f !== null && f !== undefined)
75
75
  .join("-");
76
76
  }
77
+
78
+ /*
79
+ Used to build a consistent key for the KnockMsTeamsProvider so that React knows when
80
+ to trigger a re-render of the context when a key property changes.
81
+ */
82
+ export function msTeamsProviderKey({
83
+ knockMsTeamsChannelId,
84
+ tenantId,
85
+ connectionStatus,
86
+ errorLabel,
87
+ }: {
88
+ knockMsTeamsChannelId: string;
89
+ tenantId: string;
90
+ connectionStatus: string;
91
+ errorLabel: string | null;
92
+ }) {
93
+ return [knockMsTeamsChannelId, tenantId, connectionStatus, errorLabel]
94
+ .filter((f) => f !== null && f !== undefined)
95
+ .join("-");
96
+ }
@@ -20,7 +20,7 @@ export interface KnockFeedProviderState {
20
20
  colorMode: ColorMode;
21
21
  }
22
22
 
23
- const KnockFeedContext = React.createContext<
23
+ const FeedStateContext = React.createContext<
24
24
  KnockFeedProviderState | undefined
25
25
  >(undefined);
26
26
 
@@ -38,18 +38,12 @@ export interface KnockFeedProviderProps {
38
38
  export const KnockFeedProvider: React.FC<
39
39
  PropsWithChildren<KnockFeedProviderProps>
40
40
  > = ({ feedId, children, defaultFeedOptions = {}, colorMode = "light" }) => {
41
- let knock: Knock;
42
- try {
43
- knock = useKnockClient();
44
- } catch (error) {
45
- throw new Error("KnockFeedProvider must be used within a KnockProvider.");
46
- }
47
-
41
+ const knock = useKnockClient();
48
42
  const feedClient = useNotifications(knock, feedId, defaultFeedOptions);
49
43
  const useFeedStore = useCreateNotificationStore(feedClient);
50
44
 
51
45
  return (
52
- <KnockFeedContext.Provider
46
+ <FeedStateContext.Provider
53
47
  key={feedProviderKey(knock.userId, feedId, defaultFeedOptions)}
54
48
  value={{
55
49
  knock,
@@ -59,12 +53,13 @@ export const KnockFeedProvider: React.FC<
59
53
  }}
60
54
  >
61
55
  {children}
62
- </KnockFeedContext.Provider>
56
+ </FeedStateContext.Provider>
63
57
  );
64
58
  };
65
59
 
66
60
  export const useKnockFeed = (): KnockFeedProviderState => {
67
- const context = React.useContext(KnockFeedContext);
61
+ const context = React.useContext(FeedStateContext);
62
+
68
63
  if (!context) {
69
64
  throw new Error("useKnockFeed must be used within a KnockFeedProvider");
70
65
  }
@@ -12,6 +12,16 @@ const en: I18nContent = {
12
12
  unread: "Unread",
13
13
  read: "Read",
14
14
  unseen: "Unseen",
15
+ msTeamsConnect: "Connect to Microsoft Teams",
16
+ msTeamsConnected: "Connected",
17
+ msTeamsConnecting: "Connecting to Microsoft Teams…",
18
+ msTeamsConnectContainerDescription:
19
+ "Connect to get notifications in Microsoft Teams",
20
+ msTeamsDisconnect: "Disconnect",
21
+ msTeamsDisconnecting: "Disconnecting from Microsoft Teams…",
22
+ msTeamsError: "Error",
23
+ msTeamsReconnect: "Reconnect",
24
+ msTeamsTenantIdNotSet: "Microsoft Teams tenant ID not set.",
15
25
  slackConnectChannel: "Connect channel",
16
26
  slackChannelId: "Slack channel ID",
17
27
  slackConnecting: "Connecting to Slack...",
@@ -13,6 +13,15 @@ export interface Translations {
13
13
  readonly unread: string;
14
14
  readonly read: string;
15
15
  readonly unseen: string;
16
+ readonly msTeamsConnect: string;
17
+ readonly msTeamsConnected: string;
18
+ readonly msTeamsConnecting: string;
19
+ readonly msTeamsConnectContainerDescription: string;
20
+ readonly msTeamsDisconnect: string;
21
+ readonly msTeamsDisconnecting: string;
22
+ readonly msTeamsError: string;
23
+ readonly msTeamsReconnect: string;
24
+ readonly msTeamsTenantIdNotSet: string;
16
25
  readonly slackConnectChannel: string;
17
26
  readonly slackChannelId: string;
18
27
  readonly slackConnecting: string;
@@ -0,0 +1,74 @@
1
+ import * as React from "react";
2
+ import { PropsWithChildren } from "react";
3
+
4
+ import { useKnockClient } from "../../core";
5
+ import { msTeamsProviderKey } from "../../core/utils";
6
+ import { useMsTeamsConnectionStatus } from "../hooks";
7
+ import { ConnectionStatus } from "../hooks/useMsTeamsConnectionStatus";
8
+
9
+ export interface KnockMsTeamsProviderState {
10
+ knockMsTeamsChannelId: string;
11
+ tenantId: string;
12
+ connectionStatus: ConnectionStatus;
13
+ setConnectionStatus: (connectionStatus: ConnectionStatus) => void;
14
+ errorLabel: string | null;
15
+ setErrorLabel: (label: string) => void;
16
+ actionLabel: string | null;
17
+ setActionLabel: (label: string | null) => void;
18
+ }
19
+
20
+ const MsTeamsProviderStateContext =
21
+ React.createContext<KnockMsTeamsProviderState | null>(null);
22
+
23
+ export interface KnockMsTeamsProviderProps {
24
+ knockMsTeamsChannelId: string;
25
+ tenantId: string;
26
+ }
27
+
28
+ export const KnockMsTeamsProvider: React.FC<
29
+ PropsWithChildren<KnockMsTeamsProviderProps>
30
+ > = ({ knockMsTeamsChannelId, tenantId, children }) => {
31
+ const knock = useKnockClient();
32
+
33
+ const {
34
+ connectionStatus,
35
+ setConnectionStatus,
36
+ errorLabel,
37
+ setErrorLabel,
38
+ actionLabel,
39
+ setActionLabel,
40
+ } = useMsTeamsConnectionStatus(knock, knockMsTeamsChannelId, tenantId);
41
+
42
+ return (
43
+ <MsTeamsProviderStateContext.Provider
44
+ key={msTeamsProviderKey({
45
+ knockMsTeamsChannelId,
46
+ tenantId,
47
+ connectionStatus,
48
+ errorLabel,
49
+ })}
50
+ value={{
51
+ connectionStatus,
52
+ setConnectionStatus,
53
+ errorLabel,
54
+ setErrorLabel,
55
+ actionLabel,
56
+ setActionLabel,
57
+ knockMsTeamsChannelId,
58
+ tenantId,
59
+ }}
60
+ >
61
+ {children}
62
+ </MsTeamsProviderStateContext.Provider>
63
+ );
64
+ };
65
+
66
+ export const useKnockMsTeamsClient = (): KnockMsTeamsProviderState => {
67
+ const context = React.useContext(MsTeamsProviderStateContext);
68
+ if (!context) {
69
+ throw new Error(
70
+ "useKnockMsTeamsClient must be used within a KnockMsTeamsProvider",
71
+ );
72
+ }
73
+ return context;
74
+ };
@@ -0,0 +1 @@
1
+ export * from "./KnockMsTeamsProvider";
@@ -0,0 +1,2 @@
1
+ export { default as useMsTeamsConnectionStatus } from "./useMsTeamsConnectionStatus";
2
+ export { default as useMsTeamsAuth } from "./useMsTeamsAuth";
@@ -0,0 +1,84 @@
1
+ import { useKnockMsTeamsClient } from "..";
2
+ import { TENANT_OBJECT_COLLECTION } from "@knocklabs/client";
3
+ import { useCallback, useMemo } from "react";
4
+
5
+ import { useKnockClient } from "../../core";
6
+
7
+ const MS_TEAMS_ADMINCONSENT_URL =
8
+ "https://login.microsoftonline.com/organizations/adminconsent";
9
+
10
+ const AUTH_REDIRECT_PATH = "/providers/ms-teams/authenticate";
11
+
12
+ interface UseMsTeamsAuthOutput {
13
+ buildMsTeamsAuthUrl: () => string;
14
+ disconnectFromMsTeams: () => void;
15
+ }
16
+
17
+ function useMsTeamsAuth(
18
+ msTeamsBotId: string,
19
+ redirectUrl?: string,
20
+ ): UseMsTeamsAuthOutput {
21
+ const knock = useKnockClient();
22
+ const {
23
+ setConnectionStatus,
24
+ knockMsTeamsChannelId,
25
+ tenantId,
26
+ setActionLabel,
27
+ } = useKnockMsTeamsClient();
28
+
29
+ const authRedirectUri = useMemo(
30
+ () => knock.host + AUTH_REDIRECT_PATH,
31
+ [knock.host],
32
+ );
33
+
34
+ const buildMsTeamsAuthUrl = useCallback(() => {
35
+ const rawParams = {
36
+ state: JSON.stringify({
37
+ redirect_url: redirectUrl,
38
+ ms_teams_tenant_object: {
39
+ object_id: tenantId,
40
+ collection: TENANT_OBJECT_COLLECTION,
41
+ },
42
+ channel_id: knockMsTeamsChannelId,
43
+ public_key: knock.apiKey,
44
+ user_token: knock.userToken,
45
+ }),
46
+ client_id: msTeamsBotId,
47
+ redirect_uri: authRedirectUri,
48
+ };
49
+ return `${MS_TEAMS_ADMINCONSENT_URL}?${new URLSearchParams(rawParams)}`;
50
+ }, [
51
+ redirectUrl,
52
+ tenantId,
53
+ knockMsTeamsChannelId,
54
+ knock.apiKey,
55
+ knock.userToken,
56
+ msTeamsBotId,
57
+ authRedirectUri,
58
+ ]);
59
+
60
+ const disconnectFromMsTeams = useCallback(async () => {
61
+ setActionLabel(null);
62
+ setConnectionStatus("disconnecting");
63
+ try {
64
+ const revokeResult = await knock.msTeams.revokeAccessToken({
65
+ tenant: tenantId,
66
+ knockChannelId: knockMsTeamsChannelId,
67
+ });
68
+
69
+ setConnectionStatus(revokeResult === "ok" ? "disconnected" : "error");
70
+ } catch (_error) {
71
+ setConnectionStatus("error");
72
+ }
73
+ }, [
74
+ setConnectionStatus,
75
+ knock.msTeams,
76
+ tenantId,
77
+ knockMsTeamsChannelId,
78
+ setActionLabel,
79
+ ]);
80
+
81
+ return { buildMsTeamsAuthUrl, disconnectFromMsTeams };
82
+ }
83
+
84
+ export default useMsTeamsAuth;