@knocklabs/react-core 0.2.29 → 0.3.0-rc-2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/CHANGELOG.md +6 -16
  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.map +1 -1
  8. package/dist/cjs/modules/feed/context/KnockFeedProvider.js +1 -1
  9. package/dist/cjs/modules/feed/context/KnockFeedProvider.js.map +1 -1
  10. package/dist/cjs/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.js +2 -0
  11. package/dist/cjs/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.js.map +1 -0
  12. package/dist/cjs/modules/in-app-messages/hooks/useInAppMessages.js +2 -0
  13. package/dist/cjs/modules/in-app-messages/hooks/useInAppMessages.js.map +1 -0
  14. package/dist/cjs/modules/slack/context/KnockSlackProvider.js +1 -1
  15. package/dist/cjs/modules/slack/hooks/useConnectedSlackChannels.js +1 -1
  16. package/dist/cjs/modules/slack/hooks/useConnectedSlackChannels.js.map +1 -1
  17. package/dist/cjs/modules/slack/hooks/useSlackAuth.js +1 -1
  18. package/dist/cjs/modules/slack/hooks/useSlackAuth.js.map +1 -1
  19. package/dist/cjs/modules/slack/hooks/useSlackChannels.js +1 -1
  20. package/dist/cjs/modules/slack/hooks/useSlackConnectionStatus.js.map +1 -1
  21. package/dist/esm/index.mjs +36 -30
  22. package/dist/esm/index.mjs.map +1 -1
  23. package/dist/esm/modules/core/context/KnockProvider.mjs +15 -15
  24. package/dist/esm/modules/core/context/KnockProvider.mjs.map +1 -1
  25. package/dist/esm/modules/core/hooks/useStableOptions.mjs +8 -8
  26. package/dist/esm/modules/core/hooks/useStableOptions.mjs.map +1 -1
  27. package/dist/esm/modules/core/utils.mjs.map +1 -1
  28. package/dist/esm/modules/feed/context/KnockFeedProvider.mjs +20 -14
  29. package/dist/esm/modules/feed/context/KnockFeedProvider.mjs.map +1 -1
  30. package/dist/esm/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.mjs +33 -0
  31. package/dist/esm/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.mjs.map +1 -0
  32. package/dist/esm/modules/in-app-messages/hooks/useInAppMessages.mjs +41 -0
  33. package/dist/esm/modules/in-app-messages/hooks/useInAppMessages.mjs.map +1 -0
  34. package/dist/esm/modules/slack/context/KnockSlackProvider.mjs +1 -1
  35. package/dist/esm/modules/slack/hooks/useConnectedSlackChannels.mjs +3 -3
  36. package/dist/esm/modules/slack/hooks/useConnectedSlackChannels.mjs.map +1 -1
  37. package/dist/esm/modules/slack/hooks/useSlackAuth.mjs +1 -1
  38. package/dist/esm/modules/slack/hooks/useSlackAuth.mjs.map +1 -1
  39. package/dist/esm/modules/slack/hooks/useSlackChannels.mjs +1 -1
  40. package/dist/esm/modules/slack/hooks/useSlackConnectionStatus.mjs.map +1 -1
  41. package/dist/types/index.d.ts +1 -0
  42. package/dist/types/index.d.ts.map +1 -1
  43. package/dist/types/modules/core/context/KnockProvider.d.ts +1 -0
  44. package/dist/types/modules/core/context/KnockProvider.d.ts.map +1 -1
  45. package/dist/types/modules/core/hooks/useAuthenticatedKnockClient.d.ts +1 -0
  46. package/dist/types/modules/core/utils.d.ts +1 -0
  47. package/dist/types/modules/feed/context/KnockFeedProvider.d.ts +1 -0
  48. package/dist/types/modules/feed/context/KnockFeedProvider.d.ts.map +1 -1
  49. package/dist/types/modules/feed/hooks/useFeedSettings.d.ts +1 -0
  50. package/dist/types/modules/feed/hooks/useNotificationStore.d.ts +1 -0
  51. package/dist/types/modules/feed/hooks/useNotifications.d.ts +1 -0
  52. package/dist/types/modules/i18n/context/KnockI18nProvider.d.ts +1 -0
  53. package/dist/types/modules/i18n/languages/de.d.ts +1 -0
  54. package/dist/types/modules/i18n/languages/en.d.ts +1 -0
  55. package/dist/types/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.d.ts +16 -0
  56. package/dist/types/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.d.ts.map +1 -0
  57. package/dist/types/modules/in-app-messages/context/index.d.ts +2 -0
  58. package/dist/types/modules/in-app-messages/context/index.d.ts.map +1 -0
  59. package/dist/types/modules/in-app-messages/hooks/index.d.ts +2 -0
  60. package/dist/types/modules/in-app-messages/hooks/index.d.ts.map +1 -0
  61. package/dist/types/modules/in-app-messages/hooks/useInAppMessages.d.ts +21 -0
  62. package/dist/types/modules/in-app-messages/hooks/useInAppMessages.d.ts.map +1 -0
  63. package/dist/types/modules/in-app-messages/index.d.ts +3 -0
  64. package/dist/types/modules/in-app-messages/index.d.ts.map +1 -0
  65. package/dist/types/modules/slack/hooks/useConnectedSlackChannels.d.ts +1 -0
  66. package/dist/types/modules/slack/hooks/useSlackChannels.d.ts +1 -0
  67. package/dist/types/modules/slack/hooks/useSlackConnectionStatus.d.ts +1 -0
  68. package/package.json +10 -8
  69. package/src/index.ts +1 -0
  70. package/src/modules/core/context/KnockProvider.tsx +6 -8
  71. package/src/modules/core/hooks/useStableOptions.ts +2 -2
  72. package/src/modules/core/utils.ts +1 -1
  73. package/src/modules/feed/context/KnockFeedProvider.tsx +11 -6
  74. package/src/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.tsx +68 -0
  75. package/src/modules/in-app-messages/context/index.ts +1 -0
  76. package/src/modules/in-app-messages/hooks/index.ts +1 -0
  77. package/src/modules/in-app-messages/hooks/useInAppMessages.ts +87 -0
  78. package/src/modules/in-app-messages/index.ts +3 -0
  79. package/src/modules/slack/hooks/useConnectedSlackChannels.ts +1 -1
  80. package/src/modules/slack/hooks/useSlackAuth.ts +1 -1
  81. package/src/modules/slack/hooks/useSlackConnectionStatus.ts +1 -1
@@ -20,7 +20,7 @@ export interface KnockFeedProviderState {
20
20
  colorMode: ColorMode;
21
21
  }
22
22
 
23
- const FeedStateContext = React.createContext<
23
+ const KnockFeedContext = React.createContext<
24
24
  KnockFeedProviderState | undefined
25
25
  >(undefined);
26
26
 
@@ -38,12 +38,18 @@ export interface KnockFeedProviderProps {
38
38
  export const KnockFeedProvider: React.FC<
39
39
  PropsWithChildren<KnockFeedProviderProps>
40
40
  > = ({ feedId, children, defaultFeedOptions = {}, colorMode = "light" }) => {
41
- const knock = useKnockClient();
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
+
42
48
  const feedClient = useNotifications(knock, feedId, defaultFeedOptions);
43
49
  const useFeedStore = useCreateNotificationStore(feedClient);
44
50
 
45
51
  return (
46
- <FeedStateContext.Provider
52
+ <KnockFeedContext.Provider
47
53
  key={feedProviderKey(knock.userId, feedId, defaultFeedOptions)}
48
54
  value={{
49
55
  knock,
@@ -53,13 +59,12 @@ export const KnockFeedProvider: React.FC<
53
59
  }}
54
60
  >
55
61
  {children}
56
- </FeedStateContext.Provider>
62
+ </KnockFeedContext.Provider>
57
63
  );
58
64
  };
59
65
 
60
66
  export const useKnockFeed = (): KnockFeedProviderState => {
61
- const context = React.useContext(FeedStateContext);
62
-
67
+ const context = React.useContext(KnockFeedContext);
63
68
  if (!context) {
64
69
  throw new Error("useKnockFeed must be used within a KnockFeedProvider");
65
70
  }
@@ -0,0 +1,68 @@
1
+ import Knock, {
2
+ InAppMessagesChannelClient,
3
+ InAppMessagesClientOptions,
4
+ } from "@knocklabs/client";
5
+ import * as React from "react";
6
+
7
+ import { useKnockClient, useStableOptions } from "../../core";
8
+ import { ColorMode } from "../../core/constants";
9
+
10
+ export interface KnockInAppMessagesChannelProviderState {
11
+ inAppMessagesChannelClient: InAppMessagesChannelClient;
12
+ colorMode: ColorMode;
13
+ }
14
+
15
+ export interface KnockInAppMessagesChannelProviderProps {
16
+ // In-App Message props
17
+ channelId: string;
18
+ defaultOptions?: InAppMessagesClientOptions;
19
+
20
+ // Extra options
21
+ colorMode?: ColorMode;
22
+ }
23
+
24
+ const KnockInAppMessagesContext = React.createContext<
25
+ KnockInAppMessagesChannelProviderState | undefined
26
+ >(undefined);
27
+
28
+ export const KnockInAppMessagesChannelProvider: React.FC<
29
+ React.PropsWithChildren<KnockInAppMessagesChannelProviderProps>
30
+ > = ({ children, channelId, colorMode = "light", defaultOptions }) => {
31
+ let knock: Knock;
32
+ try {
33
+ knock = useKnockClient();
34
+ } catch (error) {
35
+ throw new Error(
36
+ "KnockInAppMessagesChannelProvider must be used within a KnockProvider.",
37
+ );
38
+ }
39
+
40
+ const stableOptions = useStableOptions(defaultOptions);
41
+
42
+ const inAppMessagesChannelClient = React.useMemo(() => {
43
+ return new InAppMessagesChannelClient(knock, channelId, stableOptions);
44
+ }, [knock, channelId, stableOptions]);
45
+
46
+ return (
47
+ <KnockInAppMessagesContext.Provider
48
+ value={{
49
+ inAppMessagesChannelClient,
50
+ colorMode,
51
+ }}
52
+ >
53
+ {children}
54
+ </KnockInAppMessagesContext.Provider>
55
+ );
56
+ };
57
+
58
+ export const useInAppMessagesChannel =
59
+ (): KnockInAppMessagesChannelProviderState => {
60
+ const context = React.useContext(KnockInAppMessagesContext);
61
+ if (!context) {
62
+ throw new Error(
63
+ "useInAppMessagesChannel must be used within a KnockInAppMessagesChannelProvider",
64
+ );
65
+ }
66
+
67
+ return context;
68
+ };
@@ -0,0 +1 @@
1
+ export * from "./KnockInAppMessagesChannelProvider";
@@ -0,0 +1 @@
1
+ export * from "./useInAppMessages";
@@ -0,0 +1,87 @@
1
+ import {
2
+ InAppMessage,
3
+ InAppMessagesClient,
4
+ InAppMessagesClientOptions,
5
+ NetworkStatus,
6
+ } from "@knocklabs/client";
7
+ import { GenericData } from "@knocklabs/types";
8
+ import { useStore } from "@tanstack/react-store";
9
+ import { useEffect, useMemo } from "react";
10
+
11
+ import { useStableOptions } from "../../core";
12
+ import { useInAppMessagesChannel } from "../context";
13
+
14
+ export interface UseInAppMessagesOptions extends InAppMessagesClientOptions {}
15
+
16
+ export interface UseInAppMessagesResponse<
17
+ TContent extends GenericData,
18
+ TData extends GenericData,
19
+ > {
20
+ messages: InAppMessage<TContent, TData>[];
21
+ networkStatus: NetworkStatus;
22
+ loading: boolean;
23
+ inAppMessagesClient: InAppMessagesClient;
24
+ }
25
+
26
+ export const useInAppMessages = <
27
+ TContent extends GenericData = GenericData,
28
+ TData extends GenericData = GenericData,
29
+ >(
30
+ messageType: string,
31
+ options: UseInAppMessagesOptions = {},
32
+ ): UseInAppMessagesResponse<TContent, TData> => {
33
+ const { inAppMessagesChannelClient } = useInAppMessagesChannel();
34
+
35
+ const stableOptions = useStableOptions(options);
36
+
37
+ const inAppMessagesClient = useMemo(() => {
38
+ return new InAppMessagesClient(
39
+ inAppMessagesChannelClient,
40
+ messageType,
41
+ stableOptions,
42
+ );
43
+ }, [inAppMessagesChannelClient, messageType, stableOptions]);
44
+
45
+ const { messages, networkStatus, loading } = useStore(
46
+ inAppMessagesChannelClient.store,
47
+ (state) => inAppMessagesClient.getQueryInfoSelector<TContent, TData>(state),
48
+ );
49
+
50
+ useEffect(() => {
51
+ inAppMessagesClient.subscribe();
52
+ inAppMessagesClient.fetch();
53
+
54
+ return () => {
55
+ inAppMessagesClient.unsubscribe();
56
+ };
57
+ }, [inAppMessagesClient]);
58
+
59
+ return { messages, networkStatus, loading, inAppMessagesClient };
60
+ };
61
+
62
+ export type UseInAppMessageOptions = Omit<UseInAppMessagesOptions, "page_size">;
63
+
64
+ export interface UseInAppMessageResponse<
65
+ TContent extends GenericData,
66
+ TData extends GenericData,
67
+ > extends GenericData {
68
+ message?: InAppMessage<TContent, TData>;
69
+ networkStatus: NetworkStatus;
70
+ loading: boolean;
71
+ inAppMessagesClient: InAppMessagesClient;
72
+ }
73
+
74
+ export const useInAppMessage = <
75
+ TContent extends GenericData = GenericData,
76
+ TData extends GenericData = GenericData,
77
+ >(
78
+ messageType: string,
79
+ options: UseInAppMessageOptions = {},
80
+ ): UseInAppMessageResponse<TContent, TData> => {
81
+ const { messages, ...rest } = useInAppMessages<TContent, TData>(messageType, {
82
+ ...options,
83
+ page_size: 1,
84
+ });
85
+
86
+ return { message: messages[0], ...rest };
87
+ };
@@ -0,0 +1,3 @@
1
+ export * from "./context";
2
+ export * from "./hooks";
3
+ // TODO: Double check exports are exporting only necessary values
@@ -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
  };