@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
package/CHANGELOG.md CHANGED
@@ -1,26 +1,16 @@
1
1
  # Changelog
2
2
 
3
- ## 0.2.29
3
+ ## 0.3.0-rc-2.0
4
4
 
5
- ### Patch Changes
6
-
7
- - Updated dependencies [26db496]
8
- - Updated dependencies [988aaf9]
9
- - @knocklabs/client@0.10.17
10
-
11
- ## 0.2.28
12
-
13
- ### Patch Changes
14
-
15
- - Updated dependencies [bc99374]
16
- - @knocklabs/client@0.10.16
5
+ ### Minor Changes
17
6
 
18
- ## 0.2.27
7
+ - f442962: feat: add in app messages client, hooks, provider, and components
19
8
 
20
9
  ### Patch Changes
21
10
 
22
- - Updated dependencies [26166e3]
23
- - @knocklabs/client@0.10.15
11
+ - Updated dependencies [1b3ad4b]
12
+ - Updated dependencies [f442962]
13
+ - @knocklabs/client@0.11.0-rc-2.0
24
14
 
25
15
  ## 0.2.26
26
16
 
package/dist/cjs/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./modules/core/context/KnockProvider.js"),i=require("./modules/core/hooks/useAuthenticatedKnockClient.js"),c=require("./modules/core/hooks/useStableOptions.js"),a=require("./modules/core/constants.js"),e=require("./modules/core/utils.js"),n=require("./modules/feed/context/KnockFeedProvider.js"),u=require("./modules/feed/hooks/useNotifications.js"),l=require("./modules/feed/hooks/useFeedSettings.js"),o=require("./modules/feed/hooks/useNotificationStore.js"),r=require("./modules/slack/context/KnockSlackProvider.js"),d=require("./modules/slack/hooks/useSlackConnectionStatus.js"),k=require("./modules/slack/hooks/useSlackChannels.js"),S=require("./modules/slack/hooks/useConnectedSlackChannels.js"),K=require("./modules/slack/hooks/useSlackAuth.js"),s=require("./modules/i18n/context/KnockI18nProvider.js"),C=require("./modules/i18n/hooks/useTranslations.js"),q=require("./modules/i18n/languages/index.js");exports.KnockProvider=t.KnockProvider;exports.useKnockClient=t.useKnockClient;exports.useAuthenticatedKnockClient=i;exports.useStableOptions=c;exports.FilterStatus=a.FilterStatus;exports.feedProviderKey=e.feedProviderKey;exports.formatBadgeCount=e.formatBadgeCount;exports.formatTimestamp=e.formatTimestamp;exports.renderNodeOrFallback=e.renderNodeOrFallback;exports.slackProviderKey=e.slackProviderKey;exports.toSentenceCase=e.toSentenceCase;exports.KnockFeedProvider=n.KnockFeedProvider;exports.useKnockFeed=n.useKnockFeed;exports.useNotifications=u;exports.useFeedSettings=l;exports.useCreateNotificationStore=o.useCreateNotificationStore;exports.useNotificationStore=o.default;exports.KnockSlackProvider=r.KnockSlackProvider;exports.useKnockSlackClient=r.useKnockSlackClient;exports.useSlackConnectionStatus=d;exports.useSlackChannels=k;exports.useConnectedSlackChannels=S;exports.useSlackAuth=K;exports.I18nContext=s.I18nContext;exports.KnockI18nProvider=s.KnockI18nProvider;exports.useTranslations=C.useTranslations;exports.locales=q.locales;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./modules/core/context/KnockProvider.js"),a=require("./modules/core/hooks/useAuthenticatedKnockClient.js"),u=require("./modules/core/hooks/useStableOptions.js"),l=require("./modules/core/constants.js"),e=require("./modules/core/utils.js"),s=require("./modules/feed/context/KnockFeedProvider.js"),d=require("./modules/feed/hooks/useNotifications.js"),k=require("./modules/feed/hooks/useFeedSettings.js"),o=require("./modules/feed/hooks/useNotificationStore.js"),t=require("./modules/in-app-messages/context/KnockInAppMessagesChannelProvider.js"),r=require("./modules/in-app-messages/hooks/useInAppMessages.js"),i=require("./modules/slack/context/KnockSlackProvider.js"),S=require("./modules/slack/hooks/useSlackConnectionStatus.js"),C=require("./modules/slack/hooks/useSlackChannels.js"),K=require("./modules/slack/hooks/useConnectedSlackChannels.js"),p=require("./modules/slack/hooks/useSlackAuth.js"),c=require("./modules/i18n/context/KnockI18nProvider.js"),v=require("./modules/i18n/hooks/useTranslations.js"),P=require("./modules/i18n/languages/index.js");exports.KnockProvider=n.KnockProvider;exports.useKnockClient=n.useKnockClient;exports.useAuthenticatedKnockClient=a;exports.useStableOptions=u;exports.FilterStatus=l.FilterStatus;exports.feedProviderKey=e.feedProviderKey;exports.formatBadgeCount=e.formatBadgeCount;exports.formatTimestamp=e.formatTimestamp;exports.renderNodeOrFallback=e.renderNodeOrFallback;exports.slackProviderKey=e.slackProviderKey;exports.toSentenceCase=e.toSentenceCase;exports.KnockFeedProvider=s.KnockFeedProvider;exports.useKnockFeed=s.useKnockFeed;exports.useNotifications=d;exports.useFeedSettings=k;exports.useCreateNotificationStore=o.useCreateNotificationStore;exports.useNotificationStore=o.default;exports.KnockInAppMessagesChannelProvider=t.KnockInAppMessagesChannelProvider;exports.useInAppMessagesChannel=t.useInAppMessagesChannel;exports.useInAppMessage=r.useInAppMessage;exports.useInAppMessages=r.useInAppMessages;exports.KnockSlackProvider=i.KnockSlackProvider;exports.useKnockSlackClient=i.useKnockSlackClient;exports.useSlackConnectionStatus=S;exports.useSlackChannels=C;exports.useConnectedSlackChannels=K;exports.useSlackAuth=p;exports.I18nContext=c.I18nContext;exports.KnockI18nProvider=c.KnockI18nProvider;exports.useTranslations=v.useTranslations;exports.locales=P.locales;
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react"),b=require("../../i18n/context/KnockI18nProvider.js"),v=require("../hooks/useAuthenticatedKnockClient.js");require("zustand/shallow");function P(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 o=P(f),i=o.createContext(null),m=({apiKey:e,host:n,logLevel:t,userId:r,userToken:a,onUserTokenExpiring:c,timeBeforeExpirationInMs:u,children:s,i18n:d})=>{const l=o.useMemo(()=>({host:n,onUserTokenExpiring:c,timeBeforeExpirationInMs:u,logLevel:t}),[n,c,u,t]),k=v(e,r,a,l);return o.createElement(i.Provider,{value:{knock:k}},o.createElement(b.KnockI18nProvider,{i18n:d},s))},K=()=>{const e=o.useContext(i);if(e===void 0)throw new Error("useKnock must be used within a KnockProvider");return e.knock};exports.KnockProvider=m;exports.useKnockClient=K;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react"),b=require("../../i18n/context/KnockI18nProvider.js"),K=require("../hooks/useAuthenticatedKnockClient.js");require("fast-deep-equal");function m(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 o=m(f),i=o.createContext(null),P=({apiKey:e,host:n,logLevel:t,userId:r,userToken:s,onUserTokenExpiring:c,timeBeforeExpirationInMs:u,children:a,i18n:l})=>{const d=o.useMemo(()=>({host:n,onUserTokenExpiring:c,timeBeforeExpirationInMs:u,logLevel:t}),[n,c,u,t]),k=K(e,r,s,d);return o.createElement(i.Provider,{value:{knock:k}},o.createElement(b.KnockI18nProvider,{i18n:l},a))},p=()=>{const e=o.useContext(i);if(!e)throw new Error("useKnockClient must be used within a KnockProvider");return e.knock};exports.KnockProvider=P;exports.useKnockClient=p;
2
2
  //# sourceMappingURL=KnockProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"KnockProvider.js","sources":["../../../../../src/modules/core/context/KnockProvider.tsx"],"sourcesContent":["import Knock, { AuthenticateOptions, LogLevel } from \"@knocklabs/client\";\nimport * as React from \"react\";\nimport { PropsWithChildren } from \"react\";\n\nimport { I18nContent, KnockI18nProvider } from \"../../i18n\";\nimport { useAuthenticatedKnockClient } from \"../hooks\";\n\nexport interface KnockProviderState {\n knock: Knock;\n}\n\nconst ProviderStateContext = React.createContext<KnockProviderState | null>(\n null,\n);\n\nexport interface KnockProviderProps {\n // Knock client props\n apiKey: string;\n host?: string;\n // Authentication props\n userId: string;\n userToken?: string;\n onUserTokenExpiring?: AuthenticateOptions[\"onUserTokenExpiring\"];\n timeBeforeExpirationInMs?: AuthenticateOptions[\"timeBeforeExpirationInMs\"];\n\n // i18n translations\n i18n?: I18nContent;\n\n logLevel?: LogLevel;\n}\n\nexport const KnockProvider: React.FC<PropsWithChildren<KnockProviderProps>> = ({\n apiKey,\n host,\n logLevel,\n userId,\n userToken,\n onUserTokenExpiring,\n timeBeforeExpirationInMs,\n children,\n i18n,\n}) => {\n // We memoize the options here so that we don't create a new object on every re-render\n const authenticateOptions = React.useMemo(\n () => ({\n host,\n onUserTokenExpiring,\n timeBeforeExpirationInMs,\n logLevel,\n }),\n [host, onUserTokenExpiring, timeBeforeExpirationInMs, logLevel],\n );\n\n const knock = useAuthenticatedKnockClient(\n apiKey,\n userId,\n userToken,\n authenticateOptions,\n );\n\n return (\n <ProviderStateContext.Provider\n value={{\n knock,\n }}\n >\n <KnockI18nProvider i18n={i18n}>{children}</KnockI18nProvider>\n </ProviderStateContext.Provider>\n );\n};\n\nexport const useKnockClient = (): Knock => {\n const context = React.useContext(ProviderStateContext) as KnockProviderState;\n if (context === undefined) {\n throw new Error(\"useKnock must be used within a KnockProvider\");\n }\n return context.knock;\n};\n"],"names":["ProviderStateContext","React","createContext","KnockProvider","apiKey","host","logLevel","userId","userToken","onUserTokenExpiring","timeBeforeExpirationInMs","children","i18n","authenticateOptions","useMemo","knock","useAuthenticatedKnockClient","KnockI18nProvider","useKnockClient","context","useContext","undefined","Error"],"mappings":"yjBAWMA,EAAuBC,EAAMC,cACjC,IACF,EAkBaC,EAAiEA,CAAC,CAC7EC,OAAAA,EACAC,KAAAA,EACAC,SAAAA,EACAC,OAAAA,EACAC,UAAAA,EACAC,oBAAAA,EACAC,yBAAAA,EACAC,SAAAA,EACAC,KAAAA,CACF,IAAM,CAEEC,MAAAA,EAAsBZ,EAAMa,QAChC,KAAO,CACLT,KAAAA,EACAI,oBAAAA,EACAC,yBAAAA,EACAJ,SAAAA,CAAAA,GAEF,CAACD,EAAMI,EAAqBC,EAA0BJ,CAAQ,CAChE,EAEMS,EAAQC,EACZZ,EACAG,EACAC,EACAK,CACF,EAEA,OACGZ,EAAA,cAAAD,EAAqB,SAArB,CACC,MAAO,CACLe,MAAAA,CAAAA,CAGF,EAAAd,EAAA,cAACgB,EAAAA,kBAAkB,CAAA,KAAAL,CAAA,EAAaD,CAAS,CAC3C,CAEJ,EAEaO,EAAiBA,IAAa,CACnCC,MAAAA,EAAUlB,EAAMmB,WAAWpB,CAAoB,EACrD,GAAImB,IAAYE,OACR,MAAA,IAAIC,MAAM,8CAA8C,EAEhE,OAAOH,EAAQJ,KACjB"}
1
+ {"version":3,"file":"KnockProvider.js","sources":["../../../../../src/modules/core/context/KnockProvider.tsx"],"sourcesContent":["import Knock, { AuthenticateOptions, LogLevel } from \"@knocklabs/client\";\nimport * as React from \"react\";\nimport { PropsWithChildren } from \"react\";\n\nimport { I18nContent, KnockI18nProvider } from \"../../i18n\";\nimport { useAuthenticatedKnockClient } from \"../hooks\";\n\nexport interface KnockProviderState {\n knock: Knock;\n}\n\nconst KnockContext = React.createContext<KnockProviderState | null>(null);\n\nexport interface KnockProviderProps {\n // Knock client props\n apiKey: string;\n host?: string;\n // Authentication props\n userId: string;\n userToken?: string;\n onUserTokenExpiring?: AuthenticateOptions[\"onUserTokenExpiring\"];\n timeBeforeExpirationInMs?: AuthenticateOptions[\"timeBeforeExpirationInMs\"];\n\n // i18n translations\n i18n?: I18nContent;\n\n logLevel?: LogLevel;\n}\n\nexport const KnockProvider: React.FC<PropsWithChildren<KnockProviderProps>> = ({\n apiKey,\n host,\n logLevel,\n userId,\n userToken,\n onUserTokenExpiring,\n timeBeforeExpirationInMs,\n children,\n i18n,\n}) => {\n // We memoize the options here so that we don't create a new object on every re-render\n const authenticateOptions = React.useMemo(\n () => ({\n host,\n onUserTokenExpiring,\n timeBeforeExpirationInMs,\n logLevel,\n }),\n [host, onUserTokenExpiring, timeBeforeExpirationInMs, logLevel],\n );\n\n const knock = useAuthenticatedKnockClient(\n apiKey,\n userId,\n userToken,\n authenticateOptions,\n );\n\n return (\n <KnockContext.Provider\n value={{\n knock,\n }}\n >\n <KnockI18nProvider i18n={i18n}>{children}</KnockI18nProvider>\n </KnockContext.Provider>\n );\n};\n\nexport const useKnockClient = (): Knock => {\n const context = React.useContext(KnockContext);\n if (!context) {\n throw new Error(\"useKnockClient must be used within a KnockProvider\");\n }\n return context.knock;\n};\n"],"names":["KnockContext","React","createContext","KnockProvider","apiKey","host","logLevel","userId","userToken","onUserTokenExpiring","timeBeforeExpirationInMs","children","i18n","authenticateOptions","useMemo","knock","useAuthenticatedKnockClient","KnockI18nProvider","useKnockClient","context","useContext","Error"],"mappings":"yjBAWMA,EAAeC,EAAMC,cAAyC,IAAI,EAkB3DC,EAAiEA,CAAC,CAC7EC,OAAAA,EACAC,KAAAA,EACAC,SAAAA,EACAC,OAAAA,EACAC,UAAAA,EACAC,oBAAAA,EACAC,yBAAAA,EACAC,SAAAA,EACAC,KAAAA,CACF,IAAM,CAEEC,MAAAA,EAAsBZ,EAAMa,QAChC,KAAO,CACLT,KAAAA,EACAI,oBAAAA,EACAC,yBAAAA,EACAJ,SAAAA,CAAAA,GAEF,CAACD,EAAMI,EAAqBC,EAA0BJ,CAAQ,CAChE,EAEMS,EAAQC,EACZZ,EACAG,EACAC,EACAK,CACF,EAEA,OACGZ,EAAA,cAAAD,EAAa,SAAb,CACC,MAAO,CACLe,MAAAA,CAAAA,CAGF,EAAAd,EAAA,cAACgB,EAAAA,kBAAkB,CAAA,KAAAL,CAAA,EAAaD,CAAS,CAC3C,CAEJ,EAEaO,EAAiBA,IAAa,CACnCC,MAAAA,EAAUlB,EAAMmB,WAAWpB,CAAY,EAC7C,GAAI,CAACmB,EACG,MAAA,IAAIE,MAAM,oDAAoD,EAEtE,OAAOF,EAAQJ,KACjB"}
@@ -1,2 +1,2 @@
1
- "use strict";const u=require("react"),n=require("zustand/shallow"),s=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},c=s(n);function o(t){const r=u.useRef();return u.useMemo(()=>{const e=r.current;return e&&c.default(t,e)?e:(r.current=t,t)},[t])}module.exports=o;
1
+ "use strict";const n=require("fast-deep-equal"),r=require("react"),s=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},c=s(n);function a(t){const u=r.useRef();return r.useMemo(()=>{const e=u.current;return e&&c.default(t,e)?e:(u.current=t,t)},[t])}module.exports=a;
2
2
  //# sourceMappingURL=useStableOptions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useStableOptions.js","sources":["../../../../../src/modules/core/hooks/useStableOptions.ts"],"sourcesContent":["import { useMemo, useRef } from \"react\";\nimport shallow from \"zustand/shallow\";\n\nexport default function useStableOptions<T>(options: T): T {\n const optionsRef = useRef<T>();\n\n return useMemo(() => {\n const currentOptions = optionsRef.current;\n\n if (currentOptions && shallow(options, currentOptions)) {\n return currentOptions;\n }\n\n optionsRef.current = options;\n return options;\n }, [options]);\n}\n"],"names":["useStableOptions","options","optionsRef","useRef","useMemo","currentOptions","current","shallow"],"mappings":"kIAGA,SAAwBA,EAAoBC,EAAe,CACzD,MAAMC,EAAaC,EAAAA,SAEnB,OAAOC,UAAQ,IAAM,CACnB,MAAMC,EAAiBH,EAAWI,QAElC,OAAID,GAAkBE,EAAAA,QAAQN,EAASI,CAAc,EAC5CA,GAGTH,EAAWI,QAAUL,EACdA,EAAAA,EACN,CAACA,CAAO,CAAC,CACd"}
1
+ {"version":3,"file":"useStableOptions.js","sources":["../../../../../src/modules/core/hooks/useStableOptions.ts"],"sourcesContent":["import fastDeepEqual from \"fast-deep-equal\";\nimport { useMemo, useRef } from \"react\";\n\nexport default function useStableOptions<T>(options: T): T {\n const optionsRef = useRef<T>();\n\n return useMemo(() => {\n const currentOptions = optionsRef.current;\n\n if (currentOptions && fastDeepEqual(options, currentOptions)) {\n return currentOptions;\n }\n\n optionsRef.current = options;\n return options;\n }, [options]);\n}\n"],"names":["useStableOptions","options","optionsRef","useRef","useMemo","currentOptions","current","fastDeepEqual"],"mappings":"kIAGA,SAAwBA,EAAoBC,EAAe,CACzD,MAAMC,EAAaC,EAAAA,SAEnB,OAAOC,UAAQ,IAAM,CACnB,MAAMC,EAAiBH,EAAWI,QAElC,OAAID,GAAkBE,EAAAA,QAAcN,EAASI,CAAc,EAClDA,GAGTH,EAAWI,QAAUL,EACdA,EAAAA,EACN,CAACA,CAAO,CAAC,CACd"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../src/modules/core/utils.ts"],"sourcesContent":["import { FeedClientOptions } from \"@knocklabs/client\";\nimport { intlFormatDistance, parseISO } from \"date-fns\";\nimport { ReactNode } from \"react\";\n\nexport function formatBadgeCount(count: number): string | number {\n return count > 9 ? \"9+\" : count;\n}\n\ntype FormatTimestampOptions = {\n locale?: string | string[];\n};\n\nexport function formatTimestamp(\n ts: string,\n options: FormatTimestampOptions = {},\n) {\n try {\n const parsedTs = parseISO(ts);\n const formatted = intlFormatDistance(parsedTs, new Date(), {\n locale: options.locale,\n });\n\n return formatted;\n } catch (_e) {\n return ts;\n }\n}\n\nexport function toSentenceCase(string: string): string {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nexport function renderNodeOrFallback(node: ReactNode, fallback: ReactNode) {\n return node !== undefined ? node : fallback;\n}\n\n/*\n Used to build a consistent key for the KnockFeedProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function feedProviderKey(\n userId: string | undefined,\n feedId: string,\n options: FeedClientOptions = {},\n) {\n return [\n userId,\n feedId,\n options.source,\n options.tenant,\n options.has_tenant,\n options.archived,\n ]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n\n/*\n Used to build a consistent key for the KnockSlackProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function slackProviderKey({\n knockSlackChannelId,\n tenant,\n connectionStatus,\n errorLabel,\n}: {\n knockSlackChannelId: string;\n tenant: string;\n connectionStatus: string;\n errorLabel: string | null;\n}) {\n return [knockSlackChannelId, tenant, connectionStatus, errorLabel]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n"],"names":["formatBadgeCount","count","formatTimestamp","ts","options","parsedTs","parseISO","formatted","intlFormatDistance","Date","locale","toSentenceCase","string","charAt","toUpperCase","slice","renderNodeOrFallback","node","fallback","undefined","feedProviderKey","userId","feedId","source","tenant","has_tenant","archived","filter","f","join","slackProviderKey","knockSlackChannelId","connectionStatus","errorLabel"],"mappings":"4GAIO,SAASA,EAAiBC,EAAgC,CACxDA,OAAAA,EAAQ,EAAI,KAAOA,CAC5B,CAMO,SAASC,EACdC,EACAC,EAAkC,GAClC,CACI,GAAA,CACIC,MAAAA,EAAWC,WAASH,CAAE,EAKrBI,OAJWC,EAAAA,mBAAmBH,EAAU,IAAII,KAAQ,CACzDC,OAAQN,EAAQM,MAAAA,CACjB,OAGU,CACJP,OAAAA,CACT,CACF,CAEO,SAASQ,EAAeC,EAAwB,CAC9CA,OAAAA,EAAOC,OAAO,CAAC,EAAEC,cAAgBF,EAAOG,MAAM,CAAC,CACxD,CAEgBC,SAAAA,EAAqBC,EAAiBC,EAAqB,CAClED,OAAAA,IAASE,OAAYF,EAAOC,CACrC,CAMO,SAASE,EACdC,EACAC,EACAlB,EAA6B,CAAA,EAC7B,CACO,MAAA,CACLiB,EACAC,EACAlB,EAAQmB,OACRnB,EAAQoB,OACRpB,EAAQqB,WACRrB,EAAQsB,QAAQ,EAEfC,UAAcC,GAAM,IAAuB,EAC3CC,KAAK,GAAG,CACb,CAMO,SAASC,EAAiB,CAC/BC,oBAAAA,EACAP,OAAAA,EACAQ,iBAAAA,EACAC,WAAAA,CAMF,EAAG,CACD,MAAO,CAACF,EAAqBP,EAAQQ,EAAkBC,CAAU,EAC9DN,OAAcC,GAAAA,GAAM,IAAuB,EAC3CC,KAAK,GAAG,CACb"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../src/modules/core/utils.ts"],"sourcesContent":["import { FeedClientOptions } from \"@knocklabs/client\";\nimport { intlFormatDistance, parseISO } from \"date-fns\";\nimport { ReactNode } from \"react\";\n\nexport function formatBadgeCount(count: number): string | number {\n return count > 9 ? \"9+\" : count;\n}\n\ntype FormatTimestampOptions = {\n locale?: string | string[];\n};\n\nexport function formatTimestamp(\n ts: string,\n options: FormatTimestampOptions = {},\n) {\n try {\n const parsedTs = parseISO(ts);\n const formatted = intlFormatDistance(parsedTs, new Date(), {\n locale: options.locale,\n });\n\n return formatted;\n } catch (e) {\n return ts;\n }\n}\n\nexport function toSentenceCase(string: string): string {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nexport function renderNodeOrFallback(node: ReactNode, fallback: ReactNode) {\n return node !== undefined ? node : fallback;\n}\n\n/*\n Used to build a consistent key for the KnockFeedProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function feedProviderKey(\n userId: string | undefined,\n feedId: string,\n options: FeedClientOptions = {},\n) {\n return [\n userId,\n feedId,\n options.source,\n options.tenant,\n options.has_tenant,\n options.archived,\n ]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n\n/*\n Used to build a consistent key for the KnockSlackProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function slackProviderKey({\n knockSlackChannelId,\n tenant,\n connectionStatus,\n errorLabel,\n}: {\n knockSlackChannelId: string;\n tenant: string;\n connectionStatus: string;\n errorLabel: string | null;\n}) {\n return [knockSlackChannelId, tenant, connectionStatus, errorLabel]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n"],"names":["formatBadgeCount","count","formatTimestamp","ts","options","parsedTs","parseISO","formatted","intlFormatDistance","Date","locale","toSentenceCase","string","charAt","toUpperCase","slice","renderNodeOrFallback","node","fallback","undefined","feedProviderKey","userId","feedId","source","tenant","has_tenant","archived","filter","f","join","slackProviderKey","knockSlackChannelId","connectionStatus","errorLabel"],"mappings":"4GAIO,SAASA,EAAiBC,EAAgC,CACxDA,OAAAA,EAAQ,EAAI,KAAOA,CAC5B,CAMO,SAASC,EACdC,EACAC,EAAkC,GAClC,CACI,GAAA,CACIC,MAAAA,EAAWC,WAASH,CAAE,EAKrBI,OAJWC,EAAAA,mBAAmBH,EAAU,IAAII,KAAQ,CACzDC,OAAQN,EAAQM,MAAAA,CACjB,OAGS,CACHP,OAAAA,CACT,CACF,CAEO,SAASQ,EAAeC,EAAwB,CAC9CA,OAAAA,EAAOC,OAAO,CAAC,EAAEC,cAAgBF,EAAOG,MAAM,CAAC,CACxD,CAEgBC,SAAAA,EAAqBC,EAAiBC,EAAqB,CAClED,OAAAA,IAASE,OAAYF,EAAOC,CACrC,CAMO,SAASE,EACdC,EACAC,EACAlB,EAA6B,CAAA,EAC7B,CACO,MAAA,CACLiB,EACAC,EACAlB,EAAQmB,OACRnB,EAAQoB,OACRpB,EAAQqB,WACRrB,EAAQsB,QAAQ,EAEfC,UAAcC,GAAM,IAAuB,EAC3CC,KAAK,GAAG,CACb,CAMO,SAASC,EAAiB,CAC/BC,oBAAAA,EACAP,OAAAA,EACAQ,iBAAAA,EACAC,WAAAA,CAMF,EAAG,CACD,MAAO,CAACF,EAAqBP,EAAQQ,EAAkBC,CAAU,EAC9DN,OAAcC,GAAAA,GAAM,IAAuB,EAC3CC,KAAK,GAAG,CACb"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react"),d=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("zustand/shallow");const l=require("../../core/utils.js"),f=require("../hooks/useNotifications.js"),k=require("../hooks/useNotificationStore.js");function b(e){if(e&&typeof e=="object"&&"default"in e)return e;const o=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(o,t,r.get?r:{enumerable:!0,get:()=>e[t]})}}return o.default=e,Object.freeze(o)}const c=b(a),u=c.createContext(void 0),v=({feedId:e,children:o,defaultFeedOptions:t={},colorMode:r="light"})=>{const n=d.useKnockClient(),i=f(n,e,t),s=k.useCreateNotificationStore(i);return c.createElement(u.Provider,{key:l.feedProviderKey(n.userId,e,t),value:{knock:n,feedClient:i,useFeedStore:s,colorMode:r}},o)},K=()=>{const e=c.useContext(u);if(!e)throw new Error("useKnockFeed must be used within a KnockFeedProvider");return e};exports.KnockFeedProvider=v;exports.useKnockFeed=K;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("react"),a=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("fast-deep-equal");const l=require("../../core/utils.js"),f=require("../hooks/useNotifications.js"),k=require("../hooks/useNotificationStore.js");function v(e){if(e&&typeof e=="object"&&"default"in e)return e;const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const o=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,o.get?o:{enumerable:!0,get:()=>e[t]})}}return r.default=e,Object.freeze(r)}const c=v(d),u=c.createContext(void 0),K=({feedId:e,children:r,defaultFeedOptions:t={},colorMode:o="light"})=>{let n;try{n=a.useKnockClient()}catch{throw new Error("KnockFeedProvider must be used within a KnockProvider.")}const i=f(n,e,t),s=k.useCreateNotificationStore(i);return c.createElement(u.Provider,{key:l.feedProviderKey(n.userId,e,t),value:{knock:n,feedClient:i,useFeedStore:s,colorMode:o}},r)},b=()=>{const e=c.useContext(u);if(!e)throw new Error("useKnockFeed must be used within a KnockFeedProvider");return e};exports.KnockFeedProvider=K;exports.useKnockFeed=b;
2
2
  //# sourceMappingURL=KnockFeedProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"KnockFeedProvider.js","sources":["../../../../../src/modules/feed/context/KnockFeedProvider.tsx"],"sourcesContent":["import Knock, {\n Feed,\n FeedClientOptions,\n FeedStoreState,\n} from \"@knocklabs/client\";\nimport * as React from \"react\";\nimport { PropsWithChildren } from \"react\";\nimport { UseBoundStore } from \"zustand\";\n\nimport { useKnockClient } from \"../../core\";\nimport { ColorMode } from \"../../core/constants\";\nimport { feedProviderKey } from \"../../core/utils\";\nimport { useCreateNotificationStore } from \"../hooks\";\nimport useNotifications from \"../hooks/useNotifications\";\n\nexport interface KnockFeedProviderState {\n knock: Knock;\n feedClient: Feed;\n useFeedStore: UseBoundStore<FeedStoreState>;\n colorMode: ColorMode;\n}\n\nconst FeedStateContext = React.createContext<\n KnockFeedProviderState | undefined\n>(undefined);\n\nexport interface KnockFeedProviderProps {\n // Feed props\n feedId: string;\n\n // Extra options\n colorMode?: ColorMode;\n\n // Feed client options\n defaultFeedOptions?: FeedClientOptions;\n}\n\nexport const KnockFeedProvider: React.FC<\n PropsWithChildren<KnockFeedProviderProps>\n> = ({ feedId, children, defaultFeedOptions = {}, colorMode = \"light\" }) => {\n const knock = useKnockClient();\n const feedClient = useNotifications(knock, feedId, defaultFeedOptions);\n const useFeedStore = useCreateNotificationStore(feedClient);\n\n return (\n <FeedStateContext.Provider\n key={feedProviderKey(knock.userId, feedId, defaultFeedOptions)}\n value={{\n knock,\n feedClient,\n useFeedStore,\n colorMode,\n }}\n >\n {children}\n </FeedStateContext.Provider>\n );\n};\n\nexport const useKnockFeed = (): KnockFeedProviderState => {\n const context = React.useContext(FeedStateContext);\n\n if (!context) {\n throw new Error(\"useKnockFeed must be used within a KnockFeedProvider\");\n }\n\n return context;\n};\n"],"names":["FeedStateContext","React","createContext","undefined","KnockFeedProvider","feedId","children","defaultFeedOptions","colorMode","knock","useKnockClient","feedClient","useNotifications","useFeedStore","useCreateNotificationStore","feedProviderKey","userId","useKnockFeed","context","useContext","Error"],"mappings":"4pBAsBMA,EAAmBC,EAAMC,cAE7BC,MAAS,EAaEC,EAETA,CAAC,CAAEC,OAAAA,EAAQC,SAAAA,EAAUC,mBAAAA,EAAqB,CAAC,EAAGC,UAAAA,EAAY,OAAQ,IAAM,CAC1E,MAAMC,EAAQC,EAAAA,iBACRC,EAAaC,EAAiBH,EAAOJ,EAAQE,CAAkB,EAC/DM,EAAeC,6BAA2BH,CAAU,EAGxD,OAAAV,EAAA,cAACD,EAAiB,SAAjB,CACC,IAAKe,kBAAgBN,EAAMO,OAAQX,EAAQE,CAAkB,EAC7D,MAAO,CACLE,MAAAA,EACAE,WAAAA,EACAE,aAAAA,EACAL,UAAAA,CAAAA,GAGDF,CACH,CAEJ,EAEaW,EAAeA,IAA8B,CAClDC,MAAAA,EAAUjB,EAAMkB,WAAWnB,CAAgB,EAEjD,GAAI,CAACkB,EACG,MAAA,IAAIE,MAAM,sDAAsD,EAGjEF,OAAAA,CACT"}
1
+ {"version":3,"file":"KnockFeedProvider.js","sources":["../../../../../src/modules/feed/context/KnockFeedProvider.tsx"],"sourcesContent":["import Knock, {\n Feed,\n FeedClientOptions,\n FeedStoreState,\n} from \"@knocklabs/client\";\nimport * as React from \"react\";\nimport { PropsWithChildren } from \"react\";\nimport { UseBoundStore } from \"zustand\";\n\nimport { useKnockClient } from \"../../core\";\nimport { ColorMode } from \"../../core/constants\";\nimport { feedProviderKey } from \"../../core/utils\";\nimport { useCreateNotificationStore } from \"../hooks\";\nimport useNotifications from \"../hooks/useNotifications\";\n\nexport interface KnockFeedProviderState {\n knock: Knock;\n feedClient: Feed;\n useFeedStore: UseBoundStore<FeedStoreState>;\n colorMode: ColorMode;\n}\n\nconst KnockFeedContext = React.createContext<\n KnockFeedProviderState | undefined\n>(undefined);\n\nexport interface KnockFeedProviderProps {\n // Feed props\n feedId: string;\n\n // Extra options\n colorMode?: ColorMode;\n\n // Feed client options\n defaultFeedOptions?: FeedClientOptions;\n}\n\nexport const KnockFeedProvider: React.FC<\n PropsWithChildren<KnockFeedProviderProps>\n> = ({ feedId, children, defaultFeedOptions = {}, colorMode = \"light\" }) => {\n let knock: Knock;\n try {\n knock = useKnockClient();\n } catch (error) {\n throw new Error(\"KnockFeedProvider must be used within a KnockProvider.\");\n }\n\n const feedClient = useNotifications(knock, feedId, defaultFeedOptions);\n const useFeedStore = useCreateNotificationStore(feedClient);\n\n return (\n <KnockFeedContext.Provider\n key={feedProviderKey(knock.userId, feedId, defaultFeedOptions)}\n value={{\n knock,\n feedClient,\n useFeedStore,\n colorMode,\n }}\n >\n {children}\n </KnockFeedContext.Provider>\n );\n};\n\nexport const useKnockFeed = (): KnockFeedProviderState => {\n const context = React.useContext(KnockFeedContext);\n if (!context) {\n throw new Error(\"useKnockFeed must be used within a KnockFeedProvider\");\n }\n\n return context;\n};\n"],"names":["KnockFeedContext","React","createContext","undefined","KnockFeedProvider","feedId","children","defaultFeedOptions","colorMode","knock","useKnockClient","Error","feedClient","useNotifications","useFeedStore","useCreateNotificationStore","feedProviderKey","userId","useKnockFeed","context","useContext"],"mappings":"4pBAsBMA,EAAmBC,EAAMC,cAE7BC,MAAS,EAaEC,EAETA,CAAC,CAAEC,OAAAA,EAAQC,SAAAA,EAAUC,mBAAAA,EAAqB,CAAC,EAAGC,UAAAA,EAAY,OAAQ,IAAM,CACtEC,IAAAA,EACA,GAAA,CACFA,EAAQC,EAAe,eAAA,OACT,CACR,MAAA,IAAIC,MAAM,wDAAwD,CAC1E,CAEA,MAAMC,EAAaC,EAAiBJ,EAAOJ,EAAQE,CAAkB,EAC/DO,EAAeC,6BAA2BH,CAAU,EAGxD,OAAAX,EAAA,cAACD,EAAiB,SAAjB,CACC,IAAKgB,kBAAgBP,EAAMQ,OAAQZ,EAAQE,CAAkB,EAC7D,MAAO,CACLE,MAAAA,EACAG,WAAAA,EACAE,aAAAA,EACAN,UAAAA,CAAAA,GAGDF,CACH,CAEJ,EAEaY,EAAeA,IAA8B,CAClDC,MAAAA,EAAUlB,EAAMmB,WAAWpB,CAAgB,EACjD,GAAI,CAACmB,EACG,MAAA,IAAIR,MAAM,sDAAsD,EAGjEQ,OAAAA,CACT"}
@@ -0,0 +1,2 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
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:s}=A.useInAppMessagesChannel(),t=M(r),e=o.useMemo(()=>new g.InAppMessagesClient(s,n,t),[s,n,t]),{messages:a,networkStatus:c,loading:i}=l.useStore(s.store,p=>e.getQueryInfoSelector(p));return o.useEffect(()=>(e.subscribe(),e.fetch(),()=>{e.unsubscribe()}),[e]),{messages:a,networkStatus:c,loading:i,inAppMessagesClient:e}},b=(n,r={})=>{const{messages:s,...t}=u(n,{...r,page_size:1});return{message:s[0],...t}};exports.useInAppMessage=b;exports.useInAppMessages=u;
2
+ //# sourceMappingURL=useInAppMessages.js.map
@@ -0,0 +1 @@
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 }, [inAppMessagesClient]);\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,GAEjC,CAACb,CAAmB,CAAC,EAEjB,CAAEG,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,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const k=require("../hooks/useSlackConnectionStatus.js"),b=require("react");require("swr/infinite");const S=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("zustand/shallow");const f=require("../../core/utils.js");require("../../i18n/context/KnockI18nProvider.js");function v(e){if(e&&typeof e=="object"&&"default"in e)return e;const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,o.get?o:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const n=v(b),u=n.createContext(null),P=({knockSlackChannelId:e,tenant:t,children:r})=>{const o=S.useKnockClient(),{connectionStatus:c,setConnectionStatus:s,errorLabel:i,setErrorLabel:a,actionLabel:l,setActionLabel:d}=k(o,e,t);return n.createElement(u.Provider,{key:f.slackProviderKey({knockSlackChannelId:e,tenant:t,connectionStatus:c,errorLabel:i}),value:{connectionStatus:c,setConnectionStatus:s,errorLabel:i,setErrorLabel:a,actionLabel:l,setActionLabel:d,knockSlackChannelId:e,tenant:t}},r)},p=()=>{const e=n.useContext(u);if(e===void 0)throw new Error("useKnockSlackClient must be used within a KnockSlackProvider");return e};exports.KnockSlackProvider=P;exports.useKnockSlackClient=p;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const k=require("../hooks/useSlackConnectionStatus.js"),b=require("react");require("swr/infinite");const S=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("fast-deep-equal");const f=require("../../core/utils.js");require("../../i18n/context/KnockI18nProvider.js");function v(e){if(e&&typeof e=="object"&&"default"in e)return e;const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,o.get?o:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const n=v(b),u=n.createContext(null),P=({knockSlackChannelId:e,tenant:t,children:r})=>{const o=S.useKnockClient(),{connectionStatus:c,setConnectionStatus:s,errorLabel:i,setErrorLabel:a,actionLabel:l,setActionLabel:d}=k(o,e,t);return n.createElement(u.Provider,{key:f.slackProviderKey({knockSlackChannelId:e,tenant:t,connectionStatus:c,errorLabel:i}),value:{connectionStatus:c,setConnectionStatus:s,errorLabel:i,setErrorLabel:a,actionLabel:l,setActionLabel:d,knockSlackChannelId:e,tenant:t}},r)},p=()=>{const e=n.useContext(u);if(e===void 0)throw new Error("useKnockSlackClient must be used within a KnockSlackProvider");return e};exports.KnockSlackProvider=P;exports.useKnockSlackClient=p;
2
2
  //# sourceMappingURL=KnockSlackProvider.js.map
@@ -1,2 +1,2 @@
1
- "use strict";const K=require("../context/KnockSlackProvider.js"),e=require("react");require("../../i18n/context/KnockI18nProvider.js");const b=require("../../i18n/hooks/useTranslations.js");require("swr/infinite");const y=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("zustand/shallow");require("date-fns");function E({slackChannelsRecipientObject:{objectId:t,collection:a}}){const{t:q}=b.useTranslations(),c=y.useKnockClient(),{connectionStatus:h,knockSlackChannelId:s}=K.useKnockSlackClient(),[o,l]=e.useState(null),[r,i]=e.useState(null),[u,d]=e.useState(!1),[p,k]=e.useState(!1),C=e.useCallback(()=>{d(!0),(async()=>await c.objects.getChannelData({collection:a,objectId:t,channelId:s}))().then(n=>{var S,g;(S=n==null?void 0:n.data)!=null&&S.connections?l((g=n==null?void 0:n.data)==null?void 0:g.connections):l([]),i(null),d(!1)}).catch(()=>{l([]),i(null),d(!1)})},[a,c.objects,s,t]);return e.useEffect(()=>{h==="connected"&&!o&&!r&&!u&&C()},[o,C,u,r,h]),{data:o,updateConnectedChannels:async f=>{k(!0);try{await c.objects.setChannelData({objectId:t,collection:a,channelId:s,data:{connections:f}}),C()}catch{i(q("slackChannelSetError")||"")}k(!1)},updating:p,loading:u,error:r}}module.exports=E;
1
+ "use strict";const K=require("../context/KnockSlackProvider.js"),e=require("react");require("../../i18n/context/KnockI18nProvider.js");const b=require("../../i18n/hooks/useTranslations.js");require("swr/infinite");const y=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("fast-deep-equal");require("date-fns");function E({slackChannelsRecipientObject:{objectId:t,collection:a}}){const{t:q}=b.useTranslations(),c=y.useKnockClient(),{connectionStatus:h,knockSlackChannelId:s}=K.useKnockSlackClient(),[o,l]=e.useState(null),[r,i]=e.useState(null),[u,d]=e.useState(!1),[p,k]=e.useState(!1),C=e.useCallback(()=>{d(!0),(async()=>await c.objects.getChannelData({collection:a,objectId:t,channelId:s}))().then(n=>{var S,g;(S=n==null?void 0:n.data)!=null&&S.connections?l((g=n==null?void 0:n.data)==null?void 0:g.connections):l([]),i(null),d(!1)}).catch(()=>{l([]),i(null),d(!1)})},[a,c.objects,s,t]);return e.useEffect(()=>{h==="connected"&&!o&&!r&&!u&&C()},[o,C,u,r,h]),{data:o,updateConnectedChannels:async f=>{k(!0);try{await c.objects.setChannelData({objectId:t,collection:a,channelId:s,data:{connections:f}}),C()}catch{i(q("slackChannelSetError")||"")}k(!1)},updating:p,loading:u,error:r}}module.exports=E;
2
2
  //# sourceMappingURL=useConnectedSlackChannels.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useConnectedSlackChannels.js","sources":["../../../../../src/modules/slack/hooks/useConnectedSlackChannels.ts"],"sourcesContent":["import { ContainerObject, useKnockSlackClient } from \"..\";\nimport { SlackChannelConnection } from \"@knocklabs/client\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { useKnockClient } from \"../../core\";\nimport { useTranslations } from \"../../i18n\";\n\ntype UseSlackChannelsProps = {\n slackChannelsRecipientObject: ContainerObject;\n};\n\ntype UseSlackChannelOutput = {\n data: SlackChannelConnection[] | null;\n updateConnectedChannels: (\n connectedChannels: SlackChannelConnection[],\n ) => void;\n loading: boolean;\n error: string | null;\n updating: boolean;\n};\n\nfunction useConnectedSlackChannels({\n slackChannelsRecipientObject: { objectId, collection },\n}: UseSlackChannelsProps): UseSlackChannelOutput {\n const { t } = useTranslations();\n const knock = useKnockClient();\n const { connectionStatus, knockSlackChannelId } = useKnockSlackClient();\n const [connectedChannels, setConnectedChannels] = useState<\n null | SlackChannelConnection[]\n >(null);\n const [error, setError] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isUpdating, setIsUpdating] = useState(false);\n\n const fetchAndSetConnectedChannels = useCallback(() => {\n setIsLoading(true);\n const getConnectedChannels = async () =>\n await knock.objects.getChannelData({\n collection,\n objectId,\n channelId: knockSlackChannelId,\n });\n\n getConnectedChannels()\n .then((res) => {\n if (res?.data?.connections) {\n setConnectedChannels(res?.data?.connections);\n } else {\n setConnectedChannels([]);\n }\n setError(null);\n setIsLoading(false);\n })\n .catch(() => {\n setConnectedChannels([]);\n setError(null);\n setIsLoading(false);\n });\n }, [collection, knock.objects, knockSlackChannelId, objectId]);\n\n useEffect(() => {\n if (\n connectionStatus === \"connected\" &&\n !connectedChannels &&\n !error &&\n !isLoading\n ) {\n fetchAndSetConnectedChannels();\n }\n }, [\n connectedChannels,\n fetchAndSetConnectedChannels,\n isLoading,\n error,\n connectionStatus,\n ]);\n\n const updateConnectedChannels = async (\n channelsToSendToKnock: SlackChannelConnection[],\n ) => {\n setIsUpdating(true);\n try {\n await knock.objects.setChannelData({\n objectId,\n collection,\n channelId: knockSlackChannelId,\n data: { connections: channelsToSendToKnock },\n });\n fetchAndSetConnectedChannels();\n } catch (_error) {\n setError(t(\"slackChannelSetError\") || \"\");\n }\n setIsUpdating(false);\n };\n\n return {\n data: connectedChannels,\n updateConnectedChannels,\n updating: isUpdating,\n loading: isLoading,\n error,\n };\n}\n\nexport default useConnectedSlackChannels;\n"],"names":["useConnectedSlackChannels","slackChannelsRecipientObject","objectId","collection","t","useTranslations","knock","useKnockClient","connectionStatus","knockSlackChannelId","useKnockSlackClient","connectedChannels","setConnectedChannels","useState","error","setError","isLoading","setIsLoading","isUpdating","setIsUpdating","fetchAndSetConnectedChannels","useCallback","objects","getChannelData","channelId","then","res","data","connections","catch","useEffect","updateConnectedChannels","channelsToSendToKnock","setChannelData","updating","loading"],"mappings":"yVAqBA,SAASA,EAA0B,CACjCC,6BAA8B,CAAEC,SAAAA,EAAUC,WAAAA,CAAW,CAChC,EAA0B,CACzC,KAAA,CAAEC,EAAAA,GAAMC,EAAgB,gBAAA,EACxBC,EAAQC,EAAAA,iBACR,CAAEC,iBAAAA,EAAkBC,oBAAAA,GAAwBC,EAAoB,oBAAA,EAChE,CAACC,EAAmBC,CAAoB,EAAIC,WAEhD,IAAI,EACA,CAACC,EAAOC,CAAQ,EAAIF,WAAwB,IAAI,EAChD,CAACG,EAAWC,CAAY,EAAIJ,WAAS,EAAK,EAC1C,CAACK,EAAYC,CAAa,EAAIN,WAAS,EAAK,EAE5CO,EAA+BC,EAAAA,YAAY,IAAM,CACrDJ,EAAa,EAAI,GACY,SAC3B,MAAMX,EAAMgB,QAAQC,eAAe,CACjCpB,WAAAA,EACAD,SAAAA,EACAsB,UAAWf,CAAAA,CACZ,GAEkB,EAClBgB,KAAcC,GAAA,UACTA,EAAAA,GAAAA,YAAAA,EAAKC,OAALD,MAAAA,EAAWE,YACQF,GAAAA,EAAAA,GAAAA,YAAAA,EAAKC,OAALD,YAAAA,EAAWE,WAAW,EAE3ChB,EAAqB,CAAE,CAAA,EAEzBG,EAAS,IAAI,EACbE,EAAa,EAAK,CAAA,CACnB,EACAY,MAAM,IAAM,CACXjB,EAAqB,CAAE,CAAA,EACvBG,EAAS,IAAI,EACbE,EAAa,EAAK,CAAA,CACnB,CAAA,EACF,CAACd,EAAYG,EAAMgB,QAASb,EAAqBP,CAAQ,CAAC,EAE7D4B,OAAAA,EAAAA,UAAU,IAAM,CAEZtB,IAAqB,aACrB,CAACG,GACD,CAACG,GACD,CAACE,GAE4BI,GAC/B,EACC,CACDT,EACAS,EACAJ,EACAF,EACAN,CAAgB,CACjB,EAoBM,CACLmB,KAAMhB,EACNoB,wBApB8B,MAC9BC,GACG,CACHb,EAAc,EAAI,EACd,GAAA,CACIb,MAAAA,EAAMgB,QAAQW,eAAe,CACjC/B,SAAAA,EACAC,WAAAA,EACAqB,UAAWf,EACXkB,KAAM,CAAEC,YAAaI,CAAsB,CAAA,CAC5C,EAC4BZ,SACd,CACNhB,EAAAA,EAAE,sBAAsB,GAAK,EAAE,CAC1C,CACAe,EAAc,EAAK,CAAA,EAMnBe,SAAUhB,EACViB,QAASnB,EACTF,MAAAA,CAAAA,CAEJ"}
1
+ {"version":3,"file":"useConnectedSlackChannels.js","sources":["../../../../../src/modules/slack/hooks/useConnectedSlackChannels.ts"],"sourcesContent":["import { ContainerObject, useKnockSlackClient } from \"..\";\nimport { SlackChannelConnection } from \"@knocklabs/client\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { useKnockClient } from \"../../core\";\nimport { useTranslations } from \"../../i18n\";\n\ntype UseSlackChannelsProps = {\n slackChannelsRecipientObject: ContainerObject;\n};\n\ntype UseSlackChannelOutput = {\n data: SlackChannelConnection[] | null;\n updateConnectedChannels: (\n connectedChannels: SlackChannelConnection[],\n ) => void;\n loading: boolean;\n error: string | null;\n updating: boolean;\n};\n\nfunction useConnectedSlackChannels({\n slackChannelsRecipientObject: { objectId, collection },\n}: UseSlackChannelsProps): UseSlackChannelOutput {\n const { t } = useTranslations();\n const knock = useKnockClient();\n const { connectionStatus, knockSlackChannelId } = useKnockSlackClient();\n const [connectedChannels, setConnectedChannels] = useState<\n null | SlackChannelConnection[]\n >(null);\n const [error, setError] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isUpdating, setIsUpdating] = useState(false);\n\n const fetchAndSetConnectedChannels = useCallback(() => {\n setIsLoading(true);\n const getConnectedChannels = async () =>\n await knock.objects.getChannelData({\n collection,\n objectId,\n channelId: knockSlackChannelId,\n });\n\n getConnectedChannels()\n .then((res) => {\n if (res?.data?.connections) {\n setConnectedChannels(res?.data?.connections);\n } else {\n setConnectedChannels([]);\n }\n setError(null);\n setIsLoading(false);\n })\n .catch(() => {\n setConnectedChannels([]);\n setError(null);\n setIsLoading(false);\n });\n }, [collection, knock.objects, knockSlackChannelId, objectId]);\n\n useEffect(() => {\n if (\n connectionStatus === \"connected\" &&\n !connectedChannels &&\n !error &&\n !isLoading\n ) {\n fetchAndSetConnectedChannels();\n }\n }, [\n connectedChannels,\n fetchAndSetConnectedChannels,\n isLoading,\n error,\n connectionStatus,\n ]);\n\n const updateConnectedChannels = async (\n channelsToSendToKnock: SlackChannelConnection[],\n ) => {\n setIsUpdating(true);\n try {\n await knock.objects.setChannelData({\n objectId,\n collection,\n channelId: knockSlackChannelId,\n data: { connections: channelsToSendToKnock },\n });\n fetchAndSetConnectedChannels();\n } catch (error) {\n setError(t(\"slackChannelSetError\") || \"\");\n }\n setIsUpdating(false);\n };\n\n return {\n data: connectedChannels,\n updateConnectedChannels,\n updating: isUpdating,\n loading: isLoading,\n error,\n };\n}\n\nexport default useConnectedSlackChannels;\n"],"names":["useConnectedSlackChannels","slackChannelsRecipientObject","objectId","collection","t","useTranslations","knock","useKnockClient","connectionStatus","knockSlackChannelId","useKnockSlackClient","connectedChannels","setConnectedChannels","useState","error","setError","isLoading","setIsLoading","isUpdating","setIsUpdating","fetchAndSetConnectedChannels","useCallback","objects","getChannelData","channelId","then","res","data","connections","catch","useEffect","updateConnectedChannels","channelsToSendToKnock","setChannelData","updating","loading"],"mappings":"yVAqBA,SAASA,EAA0B,CACjCC,6BAA8B,CAAEC,SAAAA,EAAUC,WAAAA,CAAW,CAChC,EAA0B,CACzC,KAAA,CAAEC,EAAAA,GAAMC,EAAgB,gBAAA,EACxBC,EAAQC,EAAAA,iBACR,CAAEC,iBAAAA,EAAkBC,oBAAAA,GAAwBC,EAAoB,oBAAA,EAChE,CAACC,EAAmBC,CAAoB,EAAIC,WAEhD,IAAI,EACA,CAACC,EAAOC,CAAQ,EAAIF,WAAwB,IAAI,EAChD,CAACG,EAAWC,CAAY,EAAIJ,WAAS,EAAK,EAC1C,CAACK,EAAYC,CAAa,EAAIN,WAAS,EAAK,EAE5CO,EAA+BC,EAAAA,YAAY,IAAM,CACrDJ,EAAa,EAAI,GACY,SAC3B,MAAMX,EAAMgB,QAAQC,eAAe,CACjCpB,WAAAA,EACAD,SAAAA,EACAsB,UAAWf,CAAAA,CACZ,GAEkB,EAClBgB,KAAcC,GAAA,UACTA,EAAAA,GAAAA,YAAAA,EAAKC,OAALD,MAAAA,EAAWE,YACQF,GAAAA,EAAAA,GAAAA,YAAAA,EAAKC,OAALD,YAAAA,EAAWE,WAAW,EAE3ChB,EAAqB,CAAE,CAAA,EAEzBG,EAAS,IAAI,EACbE,EAAa,EAAK,CAAA,CACnB,EACAY,MAAM,IAAM,CACXjB,EAAqB,CAAE,CAAA,EACvBG,EAAS,IAAI,EACbE,EAAa,EAAK,CAAA,CACnB,CAAA,EACF,CAACd,EAAYG,EAAMgB,QAASb,EAAqBP,CAAQ,CAAC,EAE7D4B,OAAAA,EAAAA,UAAU,IAAM,CAEZtB,IAAqB,aACrB,CAACG,GACD,CAACG,GACD,CAACE,GAE4BI,GAC/B,EACC,CACDT,EACAS,EACAJ,EACAF,EACAN,CAAgB,CACjB,EAoBM,CACLmB,KAAMhB,EACNoB,wBApB8B,MAC9BC,GACG,CACHb,EAAc,EAAI,EACd,GAAA,CACIb,MAAAA,EAAMgB,QAAQW,eAAe,CACjC/B,SAAAA,EACAC,WAAAA,EACAqB,UAAWf,EACXkB,KAAM,CAAEC,YAAaI,CAAsB,CAAA,CAC5C,EAC4BZ,SACf,CACLhB,EAAAA,EAAE,sBAAsB,GAAK,EAAE,CAC1C,CACAe,EAAc,EAAK,CAAA,EAMnBe,SAAUhB,EACViB,QAASnB,EACTF,MAAAA,CAAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- "use strict";const _=require("../context/KnockSlackProvider.js"),k=require("react");require("../../i18n/context/KnockI18nProvider.js");require("swr/infinite");const S=require("../../core/context/KnockProvider.js"),C=require("@knocklabs/client");require("zustand/shallow");require("date-fns");const d="https://slack.com/oauth/v2/authorize",l=["chat:write","chat:write.public","channels:read","groups:read"];function A(s,a,o){const e=S.useKnockClient(),{setConnectionStatus:c,knockSlackChannelId:n,tenant:r,setActionLabel:i}=_.useKnockSlackClient(),u=o&&o.length>0?Array.from(new Set(l.concat(o))):l,h=k.useCallback(async()=>{i(null),c("disconnecting");try{const t=await e.slack.revokeAccessToken({tenant:r,knockChannelId:n});c(t==="ok"?"disconnected":"error")}catch{c("error")}},[c,e.slack,r,n,i]);return{buildSlackAuthUrl:k.useCallback(()=>{const t={state:JSON.stringify({redirect_url:a,access_token_object:{object_id:r,collection:C.TENANT_OBJECT_COLLECTION},channel_id:n,public_key:e.apiKey,user_token:e.userToken}),client_id:s,scope:u.join(",")};return`${d}?${new URLSearchParams(t)}`},[a,r,n,e.apiKey,e.userToken,s,u]),disconnectFromSlack:h}}module.exports=A;
1
+ "use strict";const S=require("../context/KnockSlackProvider.js"),k=require("react");require("../../i18n/context/KnockI18nProvider.js");require("swr/infinite");const _=require("../../core/context/KnockProvider.js"),C=require("@knocklabs/client");require("fast-deep-equal");require("date-fns");const d="https://slack.com/oauth/v2/authorize",l=["chat:write","chat:write.public","channels:read","groups:read"];function A(s,a,o){const e=_.useKnockClient(),{setConnectionStatus:c,knockSlackChannelId:n,tenant:r,setActionLabel:i}=S.useKnockSlackClient(),u=o&&o.length>0?Array.from(new Set(l.concat(o))):l,h=k.useCallback(async()=>{i(null),c("disconnecting");try{const t=await e.slack.revokeAccessToken({tenant:r,knockChannelId:n});c(t==="ok"?"disconnected":"error")}catch{c("error")}},[c,e.slack,r,n,i]);return{buildSlackAuthUrl:k.useCallback(()=>{const t={state:JSON.stringify({redirect_url:a,access_token_object:{object_id:r,collection:C.TENANT_OBJECT_COLLECTION},channel_id:n,public_key:e.apiKey,user_token:e.userToken}),client_id:s,scope:u.join(",")};return`${d}?${new URLSearchParams(t)}`},[a,r,n,e.apiKey,e.userToken,s,u]),disconnectFromSlack:h}}module.exports=A;
2
2
  //# sourceMappingURL=useSlackAuth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSlackAuth.js","sources":["../../../../../src/modules/slack/hooks/useSlackAuth.ts"],"sourcesContent":["import { useKnockSlackClient } from \"..\";\nimport { TENANT_OBJECT_COLLECTION } from \"@knocklabs/client\";\nimport { useCallback } from \"react\";\n\nimport { useKnockClient } from \"../../core\";\n\nconst SLACK_AUTHORIZE_URL = \"https://slack.com/oauth/v2/authorize\";\nconst DEFAULT_SLACK_SCOPES = [\n \"chat:write\",\n \"chat:write.public\",\n \"channels:read\",\n \"groups:read\",\n];\n\ntype UseSlackAuthOutput = {\n buildSlackAuthUrl: () => string;\n disconnectFromSlack: () => void;\n};\n\nfunction useSlackAuth(\n slackClientId: string,\n redirectUrl?: string,\n additionalScopes?: string[],\n): UseSlackAuthOutput {\n const knock = useKnockClient();\n const { setConnectionStatus, knockSlackChannelId, tenant, setActionLabel } =\n useKnockSlackClient();\n\n const combinedScopes =\n additionalScopes && additionalScopes.length > 0\n ? Array.from(new Set(DEFAULT_SLACK_SCOPES.concat(additionalScopes)))\n : DEFAULT_SLACK_SCOPES;\n\n const disconnectFromSlack = useCallback(async () => {\n setActionLabel(null);\n setConnectionStatus(\"disconnecting\");\n try {\n const revoke = await knock.slack.revokeAccessToken({\n tenant,\n knockChannelId: knockSlackChannelId,\n });\n\n if (revoke === \"ok\") {\n setConnectionStatus(\"disconnected\");\n } else {\n setConnectionStatus(\"error\");\n }\n } catch (_error) {\n setConnectionStatus(\"error\");\n }\n }, [\n setConnectionStatus,\n knock.slack,\n tenant,\n knockSlackChannelId,\n setActionLabel,\n ]);\n\n const buildSlackAuthUrl = useCallback(() => {\n const rawParams = {\n state: JSON.stringify({\n redirect_url: redirectUrl,\n access_token_object: {\n object_id: tenant,\n collection: TENANT_OBJECT_COLLECTION,\n },\n channel_id: knockSlackChannelId,\n public_key: knock.apiKey,\n user_token: knock.userToken,\n }),\n client_id: slackClientId,\n scope: combinedScopes.join(\",\"),\n };\n return `${SLACK_AUTHORIZE_URL}?${new URLSearchParams(rawParams)}`;\n }, [\n redirectUrl,\n tenant,\n knockSlackChannelId,\n knock.apiKey,\n knock.userToken,\n slackClientId,\n combinedScopes,\n ]);\n\n return {\n buildSlackAuthUrl,\n disconnectFromSlack,\n };\n}\n\nexport default useSlackAuth;\n"],"names":["SLACK_AUTHORIZE_URL","DEFAULT_SLACK_SCOPES","useSlackAuth","slackClientId","redirectUrl","additionalScopes","knock","useKnockClient","setConnectionStatus","knockSlackChannelId","tenant","setActionLabel","useKnockSlackClient","combinedScopes","length","Array","from","Set","concat","disconnectFromSlack","useCallback","revoke","slack","revokeAccessToken","knockChannelId","buildSlackAuthUrl","rawParams","state","JSON","stringify","redirect_url","access_token_object","object_id","collection","TENANT_OBJECT_COLLECTION","channel_id","public_key","apiKey","user_token","userToken","client_id","scope","join","URLSearchParams"],"mappings":"oSAMA,MAAMA,EAAsB,uCACtBC,EAAuB,CAC3B,aACA,oBACA,gBACA,aAAa,EAQf,SAASC,EACPC,EACAC,EACAC,EACoB,CACpB,MAAMC,EAAQC,EAAAA,iBACR,CAAEC,oBAAAA,EAAqBC,oBAAAA,EAAqBC,OAAAA,EAAQC,eAAAA,GACxDC,EAAoB,oBAAA,EAEhBC,EACJR,GAAoBA,EAAiBS,OAAS,EAC1CC,MAAMC,KAAK,IAAIC,IAAIhB,EAAqBiB,OAAOb,CAAgB,CAAC,CAAC,EACjEJ,EAEAkB,EAAsBC,EAAAA,YAAY,SAAY,CAClDT,EAAe,IAAI,EACnBH,EAAoB,eAAe,EAC/B,GAAA,CACF,MAAMa,EAAS,MAAMf,EAAMgB,MAAMC,kBAAkB,CACjDb,OAAAA,EACAc,eAAgBf,CAAAA,CACjB,EAGCD,EADEa,IAAW,KACO,eAEA,OAFc,OAIrB,CACfb,EAAoB,OAAO,CAC7B,CAAA,EACC,CACDA,EACAF,EAAMgB,MACNZ,EACAD,EACAE,CAAc,CACf,EA4BM,MAAA,CACLc,kBA3BwBL,EAAAA,YAAY,IAAM,CAC1C,MAAMM,EAAY,CAChBC,MAAOC,KAAKC,UAAU,CACpBC,aAAc1B,EACd2B,oBAAqB,CACnBC,UAAWtB,EACXuB,WAAYC,EAAAA,wBACd,EACAC,WAAY1B,EACZ2B,WAAY9B,EAAM+B,OAClBC,WAAYhC,EAAMiC,SAAAA,CACnB,EACDC,UAAWrC,EACXsC,MAAO5B,EAAe6B,KAAK,GAAG,CAAA,EAEhC,MAAO,GAAG1C,CAAmB,IAAI,IAAI2C,gBAAgBjB,CAAS,CAAC,EACjE,EAAG,CACDtB,EACAM,EACAD,EACAH,EAAM+B,OACN/B,EAAMiC,UACNpC,EACAU,CAAc,CACf,EAICM,oBAAAA,CAAAA,CAEJ"}
1
+ {"version":3,"file":"useSlackAuth.js","sources":["../../../../../src/modules/slack/hooks/useSlackAuth.ts"],"sourcesContent":["import { useKnockSlackClient } from \"..\";\nimport { TENANT_OBJECT_COLLECTION } from \"@knocklabs/client\";\nimport { useCallback } from \"react\";\n\nimport { useKnockClient } from \"../../core\";\n\nconst SLACK_AUTHORIZE_URL = \"https://slack.com/oauth/v2/authorize\";\nconst DEFAULT_SLACK_SCOPES = [\n \"chat:write\",\n \"chat:write.public\",\n \"channels:read\",\n \"groups:read\",\n];\n\ntype UseSlackAuthOutput = {\n buildSlackAuthUrl: () => string;\n disconnectFromSlack: () => void;\n};\n\nfunction useSlackAuth(\n slackClientId: string,\n redirectUrl?: string,\n additionalScopes?: string[],\n): UseSlackAuthOutput {\n const knock = useKnockClient();\n const { setConnectionStatus, knockSlackChannelId, tenant, setActionLabel } =\n useKnockSlackClient();\n\n const combinedScopes =\n additionalScopes && additionalScopes.length > 0\n ? Array.from(new Set(DEFAULT_SLACK_SCOPES.concat(additionalScopes)))\n : DEFAULT_SLACK_SCOPES;\n\n const disconnectFromSlack = useCallback(async () => {\n setActionLabel(null);\n setConnectionStatus(\"disconnecting\");\n try {\n const revoke = await knock.slack.revokeAccessToken({\n tenant,\n knockChannelId: knockSlackChannelId,\n });\n\n if (revoke === \"ok\") {\n setConnectionStatus(\"disconnected\");\n } else {\n setConnectionStatus(\"error\");\n }\n } catch (error) {\n setConnectionStatus(\"error\");\n }\n }, [\n setConnectionStatus,\n knock.slack,\n tenant,\n knockSlackChannelId,\n setActionLabel,\n ]);\n\n const buildSlackAuthUrl = useCallback(() => {\n const rawParams = {\n state: JSON.stringify({\n redirect_url: redirectUrl,\n access_token_object: {\n object_id: tenant,\n collection: TENANT_OBJECT_COLLECTION,\n },\n channel_id: knockSlackChannelId,\n public_key: knock.apiKey,\n user_token: knock.userToken,\n }),\n client_id: slackClientId,\n scope: combinedScopes.join(\",\"),\n };\n return `${SLACK_AUTHORIZE_URL}?${new URLSearchParams(rawParams)}`;\n }, [\n redirectUrl,\n tenant,\n knockSlackChannelId,\n knock.apiKey,\n knock.userToken,\n slackClientId,\n combinedScopes,\n ]);\n\n return {\n buildSlackAuthUrl,\n disconnectFromSlack,\n };\n}\n\nexport default useSlackAuth;\n"],"names":["SLACK_AUTHORIZE_URL","DEFAULT_SLACK_SCOPES","useSlackAuth","slackClientId","redirectUrl","additionalScopes","knock","useKnockClient","setConnectionStatus","knockSlackChannelId","tenant","setActionLabel","useKnockSlackClient","combinedScopes","length","Array","from","Set","concat","disconnectFromSlack","useCallback","revoke","slack","revokeAccessToken","knockChannelId","buildSlackAuthUrl","rawParams","state","JSON","stringify","redirect_url","access_token_object","object_id","collection","TENANT_OBJECT_COLLECTION","channel_id","public_key","apiKey","user_token","userToken","client_id","scope","join","URLSearchParams"],"mappings":"oSAMA,MAAMA,EAAsB,uCACtBC,EAAuB,CAC3B,aACA,oBACA,gBACA,aAAa,EAQf,SAASC,EACPC,EACAC,EACAC,EACoB,CACpB,MAAMC,EAAQC,EAAAA,iBACR,CAAEC,oBAAAA,EAAqBC,oBAAAA,EAAqBC,OAAAA,EAAQC,eAAAA,GACxDC,EAAoB,oBAAA,EAEhBC,EACJR,GAAoBA,EAAiBS,OAAS,EAC1CC,MAAMC,KAAK,IAAIC,IAAIhB,EAAqBiB,OAAOb,CAAgB,CAAC,CAAC,EACjEJ,EAEAkB,EAAsBC,EAAAA,YAAY,SAAY,CAClDT,EAAe,IAAI,EACnBH,EAAoB,eAAe,EAC/B,GAAA,CACF,MAAMa,EAAS,MAAMf,EAAMgB,MAAMC,kBAAkB,CACjDb,OAAAA,EACAc,eAAgBf,CAAAA,CACjB,EAGCD,EADEa,IAAW,KACO,eAEA,OAFc,OAItB,CACdb,EAAoB,OAAO,CAC7B,CAAA,EACC,CACDA,EACAF,EAAMgB,MACNZ,EACAD,EACAE,CAAc,CACf,EA4BM,MAAA,CACLc,kBA3BwBL,EAAAA,YAAY,IAAM,CAC1C,MAAMM,EAAY,CAChBC,MAAOC,KAAKC,UAAU,CACpBC,aAAc1B,EACd2B,oBAAqB,CACnBC,UAAWtB,EACXuB,WAAYC,EAAAA,wBACd,EACAC,WAAY1B,EACZ2B,WAAY9B,EAAM+B,OAClBC,WAAYhC,EAAMiC,SAAAA,CACnB,EACDC,UAAWrC,EACXsC,MAAO5B,EAAe6B,KAAK,GAAG,CAAA,EAEhC,MAAO,GAAG1C,CAAmB,IAAI,IAAI2C,gBAAgBjB,CAAS,CAAC,EACjE,EAAG,CACDtB,EACAM,EACAD,EACAH,EAAM+B,OACN/B,EAAMiC,UACNpC,EACAU,CAAc,CACf,EAICM,oBAAAA,CAAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- "use strict";const I=require("../context/KnockSlackProvider.js"),d=require("react");require("../../i18n/context/KnockI18nProvider.js");const K=require("swr/infinite"),L=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("zustand/shallow");require("date-fns");const N=n=>n&&typeof n=="object"&&"default"in n?n:{default:n},g=N(K),A=1e3,R=200,M="private_channel,public_channel",S="SLACK_CHANNELS";function z(n,c){return n===0?[S,""]:c&&["",null].includes(c.next_cursor)?null:[S,c.next_cursor??""]}function T({queryOptions:n}){var h,C;const c=L.useKnockClient(),{knockSlackChannelId:x,tenant:E,connectionStatus:a}=I.useKnockSlackClient(),m=t=>c.slack.getChannels({tenant:E,knockChannelId:x,queryOptions:{...n,cursor:t?t[1]:"",limit:(n==null?void 0:n.limitPerPage)||R,types:(n==null?void 0:n.types)||M}}),{data:e,error:i,isLoading:l,isValidating:r,size:u,setSize:f,mutate:P}=g.default(z,m,{initialSize:0}),s=(e==null?void 0:e.length)||0,k=s===0||e&&((h=e[s])==null?void 0:h.next_cursor)&&((C=e[s])==null?void 0:C.next_cursor)!=="",o=d.useMemo(()=>(e??[]).flatMap(t=>t==null?void 0:t.slack_channels).filter(t=>!!t),[e]),_=(n==null?void 0:n.maxCount)||A;return d.useEffect(()=>{a==="connected"&&!i&&k&&!l&&!r&&o.length<_&&f(u+1)},[o.length,f,u,k,l,r,_,i,a]),{data:o,isLoading:l||r,refetch:()=>P()}}module.exports=T;
1
+ "use strict";const I=require("../context/KnockSlackProvider.js"),d=require("react");require("../../i18n/context/KnockI18nProvider.js");const K=require("swr/infinite"),L=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("fast-deep-equal");require("date-fns");const N=n=>n&&typeof n=="object"&&"default"in n?n:{default:n},g=N(K),A=1e3,R=200,M="private_channel,public_channel",S="SLACK_CHANNELS";function z(n,c){return n===0?[S,""]:c&&["",null].includes(c.next_cursor)?null:[S,c.next_cursor??""]}function T({queryOptions:n}){var h,C;const c=L.useKnockClient(),{knockSlackChannelId:x,tenant:E,connectionStatus:a}=I.useKnockSlackClient(),m=t=>c.slack.getChannels({tenant:E,knockChannelId:x,queryOptions:{...n,cursor:t?t[1]:"",limit:(n==null?void 0:n.limitPerPage)||R,types:(n==null?void 0:n.types)||M}}),{data:e,error:i,isLoading:l,isValidating:r,size:u,setSize:f,mutate:P}=g.default(z,m,{initialSize:0}),s=(e==null?void 0:e.length)||0,k=s===0||e&&((h=e[s])==null?void 0:h.next_cursor)&&((C=e[s])==null?void 0:C.next_cursor)!=="",o=d.useMemo(()=>(e??[]).flatMap(t=>t==null?void 0:t.slack_channels).filter(t=>!!t),[e]),_=(n==null?void 0:n.maxCount)||A;return d.useEffect(()=>{a==="connected"&&!i&&k&&!l&&!r&&o.length<_&&f(u+1)},[o.length,f,u,k,l,r,_,i,a]),{data:o,isLoading:l||r,refetch:()=>P()}}module.exports=T;
2
2
  //# sourceMappingURL=useSlackChannels.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSlackConnectionStatus.js","sources":["../../../../../src/modules/slack/hooks/useSlackConnectionStatus.ts"],"sourcesContent":["import Knock from \"@knocklabs/client\";\nimport { useEffect, useState } from \"react\";\n\nimport { useTranslations } from \"../../i18n\";\n\nexport type ConnectionStatus =\n | \"connecting\"\n | \"connected\"\n | \"disconnected\"\n | \"error\"\n | \"disconnecting\";\n\ntype UseSlackConnectionStatusOutput = {\n connectionStatus: ConnectionStatus;\n setConnectionStatus: (status: ConnectionStatus) => void;\n errorLabel: string | null;\n setErrorLabel: (errorLabel: string) => void;\n actionLabel: string | null;\n setActionLabel: (actionLabel: string | null) => void;\n};\n\n/**\n * Transforms a slack error message into\n * a formatted one. Slack error messages: https://api.slack.com/methods/auth.test#errors\n *\n * Ex.: \"account_inactive\" -> \"Account inactive\"\n */\nconst formatSlackErrorMessage = (errorMessage: string) => {\n const firstLetter = errorMessage.substring(0, 1).toUpperCase();\n const rest = errorMessage.substring(1);\n return firstLetter?.concat(rest).replace(\"_\", \" \");\n};\n\nfunction useSlackConnectionStatus(\n knock: Knock,\n knockSlackChannelId: string,\n tenant: string,\n): UseSlackConnectionStatusOutput {\n const { t } = useTranslations();\n const [connectionStatus, setConnectionStatus] =\n useState<ConnectionStatus>(\"connecting\");\n const [errorLabel, setErrorLabel] = useState<string | null>(null);\n const [actionLabel, setActionLabel] = useState<string | null>(null);\n\n useEffect(() => {\n const checkAuthStatus = async () => {\n if (connectionStatus !== \"connecting\") return;\n\n try {\n const authRes = await knock.slack.authCheck({\n tenant,\n knockChannelId: knockSlackChannelId,\n });\n\n if (authRes.connection?.ok) {\n return setConnectionStatus(\"connected\");\n }\n\n if (!authRes.connection?.ok) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is a normal response for a tenant that doesn't have an access\n // token set on it, meaning it's not connected to Slack, so we\n // give it a \"disconnected\" status instead of an error status.\n if (\n authRes.code === \"ERR_BAD_REQUEST\" &&\n authRes.response?.data?.message === t(\"slackAccessTokenNotSet\")\n ) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is for an error coming directly from Slack.\n if (!authRes.connection?.ok && authRes.connection?.error) {\n const errorLabel = formatSlackErrorMessage(authRes.connection?.error);\n setErrorLabel(errorLabel);\n setConnectionStatus(\"error\");\n return;\n }\n\n // This is for any Knock errors that would require a reconnect.\n\n setConnectionStatus(\"error\");\n } catch (_error) {\n setConnectionStatus(\"error\");\n }\n };\n\n checkAuthStatus();\n }, [connectionStatus, tenant, knockSlackChannelId, knock.slack, t]);\n\n return {\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n };\n}\n\nexport default useSlackConnectionStatus;\n"],"names":["formatSlackErrorMessage","errorMessage","firstLetter","substring","toUpperCase","rest","concat","replace","useSlackConnectionStatus","knock","knockSlackChannelId","tenant","t","useTranslations","connectionStatus","setConnectionStatus","useState","errorLabel","setErrorLabel","actionLabel","setActionLabel","useEffect","authRes","slack","authCheck","knockChannelId","connection","ok","code","response","data","message","error"],"mappings":"gJA2BMA,EAA2BC,GAAyB,CACxD,MAAMC,EAAcD,EAAaE,UAAU,EAAG,CAAC,EAAEC,cAC3CC,EAAOJ,EAAaE,UAAU,CAAC,EACrC,OAAOD,GAAAA,YAAAA,EAAaI,OAAOD,GAAME,QAAQ,IAAK,IAChD,EAEA,SAASC,EACPC,EACAC,EACAC,EACgC,CAC1B,KAAA,CAAEC,EAAAA,GAAMC,EAAgB,gBAAA,EACxB,CAACC,EAAkBC,CAAmB,EAC1CC,WAA2B,YAAY,EACnC,CAACC,EAAYC,CAAa,EAAIF,WAAwB,IAAI,EAC1D,CAACG,EAAaC,CAAc,EAAIJ,WAAwB,IAAI,EAElEK,OAAAA,EAAAA,UAAU,IAAM,EACU,SAAY,mBAClC,GAAIP,IAAqB,aAErB,GAAA,CACF,MAAMQ,EAAU,MAAMb,EAAMc,MAAMC,UAAU,CAC1Cb,OAAAA,EACAc,eAAgBf,CAAAA,CACjB,EAEGY,IAAAA,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBK,GACtB,OAAOZ,EAAoB,WAAW,EAWtCO,GARE,GAACA,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBK,KAQvBL,EAAQM,OAAS,qBACjBN,GAAAA,EAAAA,EAAQO,WAARP,YAAAA,EAAkBQ,OAAlBR,YAAAA,EAAwBS,WAAYnB,EAAE,wBAAwB,EAE9D,OAAOG,EAAoB,cAAc,EAI3C,GAAI,GAACO,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBK,OAAML,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBU,OAAO,CACxD,MAAMf,EAAajB,GAAwBsB,EAAAA,EAAQI,aAARJ,YAAAA,EAAoBU,KAAK,EACpEd,EAAcD,CAAU,EACxBF,EAAoB,OAAO,EAC3B,MACF,CAIAA,EAAoB,OAAO,OACZ,CACfA,EAAoB,OAAO,CAC7B,CAAA,IAGc,EACf,CAACD,EAAkBH,EAAQD,EAAqBD,EAAMc,MAAOX,CAAC,CAAC,EAE3D,CACLE,iBAAAA,EACAC,oBAAAA,EACAE,WAAAA,EACAC,cAAAA,EACAC,YAAAA,EACAC,eAAAA,CAAAA,CAEJ"}
1
+ {"version":3,"file":"useSlackConnectionStatus.js","sources":["../../../../../src/modules/slack/hooks/useSlackConnectionStatus.ts"],"sourcesContent":["import Knock from \"@knocklabs/client\";\nimport { useEffect, useState } from \"react\";\n\nimport { useTranslations } from \"../../i18n\";\n\nexport type ConnectionStatus =\n | \"connecting\"\n | \"connected\"\n | \"disconnected\"\n | \"error\"\n | \"disconnecting\";\n\ntype UseSlackConnectionStatusOutput = {\n connectionStatus: ConnectionStatus;\n setConnectionStatus: (status: ConnectionStatus) => void;\n errorLabel: string | null;\n setErrorLabel: (errorLabel: string) => void;\n actionLabel: string | null;\n setActionLabel: (actionLabel: string | null) => void;\n};\n\n/**\n * Transforms a slack error message into\n * a formatted one. Slack error messages: https://api.slack.com/methods/auth.test#errors\n *\n * Ex.: \"account_inactive\" -> \"Account inactive\"\n */\nconst formatSlackErrorMessage = (errorMessage: string) => {\n const firstLetter = errorMessage.substring(0, 1).toUpperCase();\n const rest = errorMessage.substring(1);\n return firstLetter?.concat(rest).replace(\"_\", \" \");\n};\n\nfunction useSlackConnectionStatus(\n knock: Knock,\n knockSlackChannelId: string,\n tenant: string,\n): UseSlackConnectionStatusOutput {\n const { t } = useTranslations();\n const [connectionStatus, setConnectionStatus] =\n useState<ConnectionStatus>(\"connecting\");\n const [errorLabel, setErrorLabel] = useState<string | null>(null);\n const [actionLabel, setActionLabel] = useState<string | null>(null);\n\n useEffect(() => {\n const checkAuthStatus = async () => {\n if (connectionStatus !== \"connecting\") return;\n\n try {\n const authRes = await knock.slack.authCheck({\n tenant,\n knockChannelId: knockSlackChannelId,\n });\n\n if (authRes.connection?.ok) {\n return setConnectionStatus(\"connected\");\n }\n\n if (!authRes.connection?.ok) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is a normal response for a tenant that doesn't have an access\n // token set on it, meaning it's not connected to Slack, so we\n // give it a \"disconnected\" status instead of an error status.\n if (\n authRes.code === \"ERR_BAD_REQUEST\" &&\n authRes.response?.data?.message === t(\"slackAccessTokenNotSet\")\n ) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is for an error coming directly from Slack.\n if (!authRes.connection?.ok && authRes.connection?.error) {\n const errorLabel = formatSlackErrorMessage(authRes.connection?.error);\n setErrorLabel(errorLabel);\n setConnectionStatus(\"error\");\n return;\n }\n\n // This is for any Knock errors that would require a reconnect.\n\n setConnectionStatus(\"error\");\n } catch (error) {\n setConnectionStatus(\"error\");\n }\n };\n\n checkAuthStatus();\n }, [connectionStatus, tenant, knockSlackChannelId, knock.slack, t]);\n\n return {\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n };\n}\n\nexport default useSlackConnectionStatus;\n"],"names":["formatSlackErrorMessage","errorMessage","firstLetter","substring","toUpperCase","rest","concat","replace","useSlackConnectionStatus","knock","knockSlackChannelId","tenant","t","useTranslations","connectionStatus","setConnectionStatus","useState","errorLabel","setErrorLabel","actionLabel","setActionLabel","useEffect","authRes","slack","authCheck","knockChannelId","connection","ok","code","response","data","message","error"],"mappings":"gJA2BMA,EAA2BC,GAAyB,CACxD,MAAMC,EAAcD,EAAaE,UAAU,EAAG,CAAC,EAAEC,cAC3CC,EAAOJ,EAAaE,UAAU,CAAC,EACrC,OAAOD,GAAAA,YAAAA,EAAaI,OAAOD,GAAME,QAAQ,IAAK,IAChD,EAEA,SAASC,EACPC,EACAC,EACAC,EACgC,CAC1B,KAAA,CAAEC,EAAAA,GAAMC,EAAgB,gBAAA,EACxB,CAACC,EAAkBC,CAAmB,EAC1CC,WAA2B,YAAY,EACnC,CAACC,EAAYC,CAAa,EAAIF,WAAwB,IAAI,EAC1D,CAACG,EAAaC,CAAc,EAAIJ,WAAwB,IAAI,EAElEK,OAAAA,EAAAA,UAAU,IAAM,EACU,SAAY,mBAClC,GAAIP,IAAqB,aAErB,GAAA,CACF,MAAMQ,EAAU,MAAMb,EAAMc,MAAMC,UAAU,CAC1Cb,OAAAA,EACAc,eAAgBf,CAAAA,CACjB,EAEGY,IAAAA,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBK,GACtB,OAAOZ,EAAoB,WAAW,EAWtCO,GARE,GAACA,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBK,KAQvBL,EAAQM,OAAS,qBACjBN,GAAAA,EAAAA,EAAQO,WAARP,YAAAA,EAAkBQ,OAAlBR,YAAAA,EAAwBS,WAAYnB,EAAE,wBAAwB,EAE9D,OAAOG,EAAoB,cAAc,EAI3C,GAAI,GAACO,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBK,OAAML,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBU,OAAO,CACxD,MAAMf,EAAajB,GAAwBsB,EAAAA,EAAQI,aAARJ,YAAAA,EAAoBU,KAAK,EACpEd,EAAcD,CAAU,EACxBF,EAAoB,OAAO,EAC3B,MACF,CAIAA,EAAoB,OAAO,OACb,CACdA,EAAoB,OAAO,CAC7B,CAAA,IAGc,EACf,CAACD,EAAkBH,EAAQD,EAAqBD,EAAMc,MAAOX,CAAC,CAAC,EAE3D,CACLE,iBAAAA,EACAC,oBAAAA,EACAE,WAAAA,EACAC,cAAAA,EACAC,YAAAA,EACAC,eAAAA,CAAAA,CAEJ"}
@@ -1,47 +1,53 @@
1
1
  import { KnockProvider as t, useKnockClient as r } from "./modules/core/context/KnockProvider.mjs";
2
2
  import { default as s } from "./modules/core/hooks/useAuthenticatedKnockClient.mjs";
3
3
  import { default as f } from "./modules/core/hooks/useStableOptions.mjs";
4
- import { FilterStatus as u } from "./modules/core/constants.mjs";
5
- import { feedProviderKey as c, formatBadgeCount as d, formatTimestamp as m, renderNodeOrFallback as p, slackProviderKey as x, toSentenceCase as k } from "./modules/core/utils.mjs";
6
- import { KnockFeedProvider as C, useKnockFeed as K } from "./modules/feed/context/KnockFeedProvider.mjs";
4
+ import { FilterStatus as l } from "./modules/core/constants.mjs";
5
+ import { feedProviderKey as i, formatBadgeCount as c, formatTimestamp as d, renderNodeOrFallback as m, slackProviderKey as x, toSentenceCase as k } from "./modules/core/utils.mjs";
6
+ import { KnockFeedProvider as S, useKnockFeed as K } from "./modules/feed/context/KnockFeedProvider.mjs";
7
7
  import { default as P } from "./modules/feed/hooks/useNotifications.mjs";
8
8
  import { default as h } from "./modules/feed/hooks/useFeedSettings.mjs";
9
- import { useCreateNotificationStore as b, default as g } from "./modules/feed/hooks/useNotificationStore.mjs";
10
- import { KnockSlackProvider as A, useKnockSlackClient as I } from "./modules/slack/context/KnockSlackProvider.mjs";
11
- import { default as T } from "./modules/slack/hooks/useSlackConnectionStatus.mjs";
12
- import { default as j } from "./modules/slack/hooks/useSlackChannels.mjs";
13
- import { default as w } from "./modules/slack/hooks/useConnectedSlackChannels.mjs";
14
- import { default as D } from "./modules/slack/hooks/useSlackAuth.mjs";
15
- import { I18nContext as G, KnockI18nProvider as H } from "./modules/i18n/context/KnockI18nProvider.mjs";
16
- import { useTranslations as L } from "./modules/i18n/hooks/useTranslations.mjs";
17
- import { locales as Q } from "./modules/i18n/languages/index.mjs";
9
+ import { useCreateNotificationStore as I, default as F } from "./modules/feed/hooks/useNotificationStore.mjs";
10
+ import { KnockInAppMessagesChannelProvider as N, useInAppMessagesChannel as b } from "./modules/in-app-messages/context/KnockInAppMessagesChannelProvider.mjs";
11
+ import { useInAppMessage as O, useInAppMessages as T } from "./modules/in-app-messages/hooks/useInAppMessages.mjs";
12
+ import { KnockSlackProvider as j, useKnockSlackClient as q } from "./modules/slack/context/KnockSlackProvider.mjs";
13
+ import { default as z } from "./modules/slack/hooks/useSlackConnectionStatus.mjs";
14
+ import { default as E } from "./modules/slack/hooks/useSlackChannels.mjs";
15
+ import { default as H } from "./modules/slack/hooks/useConnectedSlackChannels.mjs";
16
+ import { default as L } from "./modules/slack/hooks/useSlackAuth.mjs";
17
+ import { I18nContext as R, KnockI18nProvider as U } from "./modules/i18n/context/KnockI18nProvider.mjs";
18
+ import { useTranslations as W } from "./modules/i18n/hooks/useTranslations.mjs";
19
+ import { locales as Y } from "./modules/i18n/languages/index.mjs";
18
20
  export {
19
- u as FilterStatus,
20
- G as I18nContext,
21
- C as KnockFeedProvider,
22
- H as KnockI18nProvider,
21
+ l as FilterStatus,
22
+ R as I18nContext,
23
+ S as KnockFeedProvider,
24
+ U as KnockI18nProvider,
25
+ N as KnockInAppMessagesChannelProvider,
23
26
  t as KnockProvider,
24
- A as KnockSlackProvider,
25
- c as feedProviderKey,
26
- d as formatBadgeCount,
27
- m as formatTimestamp,
28
- Q as locales,
29
- p as renderNodeOrFallback,
27
+ j as KnockSlackProvider,
28
+ i as feedProviderKey,
29
+ c as formatBadgeCount,
30
+ d as formatTimestamp,
31
+ Y as locales,
32
+ m as renderNodeOrFallback,
30
33
  x as slackProviderKey,
31
34
  k as toSentenceCase,
32
35
  s as useAuthenticatedKnockClient,
33
- w as useConnectedSlackChannels,
34
- b as useCreateNotificationStore,
36
+ H as useConnectedSlackChannels,
37
+ I as useCreateNotificationStore,
35
38
  h as useFeedSettings,
39
+ O as useInAppMessage,
40
+ T as useInAppMessages,
41
+ b as useInAppMessagesChannel,
36
42
  r as useKnockClient,
37
43
  K as useKnockFeed,
38
- I as useKnockSlackClient,
39
- g as useNotificationStore,
44
+ q as useKnockSlackClient,
45
+ F as useNotificationStore,
40
46
  P as useNotifications,
41
- D as useSlackAuth,
42
- j as useSlackChannels,
43
- T as useSlackConnectionStatus,
47
+ L as useSlackAuth,
48
+ E as useSlackChannels,
49
+ z as useSlackConnectionStatus,
44
50
  f as useStableOptions,
45
- L as useTranslations
51
+ W as useTranslations
46
52
  };
47
53
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;"}
@@ -1,35 +1,35 @@
1
1
  import * as t from "react";
2
- import { KnockI18nProvider as v } from "../../i18n/context/KnockI18nProvider.mjs";
3
- import K from "../hooks/useAuthenticatedKnockClient.mjs";
4
- import "zustand/shallow";
5
- const i = t.createContext(null), p = ({
2
+ import { KnockI18nProvider as d } from "../../i18n/context/KnockI18nProvider.mjs";
3
+ import l from "../hooks/useAuthenticatedKnockClient.mjs";
4
+ import "fast-deep-equal";
5
+ const u = t.createContext(null), P = ({
6
6
  apiKey: e,
7
7
  host: o,
8
8
  logLevel: n,
9
- userId: u,
9
+ userId: i,
10
10
  userToken: s,
11
11
  onUserTokenExpiring: r,
12
12
  timeBeforeExpirationInMs: c,
13
- children: a,
13
+ children: k,
14
14
  i18n: m
15
15
  }) => {
16
- const k = t.useMemo(() => ({
16
+ const a = t.useMemo(() => ({
17
17
  host: o,
18
18
  onUserTokenExpiring: r,
19
19
  timeBeforeExpirationInMs: c,
20
20
  logLevel: n
21
- }), [o, r, c, n]), d = K(e, u, s, k);
22
- return /* @__PURE__ */ t.createElement(i.Provider, { value: {
23
- knock: d
24
- } }, /* @__PURE__ */ t.createElement(v, { i18n: m }, a));
21
+ }), [o, r, c, n]), K = l(e, i, s, a);
22
+ return /* @__PURE__ */ t.createElement(u.Provider, { value: {
23
+ knock: K
24
+ } }, /* @__PURE__ */ t.createElement(d, { i18n: m }, k));
25
25
  }, f = () => {
26
- const e = t.useContext(i);
27
- if (e === void 0)
28
- throw new Error("useKnock must be used within a KnockProvider");
26
+ const e = t.useContext(u);
27
+ if (!e)
28
+ throw new Error("useKnockClient must be used within a KnockProvider");
29
29
  return e.knock;
30
30
  };
31
31
  export {
32
- p as KnockProvider,
32
+ P as KnockProvider,
33
33
  f as useKnockClient
34
34
  };
35
35
  //# sourceMappingURL=KnockProvider.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"KnockProvider.mjs","sources":["../../../../../src/modules/core/context/KnockProvider.tsx"],"sourcesContent":["import Knock, { AuthenticateOptions, LogLevel } from \"@knocklabs/client\";\nimport * as React from \"react\";\nimport { PropsWithChildren } from \"react\";\n\nimport { I18nContent, KnockI18nProvider } from \"../../i18n\";\nimport { useAuthenticatedKnockClient } from \"../hooks\";\n\nexport interface KnockProviderState {\n knock: Knock;\n}\n\nconst ProviderStateContext = React.createContext<KnockProviderState | null>(\n null,\n);\n\nexport interface KnockProviderProps {\n // Knock client props\n apiKey: string;\n host?: string;\n // Authentication props\n userId: string;\n userToken?: string;\n onUserTokenExpiring?: AuthenticateOptions[\"onUserTokenExpiring\"];\n timeBeforeExpirationInMs?: AuthenticateOptions[\"timeBeforeExpirationInMs\"];\n\n // i18n translations\n i18n?: I18nContent;\n\n logLevel?: LogLevel;\n}\n\nexport const KnockProvider: React.FC<PropsWithChildren<KnockProviderProps>> = ({\n apiKey,\n host,\n logLevel,\n userId,\n userToken,\n onUserTokenExpiring,\n timeBeforeExpirationInMs,\n children,\n i18n,\n}) => {\n // We memoize the options here so that we don't create a new object on every re-render\n const authenticateOptions = React.useMemo(\n () => ({\n host,\n onUserTokenExpiring,\n timeBeforeExpirationInMs,\n logLevel,\n }),\n [host, onUserTokenExpiring, timeBeforeExpirationInMs, logLevel],\n );\n\n const knock = useAuthenticatedKnockClient(\n apiKey,\n userId,\n userToken,\n authenticateOptions,\n );\n\n return (\n <ProviderStateContext.Provider\n value={{\n knock,\n }}\n >\n <KnockI18nProvider i18n={i18n}>{children}</KnockI18nProvider>\n </ProviderStateContext.Provider>\n );\n};\n\nexport const useKnockClient = (): Knock => {\n const context = React.useContext(ProviderStateContext) as KnockProviderState;\n if (context === undefined) {\n throw new Error(\"useKnock must be used within a KnockProvider\");\n }\n return context.knock;\n};\n"],"names":["ProviderStateContext","React","createContext","KnockProvider","apiKey","host","logLevel","userId","userToken","onUserTokenExpiring","timeBeforeExpirationInMs","children","i18n","authenticateOptions","useMemo","knock","useAuthenticatedKnockClient","KnockI18nProvider","useKnockClient","context","useContext","undefined","Error"],"mappings":";;;;AAWA,MAAMA,IAAuBC,EAAMC,cACjC,IACF,GAkBaC,IAAiEA,CAAC;AAAA,EAC7EC,QAAAA;AAAAA,EACAC,MAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,QAAAA;AAAAA,EACAC,WAAAA;AAAAA,EACAC,qBAAAA;AAAAA,EACAC,0BAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,MAAAA;AACF,MAAM;AAEEC,QAAAA,IAAsBZ,EAAMa,QAChC,OAAO;AAAA,IACLT,MAAAA;AAAAA,IACAI,qBAAAA;AAAAA,IACAC,0BAAAA;AAAAA,IACAJ,UAAAA;AAAAA,EAAAA,IAEF,CAACD,GAAMI,GAAqBC,GAA0BJ,CAAQ,CAChE,GAEMS,IAAQC,EACZZ,GACAG,GACAC,GACAK,CACF;AAEA,SACG,gBAAAZ,EAAA,cAAAD,EAAqB,UAArB,EACC,OAAO;AAAA,IACLe,OAAAA;AAAAA,EAAAA,EAGF,GAAA,gBAAAd,EAAA,cAACgB,GAAkB,EAAA,MAAAL,EAAA,GAAaD,CAAS,CAC3C;AAEJ,GAEaO,IAAiBA,MAAa;AACnCC,QAAAA,IAAUlB,EAAMmB,WAAWpB,CAAoB;AACrD,MAAImB,MAAYE;AACR,UAAA,IAAIC,MAAM,8CAA8C;AAEhE,SAAOH,EAAQJ;AACjB;"}
1
+ {"version":3,"file":"KnockProvider.mjs","sources":["../../../../../src/modules/core/context/KnockProvider.tsx"],"sourcesContent":["import Knock, { AuthenticateOptions, LogLevel } from \"@knocklabs/client\";\nimport * as React from \"react\";\nimport { PropsWithChildren } from \"react\";\n\nimport { I18nContent, KnockI18nProvider } from \"../../i18n\";\nimport { useAuthenticatedKnockClient } from \"../hooks\";\n\nexport interface KnockProviderState {\n knock: Knock;\n}\n\nconst KnockContext = React.createContext<KnockProviderState | null>(null);\n\nexport interface KnockProviderProps {\n // Knock client props\n apiKey: string;\n host?: string;\n // Authentication props\n userId: string;\n userToken?: string;\n onUserTokenExpiring?: AuthenticateOptions[\"onUserTokenExpiring\"];\n timeBeforeExpirationInMs?: AuthenticateOptions[\"timeBeforeExpirationInMs\"];\n\n // i18n translations\n i18n?: I18nContent;\n\n logLevel?: LogLevel;\n}\n\nexport const KnockProvider: React.FC<PropsWithChildren<KnockProviderProps>> = ({\n apiKey,\n host,\n logLevel,\n userId,\n userToken,\n onUserTokenExpiring,\n timeBeforeExpirationInMs,\n children,\n i18n,\n}) => {\n // We memoize the options here so that we don't create a new object on every re-render\n const authenticateOptions = React.useMemo(\n () => ({\n host,\n onUserTokenExpiring,\n timeBeforeExpirationInMs,\n logLevel,\n }),\n [host, onUserTokenExpiring, timeBeforeExpirationInMs, logLevel],\n );\n\n const knock = useAuthenticatedKnockClient(\n apiKey,\n userId,\n userToken,\n authenticateOptions,\n );\n\n return (\n <KnockContext.Provider\n value={{\n knock,\n }}\n >\n <KnockI18nProvider i18n={i18n}>{children}</KnockI18nProvider>\n </KnockContext.Provider>\n );\n};\n\nexport const useKnockClient = (): Knock => {\n const context = React.useContext(KnockContext);\n if (!context) {\n throw new Error(\"useKnockClient must be used within a KnockProvider\");\n }\n return context.knock;\n};\n"],"names":["KnockContext","React","createContext","KnockProvider","apiKey","host","logLevel","userId","userToken","onUserTokenExpiring","timeBeforeExpirationInMs","children","i18n","authenticateOptions","useMemo","knock","useAuthenticatedKnockClient","KnockI18nProvider","useKnockClient","context","useContext","Error"],"mappings":";;;;AAWA,MAAMA,IAAeC,EAAMC,cAAyC,IAAI,GAkB3DC,IAAiEA,CAAC;AAAA,EAC7EC,QAAAA;AAAAA,EACAC,MAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,QAAAA;AAAAA,EACAC,WAAAA;AAAAA,EACAC,qBAAAA;AAAAA,EACAC,0BAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,MAAAA;AACF,MAAM;AAEEC,QAAAA,IAAsBZ,EAAMa,QAChC,OAAO;AAAA,IACLT,MAAAA;AAAAA,IACAI,qBAAAA;AAAAA,IACAC,0BAAAA;AAAAA,IACAJ,UAAAA;AAAAA,EAAAA,IAEF,CAACD,GAAMI,GAAqBC,GAA0BJ,CAAQ,CAChE,GAEMS,IAAQC,EACZZ,GACAG,GACAC,GACAK,CACF;AAEA,SACG,gBAAAZ,EAAA,cAAAD,EAAa,UAAb,EACC,OAAO;AAAA,IACLe,OAAAA;AAAAA,EAAAA,EAGF,GAAA,gBAAAd,EAAA,cAACgB,GAAkB,EAAA,MAAAL,EAAA,GAAaD,CAAS,CAC3C;AAEJ,GAEaO,IAAiBA,MAAa;AACnCC,QAAAA,IAAUlB,EAAMmB,WAAWpB,CAAY;AAC7C,MAAI,CAACmB;AACG,UAAA,IAAIE,MAAM,oDAAoD;AAEtE,SAAOF,EAAQJ;AACjB;"}
@@ -1,11 +1,11 @@
1
- import { useRef as u, useMemo as n } from "react";
2
- import o from "zustand/shallow";
3
- function c(r) {
4
- const t = u();
5
- return n(() => {
6
- const e = t.current;
7
- return e && o(r, e) ? e : (t.current = r, r);
8
- }, [r]);
1
+ import u from "fast-deep-equal";
2
+ import { useRef as n, useMemo as f } from "react";
3
+ function c(e) {
4
+ const t = n();
5
+ return f(() => {
6
+ const r = t.current;
7
+ return r && u(e, r) ? r : (t.current = e, e);
8
+ }, [e]);
9
9
  }
10
10
  export {
11
11
  c as default
@@ -1 +1 @@
1
- {"version":3,"file":"useStableOptions.mjs","sources":["../../../../../src/modules/core/hooks/useStableOptions.ts"],"sourcesContent":["import { useMemo, useRef } from \"react\";\nimport shallow from \"zustand/shallow\";\n\nexport default function useStableOptions<T>(options: T): T {\n const optionsRef = useRef<T>();\n\n return useMemo(() => {\n const currentOptions = optionsRef.current;\n\n if (currentOptions && shallow(options, currentOptions)) {\n return currentOptions;\n }\n\n optionsRef.current = options;\n return options;\n }, [options]);\n}\n"],"names":["useStableOptions","options","optionsRef","useRef","useMemo","currentOptions","current","shallow"],"mappings":";;AAGA,SAAwBA,EAAoBC,GAAe;AACzD,QAAMC,IAAaC;AAEnB,SAAOC,EAAQ,MAAM;AACnB,UAAMC,IAAiBH,EAAWI;AAElC,WAAID,KAAkBE,EAAQN,GAASI,CAAc,IAC5CA,KAGTH,EAAWI,UAAUL,GACdA;AAAAA,EAAAA,GACN,CAACA,CAAO,CAAC;AACd;"}
1
+ {"version":3,"file":"useStableOptions.mjs","sources":["../../../../../src/modules/core/hooks/useStableOptions.ts"],"sourcesContent":["import fastDeepEqual from \"fast-deep-equal\";\nimport { useMemo, useRef } from \"react\";\n\nexport default function useStableOptions<T>(options: T): T {\n const optionsRef = useRef<T>();\n\n return useMemo(() => {\n const currentOptions = optionsRef.current;\n\n if (currentOptions && fastDeepEqual(options, currentOptions)) {\n return currentOptions;\n }\n\n optionsRef.current = options;\n return options;\n }, [options]);\n}\n"],"names":["useStableOptions","options","optionsRef","useRef","useMemo","currentOptions","current","fastDeepEqual"],"mappings":";;AAGA,SAAwBA,EAAoBC,GAAe;AACzD,QAAMC,IAAaC;AAEnB,SAAOC,EAAQ,MAAM;AACnB,UAAMC,IAAiBH,EAAWI;AAElC,WAAID,KAAkBE,EAAcN,GAASI,CAAc,IAClDA,KAGTH,EAAWI,UAAUL,GACdA;AAAAA,EAAAA,GACN,CAACA,CAAO,CAAC;AACd;"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","sources":["../../../../src/modules/core/utils.ts"],"sourcesContent":["import { FeedClientOptions } from \"@knocklabs/client\";\nimport { intlFormatDistance, parseISO } from \"date-fns\";\nimport { ReactNode } from \"react\";\n\nexport function formatBadgeCount(count: number): string | number {\n return count > 9 ? \"9+\" : count;\n}\n\ntype FormatTimestampOptions = {\n locale?: string | string[];\n};\n\nexport function formatTimestamp(\n ts: string,\n options: FormatTimestampOptions = {},\n) {\n try {\n const parsedTs = parseISO(ts);\n const formatted = intlFormatDistance(parsedTs, new Date(), {\n locale: options.locale,\n });\n\n return formatted;\n } catch (_e) {\n return ts;\n }\n}\n\nexport function toSentenceCase(string: string): string {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nexport function renderNodeOrFallback(node: ReactNode, fallback: ReactNode) {\n return node !== undefined ? node : fallback;\n}\n\n/*\n Used to build a consistent key for the KnockFeedProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function feedProviderKey(\n userId: string | undefined,\n feedId: string,\n options: FeedClientOptions = {},\n) {\n return [\n userId,\n feedId,\n options.source,\n options.tenant,\n options.has_tenant,\n options.archived,\n ]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n\n/*\n Used to build a consistent key for the KnockSlackProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function slackProviderKey({\n knockSlackChannelId,\n tenant,\n connectionStatus,\n errorLabel,\n}: {\n knockSlackChannelId: string;\n tenant: string;\n connectionStatus: string;\n errorLabel: string | null;\n}) {\n return [knockSlackChannelId, tenant, connectionStatus, errorLabel]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n"],"names":["formatBadgeCount","count","formatTimestamp","ts","options","parsedTs","parseISO","formatted","intlFormatDistance","Date","locale","toSentenceCase","string","charAt","toUpperCase","slice","renderNodeOrFallback","node","fallback","undefined","feedProviderKey","userId","feedId","source","tenant","has_tenant","archived","filter","f","join","slackProviderKey","knockSlackChannelId","connectionStatus","errorLabel"],"mappings":";AAIO,SAASA,EAAiBC,GAAgC;AACxDA,SAAAA,IAAQ,IAAI,OAAOA;AAC5B;AAMO,SAASC,EACdC,GACAC,IAAkC,IAClC;AACI,MAAA;AACIC,UAAAA,IAAWC,EAASH,CAAE;AAKrBI,WAJWC,EAAmBH,GAAU,oBAAII,QAAQ;AAAA,MACzDC,QAAQN,EAAQM;AAAAA,IAAAA,CACjB;AAAA,UAGU;AACJP,WAAAA;AAAAA,EACT;AACF;AAEO,SAASQ,EAAeC,GAAwB;AAC9CA,SAAAA,EAAOC,OAAO,CAAC,EAAEC,gBAAgBF,EAAOG,MAAM,CAAC;AACxD;AAEgBC,SAAAA,EAAqBC,GAAiBC,GAAqB;AAClED,SAAAA,MAASE,SAAYF,IAAOC;AACrC;AAMO,SAASE,EACdC,GACAC,GACAlB,IAA6B,CAAA,GAC7B;AACO,SAAA,CACLiB,GACAC,GACAlB,EAAQmB,QACRnB,EAAQoB,QACRpB,EAAQqB,YACRrB,EAAQsB,QAAQ,EAEfC,OAAQC,OAAMA,KAAM,IAAuB,EAC3CC,KAAK,GAAG;AACb;AAMO,SAASC,EAAiB;AAAA,EAC/BC,qBAAAA;AAAAA,EACAP,QAAAA;AAAAA,EACAQ,kBAAAA;AAAAA,EACAC,YAAAA;AAMF,GAAG;AACD,SAAO,CAACF,GAAqBP,GAAQQ,GAAkBC,CAAU,EAC9DN,OAAQC,CAAMA,MAAAA,KAAM,IAAuB,EAC3CC,KAAK,GAAG;AACb;"}
1
+ {"version":3,"file":"utils.mjs","sources":["../../../../src/modules/core/utils.ts"],"sourcesContent":["import { FeedClientOptions } from \"@knocklabs/client\";\nimport { intlFormatDistance, parseISO } from \"date-fns\";\nimport { ReactNode } from \"react\";\n\nexport function formatBadgeCount(count: number): string | number {\n return count > 9 ? \"9+\" : count;\n}\n\ntype FormatTimestampOptions = {\n locale?: string | string[];\n};\n\nexport function formatTimestamp(\n ts: string,\n options: FormatTimestampOptions = {},\n) {\n try {\n const parsedTs = parseISO(ts);\n const formatted = intlFormatDistance(parsedTs, new Date(), {\n locale: options.locale,\n });\n\n return formatted;\n } catch (e) {\n return ts;\n }\n}\n\nexport function toSentenceCase(string: string): string {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nexport function renderNodeOrFallback(node: ReactNode, fallback: ReactNode) {\n return node !== undefined ? node : fallback;\n}\n\n/*\n Used to build a consistent key for the KnockFeedProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function feedProviderKey(\n userId: string | undefined,\n feedId: string,\n options: FeedClientOptions = {},\n) {\n return [\n userId,\n feedId,\n options.source,\n options.tenant,\n options.has_tenant,\n options.archived,\n ]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n\n/*\n Used to build a consistent key for the KnockSlackProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function slackProviderKey({\n knockSlackChannelId,\n tenant,\n connectionStatus,\n errorLabel,\n}: {\n knockSlackChannelId: string;\n tenant: string;\n connectionStatus: string;\n errorLabel: string | null;\n}) {\n return [knockSlackChannelId, tenant, connectionStatus, errorLabel]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n"],"names":["formatBadgeCount","count","formatTimestamp","ts","options","parsedTs","parseISO","formatted","intlFormatDistance","Date","locale","toSentenceCase","string","charAt","toUpperCase","slice","renderNodeOrFallback","node","fallback","undefined","feedProviderKey","userId","feedId","source","tenant","has_tenant","archived","filter","f","join","slackProviderKey","knockSlackChannelId","connectionStatus","errorLabel"],"mappings":";AAIO,SAASA,EAAiBC,GAAgC;AACxDA,SAAAA,IAAQ,IAAI,OAAOA;AAC5B;AAMO,SAASC,EACdC,GACAC,IAAkC,IAClC;AACI,MAAA;AACIC,UAAAA,IAAWC,EAASH,CAAE;AAKrBI,WAJWC,EAAmBH,GAAU,oBAAII,QAAQ;AAAA,MACzDC,QAAQN,EAAQM;AAAAA,IAAAA,CACjB;AAAA,UAGS;AACHP,WAAAA;AAAAA,EACT;AACF;AAEO,SAASQ,EAAeC,GAAwB;AAC9CA,SAAAA,EAAOC,OAAO,CAAC,EAAEC,gBAAgBF,EAAOG,MAAM,CAAC;AACxD;AAEgBC,SAAAA,EAAqBC,GAAiBC,GAAqB;AAClED,SAAAA,MAASE,SAAYF,IAAOC;AACrC;AAMO,SAASE,EACdC,GACAC,GACAlB,IAA6B,CAAA,GAC7B;AACO,SAAA,CACLiB,GACAC,GACAlB,EAAQmB,QACRnB,EAAQoB,QACRpB,EAAQqB,YACRrB,EAAQsB,QAAQ,EAEfC,OAAQC,OAAMA,KAAM,IAAuB,EAC3CC,KAAK,GAAG;AACb;AAMO,SAASC,EAAiB;AAAA,EAC/BC,qBAAAA;AAAAA,EACAP,QAAAA;AAAAA,EACAQ,kBAAAA;AAAAA,EACAC,YAAAA;AAMF,GAAG;AACD,SAAO,CAACF,GAAqBP,GAAQQ,GAAkBC,CAAU,EAC9DN,OAAQC,CAAMA,MAAAA,KAAM,IAAuB,EAC3CC,KAAK,GAAG;AACb;"}
@@ -1,31 +1,37 @@
1
- import * as t from "react";
2
- import { useKnockClient as u } from "../../core/context/KnockProvider.mjs";
1
+ import * as r from "react";
2
+ import { useKnockClient as m } from "../../core/context/KnockProvider.mjs";
3
3
  import "@knocklabs/client";
4
- import "zustand/shallow";
5
- import { feedProviderKey as d } from "../../core/utils.mjs";
6
- import a from "../hooks/useNotifications.mjs";
7
- import { useCreateNotificationStore as f } from "../hooks/useNotificationStore.mjs";
8
- const i = t.createContext(void 0), F = ({
4
+ import "fast-deep-equal";
5
+ import { feedProviderKey as u } from "../../core/utils.mjs";
6
+ import k from "../hooks/useNotifications.mjs";
7
+ import { useCreateNotificationStore as a } from "../hooks/useNotificationStore.mjs";
8
+ const i = r.createContext(void 0), F = ({
9
9
  feedId: e,
10
10
  children: c,
11
- defaultFeedOptions: r = {},
11
+ defaultFeedOptions: t = {},
12
12
  colorMode: s = "light"
13
13
  }) => {
14
- const o = u(), n = a(o, e, r), m = f(n);
15
- return /* @__PURE__ */ t.createElement(i.Provider, { key: d(o.userId, e, r), value: {
14
+ let o;
15
+ try {
16
+ o = m();
17
+ } catch {
18
+ throw new Error("KnockFeedProvider must be used within a KnockProvider.");
19
+ }
20
+ const n = k(o, e, t), d = a(n);
21
+ return /* @__PURE__ */ r.createElement(i.Provider, { key: u(o.userId, e, t), value: {
16
22
  knock: o,
17
23
  feedClient: n,
18
- useFeedStore: m,
24
+ useFeedStore: d,
19
25
  colorMode: s
20
26
  } }, c);
21
- }, l = () => {
22
- const e = t.useContext(i);
27
+ }, P = () => {
28
+ const e = r.useContext(i);
23
29
  if (!e)
24
30
  throw new Error("useKnockFeed must be used within a KnockFeedProvider");
25
31
  return e;
26
32
  };
27
33
  export {
28
34
  F as KnockFeedProvider,
29
- l as useKnockFeed
35
+ P as useKnockFeed
30
36
  };
31
37
  //# sourceMappingURL=KnockFeedProvider.mjs.map