@knocklabs/react-core 0.3.0-rc.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 (113) hide show
  1. package/CHANGELOG.md +33 -4
  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/utils.js +1 -1
  6. package/dist/cjs/modules/core/utils.js.map +1 -1
  7. package/dist/cjs/modules/feed/context/KnockFeedProvider.js +1 -1
  8. package/dist/cjs/modules/feed/context/KnockFeedProvider.js.map +1 -1
  9. package/dist/cjs/modules/i18n/languages/en.js +1 -1
  10. package/dist/cjs/modules/i18n/languages/en.js.map +1 -1
  11. package/dist/cjs/modules/i18n/languages/index.js.map +1 -1
  12. package/dist/cjs/modules/ms-teams/context/KnockMsTeamsProvider.js +2 -0
  13. package/dist/cjs/modules/ms-teams/context/KnockMsTeamsProvider.js.map +1 -0
  14. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsAuth.js +2 -0
  15. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsAuth.js.map +1 -0
  16. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsConnectionStatus.js +2 -0
  17. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsConnectionStatus.js.map +1 -0
  18. package/dist/cjs/modules/slack/hooks/useConnectedSlackChannels.js.map +1 -1
  19. package/dist/cjs/modules/slack/hooks/useSlackAuth.js +1 -1
  20. package/dist/cjs/modules/slack/hooks/useSlackAuth.js.map +1 -1
  21. package/dist/cjs/modules/slack/hooks/useSlackConnectionStatus.js.map +1 -1
  22. package/dist/esm/index.mjs +42 -40
  23. package/dist/esm/index.mjs.map +1 -1
  24. package/dist/esm/modules/core/context/KnockProvider.mjs +14 -14
  25. package/dist/esm/modules/core/context/KnockProvider.mjs.map +1 -1
  26. package/dist/esm/modules/core/utils.mjs +13 -4
  27. package/dist/esm/modules/core/utils.mjs.map +1 -1
  28. package/dist/esm/modules/feed/context/KnockFeedProvider.mjs +13 -19
  29. package/dist/esm/modules/feed/context/KnockFeedProvider.mjs.map +1 -1
  30. package/dist/esm/modules/i18n/languages/en.mjs +9 -0
  31. package/dist/esm/modules/i18n/languages/en.mjs.map +1 -1
  32. package/dist/esm/modules/i18n/languages/index.mjs.map +1 -1
  33. package/dist/esm/modules/ms-teams/context/KnockMsTeamsProvider.mjs +45 -0
  34. package/dist/esm/modules/ms-teams/context/KnockMsTeamsProvider.mjs.map +1 -0
  35. package/dist/esm/modules/ms-teams/hooks/useMsTeamsAuth.mjs +51 -0
  36. package/dist/esm/modules/ms-teams/hooks/useMsTeamsAuth.mjs.map +1 -0
  37. package/dist/esm/modules/ms-teams/hooks/useMsTeamsConnectionStatus.mjs +38 -0
  38. package/dist/esm/modules/ms-teams/hooks/useMsTeamsConnectionStatus.mjs.map +1 -0
  39. package/dist/esm/modules/slack/hooks/useConnectedSlackChannels.mjs +2 -2
  40. package/dist/esm/modules/slack/hooks/useConnectedSlackChannels.mjs.map +1 -1
  41. package/dist/esm/modules/slack/hooks/useSlackAuth.mjs.map +1 -1
  42. package/dist/esm/modules/slack/hooks/useSlackConnectionStatus.mjs.map +1 -1
  43. package/dist/types/index.d.ts +1 -1
  44. package/dist/types/index.d.ts.map +1 -1
  45. package/dist/types/modules/core/context/KnockProvider.d.ts +0 -1
  46. package/dist/types/modules/core/context/KnockProvider.d.ts.map +1 -1
  47. package/dist/types/modules/core/hooks/useAuthenticatedKnockClient.d.ts +0 -1
  48. package/dist/types/modules/core/utils.d.ts +6 -1
  49. package/dist/types/modules/core/utils.d.ts.map +1 -1
  50. package/dist/types/modules/feed/context/KnockFeedProvider.d.ts +0 -1
  51. package/dist/types/modules/feed/context/KnockFeedProvider.d.ts.map +1 -1
  52. package/dist/types/modules/feed/hooks/useFeedSettings.d.ts +0 -1
  53. package/dist/types/modules/feed/hooks/useNotificationStore.d.ts +0 -1
  54. package/dist/types/modules/feed/hooks/useNotifications.d.ts +0 -1
  55. package/dist/types/modules/i18n/context/KnockI18nProvider.d.ts +0 -1
  56. package/dist/types/modules/i18n/languages/de.d.ts +0 -1
  57. package/dist/types/modules/i18n/languages/en.d.ts +0 -1
  58. package/dist/types/modules/i18n/languages/en.d.ts.map +1 -1
  59. package/dist/types/modules/i18n/languages/index.d.ts +9 -0
  60. package/dist/types/modules/i18n/languages/index.d.ts.map +1 -1
  61. package/dist/types/modules/ms-teams/context/KnockMsTeamsProvider.d.ts +20 -0
  62. package/dist/types/modules/ms-teams/context/KnockMsTeamsProvider.d.ts.map +1 -0
  63. package/dist/types/modules/ms-teams/context/index.d.ts +2 -0
  64. package/dist/types/modules/ms-teams/context/index.d.ts.map +1 -0
  65. package/dist/types/modules/ms-teams/hooks/index.d.ts +3 -0
  66. package/dist/types/modules/ms-teams/hooks/index.d.ts.map +1 -0
  67. package/dist/types/modules/ms-teams/hooks/useMsTeamsAuth.d.ts +7 -0
  68. package/dist/types/modules/ms-teams/hooks/useMsTeamsAuth.d.ts.map +1 -0
  69. package/dist/types/modules/ms-teams/hooks/useMsTeamsConnectionStatus.d.ts +13 -0
  70. package/dist/types/modules/ms-teams/hooks/useMsTeamsConnectionStatus.d.ts.map +1 -0
  71. package/dist/types/modules/ms-teams/index.d.ts.map +1 -0
  72. package/dist/types/modules/slack/hooks/useConnectedSlackChannels.d.ts +0 -1
  73. package/dist/types/modules/slack/hooks/useSlackChannels.d.ts +0 -1
  74. package/dist/types/modules/slack/hooks/useSlackConnectionStatus.d.ts +0 -1
  75. package/package.json +11 -12
  76. package/src/index.ts +1 -1
  77. package/src/modules/core/context/KnockProvider.tsx +8 -6
  78. package/src/modules/core/utils.ts +21 -1
  79. package/src/modules/feed/context/KnockFeedProvider.tsx +6 -11
  80. package/src/modules/i18n/languages/en.ts +10 -0
  81. package/src/modules/i18n/languages/index.ts +9 -0
  82. package/src/modules/ms-teams/context/KnockMsTeamsProvider.tsx +74 -0
  83. package/src/modules/ms-teams/context/index.ts +1 -0
  84. package/src/modules/ms-teams/hooks/index.ts +2 -0
  85. package/src/modules/ms-teams/hooks/useMsTeamsAuth.ts +84 -0
  86. package/src/modules/ms-teams/hooks/useMsTeamsConnectionStatus.ts +82 -0
  87. package/src/modules/ms-teams/index.ts +2 -0
  88. package/src/modules/slack/hooks/useConnectedSlackChannels.ts +1 -1
  89. package/src/modules/slack/hooks/useSlackAuth.ts +1 -1
  90. package/src/modules/slack/hooks/useSlackConnectionStatus.ts +1 -1
  91. package/dist/cjs/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.js +0 -2
  92. package/dist/cjs/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.js.map +0 -1
  93. package/dist/cjs/modules/in-app-messages/hooks/useInAppMessages.js +0 -2
  94. package/dist/cjs/modules/in-app-messages/hooks/useInAppMessages.js.map +0 -1
  95. package/dist/esm/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.mjs +0 -33
  96. package/dist/esm/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.mjs.map +0 -1
  97. package/dist/esm/modules/in-app-messages/hooks/useInAppMessages.mjs +0 -41
  98. package/dist/esm/modules/in-app-messages/hooks/useInAppMessages.mjs.map +0 -1
  99. package/dist/types/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.d.ts +0 -16
  100. package/dist/types/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.d.ts.map +0 -1
  101. package/dist/types/modules/in-app-messages/context/index.d.ts +0 -2
  102. package/dist/types/modules/in-app-messages/context/index.d.ts.map +0 -1
  103. package/dist/types/modules/in-app-messages/hooks/index.d.ts +0 -2
  104. package/dist/types/modules/in-app-messages/hooks/index.d.ts.map +0 -1
  105. package/dist/types/modules/in-app-messages/hooks/useInAppMessages.d.ts +0 -21
  106. package/dist/types/modules/in-app-messages/hooks/useInAppMessages.d.ts.map +0 -1
  107. package/dist/types/modules/in-app-messages/index.d.ts.map +0 -1
  108. package/src/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.tsx +0 -68
  109. package/src/modules/in-app-messages/context/index.ts +0 -1
  110. package/src/modules/in-app-messages/hooks/index.ts +0 -1
  111. package/src/modules/in-app-messages/hooks/useInAppMessages.ts +0 -89
  112. package/src/modules/in-app-messages/index.ts +0 -3
  113. /package/dist/types/modules/{in-app-messages → ms-teams}/index.d.ts +0 -0
@@ -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.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,8 +49,7 @@
49
49
  "react": "^16.11.0 || ^17.0.0 || ^18.0.0"
50
50
  },
51
51
  "dependencies": {
52
- "@knocklabs/client": "^0.11.0-rc.0",
53
- "@tanstack/react-store": "^0.5.5",
52
+ "@knocklabs/client": "^0.11.0",
54
53
  "date-fns": "^4.0.0",
55
54
  "swr": "^2.2.5",
56
55
  "zustand": "^3.7.2"
@@ -58,21 +57,21 @@
58
57
  "devDependencies": {
59
58
  "@testing-library/react": "^14.2.0",
60
59
  "@types/react": "^18.3.6",
61
- "@typescript-eslint/eslint-plugin": "^6.20.0",
62
- "@typescript-eslint/parser": "^8.8.1",
63
- "@vitejs/plugin-react": "^4.3.2",
60
+ "@typescript-eslint/eslint-plugin": "^8.19.1",
61
+ "@typescript-eslint/parser": "^8.16.0",
62
+ "@vitejs/plugin-react": "^4.3.4",
64
63
  "babel-plugin-react-require": "^4.0.3",
65
64
  "eslint": "^8.56.0",
66
- "eslint-plugin-react-hooks": "^4.6.0",
67
- "eslint-plugin-react-refresh": "^0.4.4",
68
- "jsdom": "^24.0.0",
65
+ "eslint-plugin-react-hooks": "^5.0.0",
66
+ "eslint-plugin-react-refresh": "^0.4.14",
67
+ "jsdom": "^25.0.1",
69
68
  "react": "^18.2.0",
70
69
  "rimraf": "^6.0.1",
71
70
  "rollup-plugin-execute": "^1.1.1",
72
- "typescript": "^5.6.2",
71
+ "typescript": "^5.6.3",
73
72
  "vite": "^5.0.0",
74
- "vite-plugin-dts": "^3.6.3",
73
+ "vite-plugin-dts": "^4.3.0",
75
74
  "vite-plugin-no-bundle": "^4.0.0",
76
- "vitest": "^2.0.5"
75
+ "vitest": "^2.1.4"
77
76
  }
78
77
  }
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
  };
@@ -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;
@@ -0,0 +1,82 @@
1
+ import Knock from "@knocklabs/client";
2
+ import { useEffect, useState } from "react";
3
+
4
+ import { useTranslations } from "../../i18n";
5
+
6
+ export type ConnectionStatus =
7
+ | "connecting"
8
+ | "connected"
9
+ | "disconnected"
10
+ | "error"
11
+ | "disconnecting";
12
+
13
+ type UseMsTeamsConnectionStatusOutput = {
14
+ connectionStatus: ConnectionStatus;
15
+ setConnectionStatus: (status: ConnectionStatus) => void;
16
+ errorLabel: string | null;
17
+ setErrorLabel: (errorLabel: string) => void;
18
+ actionLabel: string | null;
19
+ setActionLabel: (actionLabel: string | null) => void;
20
+ };
21
+
22
+ function useMsTeamsConnectionStatus(
23
+ knock: Knock,
24
+ knockMsTeamsChannelId: string,
25
+ tenantId: string,
26
+ ): UseMsTeamsConnectionStatusOutput {
27
+ const { t } = useTranslations();
28
+
29
+ const [connectionStatus, setConnectionStatus] =
30
+ useState<ConnectionStatus>("connecting");
31
+ const [errorLabel, setErrorLabel] = useState<string | null>(null);
32
+ const [actionLabel, setActionLabel] = useState<string | null>(null);
33
+
34
+ useEffect(() => {
35
+ const checkAuthStatus = async () => {
36
+ if (connectionStatus !== "connecting") return;
37
+
38
+ try {
39
+ const authRes = await knock.msTeams.authCheck({
40
+ tenant: tenantId,
41
+ knockChannelId: knockMsTeamsChannelId,
42
+ });
43
+
44
+ if (authRes.connection?.ok === true) {
45
+ return setConnectionStatus("connected");
46
+ }
47
+
48
+ if (authRes.connection?.ok === false) {
49
+ return setConnectionStatus("disconnected");
50
+ }
51
+
52
+ // This is a normal response for a tenant that doesn't have
53
+ // ms_teams_tenant_id set on it, meaning it's not connected to MS Teams,
54
+ // so we give it a "disconnected" status instead of an error status.
55
+ if (
56
+ authRes.code === "ERR_BAD_REQUEST" &&
57
+ authRes.response?.data?.message === t("msTeamsTenantIdNotSet")
58
+ ) {
59
+ return setConnectionStatus("disconnected");
60
+ }
61
+
62
+ // This is for any Knock errors that would require a reconnect.
63
+ setConnectionStatus("error");
64
+ } catch (_error) {
65
+ setConnectionStatus("error");
66
+ }
67
+ };
68
+
69
+ checkAuthStatus();
70
+ }, [connectionStatus, tenantId, knockMsTeamsChannelId, knock.msTeams, t]);
71
+
72
+ return {
73
+ connectionStatus,
74
+ setConnectionStatus,
75
+ errorLabel,
76
+ setErrorLabel,
77
+ actionLabel,
78
+ setActionLabel,
79
+ };
80
+ }
81
+
82
+ export default useMsTeamsConnectionStatus;
@@ -0,0 +1,2 @@
1
+ export * from "./context";
2
+ export * from "./hooks";
@@ -87,7 +87,7 @@ function useConnectedSlackChannels({
87
87
  data: { connections: channelsToSendToKnock },
88
88
  });
89
89
  fetchAndSetConnectedChannels();
90
- } catch (error) {
90
+ } catch (_error) {
91
91
  setError(t("slackChannelSetError") || "");
92
92
  }
93
93
  setIsUpdating(false);
@@ -45,7 +45,7 @@ function useSlackAuth(
45
45
  } else {
46
46
  setConnectionStatus("error");
47
47
  }
48
- } catch (error) {
48
+ } catch (_error) {
49
49
  setConnectionStatus("error");
50
50
  }
51
51
  }, [
@@ -81,7 +81,7 @@ function useSlackConnectionStatus(
81
81
  // This is for any Knock errors that would require a reconnect.
82
82
 
83
83
  setConnectionStatus("error");
84
- } catch (error) {
84
+ } catch (_error) {
85
85
  setConnectionStatus("error");
86
86
  }
87
87
  };
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("@knocklabs/client"),p=require("react"),l=require("../../core/context/KnockProvider.js"),g=require("../../core/hooks/useStableOptions.js");require("date-fns");function d(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 r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(n,t,r.get?r:{enumerable:!0,get:()=>e[t]})}}return n.default=e,Object.freeze(n)}const s=d(p),c=s.createContext(void 0),C=({children:e,channelId:n,colorMode:t="light",defaultOptions:r})=>{let o;try{o=l.useKnockClient()}catch{throw new Error("KnockInAppMessagesChannelProvider must be used within a KnockProvider.")}const a=g(r),i=s.useMemo(()=>new u.InAppMessagesChannelClient(o,n,a),[o,n,a]);return s.createElement(c.Provider,{value:{inAppMessagesChannelClient:i,colorMode:t}},e)},h=()=>{const e=s.useContext(c);if(!e)throw new Error("useInAppMessagesChannel must be used within a KnockInAppMessagesChannelProvider");return e};exports.KnockInAppMessagesChannelProvider=C;exports.useInAppMessagesChannel=h;
2
- //# sourceMappingURL=KnockInAppMessagesChannelProvider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"KnockInAppMessagesChannelProvider.js","sources":["../../../../../src/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.tsx"],"sourcesContent":["import Knock, {\n InAppMessagesChannelClient,\n InAppMessagesClientOptions,\n} from \"@knocklabs/client\";\nimport * as React from \"react\";\n\nimport { useKnockClient, useStableOptions } from \"../../core\";\nimport { ColorMode } from \"../../core/constants\";\n\nexport interface KnockInAppMessagesChannelProviderState {\n inAppMessagesChannelClient: InAppMessagesChannelClient;\n colorMode: ColorMode;\n}\n\nexport interface KnockInAppMessagesChannelProviderProps {\n // In-App Message props\n channelId: string;\n defaultOptions?: InAppMessagesClientOptions;\n\n // Extra options\n colorMode?: ColorMode;\n}\n\nconst KnockInAppMessagesContext = React.createContext<\n KnockInAppMessagesChannelProviderState | undefined\n>(undefined);\n\nexport const KnockInAppMessagesChannelProvider: React.FC<\n React.PropsWithChildren<KnockInAppMessagesChannelProviderProps>\n> = ({ children, channelId, colorMode = \"light\", defaultOptions }) => {\n let knock: Knock;\n try {\n knock = useKnockClient();\n } catch (error) {\n throw new Error(\n \"KnockInAppMessagesChannelProvider must be used within a KnockProvider.\",\n );\n }\n\n const stableOptions = useStableOptions(defaultOptions);\n\n const inAppMessagesChannelClient = React.useMemo(() => {\n return new InAppMessagesChannelClient(knock, channelId, stableOptions);\n }, [knock, channelId, stableOptions]);\n\n return (\n <KnockInAppMessagesContext.Provider\n value={{\n inAppMessagesChannelClient,\n colorMode,\n }}\n >\n {children}\n </KnockInAppMessagesContext.Provider>\n );\n};\n\nexport const useInAppMessagesChannel =\n (): KnockInAppMessagesChannelProviderState => {\n const context = React.useContext(KnockInAppMessagesContext);\n if (!context) {\n throw new Error(\n \"useInAppMessagesChannel must be used within a KnockInAppMessagesChannelProvider\",\n );\n }\n\n return context;\n };\n"],"names":["KnockInAppMessagesContext","React","createContext","undefined","KnockInAppMessagesChannelProvider","children","channelId","colorMode","defaultOptions","knock","useKnockClient","Error","stableOptions","useStableOptions","inAppMessagesChannelClient","useMemo","InAppMessagesChannelClient","useInAppMessagesChannel","context","useContext"],"mappings":"0kBAuBMA,EAA4BC,EAAMC,cAEtCC,MAAS,EAEEC,EAETA,CAAC,CAAEC,SAAAA,EAAUC,UAAAA,EAAWC,UAAAA,EAAY,QAASC,eAAAA,CAAe,IAAM,CAChEC,IAAAA,EACA,GAAA,CACFA,EAAQC,EAAe,eAAA,OACT,CACR,MAAA,IAAIC,MACR,wEACF,CACF,CAEMC,MAAAA,EAAgBC,EAAiBL,CAAc,EAE/CM,EAA6Bb,EAAMc,QAAQ,IACxC,IAAIC,EAAAA,2BAA2BP,EAAOH,EAAWM,CAAa,EACpE,CAACH,EAAOH,EAAWM,CAAa,CAAC,EAEpC,OACGX,EAAA,cAAAD,EAA0B,SAA1B,CACC,MAAO,CACLc,2BAAAA,EACAP,UAAAA,CAAAA,GAGDF,CACH,CAEJ,EAEaY,EACXA,IAA8C,CACtCC,MAAAA,EAAUjB,EAAMkB,WAAWnB,CAAyB,EAC1D,GAAI,CAACkB,EACG,MAAA,IAAIP,MACR,iFACF,EAGKO,OAAAA,CACT"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("@knocklabs/client"),l=require("@tanstack/react-store"),o=require("react");require("../../core/context/KnockProvider.js");const M=require("../../core/hooks/useStableOptions.js");require("date-fns");const A=require("../context/KnockInAppMessagesChannelProvider.js"),u=(n,r={})=>{const{inAppMessagesChannelClient:e}=A.useInAppMessagesChannel(),t=M(r),s=o.useMemo(()=>new g.InAppMessagesClient(e,n,t),[e,n,t]),{messages:a,networkStatus:c,loading:i}=l.useStore(e.store,p=>s.getQueryInfoSelector(p));return o.useEffect(()=>(s.subscribe(),s.fetch(),()=>{s.unsubscribe()}),[]),{messages:a,networkStatus:c,loading:i,inAppMessagesClient:s}},b=(n,r={})=>{const{messages:e,...t}=u(n,{...r,page_size:1});return{message:e[0],...t}};exports.useInAppMessage=b;exports.useInAppMessages=u;
2
- //# sourceMappingURL=useInAppMessages.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useInAppMessages.js","sources":["../../../../../src/modules/in-app-messages/hooks/useInAppMessages.ts"],"sourcesContent":["import {\n InAppMessage,\n InAppMessagesClient,\n InAppMessagesClientOptions,\n NetworkStatus,\n} from \"@knocklabs/client\";\nimport { GenericData } from \"@knocklabs/types\";\nimport { useStore } from \"@tanstack/react-store\";\nimport { useEffect, useMemo } from \"react\";\n\nimport { useStableOptions } from \"../../core\";\nimport { useInAppMessagesChannel } from \"../context\";\n\nexport interface UseInAppMessagesOptions extends InAppMessagesClientOptions {}\n\nexport interface UseInAppMessagesResponse<\n TContent extends GenericData,\n TData extends GenericData,\n> {\n messages: InAppMessage<TContent, TData>[];\n networkStatus: NetworkStatus;\n loading: boolean;\n inAppMessagesClient: InAppMessagesClient;\n}\n\nexport const useInAppMessages = <\n TContent extends GenericData = GenericData,\n TData extends GenericData = GenericData,\n>(\n messageType: string,\n options: UseInAppMessagesOptions = {},\n): UseInAppMessagesResponse<TContent, TData> => {\n const { inAppMessagesChannelClient } = useInAppMessagesChannel();\n\n const stableOptions = useStableOptions(options);\n\n const inAppMessagesClient = useMemo(() => {\n return new InAppMessagesClient(\n inAppMessagesChannelClient,\n messageType,\n stableOptions,\n );\n }, [inAppMessagesChannelClient, messageType, stableOptions]);\n\n const { messages, networkStatus, loading } = useStore(\n inAppMessagesChannelClient.store,\n (state) => inAppMessagesClient.getQueryInfoSelector<TContent, TData>(state),\n );\n\n useEffect(() => {\n inAppMessagesClient.subscribe();\n inAppMessagesClient.fetch();\n\n return () => {\n inAppMessagesClient.unsubscribe();\n };\n // Run only once at mount.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return { messages, networkStatus, loading, inAppMessagesClient };\n};\n\nexport type UseInAppMessageOptions = Omit<UseInAppMessagesOptions, \"page_size\">;\n\nexport interface UseInAppMessageResponse<\n TContent extends GenericData,\n TData extends GenericData,\n> extends GenericData {\n message?: InAppMessage<TContent, TData>;\n networkStatus: NetworkStatus;\n loading: boolean;\n inAppMessagesClient: InAppMessagesClient;\n}\n\nexport const useInAppMessage = <\n TContent extends GenericData = GenericData,\n TData extends GenericData = GenericData,\n>(\n messageType: string,\n options: UseInAppMessageOptions = {},\n): UseInAppMessageResponse<TContent, TData> => {\n const { messages, ...rest } = useInAppMessages<TContent, TData>(messageType, {\n ...options,\n page_size: 1,\n });\n\n return { message: messages[0], ...rest };\n};\n"],"names":["useInAppMessages","messageType","options","inAppMessagesChannelClient","useInAppMessagesChannel","stableOptions","useStableOptions","inAppMessagesClient","useMemo","InAppMessagesClient","messages","networkStatus","loading","useStore","store","getQueryInfoSelector","state","useEffect","subscribe","fetch","unsubscribe","useInAppMessage","rest","page_size","message"],"mappings":"yWAyBaA,EAAmB,CAI9BC,EACAC,EAAmC,KACW,CACxC,KAAA,CAAEC,2BAAAA,GAA+BC,EAAwB,wBAAA,EAEzDC,EAAgBC,EAAiBJ,CAAO,EAExCK,EAAsBC,EAAAA,QAAQ,IAC3B,IAAIC,EAAAA,oBACTN,EACAF,EACAI,CACF,EACC,CAACF,EAA4BF,EAAaI,CAAa,CAAC,EAErD,CAAEK,SAAAA,EAAUC,cAAAA,EAAeC,QAAAA,CAAAA,EAAYC,WAC3CV,EAA2BW,SAChBP,EAAoBQ,qBAAsCC,CAAK,CAC5E,EAEAC,OAAAA,EAAAA,UAAU,KACRV,EAAoBW,UAAU,EAC9BX,EAAoBY,MAAM,EAEnB,IAAM,CACXZ,EAAoBa,YAAY,CAAA,GAIjC,CAAE,CAAA,EAEE,CAAEV,SAAAA,EAAUC,cAAAA,EAAeC,QAAAA,EAASL,oBAAAA,CAAAA,CAC7C,EAcac,EAAkB,CAI7BpB,EACAC,EAAkC,KACW,CACvC,KAAA,CAAEQ,SAAAA,EAAU,GAAGY,CAAAA,EAAStB,EAAkCC,EAAa,CAC3E,GAAGC,EACHqB,UAAW,CAAA,CACZ,EAEM,MAAA,CAAEC,QAASd,EAAS,CAAC,EAAG,GAAGY,CAAAA,CACpC"}
@@ -1,33 +0,0 @@
1
- import { InAppMessagesChannelClient as c } from "@knocklabs/client";
2
- import * as n from "react";
3
- import { useKnockClient as l } from "../../core/context/KnockProvider.mjs";
4
- import u from "../../core/hooks/useStableOptions.mjs";
5
- import "date-fns";
6
- const r = n.createContext(void 0), k = ({
7
- children: e,
8
- channelId: t,
9
- colorMode: a = "light",
10
- defaultOptions: p
11
- }) => {
12
- let s;
13
- try {
14
- s = l();
15
- } catch {
16
- throw new Error("KnockInAppMessagesChannelProvider must be used within a KnockProvider.");
17
- }
18
- const o = u(p), i = n.useMemo(() => new c(s, t, o), [s, t, o]);
19
- return /* @__PURE__ */ n.createElement(r.Provider, { value: {
20
- inAppMessagesChannelClient: i,
21
- colorMode: a
22
- } }, e);
23
- }, A = () => {
24
- const e = n.useContext(r);
25
- if (!e)
26
- throw new Error("useInAppMessagesChannel must be used within a KnockInAppMessagesChannelProvider");
27
- return e;
28
- };
29
- export {
30
- k as KnockInAppMessagesChannelProvider,
31
- A as useInAppMessagesChannel
32
- };
33
- //# sourceMappingURL=KnockInAppMessagesChannelProvider.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"KnockInAppMessagesChannelProvider.mjs","sources":["../../../../../src/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.tsx"],"sourcesContent":["import Knock, {\n InAppMessagesChannelClient,\n InAppMessagesClientOptions,\n} from \"@knocklabs/client\";\nimport * as React from \"react\";\n\nimport { useKnockClient, useStableOptions } from \"../../core\";\nimport { ColorMode } from \"../../core/constants\";\n\nexport interface KnockInAppMessagesChannelProviderState {\n inAppMessagesChannelClient: InAppMessagesChannelClient;\n colorMode: ColorMode;\n}\n\nexport interface KnockInAppMessagesChannelProviderProps {\n // In-App Message props\n channelId: string;\n defaultOptions?: InAppMessagesClientOptions;\n\n // Extra options\n colorMode?: ColorMode;\n}\n\nconst KnockInAppMessagesContext = React.createContext<\n KnockInAppMessagesChannelProviderState | undefined\n>(undefined);\n\nexport const KnockInAppMessagesChannelProvider: React.FC<\n React.PropsWithChildren<KnockInAppMessagesChannelProviderProps>\n> = ({ children, channelId, colorMode = \"light\", defaultOptions }) => {\n let knock: Knock;\n try {\n knock = useKnockClient();\n } catch (error) {\n throw new Error(\n \"KnockInAppMessagesChannelProvider must be used within a KnockProvider.\",\n );\n }\n\n const stableOptions = useStableOptions(defaultOptions);\n\n const inAppMessagesChannelClient = React.useMemo(() => {\n return new InAppMessagesChannelClient(knock, channelId, stableOptions);\n }, [knock, channelId, stableOptions]);\n\n return (\n <KnockInAppMessagesContext.Provider\n value={{\n inAppMessagesChannelClient,\n colorMode,\n }}\n >\n {children}\n </KnockInAppMessagesContext.Provider>\n );\n};\n\nexport const useInAppMessagesChannel =\n (): KnockInAppMessagesChannelProviderState => {\n const context = React.useContext(KnockInAppMessagesContext);\n if (!context) {\n throw new Error(\n \"useInAppMessagesChannel must be used within a KnockInAppMessagesChannelProvider\",\n );\n }\n\n return context;\n };\n"],"names":["KnockInAppMessagesContext","React","createContext","undefined","KnockInAppMessagesChannelProvider","children","channelId","colorMode","defaultOptions","knock","useKnockClient","Error","stableOptions","useStableOptions","inAppMessagesChannelClient","useMemo","InAppMessagesChannelClient","useInAppMessagesChannel","context","useContext"],"mappings":";;;;;AAuBA,MAAMA,IAA4BC,EAAMC,cAEtCC,MAAS,GAEEC,IAETA,CAAC;AAAA,EAAEC,UAAAA;AAAAA,EAAUC,WAAAA;AAAAA,EAAWC,WAAAA,IAAY;AAAA,EAASC,gBAAAA;AAAe,MAAM;AAChEC,MAAAA;AACA,MAAA;AACFA,IAAAA,IAAQC,EAAe;AAAA,UACT;AACR,UAAA,IAAIC,MACR,wEACF;AAAA,EACF;AAEMC,QAAAA,IAAgBC,EAAiBL,CAAc,GAE/CM,IAA6Bb,EAAMc,QAAQ,MACxC,IAAIC,EAA2BP,GAAOH,GAAWM,CAAa,GACpE,CAACH,GAAOH,GAAWM,CAAa,CAAC;AAEpC,SACG,gBAAAX,EAAA,cAAAD,EAA0B,UAA1B,EACC,OAAO;AAAA,IACLc,4BAAAA;AAAAA,IACAP,WAAAA;AAAAA,EAAAA,KAGDF,CACH;AAEJ,GAEaY,IACXA,MAA8C;AACtCC,QAAAA,IAAUjB,EAAMkB,WAAWnB,CAAyB;AAC1D,MAAI,CAACkB;AACG,UAAA,IAAIP,MACR,iFACF;AAGKO,SAAAA;AACT;"}