@knocklabs/react-core 0.2.25 → 0.3.0-rc.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 (43) hide show
  1. package/CHANGELOG.md +11 -0
  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/feed/context/KnockFeedProvider.js +1 -1
  6. package/dist/cjs/modules/feed/context/KnockFeedProvider.js.map +1 -1
  7. package/dist/cjs/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.js +2 -0
  8. package/dist/cjs/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.js.map +1 -0
  9. package/dist/cjs/modules/in-app-messages/hooks/useInAppMessages.js +2 -0
  10. package/dist/cjs/modules/in-app-messages/hooks/useInAppMessages.js.map +1 -0
  11. package/dist/esm/index.mjs +36 -30
  12. package/dist/esm/index.mjs.map +1 -1
  13. package/dist/esm/modules/core/context/KnockProvider.mjs +14 -14
  14. package/dist/esm/modules/core/context/KnockProvider.mjs.map +1 -1
  15. package/dist/esm/modules/feed/context/KnockFeedProvider.mjs +19 -13
  16. package/dist/esm/modules/feed/context/KnockFeedProvider.mjs.map +1 -1
  17. package/dist/esm/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.mjs +33 -0
  18. package/dist/esm/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.mjs.map +1 -0
  19. package/dist/esm/modules/in-app-messages/hooks/useInAppMessages.mjs +41 -0
  20. package/dist/esm/modules/in-app-messages/hooks/useInAppMessages.mjs.map +1 -0
  21. package/dist/types/index.d.ts +1 -0
  22. package/dist/types/index.d.ts.map +1 -1
  23. package/dist/types/modules/core/context/KnockProvider.d.ts.map +1 -1
  24. package/dist/types/modules/feed/context/KnockFeedProvider.d.ts.map +1 -1
  25. package/dist/types/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.d.ts +16 -0
  26. package/dist/types/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.d.ts.map +1 -0
  27. package/dist/types/modules/in-app-messages/context/index.d.ts +2 -0
  28. package/dist/types/modules/in-app-messages/context/index.d.ts.map +1 -0
  29. package/dist/types/modules/in-app-messages/hooks/index.d.ts +2 -0
  30. package/dist/types/modules/in-app-messages/hooks/index.d.ts.map +1 -0
  31. package/dist/types/modules/in-app-messages/hooks/useInAppMessages.d.ts +21 -0
  32. package/dist/types/modules/in-app-messages/hooks/useInAppMessages.d.ts.map +1 -0
  33. package/dist/types/modules/in-app-messages/index.d.ts +3 -0
  34. package/dist/types/modules/in-app-messages/index.d.ts.map +1 -0
  35. package/package.json +4 -3
  36. package/src/index.ts +1 -0
  37. package/src/modules/core/context/KnockProvider.tsx +6 -8
  38. package/src/modules/feed/context/KnockFeedProvider.tsx +11 -6
  39. package/src/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.tsx +68 -0
  40. package/src/modules/in-app-messages/context/index.ts +1 -0
  41. package/src/modules/in-app-messages/hooks/index.ts +1 -0
  42. package/src/modules/in-app-messages/hooks/useInAppMessages.ts +89 -0
  43. package/src/modules/in-app-messages/index.ts +3 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0-rc.0
4
+
5
+ ### Minor Changes
6
+
7
+ - f442962: feat: add in app messages client, hooks, provider, and components
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [f442962]
12
+ - @knocklabs/client@0.11.0-rc.0
13
+
3
14
  ## 0.2.25
4
15
 
5
16
  ### Patch Changes
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("zustand/shallow");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";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("zustand/shallow");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:e}=A.useInAppMessagesChannel(),t=M(r),s=o.useMemo(()=>new g.InAppMessagesClient(e,n,t),[e,n,t]),{messages:a,networkStatus:c,loading:i}=l.useStore(e.store,p=>s.getQueryInfoSelector(p));return o.useEffect(()=>(s.subscribe(),s.fetch(),()=>{s.unsubscribe()}),[]),{messages:a,networkStatus:c,loading:i,inAppMessagesClient:s}},b=(n,r={})=>{const{messages:e,...t}=u(n,{...r,page_size:1});return{message:e[0],...t}};exports.useInAppMessage=b;exports.useInAppMessages=u;
2
+ //# sourceMappingURL=useInAppMessages.js.map
@@ -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 // Run only once at mount.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return { messages, networkStatus, loading, inAppMessagesClient };\n};\n\nexport type UseInAppMessageOptions = Omit<UseInAppMessagesOptions, \"page_size\">;\n\nexport interface UseInAppMessageResponse<\n TContent extends GenericData,\n TData extends GenericData,\n> extends GenericData {\n message?: InAppMessage<TContent, TData>;\n networkStatus: NetworkStatus;\n loading: boolean;\n inAppMessagesClient: InAppMessagesClient;\n}\n\nexport const useInAppMessage = <\n TContent extends GenericData = GenericData,\n TData extends GenericData = GenericData,\n>(\n messageType: string,\n options: UseInAppMessageOptions = {},\n): UseInAppMessageResponse<TContent, TData> => {\n const { messages, ...rest } = useInAppMessages<TContent, TData>(messageType, {\n ...options,\n page_size: 1,\n });\n\n return { message: messages[0], ...rest };\n};\n"],"names":["useInAppMessages","messageType","options","inAppMessagesChannelClient","useInAppMessagesChannel","stableOptions","useStableOptions","inAppMessagesClient","useMemo","InAppMessagesClient","messages","networkStatus","loading","useStore","store","getQueryInfoSelector","state","useEffect","subscribe","fetch","unsubscribe","useInAppMessage","rest","page_size","message"],"mappings":"yWAyBaA,EAAmB,CAI9BC,EACAC,EAAmC,KACW,CACxC,KAAA,CAAEC,2BAAAA,GAA+BC,EAAwB,wBAAA,EAEzDC,EAAgBC,EAAiBJ,CAAO,EAExCK,EAAsBC,EAAAA,QAAQ,IAC3B,IAAIC,EAAAA,oBACTN,EACAF,EACAI,CACF,EACC,CAACF,EAA4BF,EAAaI,CAAa,CAAC,EAErD,CAAEK,SAAAA,EAAUC,cAAAA,EAAeC,QAAAA,CAAAA,EAAYC,WAC3CV,EAA2BW,SAChBP,EAAoBQ,qBAAsCC,CAAK,CAC5E,EAEAC,OAAAA,EAAAA,UAAU,KACRV,EAAoBW,UAAU,EAC9BX,EAAoBY,MAAM,EAEnB,IAAM,CACXZ,EAAoBa,YAAY,CAAA,GAIjC,CAAE,CAAA,EAEE,CAAEV,SAAAA,EAAUC,cAAAA,EAAeC,QAAAA,EAASL,oBAAAA,CAAAA,CAC7C,EAcac,EAAkB,CAI7BpB,EACAC,EAAkC,KACW,CACvC,KAAA,CAAEQ,SAAAA,EAAU,GAAGY,CAAAA,EAAStB,EAAkCC,EAAa,CAC3E,GAAGC,EACHqB,UAAW,CAAA,CACZ,EAEM,MAAA,CAAEC,QAASd,EAAS,CAAC,EAAG,GAAGY,CAAAA,CACpC"}
@@ -1,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";
2
+ import { KnockI18nProvider as d } from "../../i18n/context/KnockI18nProvider.mjs";
3
+ import l from "../hooks/useAuthenticatedKnockClient.mjs";
4
4
  import "zustand/shallow";
5
- const i = t.createContext(null), p = ({
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,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
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 = ({
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
@@ -1 +1 @@
1
- {"version":3,"file":"KnockFeedProvider.mjs","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":";;;;;;;AAsBA,MAAMA,IAAmBC,EAAMC,cAE7BC,MAAS,GAaEC,IAETA,CAAC;AAAA,EAAEC,QAAAA;AAAAA,EAAQC,UAAAA;AAAAA,EAAUC,oBAAAA,IAAqB,CAAC;AAAA,EAAGC,WAAAA,IAAY;AAAQ,MAAM;AAC1E,QAAMC,IAAQC,KACRC,IAAaC,EAAiBH,GAAOJ,GAAQE,CAAkB,GAC/DM,IAAeC,EAA2BH,CAAU;AAGxD,SAAA,gBAAAV,EAAA,cAACD,EAAiB,UAAjB,EACC,KAAKe,EAAgBN,EAAMO,QAAQX,GAAQE,CAAkB,GAC7D,OAAO;AAAA,IACLE,OAAAA;AAAAA,IACAE,YAAAA;AAAAA,IACAE,cAAAA;AAAAA,IACAL,WAAAA;AAAAA,EAAAA,KAGDF,CACH;AAEJ,GAEaW,IAAeA,MAA8B;AAClDC,QAAAA,IAAUjB,EAAMkB,WAAWnB,CAAgB;AAEjD,MAAI,CAACkB;AACG,UAAA,IAAIE,MAAM,sDAAsD;AAGjEF,SAAAA;AACT;"}
1
+ {"version":3,"file":"KnockFeedProvider.mjs","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":";;;;;;;AAsBA,MAAMA,IAAmBC,EAAMC,cAE7BC,MAAS,GAaEC,IAETA,CAAC;AAAA,EAAEC,QAAAA;AAAAA,EAAQC,UAAAA;AAAAA,EAAUC,oBAAAA,IAAqB,CAAC;AAAA,EAAGC,WAAAA,IAAY;AAAQ,MAAM;AACtEC,MAAAA;AACA,MAAA;AACFA,IAAAA,IAAQC,EAAe;AAAA,UACT;AACR,UAAA,IAAIC,MAAM,wDAAwD;AAAA,EAC1E;AAEA,QAAMC,IAAaC,EAAiBJ,GAAOJ,GAAQE,CAAkB,GAC/DO,IAAeC,EAA2BH,CAAU;AAGxD,SAAA,gBAAAX,EAAA,cAACD,EAAiB,UAAjB,EACC,KAAKgB,EAAgBP,EAAMQ,QAAQZ,GAAQE,CAAkB,GAC7D,OAAO;AAAA,IACLE,OAAAA;AAAAA,IACAG,YAAAA;AAAAA,IACAE,cAAAA;AAAAA,IACAN,WAAAA;AAAAA,EAAAA,KAGDF,CACH;AAEJ,GAEaY,IAAeA,MAA8B;AAClDC,QAAAA,IAAUlB,EAAMmB,WAAWpB,CAAgB;AACjD,MAAI,CAACmB;AACG,UAAA,IAAIR,MAAM,sDAAsD;AAGjEQ,SAAAA;AACT;"}
@@ -0,0 +1,33 @@
1
+ import { InAppMessagesChannelClient as c } from "@knocklabs/client";
2
+ import * as n from "react";
3
+ import { useKnockClient as l } from "../../core/context/KnockProvider.mjs";
4
+ import u from "../../core/hooks/useStableOptions.mjs";
5
+ import "date-fns";
6
+ const r = n.createContext(void 0), k = ({
7
+ children: e,
8
+ channelId: t,
9
+ colorMode: a = "light",
10
+ defaultOptions: p
11
+ }) => {
12
+ let s;
13
+ try {
14
+ s = l();
15
+ } catch {
16
+ throw new Error("KnockInAppMessagesChannelProvider must be used within a KnockProvider.");
17
+ }
18
+ const o = u(p), i = n.useMemo(() => new c(s, t, o), [s, t, o]);
19
+ return /* @__PURE__ */ n.createElement(r.Provider, { value: {
20
+ inAppMessagesChannelClient: i,
21
+ colorMode: a
22
+ } }, e);
23
+ }, A = () => {
24
+ const e = n.useContext(r);
25
+ if (!e)
26
+ throw new Error("useInAppMessagesChannel must be used within a KnockInAppMessagesChannelProvider");
27
+ return e;
28
+ };
29
+ export {
30
+ k as KnockInAppMessagesChannelProvider,
31
+ A as useInAppMessagesChannel
32
+ };
33
+ //# sourceMappingURL=KnockInAppMessagesChannelProvider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnockInAppMessagesChannelProvider.mjs","sources":["../../../../../src/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.tsx"],"sourcesContent":["import Knock, {\n InAppMessagesChannelClient,\n InAppMessagesClientOptions,\n} from \"@knocklabs/client\";\nimport * as React from \"react\";\n\nimport { useKnockClient, useStableOptions } from \"../../core\";\nimport { ColorMode } from \"../../core/constants\";\n\nexport interface KnockInAppMessagesChannelProviderState {\n inAppMessagesChannelClient: InAppMessagesChannelClient;\n colorMode: ColorMode;\n}\n\nexport interface KnockInAppMessagesChannelProviderProps {\n // In-App Message props\n channelId: string;\n defaultOptions?: InAppMessagesClientOptions;\n\n // Extra options\n colorMode?: ColorMode;\n}\n\nconst KnockInAppMessagesContext = React.createContext<\n KnockInAppMessagesChannelProviderState | undefined\n>(undefined);\n\nexport const KnockInAppMessagesChannelProvider: React.FC<\n React.PropsWithChildren<KnockInAppMessagesChannelProviderProps>\n> = ({ children, channelId, colorMode = \"light\", defaultOptions }) => {\n let knock: Knock;\n try {\n knock = useKnockClient();\n } catch (error) {\n throw new Error(\n \"KnockInAppMessagesChannelProvider must be used within a KnockProvider.\",\n );\n }\n\n const stableOptions = useStableOptions(defaultOptions);\n\n const inAppMessagesChannelClient = React.useMemo(() => {\n return new InAppMessagesChannelClient(knock, channelId, stableOptions);\n }, [knock, channelId, stableOptions]);\n\n return (\n <KnockInAppMessagesContext.Provider\n value={{\n inAppMessagesChannelClient,\n colorMode,\n }}\n >\n {children}\n </KnockInAppMessagesContext.Provider>\n );\n};\n\nexport const useInAppMessagesChannel =\n (): KnockInAppMessagesChannelProviderState => {\n const context = React.useContext(KnockInAppMessagesContext);\n if (!context) {\n throw new Error(\n \"useInAppMessagesChannel must be used within a KnockInAppMessagesChannelProvider\",\n );\n }\n\n return context;\n };\n"],"names":["KnockInAppMessagesContext","React","createContext","undefined","KnockInAppMessagesChannelProvider","children","channelId","colorMode","defaultOptions","knock","useKnockClient","Error","stableOptions","useStableOptions","inAppMessagesChannelClient","useMemo","InAppMessagesChannelClient","useInAppMessagesChannel","context","useContext"],"mappings":";;;;;AAuBA,MAAMA,IAA4BC,EAAMC,cAEtCC,MAAS,GAEEC,IAETA,CAAC;AAAA,EAAEC,UAAAA;AAAAA,EAAUC,WAAAA;AAAAA,EAAWC,WAAAA,IAAY;AAAA,EAASC,gBAAAA;AAAe,MAAM;AAChEC,MAAAA;AACA,MAAA;AACFA,IAAAA,IAAQC,EAAe;AAAA,UACT;AACR,UAAA,IAAIC,MACR,wEACF;AAAA,EACF;AAEMC,QAAAA,IAAgBC,EAAiBL,CAAc,GAE/CM,IAA6Bb,EAAMc,QAAQ,MACxC,IAAIC,EAA2BP,GAAOH,GAAWM,CAAa,GACpE,CAACH,GAAOH,GAAWM,CAAa,CAAC;AAEpC,SACG,gBAAAX,EAAA,cAAAD,EAA0B,UAA1B,EACC,OAAO;AAAA,IACLc,4BAAAA;AAAAA,IACAP,WAAAA;AAAAA,EAAAA,KAGDF,CACH;AAEJ,GAEaY,IACXA,MAA8C;AACtCC,QAAAA,IAAUjB,EAAMkB,WAAWnB,CAAyB;AAC1D,MAAI,CAACkB;AACG,UAAA,IAAIP,MACR,iFACF;AAGKO,SAAAA;AACT;"}
@@ -0,0 +1,41 @@
1
+ import { InAppMessagesClient as a } from "@knocklabs/client";
2
+ import { useStore as m } from "@tanstack/react-store";
3
+ import { useMemo as c, useEffect as g } from "react";
4
+ import "../../core/context/KnockProvider.mjs";
5
+ import f from "../../core/hooks/useStableOptions.mjs";
6
+ import "date-fns";
7
+ import { useInAppMessagesChannel as l } from "../context/KnockInAppMessagesChannelProvider.mjs";
8
+ const M = (t, o = {}) => {
9
+ const {
10
+ inAppMessagesChannelClient: e
11
+ } = l(), n = f(o), s = c(() => new a(e, t, n), [e, t, n]), {
12
+ messages: r,
13
+ networkStatus: p,
14
+ loading: i
15
+ } = m(e.store, (u) => s.getQueryInfoSelector(u));
16
+ return g(() => (s.subscribe(), s.fetch(), () => {
17
+ s.unsubscribe();
18
+ }), []), {
19
+ messages: r,
20
+ networkStatus: p,
21
+ loading: i,
22
+ inAppMessagesClient: s
23
+ };
24
+ }, O = (t, o = {}) => {
25
+ const {
26
+ messages: e,
27
+ ...n
28
+ } = M(t, {
29
+ ...o,
30
+ page_size: 1
31
+ });
32
+ return {
33
+ message: e[0],
34
+ ...n
35
+ };
36
+ };
37
+ export {
38
+ O as useInAppMessage,
39
+ M as useInAppMessages
40
+ };
41
+ //# sourceMappingURL=useInAppMessages.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInAppMessages.mjs","sources":["../../../../../src/modules/in-app-messages/hooks/useInAppMessages.ts"],"sourcesContent":["import {\n InAppMessage,\n InAppMessagesClient,\n InAppMessagesClientOptions,\n NetworkStatus,\n} from \"@knocklabs/client\";\nimport { GenericData } from \"@knocklabs/types\";\nimport { useStore } from \"@tanstack/react-store\";\nimport { useEffect, useMemo } from \"react\";\n\nimport { useStableOptions } from \"../../core\";\nimport { useInAppMessagesChannel } from \"../context\";\n\nexport interface UseInAppMessagesOptions extends InAppMessagesClientOptions {}\n\nexport interface UseInAppMessagesResponse<\n TContent extends GenericData,\n TData extends GenericData,\n> {\n messages: InAppMessage<TContent, TData>[];\n networkStatus: NetworkStatus;\n loading: boolean;\n inAppMessagesClient: InAppMessagesClient;\n}\n\nexport const useInAppMessages = <\n TContent extends GenericData = GenericData,\n TData extends GenericData = GenericData,\n>(\n messageType: string,\n options: UseInAppMessagesOptions = {},\n): UseInAppMessagesResponse<TContent, TData> => {\n const { inAppMessagesChannelClient } = useInAppMessagesChannel();\n\n const stableOptions = useStableOptions(options);\n\n const inAppMessagesClient = useMemo(() => {\n return new InAppMessagesClient(\n inAppMessagesChannelClient,\n messageType,\n stableOptions,\n );\n }, [inAppMessagesChannelClient, messageType, stableOptions]);\n\n const { messages, networkStatus, loading } = useStore(\n inAppMessagesChannelClient.store,\n (state) => inAppMessagesClient.getQueryInfoSelector<TContent, TData>(state),\n );\n\n useEffect(() => {\n inAppMessagesClient.subscribe();\n inAppMessagesClient.fetch();\n\n return () => {\n inAppMessagesClient.unsubscribe();\n };\n // Run only once at mount.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return { messages, networkStatus, loading, inAppMessagesClient };\n};\n\nexport type UseInAppMessageOptions = Omit<UseInAppMessagesOptions, \"page_size\">;\n\nexport interface UseInAppMessageResponse<\n TContent extends GenericData,\n TData extends GenericData,\n> extends GenericData {\n message?: InAppMessage<TContent, TData>;\n networkStatus: NetworkStatus;\n loading: boolean;\n inAppMessagesClient: InAppMessagesClient;\n}\n\nexport const useInAppMessage = <\n TContent extends GenericData = GenericData,\n TData extends GenericData = GenericData,\n>(\n messageType: string,\n options: UseInAppMessageOptions = {},\n): UseInAppMessageResponse<TContent, TData> => {\n const { messages, ...rest } = useInAppMessages<TContent, TData>(messageType, {\n ...options,\n page_size: 1,\n });\n\n return { message: messages[0], ...rest };\n};\n"],"names":["useInAppMessages","messageType","options","inAppMessagesChannelClient","useInAppMessagesChannel","stableOptions","useStableOptions","inAppMessagesClient","useMemo","InAppMessagesClient","messages","networkStatus","loading","useStore","store","state","getQueryInfoSelector","useEffect","subscribe","fetch","unsubscribe","useInAppMessage","rest","page_size","message"],"mappings":";;;;;;;AAyBO,MAAMA,IAAmB,CAI9BC,GACAC,IAAmC,OACW;AACxC,QAAA;AAAA,IAAEC,4BAAAA;AAAAA,MAA+BC,EAAwB,GAEzDC,IAAgBC,EAAiBJ,CAAO,GAExCK,IAAsBC,EAAQ,MAC3B,IAAIC,EACTN,GACAF,GACAI,CACF,GACC,CAACF,GAA4BF,GAAaI,CAAa,CAAC,GAErD;AAAA,IAAEK,UAAAA;AAAAA,IAAUC,eAAAA;AAAAA,IAAeC,SAAAA;AAAAA,EAAAA,IAAYC,EAC3CV,EAA2BW,OAC1BC,OAAUR,EAAoBS,qBAAsCD,CAAK,CAC5E;AAEAE,SAAAA,EAAU,OACRV,EAAoBW,UAAU,GAC9BX,EAAoBY,MAAM,GAEnB,MAAM;AACXZ,IAAAA,EAAoBa,YAAY;AAAA,EAAA,IAIjC,CAAE,CAAA,GAEE;AAAA,IAAEV,UAAAA;AAAAA,IAAUC,eAAAA;AAAAA,IAAeC,SAAAA;AAAAA,IAASL,qBAAAA;AAAAA,EAAAA;AAC7C,GAcac,IAAkB,CAI7BpB,GACAC,IAAkC,OACW;AACvC,QAAA;AAAA,IAAEQ,UAAAA;AAAAA,IAAU,GAAGY;AAAAA,EAAAA,IAAStB,EAAkCC,GAAa;AAAA,IAC3E,GAAGC;AAAAA,IACHqB,WAAW;AAAA,EAAA,CACZ;AAEM,SAAA;AAAA,IAAEC,SAASd,EAAS,CAAC;AAAA,IAAG,GAAGY;AAAAA,EAAAA;AACpC;"}
@@ -1,5 +1,6 @@
1
1
  export * from './modules/core';
2
2
  export * from './modules/feed';
3
+ export * from './modules/in-app-messages';
3
4
  export * from './modules/slack';
4
5
  export * from './modules/i18n';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"KnockProvider.d.ts","sourceRoot":"","sources":["../../../../../src/modules/core/context/KnockProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAC;AAG5D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAC;CACd;AAMD,MAAM,WAAW,kBAAkB;IAEjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;IACjE,wBAAwB,CAAC,EAAE,mBAAmB,CAAC,0BAA0B,CAAC,CAAC;IAG3E,IAAI,CAAC,EAAE,WAAW,CAAC;IAEnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAsCzE,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,KAMjC,CAAC"}
1
+ {"version":3,"file":"KnockProvider.d.ts","sourceRoot":"","sources":["../../../../../src/modules/core/context/KnockProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAC;AAG5D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAC;CACd;AAID,MAAM,WAAW,kBAAkB;IAEjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;IACjE,wBAAwB,CAAC,EAAE,mBAAmB,CAAC,0BAA0B,CAAC,CAAC;IAG3E,IAAI,CAAC,EAAE,WAAW,CAAC;IAEnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAsCzE,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,KAMjC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"KnockFeedProvider.d.ts","sourceRoot":"","sources":["../../../../../src/modules/feed/context/KnockFeedProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,IAAI,EACJ,iBAAiB,EACjB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKjD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,IAAI,CAAC;IACjB,YAAY,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC5C,SAAS,EAAE,SAAS,CAAC;CACtB;AAMD,MAAM,WAAW,sBAAsB;IAErC,MAAM,EAAE,MAAM,CAAC;IAGf,SAAS,CAAC,EAAE,SAAS,CAAC;IAGtB,kBAAkB,CAAC,EAAE,iBAAiB,CAAC;CACxC;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CACtC,iBAAiB,CAAC,sBAAsB,CAAC,CAmB1C,CAAC;AAEF,eAAO,MAAM,YAAY,QAAO,sBAQ/B,CAAC"}
1
+ {"version":3,"file":"KnockFeedProvider.d.ts","sourceRoot":"","sources":["../../../../../src/modules/feed/context/KnockFeedProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,IAAI,EACJ,iBAAiB,EACjB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKjD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,IAAI,CAAC;IACjB,YAAY,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC5C,SAAS,EAAE,SAAS,CAAC;CACtB;AAMD,MAAM,WAAW,sBAAsB;IAErC,MAAM,EAAE,MAAM,CAAC;IAGf,SAAS,CAAC,EAAE,SAAS,CAAC;IAGtB,kBAAkB,CAAC,EAAE,iBAAiB,CAAC;CACxC;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CACtC,iBAAiB,CAAC,sBAAsB,CAAC,CAyB1C,CAAC;AAEF,eAAO,MAAM,YAAY,QAAO,sBAO/B,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { InAppMessagesChannelClient, InAppMessagesClientOptions } from '@knocklabs/client';
2
+ import { ColorMode } from '../../core/constants';
3
+
4
+ import * as React from "react";
5
+ export interface KnockInAppMessagesChannelProviderState {
6
+ inAppMessagesChannelClient: InAppMessagesChannelClient;
7
+ colorMode: ColorMode;
8
+ }
9
+ export interface KnockInAppMessagesChannelProviderProps {
10
+ channelId: string;
11
+ defaultOptions?: InAppMessagesClientOptions;
12
+ colorMode?: ColorMode;
13
+ }
14
+ export declare const KnockInAppMessagesChannelProvider: React.FC<React.PropsWithChildren<KnockInAppMessagesChannelProviderProps>>;
15
+ export declare const useInAppMessagesChannel: () => KnockInAppMessagesChannelProviderState;
16
+ //# sourceMappingURL=KnockInAppMessagesChannelProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnockInAppMessagesChannelProvider.d.ts","sourceRoot":"","sources":["../../../../../src/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.tsx"],"names":[],"mappings":"AAAA,OAAc,EACZ,0BAA0B,EAC1B,0BAA0B,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,WAAW,sCAAsC;IACrD,0BAA0B,EAAE,0BAA0B,CAAC;IACvD,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,sCAAsC;IAErD,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,0BAA0B,CAAC;IAG5C,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAMD,eAAO,MAAM,iCAAiC,EAAE,KAAK,CAAC,EAAE,CACtD,KAAK,CAAC,iBAAiB,CAAC,sCAAsC,CAAC,CA2BhE,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAC9B,sCASH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './KnockInAppMessagesChannelProvider';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/modules/in-app-messages/context/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './useInAppMessages';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/modules/in-app-messages/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { InAppMessage, InAppMessagesClient, InAppMessagesClientOptions, NetworkStatus } from '@knocklabs/client';
2
+ import { GenericData } from '@knocklabs/types';
3
+
4
+ export interface UseInAppMessagesOptions extends InAppMessagesClientOptions {
5
+ }
6
+ export interface UseInAppMessagesResponse<TContent extends GenericData, TData extends GenericData> {
7
+ messages: InAppMessage<TContent, TData>[];
8
+ networkStatus: NetworkStatus;
9
+ loading: boolean;
10
+ inAppMessagesClient: InAppMessagesClient;
11
+ }
12
+ export declare const useInAppMessages: <TContent extends GenericData = GenericData, TData extends GenericData = GenericData>(messageType: string, options?: UseInAppMessagesOptions) => UseInAppMessagesResponse<TContent, TData>;
13
+ export type UseInAppMessageOptions = Omit<UseInAppMessagesOptions, "page_size">;
14
+ export interface UseInAppMessageResponse<TContent extends GenericData, TData extends GenericData> extends GenericData {
15
+ message?: InAppMessage<TContent, TData>;
16
+ networkStatus: NetworkStatus;
17
+ loading: boolean;
18
+ inAppMessagesClient: InAppMessagesClient;
19
+ }
20
+ export declare const useInAppMessage: <TContent extends GenericData = GenericData, TData extends GenericData = GenericData>(messageType: string, options?: UseInAppMessageOptions) => UseInAppMessageResponse<TContent, TData>;
21
+ //# sourceMappingURL=useInAppMessages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInAppMessages.d.ts","sourceRoot":"","sources":["../../../../../src/modules/in-app-messages/hooks/useInAppMessages.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,0BAA0B,EAC1B,aAAa,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAO/C,MAAM,WAAW,uBAAwB,SAAQ,0BAA0B;CAAG;AAE9E,MAAM,WAAW,wBAAwB,CACvC,QAAQ,SAAS,WAAW,EAC5B,KAAK,SAAS,WAAW;IAEzB,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;IAC1C,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB,EAAE,mBAAmB,CAAC;CAC1C;AAED,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,SAAS,WAAW,gBAC5B,KAAK,SAAS,WAAW,6BAEZ,MAAM,YACV,uBAAuB,KAC/B,wBAAwB,CAAC,QAAQ,EAAE,KAAK,CA8B1C,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,uBAAuB,EAAE,WAAW,CAAC,CAAC;AAEhF,MAAM,WAAW,uBAAuB,CACtC,QAAQ,SAAS,WAAW,EAC5B,KAAK,SAAS,WAAW,CACzB,SAAQ,WAAW;IACnB,OAAO,CAAC,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACxC,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB,EAAE,mBAAmB,CAAC;CAC1C;AAED,eAAO,MAAM,eAAe,GAC1B,QAAQ,SAAS,WAAW,gBAC5B,KAAK,SAAS,WAAW,6BAEZ,MAAM,YACV,sBAAsB,KAC9B,uBAAuB,CAAC,QAAQ,EAAE,KAAK,CAOzC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './context';
2
+ export * from './hooks';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/in-app-messages/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@knocklabs/react-core",
3
3
  "description": "A set of React components to build notification experiences powered by Knock",
4
4
  "author": "@knocklabs",
5
- "version": "0.2.25",
5
+ "version": "0.3.0-rc.0",
6
6
  "license": "MIT",
7
7
  "main": "dist/cjs/index.js",
8
8
  "module": "dist/esm/index.mjs",
@@ -49,7 +49,8 @@
49
49
  "react": "^16.11.0 || ^17.0.0 || ^18.0.0"
50
50
  },
51
51
  "dependencies": {
52
- "@knocklabs/client": "^0.10.13",
52
+ "@knocklabs/client": "^0.11.0-rc.0",
53
+ "@tanstack/react-store": "^0.5.5",
53
54
  "date-fns": "^4.0.0",
54
55
  "swr": "^2.2.5",
55
56
  "zustand": "^3.7.2"
@@ -58,7 +59,7 @@
58
59
  "@testing-library/react": "^14.2.0",
59
60
  "@types/react": "^18.3.6",
60
61
  "@typescript-eslint/eslint-plugin": "^6.20.0",
61
- "@typescript-eslint/parser": "^8.8.0",
62
+ "@typescript-eslint/parser": "^8.8.1",
62
63
  "@vitejs/plugin-react": "^4.3.2",
63
64
  "babel-plugin-react-require": "^4.0.3",
64
65
  "eslint": "^8.56.0",
package/src/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from "./modules/core";
2
2
  export * from "./modules/feed";
3
+ export * from "./modules/in-app-messages";
3
4
  export * from "./modules/slack";
4
5
  export * from "./modules/i18n";
@@ -9,9 +9,7 @@ export interface KnockProviderState {
9
9
  knock: Knock;
10
10
  }
11
11
 
12
- const ProviderStateContext = React.createContext<KnockProviderState | null>(
13
- null,
14
- );
12
+ const KnockContext = React.createContext<KnockProviderState | null>(null);
15
13
 
16
14
  export interface KnockProviderProps {
17
15
  // Knock client props
@@ -59,20 +57,20 @@ export const KnockProvider: React.FC<PropsWithChildren<KnockProviderProps>> = ({
59
57
  );
60
58
 
61
59
  return (
62
- <ProviderStateContext.Provider
60
+ <KnockContext.Provider
63
61
  value={{
64
62
  knock,
65
63
  }}
66
64
  >
67
65
  <KnockI18nProvider i18n={i18n}>{children}</KnockI18nProvider>
68
- </ProviderStateContext.Provider>
66
+ </KnockContext.Provider>
69
67
  );
70
68
  };
71
69
 
72
70
  export const useKnockClient = (): Knock => {
73
- const context = React.useContext(ProviderStateContext) as KnockProviderState;
74
- if (context === undefined) {
75
- throw new Error("useKnock must be used within a KnockProvider");
71
+ const context = React.useContext(KnockContext);
72
+ if (!context) {
73
+ throw new Error("useKnockClient must be used within a KnockProvider");
76
74
  }
77
75
  return context.knock;
78
76
  };
@@ -20,7 +20,7 @@ export interface KnockFeedProviderState {
20
20
  colorMode: ColorMode;
21
21
  }
22
22
 
23
- const FeedStateContext = React.createContext<
23
+ const KnockFeedContext = React.createContext<
24
24
  KnockFeedProviderState | undefined
25
25
  >(undefined);
26
26
 
@@ -38,12 +38,18 @@ export interface KnockFeedProviderProps {
38
38
  export const KnockFeedProvider: React.FC<
39
39
  PropsWithChildren<KnockFeedProviderProps>
40
40
  > = ({ feedId, children, defaultFeedOptions = {}, colorMode = "light" }) => {
41
- const knock = useKnockClient();
41
+ let knock: Knock;
42
+ try {
43
+ knock = useKnockClient();
44
+ } catch (error) {
45
+ throw new Error("KnockFeedProvider must be used within a KnockProvider.");
46
+ }
47
+
42
48
  const feedClient = useNotifications(knock, feedId, defaultFeedOptions);
43
49
  const useFeedStore = useCreateNotificationStore(feedClient);
44
50
 
45
51
  return (
46
- <FeedStateContext.Provider
52
+ <KnockFeedContext.Provider
47
53
  key={feedProviderKey(knock.userId, feedId, defaultFeedOptions)}
48
54
  value={{
49
55
  knock,
@@ -53,13 +59,12 @@ export const KnockFeedProvider: React.FC<
53
59
  }}
54
60
  >
55
61
  {children}
56
- </FeedStateContext.Provider>
62
+ </KnockFeedContext.Provider>
57
63
  );
58
64
  };
59
65
 
60
66
  export const useKnockFeed = (): KnockFeedProviderState => {
61
- const context = React.useContext(FeedStateContext);
62
-
67
+ const context = React.useContext(KnockFeedContext);
63
68
  if (!context) {
64
69
  throw new Error("useKnockFeed must be used within a KnockFeedProvider");
65
70
  }
@@ -0,0 +1,68 @@
1
+ import Knock, {
2
+ InAppMessagesChannelClient,
3
+ InAppMessagesClientOptions,
4
+ } from "@knocklabs/client";
5
+ import * as React from "react";
6
+
7
+ import { useKnockClient, useStableOptions } from "../../core";
8
+ import { ColorMode } from "../../core/constants";
9
+
10
+ export interface KnockInAppMessagesChannelProviderState {
11
+ inAppMessagesChannelClient: InAppMessagesChannelClient;
12
+ colorMode: ColorMode;
13
+ }
14
+
15
+ export interface KnockInAppMessagesChannelProviderProps {
16
+ // In-App Message props
17
+ channelId: string;
18
+ defaultOptions?: InAppMessagesClientOptions;
19
+
20
+ // Extra options
21
+ colorMode?: ColorMode;
22
+ }
23
+
24
+ const KnockInAppMessagesContext = React.createContext<
25
+ KnockInAppMessagesChannelProviderState | undefined
26
+ >(undefined);
27
+
28
+ export const KnockInAppMessagesChannelProvider: React.FC<
29
+ React.PropsWithChildren<KnockInAppMessagesChannelProviderProps>
30
+ > = ({ children, channelId, colorMode = "light", defaultOptions }) => {
31
+ let knock: Knock;
32
+ try {
33
+ knock = useKnockClient();
34
+ } catch (error) {
35
+ throw new Error(
36
+ "KnockInAppMessagesChannelProvider must be used within a KnockProvider.",
37
+ );
38
+ }
39
+
40
+ const stableOptions = useStableOptions(defaultOptions);
41
+
42
+ const inAppMessagesChannelClient = React.useMemo(() => {
43
+ return new InAppMessagesChannelClient(knock, channelId, stableOptions);
44
+ }, [knock, channelId, stableOptions]);
45
+
46
+ return (
47
+ <KnockInAppMessagesContext.Provider
48
+ value={{
49
+ inAppMessagesChannelClient,
50
+ colorMode,
51
+ }}
52
+ >
53
+ {children}
54
+ </KnockInAppMessagesContext.Provider>
55
+ );
56
+ };
57
+
58
+ export const useInAppMessagesChannel =
59
+ (): KnockInAppMessagesChannelProviderState => {
60
+ const context = React.useContext(KnockInAppMessagesContext);
61
+ if (!context) {
62
+ throw new Error(
63
+ "useInAppMessagesChannel must be used within a KnockInAppMessagesChannelProvider",
64
+ );
65
+ }
66
+
67
+ return context;
68
+ };
@@ -0,0 +1 @@
1
+ export * from "./KnockInAppMessagesChannelProvider";
@@ -0,0 +1 @@
1
+ export * from "./useInAppMessages";
@@ -0,0 +1,89 @@
1
+ import {
2
+ InAppMessage,
3
+ InAppMessagesClient,
4
+ InAppMessagesClientOptions,
5
+ NetworkStatus,
6
+ } from "@knocklabs/client";
7
+ import { GenericData } from "@knocklabs/types";
8
+ import { useStore } from "@tanstack/react-store";
9
+ import { useEffect, useMemo } from "react";
10
+
11
+ import { useStableOptions } from "../../core";
12
+ import { useInAppMessagesChannel } from "../context";
13
+
14
+ export interface UseInAppMessagesOptions extends InAppMessagesClientOptions {}
15
+
16
+ export interface UseInAppMessagesResponse<
17
+ TContent extends GenericData,
18
+ TData extends GenericData,
19
+ > {
20
+ messages: InAppMessage<TContent, TData>[];
21
+ networkStatus: NetworkStatus;
22
+ loading: boolean;
23
+ inAppMessagesClient: InAppMessagesClient;
24
+ }
25
+
26
+ export const useInAppMessages = <
27
+ TContent extends GenericData = GenericData,
28
+ TData extends GenericData = GenericData,
29
+ >(
30
+ messageType: string,
31
+ options: UseInAppMessagesOptions = {},
32
+ ): UseInAppMessagesResponse<TContent, TData> => {
33
+ const { inAppMessagesChannelClient } = useInAppMessagesChannel();
34
+
35
+ const stableOptions = useStableOptions(options);
36
+
37
+ const inAppMessagesClient = useMemo(() => {
38
+ return new InAppMessagesClient(
39
+ inAppMessagesChannelClient,
40
+ messageType,
41
+ stableOptions,
42
+ );
43
+ }, [inAppMessagesChannelClient, messageType, stableOptions]);
44
+
45
+ const { messages, networkStatus, loading } = useStore(
46
+ inAppMessagesChannelClient.store,
47
+ (state) => inAppMessagesClient.getQueryInfoSelector<TContent, TData>(state),
48
+ );
49
+
50
+ useEffect(() => {
51
+ inAppMessagesClient.subscribe();
52
+ inAppMessagesClient.fetch();
53
+
54
+ return () => {
55
+ inAppMessagesClient.unsubscribe();
56
+ };
57
+ // Run only once at mount.
58
+ // eslint-disable-next-line react-hooks/exhaustive-deps
59
+ }, []);
60
+
61
+ return { messages, networkStatus, loading, inAppMessagesClient };
62
+ };
63
+
64
+ export type UseInAppMessageOptions = Omit<UseInAppMessagesOptions, "page_size">;
65
+
66
+ export interface UseInAppMessageResponse<
67
+ TContent extends GenericData,
68
+ TData extends GenericData,
69
+ > extends GenericData {
70
+ message?: InAppMessage<TContent, TData>;
71
+ networkStatus: NetworkStatus;
72
+ loading: boolean;
73
+ inAppMessagesClient: InAppMessagesClient;
74
+ }
75
+
76
+ export const useInAppMessage = <
77
+ TContent extends GenericData = GenericData,
78
+ TData extends GenericData = GenericData,
79
+ >(
80
+ messageType: string,
81
+ options: UseInAppMessageOptions = {},
82
+ ): UseInAppMessageResponse<TContent, TData> => {
83
+ const { messages, ...rest } = useInAppMessages<TContent, TData>(messageType, {
84
+ ...options,
85
+ page_size: 1,
86
+ });
87
+
88
+ return { message: messages[0], ...rest };
89
+ };
@@ -0,0 +1,3 @@
1
+ export * from "./context";
2
+ export * from "./hooks";
3
+ // TODO: Double check exports are exporting only necessary values