@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.
- package/CHANGELOG.md +11 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/modules/core/context/KnockProvider.js +1 -1
- package/dist/cjs/modules/core/context/KnockProvider.js.map +1 -1
- package/dist/cjs/modules/feed/context/KnockFeedProvider.js +1 -1
- package/dist/cjs/modules/feed/context/KnockFeedProvider.js.map +1 -1
- package/dist/cjs/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.js +2 -0
- package/dist/cjs/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.js.map +1 -0
- package/dist/cjs/modules/in-app-messages/hooks/useInAppMessages.js +2 -0
- package/dist/cjs/modules/in-app-messages/hooks/useInAppMessages.js.map +1 -0
- package/dist/esm/index.mjs +36 -30
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/modules/core/context/KnockProvider.mjs +14 -14
- package/dist/esm/modules/core/context/KnockProvider.mjs.map +1 -1
- package/dist/esm/modules/feed/context/KnockFeedProvider.mjs +19 -13
- package/dist/esm/modules/feed/context/KnockFeedProvider.mjs.map +1 -1
- package/dist/esm/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.mjs +33 -0
- package/dist/esm/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.mjs.map +1 -0
- package/dist/esm/modules/in-app-messages/hooks/useInAppMessages.mjs +41 -0
- package/dist/esm/modules/in-app-messages/hooks/useInAppMessages.mjs.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/modules/core/context/KnockProvider.d.ts.map +1 -1
- package/dist/types/modules/feed/context/KnockFeedProvider.d.ts.map +1 -1
- package/dist/types/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.d.ts +16 -0
- package/dist/types/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.d.ts.map +1 -0
- package/dist/types/modules/in-app-messages/context/index.d.ts +2 -0
- package/dist/types/modules/in-app-messages/context/index.d.ts.map +1 -0
- package/dist/types/modules/in-app-messages/hooks/index.d.ts +2 -0
- package/dist/types/modules/in-app-messages/hooks/index.d.ts.map +1 -0
- package/dist/types/modules/in-app-messages/hooks/useInAppMessages.d.ts +21 -0
- package/dist/types/modules/in-app-messages/hooks/useInAppMessages.d.ts.map +1 -0
- package/dist/types/modules/in-app-messages/index.d.ts +3 -0
- package/dist/types/modules/in-app-messages/index.d.ts.map +1 -0
- package/package.json +4 -3
- package/src/index.ts +1 -0
- package/src/modules/core/context/KnockProvider.tsx +6 -8
- package/src/modules/feed/context/KnockFeedProvider.tsx +11 -6
- package/src/modules/in-app-messages/context/KnockInAppMessagesChannelProvider.tsx +68 -0
- package/src/modules/in-app-messages/context/index.ts +1 -0
- package/src/modules/in-app-messages/hooks/index.ts +1 -0
- package/src/modules/in-app-messages/hooks/useInAppMessages.ts +89 -0
- 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
|
|
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"),
|
|
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
|
|
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
|
|
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
|
|
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"}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -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
|
|
5
|
-
import { feedProviderKey as
|
|
6
|
-
import { KnockFeedProvider as
|
|
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
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { default as
|
|
14
|
-
import { default as
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
34
|
-
|
|
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
|
-
|
|
39
|
-
|
|
44
|
+
q as useKnockSlackClient,
|
|
45
|
+
F as useNotificationStore,
|
|
40
46
|
P as useNotifications,
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
47
|
+
L as useSlackAuth,
|
|
48
|
+
E as useSlackChannels,
|
|
49
|
+
z as useSlackConnectionStatus,
|
|
44
50
|
f as useStableOptions,
|
|
45
|
-
|
|
51
|
+
W as useTranslations
|
|
46
52
|
};
|
|
47
53
|
//# sourceMappingURL=index.mjs.map
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -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
|
|
3
|
-
import
|
|
2
|
+
import { KnockI18nProvider as d } from "../../i18n/context/KnockI18nProvider.mjs";
|
|
3
|
+
import l from "../hooks/useAuthenticatedKnockClient.mjs";
|
|
4
4
|
import "zustand/shallow";
|
|
5
|
-
const
|
|
5
|
+
const u = t.createContext(null), P = ({
|
|
6
6
|
apiKey: e,
|
|
7
7
|
host: o,
|
|
8
8
|
logLevel: n,
|
|
9
|
-
userId:
|
|
9
|
+
userId: i,
|
|
10
10
|
userToken: s,
|
|
11
11
|
onUserTokenExpiring: r,
|
|
12
12
|
timeBeforeExpirationInMs: c,
|
|
13
|
-
children:
|
|
13
|
+
children: k,
|
|
14
14
|
i18n: m
|
|
15
15
|
}) => {
|
|
16
|
-
const
|
|
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]),
|
|
22
|
-
return /* @__PURE__ */ t.createElement(
|
|
23
|
-
knock:
|
|
24
|
-
} }, /* @__PURE__ */ t.createElement(
|
|
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(
|
|
27
|
-
if (e
|
|
28
|
-
throw new Error("
|
|
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
|
-
|
|
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
|
|
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
|
|
2
|
-
import { useKnockClient as
|
|
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
|
|
6
|
-
import
|
|
7
|
-
import { useCreateNotificationStore as
|
|
8
|
-
const i =
|
|
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:
|
|
11
|
+
defaultFeedOptions: t = {},
|
|
12
12
|
colorMode: s = "light"
|
|
13
13
|
}) => {
|
|
14
|
-
|
|
15
|
-
|
|
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:
|
|
24
|
+
useFeedStore: d,
|
|
19
25
|
colorMode: s
|
|
20
26
|
} }, c);
|
|
21
|
-
},
|
|
22
|
-
const e =
|
|
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
|
-
|
|
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
|
|
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;"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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;
|
|
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,
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
@@ -9,9 +9,7 @@ export interface KnockProviderState {
|
|
|
9
9
|
knock: Knock;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
const
|
|
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
|
-
<
|
|
60
|
+
<KnockContext.Provider
|
|
63
61
|
value={{
|
|
64
62
|
knock,
|
|
65
63
|
}}
|
|
66
64
|
>
|
|
67
65
|
<KnockI18nProvider i18n={i18n}>{children}</KnockI18nProvider>
|
|
68
|
-
</
|
|
66
|
+
</KnockContext.Provider>
|
|
69
67
|
);
|
|
70
68
|
};
|
|
71
69
|
|
|
72
70
|
export const useKnockClient = (): Knock => {
|
|
73
|
-
const context = React.useContext(
|
|
74
|
-
if (context
|
|
75
|
-
throw new Error("
|
|
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
|
|
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
|
-
|
|
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
|
-
<
|
|
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
|
-
</
|
|
62
|
+
</KnockFeedContext.Provider>
|
|
57
63
|
);
|
|
58
64
|
};
|
|
59
65
|
|
|
60
66
|
export const useKnockFeed = (): KnockFeedProviderState => {
|
|
61
|
-
const context = React.useContext(
|
|
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
|
+
};
|