@knocklabs/react-core 0.3.1 → 0.3.3

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 (104) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/cjs/index.js +1 -1
  3. package/dist/cjs/modules/core/utils.js +1 -1
  4. package/dist/cjs/modules/core/utils.js.map +1 -1
  5. package/dist/cjs/modules/i18n/languages/en.js +1 -1
  6. package/dist/cjs/modules/i18n/languages/en.js.map +1 -1
  7. package/dist/cjs/modules/i18n/languages/index.js.map +1 -1
  8. package/dist/cjs/modules/ms-teams/context/KnockMsTeamsProvider.js +1 -1
  9. package/dist/cjs/modules/ms-teams/context/KnockMsTeamsProvider.js.map +1 -1
  10. package/dist/cjs/modules/ms-teams/hooks/useConnectedMsTeamsChannels.js +2 -0
  11. package/dist/cjs/modules/ms-teams/hooks/useConnectedMsTeamsChannels.js.map +1 -0
  12. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsAuth.js +1 -1
  13. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsAuth.js.map +1 -1
  14. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsChannels.js +2 -0
  15. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsChannels.js.map +1 -0
  16. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsTeams.js +2 -0
  17. package/dist/cjs/modules/ms-teams/hooks/useMsTeamsTeams.js.map +1 -0
  18. package/dist/cjs/modules/slack/context/KnockSlackProvider.js +1 -1
  19. package/dist/cjs/modules/slack/context/KnockSlackProvider.js.map +1 -1
  20. package/dist/cjs/modules/slack/hooks/useConnectedSlackChannels.js +1 -1
  21. package/dist/cjs/modules/slack/hooks/useConnectedSlackChannels.js.map +1 -1
  22. package/dist/cjs/modules/slack/hooks/useSlackAuth.js +1 -1
  23. package/dist/cjs/modules/slack/hooks/useSlackAuth.js.map +1 -1
  24. package/dist/cjs/modules/slack/hooks/useSlackChannels.js +1 -1
  25. package/dist/cjs/modules/slack/hooks/useSlackChannels.js.map +1 -1
  26. package/dist/cjs/modules/slack/hooks/useSlackConnectionStatus.js.map +1 -1
  27. package/dist/esm/index.mjs +36 -30
  28. package/dist/esm/index.mjs.map +1 -1
  29. package/dist/esm/modules/core/utils.mjs +1 -1
  30. package/dist/esm/modules/core/utils.mjs.map +1 -1
  31. package/dist/esm/modules/i18n/languages/en.mjs +3 -0
  32. package/dist/esm/modules/i18n/languages/en.mjs.map +1 -1
  33. package/dist/esm/modules/i18n/languages/index.mjs.map +1 -1
  34. package/dist/esm/modules/ms-teams/context/KnockMsTeamsProvider.mjs +23 -20
  35. package/dist/esm/modules/ms-teams/context/KnockMsTeamsProvider.mjs.map +1 -1
  36. package/dist/esm/modules/ms-teams/hooks/useConnectedMsTeamsChannels.mjs +78 -0
  37. package/dist/esm/modules/ms-teams/hooks/useConnectedMsTeamsChannels.mjs.map +1 -0
  38. package/dist/esm/modules/ms-teams/hooks/useMsTeamsAuth.mjs +4 -2
  39. package/dist/esm/modules/ms-teams/hooks/useMsTeamsAuth.mjs.map +1 -1
  40. package/dist/esm/modules/ms-teams/hooks/useMsTeamsChannels.mjs +41 -0
  41. package/dist/esm/modules/ms-teams/hooks/useMsTeamsChannels.mjs.map +1 -0
  42. package/dist/esm/modules/ms-teams/hooks/useMsTeamsTeams.mjs +50 -0
  43. package/dist/esm/modules/ms-teams/hooks/useMsTeamsTeams.mjs.map +1 -0
  44. package/dist/esm/modules/slack/context/KnockSlackProvider.mjs +27 -25
  45. package/dist/esm/modules/slack/context/KnockSlackProvider.mjs.map +1 -1
  46. package/dist/esm/modules/slack/hooks/useConnectedSlackChannels.mjs +58 -41
  47. package/dist/esm/modules/slack/hooks/useConnectedSlackChannels.mjs.map +1 -1
  48. package/dist/esm/modules/slack/hooks/useSlackAuth.mjs +18 -17
  49. package/dist/esm/modules/slack/hooks/useSlackAuth.mjs.map +1 -1
  50. package/dist/esm/modules/slack/hooks/useSlackChannels.mjs +13 -12
  51. package/dist/esm/modules/slack/hooks/useSlackChannels.mjs.map +1 -1
  52. package/dist/esm/modules/slack/hooks/useSlackConnectionStatus.mjs +6 -6
  53. package/dist/esm/modules/slack/hooks/useSlackConnectionStatus.mjs.map +1 -1
  54. package/dist/types/index.d.ts +1 -0
  55. package/dist/types/index.d.ts.map +1 -1
  56. package/dist/types/interfaces.d.ts +5 -0
  57. package/dist/types/interfaces.d.ts.map +1 -0
  58. package/dist/types/modules/core/utils.d.ts +2 -2
  59. package/dist/types/modules/core/utils.d.ts.map +1 -1
  60. package/dist/types/modules/i18n/languages/en.d.ts.map +1 -1
  61. package/dist/types/modules/i18n/languages/index.d.ts +3 -0
  62. package/dist/types/modules/i18n/languages/index.d.ts.map +1 -1
  63. package/dist/types/modules/ms-teams/hooks/index.d.ts +3 -0
  64. package/dist/types/modules/ms-teams/hooks/index.d.ts.map +1 -1
  65. package/dist/types/modules/ms-teams/hooks/useConnectedMsTeamsChannels.d.ts +15 -0
  66. package/dist/types/modules/ms-teams/hooks/useConnectedMsTeamsChannels.d.ts.map +1 -0
  67. package/dist/types/modules/ms-teams/hooks/useMsTeamsChannels.d.ts +14 -0
  68. package/dist/types/modules/ms-teams/hooks/useMsTeamsChannels.d.ts.map +1 -0
  69. package/dist/types/modules/ms-teams/hooks/useMsTeamsTeams.d.ts +13 -0
  70. package/dist/types/modules/ms-teams/hooks/useMsTeamsTeams.d.ts.map +1 -0
  71. package/dist/types/modules/ms-teams/index.d.ts +1 -0
  72. package/dist/types/modules/ms-teams/index.d.ts.map +1 -1
  73. package/dist/types/modules/ms-teams/interfaces.d.ts +11 -0
  74. package/dist/types/modules/ms-teams/interfaces.d.ts.map +1 -0
  75. package/dist/types/modules/slack/context/KnockSlackProvider.d.ts +12 -2
  76. package/dist/types/modules/slack/context/KnockSlackProvider.d.ts.map +1 -1
  77. package/dist/types/modules/slack/hooks/useConnectedSlackChannels.d.ts +6 -6
  78. package/dist/types/modules/slack/hooks/useConnectedSlackChannels.d.ts.map +1 -1
  79. package/dist/types/modules/slack/hooks/useSlackConnectionStatus.d.ts +1 -1
  80. package/dist/types/modules/slack/hooks/useSlackConnectionStatus.d.ts.map +1 -1
  81. package/dist/types/modules/slack/index.d.ts +1 -1
  82. package/dist/types/modules/slack/index.d.ts.map +1 -1
  83. package/dist/types/modules/slack/{constants.d.ts → interfaces.d.ts} +3 -5
  84. package/dist/types/modules/slack/interfaces.d.ts.map +1 -0
  85. package/package.json +3 -3
  86. package/src/index.ts +1 -0
  87. package/src/interfaces.ts +4 -0
  88. package/src/modules/core/utils.ts +3 -3
  89. package/src/modules/i18n/languages/en.ts +5 -0
  90. package/src/modules/i18n/languages/index.ts +3 -0
  91. package/src/modules/ms-teams/hooks/index.ts +3 -0
  92. package/src/modules/ms-teams/hooks/useConnectedMsTeamsChannels.ts +100 -0
  93. package/src/modules/ms-teams/hooks/useMsTeamsChannels.ts +53 -0
  94. package/src/modules/ms-teams/hooks/useMsTeamsTeams.ts +112 -0
  95. package/src/modules/ms-teams/index.ts +1 -0
  96. package/src/modules/ms-teams/interfaces.ts +11 -0
  97. package/src/modules/slack/context/KnockSlackProvider.tsx +25 -8
  98. package/src/modules/slack/hooks/useConnectedSlackChannels.ts +56 -61
  99. package/src/modules/slack/hooks/useSlackAuth.ts +5 -5
  100. package/src/modules/slack/hooks/useSlackChannels.ts +2 -2
  101. package/src/modules/slack/hooks/useSlackConnectionStatus.ts +3 -3
  102. package/src/modules/slack/index.ts +1 -1
  103. package/src/modules/slack/{constants.ts → interfaces.ts} +3 -4
  104. package/dist/types/modules/slack/constants.d.ts.map +0 -1
@@ -1,19 +1,24 @@
1
- import { ContainerObject, useKnockSlackClient } from "..";
1
+ import { useKnockSlackClient } from "..";
2
2
  import { SlackChannelConnection } from "@knocklabs/client";
3
- import { useCallback, useEffect, useState } from "react";
3
+ import { GenericData } from "@knocklabs/types";
4
+ import { useState } from "react";
5
+ import useSWR from "swr";
4
6
 
7
+ import { RecipientObject } from "../../..";
5
8
  import { useKnockClient } from "../../core";
6
9
  import { useTranslations } from "../../i18n";
7
10
 
8
- type UseSlackChannelsProps = {
9
- slackChannelsRecipientObject: ContainerObject;
11
+ const QUERY_KEY = "SLACK_CONNECTED_CHANNELS";
12
+
13
+ type UseConnectedSlackChannelsProps = {
14
+ slackChannelsRecipientObject: RecipientObject;
10
15
  };
11
16
 
12
- type UseSlackChannelOutput = {
17
+ type UseConnectedSlackChannelsOutput = {
13
18
  data: SlackChannelConnection[] | null;
14
19
  updateConnectedChannels: (
15
20
  connectedChannels: SlackChannelConnection[],
16
- ) => void;
21
+ ) => Promise<void>;
17
22
  loading: boolean;
18
23
  error: string | null;
19
24
  updating: boolean;
@@ -21,72 +26,62 @@ type UseSlackChannelOutput = {
21
26
 
22
27
  function useConnectedSlackChannels({
23
28
  slackChannelsRecipientObject: { objectId, collection },
24
- }: UseSlackChannelsProps): UseSlackChannelOutput {
29
+ }: UseConnectedSlackChannelsProps): UseConnectedSlackChannelsOutput {
25
30
  const { t } = useTranslations();
26
31
  const knock = useKnockClient();
27
32
  const { connectionStatus, knockSlackChannelId } = useKnockSlackClient();
28
- const [connectedChannels, setConnectedChannels] = useState<
29
- null | SlackChannelConnection[]
30
- >(null);
33
+
31
34
  const [error, setError] = useState<string | null>(null);
32
- const [isLoading, setIsLoading] = useState(false);
33
35
  const [isUpdating, setIsUpdating] = useState(false);
34
36
 
35
- const fetchAndSetConnectedChannels = useCallback(() => {
36
- setIsLoading(true);
37
- const getConnectedChannels = async () =>
38
- await knock.objects.getChannelData({
39
- collection,
40
- objectId,
41
- channelId: knockSlackChannelId,
42
- });
43
-
44
- getConnectedChannels()
45
- .then((res) => {
46
- if (res?.data?.connections) {
47
- setConnectedChannels(res?.data?.connections);
48
- } else {
49
- setConnectedChannels([]);
50
- }
51
- setError(null);
52
- setIsLoading(false);
53
- })
54
- .catch(() => {
55
- setConnectedChannels([]);
56
- setError(null);
57
- setIsLoading(false);
58
- });
59
- }, [collection, knock.objects, knockSlackChannelId, objectId]);
60
-
61
- useEffect(() => {
62
- if (
63
- connectionStatus === "connected" &&
64
- !connectedChannels &&
65
- !error &&
66
- !isLoading
67
- ) {
68
- fetchAndSetConnectedChannels();
69
- }
70
- }, [
71
- connectedChannels,
72
- fetchAndSetConnectedChannels,
37
+ const {
38
+ data: connectedChannels,
39
+ mutate,
40
+ isValidating,
73
41
  isLoading,
74
- error,
75
- connectionStatus,
76
- ]);
42
+ } = useSWR<SlackChannelConnection[]>(
43
+ // Only fetch when Slack is connected
44
+ connectionStatus === "connected"
45
+ ? [QUERY_KEY, knockSlackChannelId, collection, objectId]
46
+ : null,
47
+ async () => {
48
+ return knock.objects
49
+ .getChannelData({
50
+ collection,
51
+ objectId,
52
+ channelId: knockSlackChannelId,
53
+ })
54
+ .then((res) => res.data?.connections ?? [])
55
+ .catch(() => []);
56
+ },
57
+ {
58
+ onSuccess: () => {
59
+ setError(null);
60
+ },
61
+ },
62
+ );
77
63
 
78
64
  const updateConnectedChannels = async (
79
65
  channelsToSendToKnock: SlackChannelConnection[],
80
66
  ) => {
81
67
  setIsUpdating(true);
82
68
  try {
83
- await knock.objects.setChannelData({
84
- objectId,
85
- collection,
86
- channelId: knockSlackChannelId,
87
- data: { connections: channelsToSendToKnock },
88
- });
89
- fetchAndSetConnectedChannels();
69
+ await mutate(
70
+ () =>
71
+ knock.objects
72
+ .setChannelData({
73
+ objectId,
74
+ collection,
75
+ channelId: knockSlackChannelId,
76
+ data: { connections: channelsToSendToKnock },
77
+ })
78
+ .then((res) => (res as GenericData).data?.connections ?? []),
79
+ {
80
+ populateCache: true,
81
+ revalidate: false,
82
+ optimisticData: channelsToSendToKnock,
83
+ },
84
+ );
90
85
  } catch (_error) {
91
86
  setError(t("slackChannelSetError") || "");
92
87
  }
@@ -94,10 +89,10 @@ function useConnectedSlackChannels({
94
89
  };
95
90
 
96
91
  return {
97
- data: connectedChannels,
92
+ data: connectedChannels ?? null,
98
93
  updateConnectedChannels,
99
94
  updating: isUpdating,
100
- loading: isLoading,
95
+ loading: isLoading || isValidating,
101
96
  error,
102
97
  };
103
98
  }
@@ -23,7 +23,7 @@ function useSlackAuth(
23
23
  additionalScopes?: string[],
24
24
  ): UseSlackAuthOutput {
25
25
  const knock = useKnockClient();
26
- const { setConnectionStatus, knockSlackChannelId, tenant, setActionLabel } =
26
+ const { setConnectionStatus, knockSlackChannelId, tenantId, setActionLabel } =
27
27
  useKnockSlackClient();
28
28
 
29
29
  const combinedScopes =
@@ -36,7 +36,7 @@ function useSlackAuth(
36
36
  setConnectionStatus("disconnecting");
37
37
  try {
38
38
  const revoke = await knock.slack.revokeAccessToken({
39
- tenant,
39
+ tenant: tenantId,
40
40
  knockChannelId: knockSlackChannelId,
41
41
  });
42
42
 
@@ -51,7 +51,7 @@ function useSlackAuth(
51
51
  }, [
52
52
  setConnectionStatus,
53
53
  knock.slack,
54
- tenant,
54
+ tenantId,
55
55
  knockSlackChannelId,
56
56
  setActionLabel,
57
57
  ]);
@@ -61,7 +61,7 @@ function useSlackAuth(
61
61
  state: JSON.stringify({
62
62
  redirect_url: redirectUrl,
63
63
  access_token_object: {
64
- object_id: tenant,
64
+ object_id: tenantId,
65
65
  collection: TENANT_OBJECT_COLLECTION,
66
66
  },
67
67
  channel_id: knockSlackChannelId,
@@ -74,7 +74,7 @@ function useSlackAuth(
74
74
  return `${SLACK_AUTHORIZE_URL}?${new URLSearchParams(rawParams)}`;
75
75
  }, [
76
76
  redirectUrl,
77
- tenant,
77
+ tenantId,
78
78
  knockSlackChannelId,
79
79
  knock.apiKey,
80
80
  knock.userToken,
@@ -45,12 +45,12 @@ function useSlackChannels({
45
45
  queryOptions,
46
46
  }: UseSlackChannelsProps): UseSlackChannelOutput {
47
47
  const knock = useKnockClient();
48
- const { knockSlackChannelId, tenant, connectionStatus } =
48
+ const { knockSlackChannelId, tenantId, connectionStatus } =
49
49
  useKnockSlackClient();
50
50
 
51
51
  const fetchChannels = (queryKey: QueryKey) => {
52
52
  return knock.slack.getChannels({
53
- tenant,
53
+ tenant: tenantId,
54
54
  knockChannelId: knockSlackChannelId,
55
55
  queryOptions: {
56
56
  ...queryOptions,
@@ -34,7 +34,7 @@ const formatSlackErrorMessage = (errorMessage: string) => {
34
34
  function useSlackConnectionStatus(
35
35
  knock: Knock,
36
36
  knockSlackChannelId: string,
37
- tenant: string,
37
+ tenantId: string,
38
38
  ): UseSlackConnectionStatusOutput {
39
39
  const { t } = useTranslations();
40
40
  const [connectionStatus, setConnectionStatus] =
@@ -48,7 +48,7 @@ function useSlackConnectionStatus(
48
48
 
49
49
  try {
50
50
  const authRes = await knock.slack.authCheck({
51
- tenant,
51
+ tenant: tenantId,
52
52
  knockChannelId: knockSlackChannelId,
53
53
  });
54
54
 
@@ -87,7 +87,7 @@ function useSlackConnectionStatus(
87
87
  };
88
88
 
89
89
  checkAuthStatus();
90
- }, [connectionStatus, tenant, knockSlackChannelId, knock.slack, t]);
90
+ }, [connectionStatus, tenantId, knockSlackChannelId, knock.slack, t]);
91
91
 
92
92
  return {
93
93
  connectionStatus,
@@ -1,3 +1,3 @@
1
1
  export * from "./context";
2
2
  export * from "./hooks";
3
- export * from "./constants";
3
+ export * from "./interfaces";
@@ -1,7 +1,6 @@
1
- export type ContainerObject = {
2
- objectId: string;
3
- collection: string;
4
- };
1
+ import type { RecipientObject } from "../../interfaces";
2
+
3
+ export type ContainerObject = RecipientObject;
5
4
 
6
5
  export type SlackChannelQueryOptions = {
7
6
  maxCount?: number;
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/modules/slack/constants.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}