@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
@@ -3,6 +3,10 @@ import { ConnectionStatus } from '../hooks/useSlackConnectionStatus';
3
3
  import * as React from "react";
4
4
  export interface KnockSlackProviderState {
5
5
  knockSlackChannelId: string;
6
+ tenantId: string;
7
+ /**
8
+ * @deprecated Use `tenantId` instead. This field will be removed in a future release.
9
+ */
6
10
  tenant: string;
7
11
  connectionStatus: ConnectionStatus;
8
12
  setConnectionStatus: (connectionStatus: ConnectionStatus) => void;
@@ -11,10 +15,16 @@ export interface KnockSlackProviderState {
11
15
  actionLabel: string | null;
12
16
  setActionLabel: (label: string | null) => void;
13
17
  }
14
- export interface KnockSlackProviderProps {
18
+ export type KnockSlackProviderProps = {
15
19
  knockSlackChannelId: string;
20
+ /**
21
+ * @deprecated Use `tenantId` instead. This field will be removed in a future release.
22
+ */
16
23
  tenant: string;
17
- }
24
+ } | {
25
+ knockSlackChannelId: string;
26
+ tenantId: string;
27
+ };
18
28
  export declare const KnockSlackProvider: React.FC<PropsWithChildren<KnockSlackProviderProps>>;
19
29
  export declare const useKnockSlackClient: () => KnockSlackProviderState;
20
30
  //# sourceMappingURL=KnockSlackProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"KnockSlackProvider.d.ts","sourceRoot":"","sources":["../../../../../src/modules/slack/context/KnockSlackProvider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAI1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAErE,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,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,uBAAuB;IACtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CACvC,iBAAiB,CAAC,uBAAuB,CAAC,CAmC3C,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAO,uBAUtC,CAAC"}
1
+ {"version":3,"file":"KnockSlackProvider.d.ts","sourceRoot":"","sources":["../../../../../src/modules/slack/context/KnockSlackProvider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAI1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAErE,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,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,MAAM,uBAAuB,GAC/B;IACE,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB,GACD;IACE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEN,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CACvC,iBAAiB,CAAC,uBAAuB,CAAC,CAwC3C,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAO,uBAUtC,CAAC"}
@@ -1,15 +1,15 @@
1
- import { ContainerObject } from '..';
2
1
  import { SlackChannelConnection } from '@knocklabs/client';
3
- type UseSlackChannelsProps = {
4
- slackChannelsRecipientObject: ContainerObject;
2
+ import { RecipientObject } from '../../..';
3
+ type UseConnectedSlackChannelsProps = {
4
+ slackChannelsRecipientObject: RecipientObject;
5
5
  };
6
- type UseSlackChannelOutput = {
6
+ type UseConnectedSlackChannelsOutput = {
7
7
  data: SlackChannelConnection[] | null;
8
- updateConnectedChannels: (connectedChannels: SlackChannelConnection[]) => void;
8
+ updateConnectedChannels: (connectedChannels: SlackChannelConnection[]) => Promise<void>;
9
9
  loading: boolean;
10
10
  error: string | null;
11
11
  updating: boolean;
12
12
  };
13
- declare function useConnectedSlackChannels({ slackChannelsRecipientObject: { objectId, collection }, }: UseSlackChannelsProps): UseSlackChannelOutput;
13
+ declare function useConnectedSlackChannels({ slackChannelsRecipientObject: { objectId, collection }, }: UseConnectedSlackChannelsProps): UseConnectedSlackChannelsOutput;
14
14
  export default useConnectedSlackChannels;
15
15
  //# sourceMappingURL=useConnectedSlackChannels.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useConnectedSlackChannels.d.ts","sourceRoot":"","sources":["../../../../../src/modules/slack/hooks/useConnectedSlackChannels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAuB,MAAM,IAAI,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAM3D,KAAK,qBAAqB,GAAG;IAC3B,4BAA4B,EAAE,eAAe,CAAC;CAC/C,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,sBAAsB,EAAE,GAAG,IAAI,CAAC;IACtC,uBAAuB,EAAE,CACvB,iBAAiB,EAAE,sBAAsB,EAAE,KACxC,IAAI,CAAC;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,iBAAS,yBAAyB,CAAC,EACjC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,GACvD,EAAE,qBAAqB,GAAG,qBAAqB,CA+E/C;AAED,eAAe,yBAAyB,CAAC"}
1
+ {"version":3,"file":"useConnectedSlackChannels.d.ts","sourceRoot":"","sources":["../../../../../src/modules/slack/hooks/useConnectedSlackChannels.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAK3D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAM3C,KAAK,8BAA8B,GAAG;IACpC,4BAA4B,EAAE,eAAe,CAAC;CAC/C,CAAC;AAEF,KAAK,+BAA+B,GAAG;IACrC,IAAI,EAAE,sBAAsB,EAAE,GAAG,IAAI,CAAC;IACtC,uBAAuB,EAAE,CACvB,iBAAiB,EAAE,sBAAsB,EAAE,KACxC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,iBAAS,yBAAyB,CAAC,EACjC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,GACvD,EAAE,8BAA8B,GAAG,+BAA+B,CAqElE;AAED,eAAe,yBAAyB,CAAC"}
@@ -8,6 +8,6 @@ type UseSlackConnectionStatusOutput = {
8
8
  actionLabel: string | null;
9
9
  setActionLabel: (actionLabel: string | null) => void;
10
10
  };
11
- declare function useSlackConnectionStatus(knock: Knock, knockSlackChannelId: string, tenant: string): UseSlackConnectionStatusOutput;
11
+ declare function useSlackConnectionStatus(knock: Knock, knockSlackChannelId: string, tenantId: string): UseSlackConnectionStatusOutput;
12
12
  export default useSlackConnectionStatus;
13
13
  //# sourceMappingURL=useSlackConnectionStatus.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSlackConnectionStatus.d.ts","sourceRoot":"","sources":["../../../../../src/modules/slack/hooks/useSlackConnectionStatus.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,8BAA8B,GAAG;IACpC,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;AAcF,iBAAS,wBAAwB,CAC/B,KAAK,EAAE,KAAK,EACZ,mBAAmB,EAAE,MAAM,EAC3B,MAAM,EAAE,MAAM,GACb,8BAA8B,CA8DhC;AAED,eAAe,wBAAwB,CAAC"}
1
+ {"version":3,"file":"useSlackConnectionStatus.d.ts","sourceRoot":"","sources":["../../../../../src/modules/slack/hooks/useSlackConnectionStatus.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,8BAA8B,GAAG;IACpC,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;AAcF,iBAAS,wBAAwB,CAC/B,KAAK,EAAE,KAAK,EACZ,mBAAmB,EAAE,MAAM,EAC3B,QAAQ,EAAE,MAAM,GACf,8BAA8B,CA8DhC;AAED,eAAe,wBAAwB,CAAC"}
@@ -1,4 +1,4 @@
1
1
  export * from './context';
2
2
  export * from './hooks';
3
- export * from './constants';
3
+ export * from './interfaces';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/slack/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/slack/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC"}
@@ -1,7 +1,5 @@
1
- export type ContainerObject = {
2
- objectId: string;
3
- collection: string;
4
- };
1
+ import { RecipientObject } from '../../interfaces';
2
+ export type ContainerObject = RecipientObject;
5
3
  export type SlackChannelQueryOptions = {
6
4
  maxCount?: number;
7
5
  limitPerPage?: number;
@@ -9,4 +7,4 @@ export type SlackChannelQueryOptions = {
9
7
  types?: string;
10
8
  teamId?: string;
11
9
  };
12
- //# sourceMappingURL=constants.d.ts.map
10
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../src/modules/slack/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG,eAAe,CAAC;AAE9C,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"}
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.1",
5
+ "version": "0.3.3",
6
6
  "license": "MIT",
7
7
  "main": "dist/cjs/index.js",
8
8
  "module": "dist/esm/index.mjs",
@@ -49,7 +49,7 @@
49
49
  "react": "^16.11.0 || ^17.0.0 || ^18.0.0"
50
50
  },
51
51
  "dependencies": {
52
- "@knocklabs/client": "^0.11.1",
52
+ "@knocklabs/client": "^0.11.3",
53
53
  "date-fns": "^4.0.0",
54
54
  "swr": "^2.2.5",
55
55
  "zustand": "^3.7.2"
@@ -70,7 +70,7 @@
70
70
  "rollup-plugin-execute": "^1.1.1",
71
71
  "typescript": "^5.7.3",
72
72
  "vite": "^5.0.0",
73
- "vite-plugin-dts": "^4.3.0",
73
+ "vite-plugin-dts": "^4.5.0",
74
74
  "vite-plugin-no-bundle": "^4.0.0",
75
75
  "vitest": "^2.1.8"
76
76
  }
package/src/index.ts CHANGED
@@ -3,3 +3,4 @@ export * from "./modules/feed";
3
3
  export * from "./modules/ms-teams";
4
4
  export * from "./modules/slack";
5
5
  export * from "./modules/i18n";
6
+ export * from "./interfaces";
@@ -0,0 +1,4 @@
1
+ export type RecipientObject = {
2
+ objectId: string;
3
+ collection: string;
4
+ };
@@ -61,16 +61,16 @@ export function feedProviderKey(
61
61
  */
62
62
  export function slackProviderKey({
63
63
  knockSlackChannelId,
64
- tenant,
64
+ tenantId,
65
65
  connectionStatus,
66
66
  errorLabel,
67
67
  }: {
68
68
  knockSlackChannelId: string;
69
- tenant: string;
69
+ tenantId: string;
70
70
  connectionStatus: string;
71
71
  errorLabel: string | null;
72
72
  }) {
73
- return [knockSlackChannelId, tenant, connectionStatus, errorLabel]
73
+ return [knockSlackChannelId, tenantId, connectionStatus, errorLabel]
74
74
  .filter((f) => f !== null && f !== undefined)
75
75
  .join("-");
76
76
  }
@@ -12,9 +12,14 @@ const en: I18nContent = {
12
12
  unread: "Unread",
13
13
  read: "Read",
14
14
  unseen: "Unseen",
15
+ msTeamsChannelSetError: "Error setting channel.",
15
16
  msTeamsConnect: "Connect to Microsoft Teams",
16
17
  msTeamsConnected: "Connected",
17
18
  msTeamsConnecting: "Connecting to Microsoft Teams…",
19
+ msTeamsConnectionErrorExists:
20
+ "Try reconnecting to Microsoft Teams to find and select channels from your teams.",
21
+ msTeamsConnectionErrorOccurred:
22
+ "There was an error connecting to Microsoft Teams. Try reconnecting to find and select channels from your teams.",
18
23
  msTeamsConnectContainerDescription:
19
24
  "Connect to get notifications in Microsoft Teams",
20
25
  msTeamsDisconnect: "Disconnect",
@@ -13,9 +13,12 @@ export interface Translations {
13
13
  readonly unread: string;
14
14
  readonly read: string;
15
15
  readonly unseen: string;
16
+ readonly msTeamsChannelSetError: string;
16
17
  readonly msTeamsConnect: string;
17
18
  readonly msTeamsConnected: string;
18
19
  readonly msTeamsConnecting: string;
20
+ readonly msTeamsConnectionErrorExists: string;
21
+ readonly msTeamsConnectionErrorOccurred: string;
19
22
  readonly msTeamsConnectContainerDescription: string;
20
23
  readonly msTeamsDisconnect: string;
21
24
  readonly msTeamsDisconnecting: string;
@@ -1,2 +1,5 @@
1
1
  export { default as useMsTeamsConnectionStatus } from "./useMsTeamsConnectionStatus";
2
2
  export { default as useMsTeamsAuth } from "./useMsTeamsAuth";
3
+ export { default as useMsTeamsTeams } from "./useMsTeamsTeams";
4
+ export { default as useMsTeamsChannels } from "./useMsTeamsChannels";
5
+ export { default as useConnectedMsTeamsChannels } from "./useConnectedMsTeamsChannels";
@@ -0,0 +1,100 @@
1
+ import { useKnockMsTeamsClient } from "..";
2
+ import { MsTeamsChannelConnection } from "@knocklabs/client";
3
+ import { GenericData } from "@knocklabs/types";
4
+ import { useState } from "react";
5
+ import useSWR from "swr";
6
+
7
+ import { RecipientObject } from "../../..";
8
+ import { useKnockClient } from "../../core";
9
+ import { useTranslations } from "../../i18n";
10
+
11
+ const QUERY_KEY = "MS_TEAMS_CONNECTED_CHANNELS";
12
+
13
+ type UseConnectedMsTeamsChannelsProps = {
14
+ msTeamsChannelsRecipientObject: RecipientObject;
15
+ };
16
+
17
+ type UseConnectedMsTeamsChannelsOutput = {
18
+ data: MsTeamsChannelConnection[] | null;
19
+ updateConnectedChannels: (
20
+ connectedChannels: MsTeamsChannelConnection[],
21
+ ) => Promise<void>;
22
+ loading: boolean;
23
+ error: string | null;
24
+ updating: boolean;
25
+ };
26
+
27
+ function useConnectedMsTeamsChannels({
28
+ msTeamsChannelsRecipientObject: { objectId, collection },
29
+ }: UseConnectedMsTeamsChannelsProps): UseConnectedMsTeamsChannelsOutput {
30
+ const { t } = useTranslations();
31
+ const knock = useKnockClient();
32
+ const { connectionStatus, knockMsTeamsChannelId } = useKnockMsTeamsClient();
33
+
34
+ const [error, setError] = useState<string | null>(null);
35
+ const [isUpdating, setIsUpdating] = useState(false);
36
+
37
+ const {
38
+ data: connectedChannels,
39
+ mutate,
40
+ isValidating,
41
+ isLoading,
42
+ } = useSWR<MsTeamsChannelConnection[]>(
43
+ // Only fetch when Microsoft Teams is connected
44
+ connectionStatus === "connected"
45
+ ? [QUERY_KEY, knockMsTeamsChannelId, collection, objectId]
46
+ : null,
47
+ async () => {
48
+ return knock.objects
49
+ .getChannelData({
50
+ collection,
51
+ objectId,
52
+ channelId: knockMsTeamsChannelId,
53
+ })
54
+ .then((res) => res.data?.connections ?? [])
55
+ .catch(() => []);
56
+ },
57
+ {
58
+ onSuccess: () => {
59
+ setError(null);
60
+ },
61
+ },
62
+ );
63
+
64
+ const updateConnectedChannels = async (
65
+ channelsToSendToKnock: MsTeamsChannelConnection[],
66
+ ) => {
67
+ setIsUpdating(true);
68
+ try {
69
+ await mutate(
70
+ () =>
71
+ knock.objects
72
+ .setChannelData({
73
+ objectId,
74
+ collection,
75
+ channelId: knockMsTeamsChannelId,
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
+ );
85
+ } catch (_error) {
86
+ setError(t("msTeamsChannelSetError") || "");
87
+ }
88
+ setIsUpdating(false);
89
+ };
90
+
91
+ return {
92
+ data: connectedChannels ?? null,
93
+ updateConnectedChannels,
94
+ updating: isUpdating,
95
+ loading: isLoading || isValidating,
96
+ error,
97
+ };
98
+ }
99
+
100
+ export default useConnectedMsTeamsChannels;
@@ -0,0 +1,53 @@
1
+ import { GetMsTeamsChannelsResponse, MsTeamsChannel } from "@knocklabs/client";
2
+ import useSWR from "swr";
3
+
4
+ import { useKnockClient } from "../../core";
5
+ import { useKnockMsTeamsClient } from "../context";
6
+ import { MsTeamsChannelQueryOptions } from "../interfaces";
7
+
8
+ const QUERY_KEY = "MS_TEAMS_CHANNELS";
9
+
10
+ type UseMsTeamsChannelsProps = {
11
+ teamId?: string;
12
+ queryOptions?: MsTeamsChannelQueryOptions;
13
+ };
14
+
15
+ type UseMsTeamsChannelsOutput = {
16
+ data: MsTeamsChannel[];
17
+ isLoading: boolean;
18
+ refetch: () => void;
19
+ };
20
+
21
+ function useMsTeamsChannels({
22
+ teamId,
23
+ queryOptions,
24
+ }: UseMsTeamsChannelsProps): UseMsTeamsChannelsOutput {
25
+ const knock = useKnockClient();
26
+ const { knockMsTeamsChannelId, tenantId } = useKnockMsTeamsClient();
27
+
28
+ const fetchChannels = () =>
29
+ knock.msTeams.getChannels({
30
+ knockChannelId: knockMsTeamsChannelId,
31
+ tenant: tenantId,
32
+ teamId: teamId!,
33
+ queryOptions: {
34
+ $filter: queryOptions?.filter,
35
+ $select: queryOptions?.select,
36
+ },
37
+ });
38
+
39
+ const { data, isLoading, isValidating, mutate } =
40
+ useSWR<GetMsTeamsChannelsResponse>(
41
+ teamId ? [QUERY_KEY, teamId] : null,
42
+ fetchChannels,
43
+ { revalidateOnFocus: false },
44
+ );
45
+
46
+ return {
47
+ data: data?.ms_teams_channels ?? [],
48
+ isLoading: isLoading || isValidating,
49
+ refetch: () => mutate(),
50
+ };
51
+ }
52
+
53
+ export default useMsTeamsChannels;
@@ -0,0 +1,112 @@
1
+ import { GetMsTeamsTeamsResponse, MsTeamsTeam } from "@knocklabs/client";
2
+ import { useEffect, useMemo } from "react";
3
+ import useSWRInfinite from "swr/infinite";
4
+
5
+ import { useKnockClient } from "../../core";
6
+ import { useKnockMsTeamsClient } from "../context";
7
+ import { MsTeamsTeamQueryOptions } from "../interfaces";
8
+
9
+ const MAX_COUNT = 1000;
10
+
11
+ const QUERY_KEY = "MS_TEAMS_TEAMS";
12
+
13
+ type UseMsTeamsTeamsProps = {
14
+ queryOptions?: MsTeamsTeamQueryOptions;
15
+ };
16
+
17
+ type UseMsTeamsTeamsOutput = {
18
+ data: MsTeamsTeam[];
19
+ isLoading: boolean;
20
+ refetch: () => void;
21
+ };
22
+
23
+ type QueryKey = [key: string, skiptoken: string] | null;
24
+
25
+ function getQueryKey(
26
+ pageIndex: number,
27
+ previousPageData: GetMsTeamsTeamsResponse,
28
+ ): QueryKey {
29
+ // First page so just pass empty
30
+ if (pageIndex === 0) {
31
+ return [QUERY_KEY, ""];
32
+ }
33
+
34
+ // If there's no more data then return an empty next skiptoken
35
+ if (previousPageData && ["", null].includes(previousPageData.skip_token)) {
36
+ return null;
37
+ }
38
+
39
+ // Next skiptoken exists so pass it
40
+ return [QUERY_KEY, previousPageData.skip_token ?? ""];
41
+ }
42
+
43
+ function useMsTeamsTeams({
44
+ queryOptions = {},
45
+ }: UseMsTeamsTeamsProps): UseMsTeamsTeamsOutput {
46
+ const knock = useKnockClient();
47
+ const { knockMsTeamsChannelId, tenantId, connectionStatus } =
48
+ useKnockMsTeamsClient();
49
+
50
+ const fetchTeams = (queryKey: QueryKey) =>
51
+ knock.msTeams.getTeams({
52
+ knockChannelId: knockMsTeamsChannelId,
53
+ tenant: tenantId,
54
+ queryOptions: {
55
+ $skiptoken: queryKey?.[1],
56
+ $top: queryOptions?.limitPerPage,
57
+ $filter: queryOptions?.filter,
58
+ $select: queryOptions?.select,
59
+ },
60
+ });
61
+
62
+ const { data, error, isLoading, isValidating, setSize, mutate } =
63
+ useSWRInfinite<GetMsTeamsTeamsResponse>(getQueryKey, fetchTeams, {
64
+ initialSize: 0,
65
+ revalidateOnFocus: false,
66
+ });
67
+
68
+ const lastPage = data?.at(-1);
69
+ const hasNextPage = lastPage === undefined || !!lastPage.skip_token;
70
+
71
+ const teams = useMemo(
72
+ () =>
73
+ (data ?? [])
74
+ .flatMap((page) => page?.ms_teams_teams)
75
+ .filter((team) => !!team),
76
+ [data],
77
+ );
78
+
79
+ const maxCount = queryOptions?.maxCount || MAX_COUNT;
80
+
81
+ useEffect(() => {
82
+ if (
83
+ connectionStatus === "connected" &&
84
+ !error &&
85
+ hasNextPage &&
86
+ !isLoading &&
87
+ !isValidating &&
88
+ teams.length < maxCount
89
+ ) {
90
+ // Fetch a page at a time until we have nothing else left to fetch
91
+ // or we've already hit the max amount of teams to fetch
92
+ setSize((size) => size + 1);
93
+ }
94
+ }, [
95
+ teams.length,
96
+ setSize,
97
+ hasNextPage,
98
+ isLoading,
99
+ isValidating,
100
+ maxCount,
101
+ error,
102
+ connectionStatus,
103
+ ]);
104
+
105
+ return {
106
+ data: teams,
107
+ isLoading: isLoading || isValidating,
108
+ refetch: () => mutate(),
109
+ };
110
+ }
111
+
112
+ export default useMsTeamsTeams;
@@ -1,2 +1,3 @@
1
1
  export * from "./context";
2
2
  export * from "./hooks";
3
+ export * from "./interfaces";
@@ -0,0 +1,11 @@
1
+ export type MsTeamsTeamQueryOptions = {
2
+ maxCount?: number;
3
+ limitPerPage?: number;
4
+ filter?: string;
5
+ select?: string;
6
+ };
7
+
8
+ export type MsTeamsChannelQueryOptions = {
9
+ filter?: string;
10
+ select?: string;
11
+ };
@@ -8,6 +8,10 @@ import { ConnectionStatus } from "../hooks/useSlackConnectionStatus";
8
8
 
9
9
  export interface KnockSlackProviderState {
10
10
  knockSlackChannelId: string;
11
+ tenantId: string;
12
+ /**
13
+ * @deprecated Use `tenantId` instead. This field will be removed in a future release.
14
+ */
11
15
  tenant: string;
12
16
  connectionStatus: ConnectionStatus;
13
17
  setConnectionStatus: (connectionStatus: ConnectionStatus) => void;
@@ -20,14 +24,25 @@ export interface KnockSlackProviderState {
20
24
  const SlackProviderStateContext =
21
25
  React.createContext<KnockSlackProviderState | null>(null);
22
26
 
23
- export interface KnockSlackProviderProps {
24
- knockSlackChannelId: string;
25
- tenant: string;
26
- }
27
+ export type KnockSlackProviderProps =
28
+ | {
29
+ knockSlackChannelId: string;
30
+ /**
31
+ * @deprecated Use `tenantId` instead. This field will be removed in a future release.
32
+ */
33
+ tenant: string;
34
+ }
35
+ | {
36
+ knockSlackChannelId: string;
37
+ tenantId: string;
38
+ };
27
39
 
28
40
  export const KnockSlackProvider: React.FC<
29
41
  PropsWithChildren<KnockSlackProviderProps>
30
- > = ({ knockSlackChannelId, tenant, children }) => {
42
+ > = (props) => {
43
+ const { knockSlackChannelId, children } = props;
44
+ const tenantId = "tenantId" in props ? props.tenantId : props.tenant;
45
+
31
46
  const knock = useKnockClient();
32
47
 
33
48
  const {
@@ -37,13 +52,13 @@ export const KnockSlackProvider: React.FC<
37
52
  setErrorLabel,
38
53
  actionLabel,
39
54
  setActionLabel,
40
- } = useSlackConnectionStatus(knock, knockSlackChannelId, tenant);
55
+ } = useSlackConnectionStatus(knock, knockSlackChannelId, tenantId);
41
56
 
42
57
  return (
43
58
  <SlackProviderStateContext.Provider
44
59
  key={slackProviderKey({
45
60
  knockSlackChannelId,
46
- tenant,
61
+ tenantId,
47
62
  connectionStatus,
48
63
  errorLabel,
49
64
  })}
@@ -55,7 +70,9 @@ export const KnockSlackProvider: React.FC<
55
70
  actionLabel,
56
71
  setActionLabel,
57
72
  knockSlackChannelId,
58
- tenant,
73
+ // Assign the same value to both tenant and tenantId for backwards compatibility
74
+ tenant: tenantId,
75
+ tenantId,
59
76
  }}
60
77
  >
61
78
  {children}