@knocklabs/react-core 0.7.0 → 0.7.2

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 (32) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/index.js +1 -1
  3. package/dist/cjs/modules/core/hooks/useAuthenticatedKnockClient.js +1 -1
  4. package/dist/cjs/modules/core/hooks/useAuthenticatedKnockClient.js.map +1 -1
  5. package/dist/cjs/modules/core/hooks/useStableOptions.js +1 -1
  6. package/dist/cjs/modules/core/hooks/useStableOptions.js.map +1 -1
  7. package/dist/cjs/modules/preferences/hooks/usePreferences.js +2 -0
  8. package/dist/cjs/modules/preferences/hooks/usePreferences.js.map +1 -0
  9. package/dist/esm/index.mjs +4 -2
  10. package/dist/esm/index.mjs.map +1 -1
  11. package/dist/esm/modules/core/hooks/useAuthenticatedKnockClient.mjs +18 -18
  12. package/dist/esm/modules/core/hooks/useAuthenticatedKnockClient.mjs.map +1 -1
  13. package/dist/esm/modules/core/hooks/useStableOptions.mjs +1 -1
  14. package/dist/esm/modules/core/hooks/useStableOptions.mjs.map +1 -1
  15. package/dist/esm/modules/preferences/hooks/usePreferences.mjs +37 -0
  16. package/dist/esm/modules/preferences/hooks/usePreferences.mjs.map +1 -0
  17. package/dist/types/index.d.ts +1 -0
  18. package/dist/types/index.d.ts.map +1 -1
  19. package/dist/types/modules/core/hooks/useAuthenticatedKnockClient.d.ts.map +1 -1
  20. package/dist/types/modules/preferences/hooks/index.d.ts +2 -0
  21. package/dist/types/modules/preferences/hooks/index.d.ts.map +1 -0
  22. package/dist/types/modules/preferences/hooks/usePreferences.d.ts +13 -0
  23. package/dist/types/modules/preferences/hooks/usePreferences.d.ts.map +1 -0
  24. package/dist/types/modules/preferences/index.d.ts +2 -0
  25. package/dist/types/modules/preferences/index.d.ts.map +1 -0
  26. package/package.json +5 -4
  27. package/src/index.ts +2 -0
  28. package/src/modules/core/hooks/useAuthenticatedKnockClient.ts +9 -7
  29. package/src/modules/core/hooks/useStableOptions.ts +1 -1
  30. package/src/modules/preferences/hooks/index.ts +1 -0
  31. package/src/modules/preferences/hooks/usePreferences.ts +69 -0
  32. package/src/modules/preferences/index.ts +1 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.7.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 3703cf6: feat: adds `usePreferences` hook for fetching and updating user preferences in react apps.
8
+ - fdc6d82: chore(deps): bump the telegraph-packages group across 1 directory with 9 updates
9
+
10
+ ## 0.7.1
11
+
12
+ ### Patch Changes
13
+
14
+ - aa16c97: fix: make the user prop to KnockProvider stable by comparing equality, and prevent re-instantiating the knock client unnecessarily
15
+
3
16
  ## 0.7.0
4
17
 
5
18
  ### Minor Changes
package/dist/cjs/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./modules/core/context/KnockProvider.js"),c=require("./modules/core/hooks/useAuthenticatedKnockClient.js"),a=require("./modules/core/hooks/useStableOptions.js"),d=require("./modules/core/constants.js"),e=require("./modules/core/utils.js"),n=require("./modules/feed/context/KnockFeedProvider.js"),l=require("./modules/feed/hooks/useNotifications.js"),k=require("./modules/feed/hooks/useFeedSettings.js"),o=require("./modules/feed/hooks/useNotificationStore.js"),t=require("./modules/guide/context/KnockGuideProvider.js"),K=require("./modules/guide/hooks/useGuide.js"),r=require("./modules/ms-teams/context/KnockMsTeamsProvider.js"),C=require("./modules/ms-teams/hooks/useMsTeamsConnectionStatus.js"),S=require("./modules/ms-teams/hooks/useMsTeamsAuth.js"),m=require("./modules/ms-teams/hooks/useMsTeamsTeams.js"),q=require("./modules/ms-teams/hooks/useMsTeamsChannels.js"),v=require("./modules/ms-teams/hooks/useConnectedMsTeamsChannels.js"),i=require("./modules/slack/context/KnockSlackProvider.js"),P=require("./modules/slack/hooks/useSlackConnectionStatus.js"),T=require("./modules/slack/hooks/useSlackChannels.js"),M=require("./modules/slack/hooks/useConnectedSlackChannels.js"),f=require("./modules/slack/hooks/useSlackAuth.js"),u=require("./modules/i18n/context/KnockI18nProvider.js"),h=require("./modules/i18n/hooks/useTranslations.js"),F=require("./modules/i18n/languages/index.js");exports.KnockProvider=s.KnockProvider;exports.useKnockClient=s.useKnockClient;exports.useAuthenticatedKnockClient=c;exports.useStableOptions=a;exports.FilterStatus=d.FilterStatus;exports.feedProviderKey=e.feedProviderKey;exports.formatBadgeCount=e.formatBadgeCount;exports.formatTimestamp=e.formatTimestamp;exports.msTeamsProviderKey=e.msTeamsProviderKey;exports.renderNodeOrFallback=e.renderNodeOrFallback;exports.slackProviderKey=e.slackProviderKey;exports.toSentenceCase=e.toSentenceCase;exports.KnockFeedProvider=n.KnockFeedProvider;exports.useKnockFeed=n.useKnockFeed;exports.useNotifications=l;exports.useFeedSettings=k;exports.useCreateNotificationStore=o.useCreateNotificationStore;exports.useNotificationStore=o.default;exports.KnockGuideContext=t.KnockGuideContext;exports.KnockGuideProvider=t.KnockGuideProvider;exports.useGuide=K.useGuide;exports.KnockMsTeamsProvider=r.KnockMsTeamsProvider;exports.useKnockMsTeamsClient=r.useKnockMsTeamsClient;exports.useMsTeamsConnectionStatus=C;exports.useMsTeamsAuth=S;exports.useMsTeamsTeams=m;exports.useMsTeamsChannels=q;exports.useConnectedMsTeamsChannels=v;exports.KnockSlackProvider=i.KnockSlackProvider;exports.useKnockSlackClient=i.useKnockSlackClient;exports.useSlackConnectionStatus=P;exports.useSlackChannels=T;exports.useConnectedSlackChannels=M;exports.useSlackAuth=f;exports.I18nContext=u.I18nContext;exports.KnockI18nProvider=u.KnockI18nProvider;exports.useTranslations=h.useTranslations;exports.locales=F.locales;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./modules/core/context/KnockProvider.js"),c=require("./modules/core/hooks/useAuthenticatedKnockClient.js"),a=require("./modules/core/hooks/useStableOptions.js"),d=require("./modules/core/constants.js"),e=require("./modules/core/utils.js"),n=require("./modules/feed/context/KnockFeedProvider.js"),l=require("./modules/feed/hooks/useNotifications.js"),k=require("./modules/feed/hooks/useFeedSettings.js"),o=require("./modules/feed/hooks/useNotificationStore.js"),r=require("./modules/guide/context/KnockGuideProvider.js"),K=require("./modules/guide/hooks/useGuide.js"),t=require("./modules/ms-teams/context/KnockMsTeamsProvider.js"),C=require("./modules/ms-teams/hooks/useMsTeamsConnectionStatus.js"),S=require("./modules/ms-teams/hooks/useMsTeamsAuth.js"),m=require("./modules/ms-teams/hooks/useMsTeamsTeams.js"),P=require("./modules/ms-teams/hooks/useMsTeamsChannels.js"),q=require("./modules/ms-teams/hooks/useConnectedMsTeamsChannels.js"),i=require("./modules/slack/context/KnockSlackProvider.js"),v=require("./modules/slack/hooks/useSlackConnectionStatus.js"),T=require("./modules/slack/hooks/useSlackChannels.js"),f=require("./modules/slack/hooks/useConnectedSlackChannels.js"),M=require("./modules/slack/hooks/useSlackAuth.js"),u=require("./modules/i18n/context/KnockI18nProvider.js"),h=require("./modules/i18n/hooks/useTranslations.js"),F=require("./modules/i18n/languages/index.js"),y=require("./modules/preferences/hooks/usePreferences.js");exports.KnockProvider=s.KnockProvider;exports.useKnockClient=s.useKnockClient;exports.useAuthenticatedKnockClient=c;exports.useStableOptions=a;exports.FilterStatus=d.FilterStatus;exports.feedProviderKey=e.feedProviderKey;exports.formatBadgeCount=e.formatBadgeCount;exports.formatTimestamp=e.formatTimestamp;exports.msTeamsProviderKey=e.msTeamsProviderKey;exports.renderNodeOrFallback=e.renderNodeOrFallback;exports.slackProviderKey=e.slackProviderKey;exports.toSentenceCase=e.toSentenceCase;exports.KnockFeedProvider=n.KnockFeedProvider;exports.useKnockFeed=n.useKnockFeed;exports.useNotifications=l;exports.useFeedSettings=k;exports.useCreateNotificationStore=o.useCreateNotificationStore;exports.useNotificationStore=o.default;exports.KnockGuideContext=r.KnockGuideContext;exports.KnockGuideProvider=r.KnockGuideProvider;exports.useGuide=K.useGuide;exports.KnockMsTeamsProvider=t.KnockMsTeamsProvider;exports.useKnockMsTeamsClient=t.useKnockMsTeamsClient;exports.useMsTeamsConnectionStatus=C;exports.useMsTeamsAuth=S;exports.useMsTeamsTeams=m;exports.useMsTeamsChannels=P;exports.useConnectedMsTeamsChannels=q;exports.KnockSlackProvider=i.KnockSlackProvider;exports.useKnockSlackClient=i.useKnockSlackClient;exports.useSlackConnectionStatus=v;exports.useSlackChannels=T;exports.useConnectedSlackChannels=f;exports.useSlackAuth=M;exports.I18nContext=u.I18nContext;exports.KnockI18nProvider=u.KnockI18nProvider;exports.useTranslations=h.useTranslations;exports.locales=F.locales;exports.usePreferences=y.usePreferences;
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- "use strict";const q=require("@knocklabs/client"),x=require("react");require("../context/KnockProvider.js");const _=require("./useStableOptions.js");require("date-fns");const i=n=>n&&typeof n=="object"&&"default"in n?n:{default:n},d=i(q),o=i(x);function k(n,t,a,c={}){n.authenticate(t,a,{onUserTokenExpiring:c==null?void 0:c.onUserTokenExpiring,timeBeforeExpirationInMs:c==null?void 0:c.timeBeforeExpirationInMs})}function m(n,t,a,c={}){const l=o.default.useRef(),u=_(c);return o.default.useMemo(()=>{const g=typeof t=="string"?t:t==null?void 0:t.id,e=l.current;if(e&&e.isAuthenticated()&&(e.userId!==g||e.userToken!==a))return k(e,t,a,u),e;e&&e.teardown();const f=new d.default(n,{host:u.host,logLevel:u.logLevel});return k(f,t,a,u),l.current=f,f},[n,t,a,u])}module.exports=m;
1
+ "use strict";const h=require("@knocklabs/client"),g=require("react");require("../context/KnockProvider.js");const s=require("./useStableOptions.js");require("date-fns");const d=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},q=d(h),f=d(g);function l(e,i,c,t={}){e.authenticate(i,c,{onUserTokenExpiring:t==null?void 0:t.onUserTokenExpiring,timeBeforeExpirationInMs:t==null?void 0:t.timeBeforeExpirationInMs})}function x(e,i,c,t={}){const a=f.default.useRef(void 0),u=s(t),n=s(i);return f.default.useMemo(()=>{const k=typeof n=="string"?n:n==null?void 0:n.id,r=a.current;if(r&&r.isAuthenticated()&&(r.userId!==k||r.userToken!==c))return l(r,n,c,u),r;r&&r.teardown();const o=new q.default(e,{host:u.host,logLevel:u.logLevel});return l(o,n,c,u),a.current=o,o},[e,n,c,u])}module.exports=x;
2
2
  //# sourceMappingURL=useAuthenticatedKnockClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthenticatedKnockClient.js","sources":["../../../../../src/modules/core/hooks/useAuthenticatedKnockClient.ts"],"sourcesContent":["import Knock, {\n AuthenticateOptions,\n KnockOptions,\n UserId,\n UserIdOrUserWithProperties,\n} from \"@knocklabs/client\";\nimport React from \"react\";\n\nimport { useStableOptions } from \"../../core\";\n\nfunction authenticateWithOptions(\n knock: Knock,\n userIdOrUserWithProperties: UserIdOrUserWithProperties,\n userToken?: Knock[\"userToken\"],\n options: AuthenticateOptions = {},\n) {\n knock.authenticate(userIdOrUserWithProperties, userToken, {\n onUserTokenExpiring: options?.onUserTokenExpiring,\n timeBeforeExpirationInMs: options?.timeBeforeExpirationInMs,\n });\n}\n\nexport type AuthenticatedKnockClientOptions = KnockOptions &\n AuthenticateOptions;\n\n/**\n * @deprecated Passing `userId` as a `string` is deprecated and will be removed in a future version.\n * Please pass a `user` object instead containing an `id` value.\n * example:\n * ```ts\n * useAuthenticatedKnockClient(\"pk_test_12345\", { id: \"user_123\" });\n * ```\n */\nfunction useAuthenticatedKnockClient(\n apiKey: string,\n userIdOrUserWithProperties: UserId,\n userToken?: Knock[\"userToken\"],\n options?: AuthenticatedKnockClientOptions,\n): Knock;\nfunction useAuthenticatedKnockClient(\n apiKey: string,\n userIdOrUserWithProperties: UserIdOrUserWithProperties,\n userToken?: Knock[\"userToken\"],\n options?: AuthenticatedKnockClientOptions,\n): Knock;\nfunction useAuthenticatedKnockClient(\n apiKey: string,\n userIdOrUserWithProperties: UserIdOrUserWithProperties,\n userToken?: Knock[\"userToken\"],\n options: AuthenticatedKnockClientOptions = {},\n) {\n const knockRef = React.useRef<Knock | undefined>();\n const stableOptions = useStableOptions(options);\n\n return React.useMemo(() => {\n const userId =\n typeof userIdOrUserWithProperties === \"string\"\n ? userIdOrUserWithProperties\n : userIdOrUserWithProperties?.id;\n\n const currentKnock = knockRef.current;\n\n // If the userId and the userToken changes then just reauth\n if (\n currentKnock &&\n currentKnock.isAuthenticated() &&\n (currentKnock.userId !== userId || currentKnock.userToken !== userToken)\n ) {\n authenticateWithOptions(\n currentKnock,\n userIdOrUserWithProperties,\n userToken,\n stableOptions,\n );\n return currentKnock;\n }\n\n if (currentKnock) {\n currentKnock.teardown();\n }\n\n // Otherwise instantiate a new Knock client\n const knock = new Knock(apiKey, {\n host: stableOptions.host,\n logLevel: stableOptions.logLevel,\n });\n\n authenticateWithOptions(\n knock,\n userIdOrUserWithProperties,\n userToken,\n stableOptions,\n );\n knockRef.current = knock;\n\n return knock;\n }, [apiKey, userIdOrUserWithProperties, userToken, stableOptions]);\n}\n\nexport default useAuthenticatedKnockClient;\n"],"names":["authenticateWithOptions","knock","userIdOrUserWithProperties","userToken","options","authenticate","onUserTokenExpiring","timeBeforeExpirationInMs","useAuthenticatedKnockClient","apiKey","knockRef","React","useRef","stableOptions","useStableOptions","useMemo","userId","id","currentKnock","current","isAuthenticated","teardown","Knock","host","logLevel"],"mappings":"qPAUA,SAASA,EACPC,EACAC,EACAC,EACAC,EAA+B,CAAA,EAC/B,CACMC,EAAAA,aAAaH,EAA4BC,EAAW,CACxDG,oBAAqBF,GAAAA,YAAAA,EAASE,oBAC9BC,yBAA0BH,GAAAA,YAAAA,EAASG,wBAAAA,CACpC,CACH,CAyBA,SAASC,EACPC,EACAP,EACAC,EACAC,EAA2C,CAAA,EAC3C,CACMM,MAAAA,EAAWC,UAAMC,OAA0B,EAC3CC,EAAgBC,EAAiBV,CAAO,EAEvCO,OAAAA,EAAAA,QAAMI,QAAQ,IAAM,CACzB,MAAMC,EACJ,OAAOd,GAA+B,SAClCA,EACAA,GAAAA,YAAAA,EAA4Be,GAE5BC,EAAeR,EAASS,QAI5BD,GAAAA,GACAA,EAAaE,gBAAgB,IAC5BF,EAAaF,SAAWA,GAAUE,EAAaf,YAAcA,GAG5De,OAAAA,EAAAA,EACAhB,EACAC,EACAU,CACF,EACOK,EAGLA,GACFA,EAAaG,SAAS,EAIlBpB,MAAAA,EAAQ,IAAIqB,EAAAA,QAAMb,EAAQ,CAC9Bc,KAAMV,EAAcU,KACpBC,SAAUX,EAAcW,QAAAA,CACzB,EAGCvB,OAAAA,EAAAA,EACAC,EACAC,EACAU,CACF,EACAH,EAASS,QAAUlB,EAEZA,GACN,CAACQ,EAAQP,EAA4BC,EAAWU,CAAa,CAAC,CACnE"}
1
+ {"version":3,"file":"useAuthenticatedKnockClient.js","sources":["../../../../../src/modules/core/hooks/useAuthenticatedKnockClient.ts"],"sourcesContent":["import Knock, {\n AuthenticateOptions,\n KnockOptions,\n UserId,\n UserIdOrUserWithProperties,\n} from \"@knocklabs/client\";\nimport React from \"react\";\n\nimport { useStableOptions } from \"../../core\";\n\nfunction authenticateWithOptions(\n knock: Knock,\n userIdOrUserWithProperties: UserIdOrUserWithProperties,\n userToken?: Knock[\"userToken\"],\n options: AuthenticateOptions = {},\n) {\n knock.authenticate(userIdOrUserWithProperties, userToken, {\n onUserTokenExpiring: options?.onUserTokenExpiring,\n timeBeforeExpirationInMs: options?.timeBeforeExpirationInMs,\n });\n}\n\nexport type AuthenticatedKnockClientOptions = KnockOptions &\n AuthenticateOptions;\n\n/**\n * @deprecated Passing `userId` as a `string` is deprecated and will be removed in a future version.\n * Please pass a `user` object instead containing an `id` value.\n * example:\n * ```ts\n * useAuthenticatedKnockClient(\"pk_test_12345\", { id: \"user_123\" });\n * ```\n */\nfunction useAuthenticatedKnockClient(\n apiKey: string,\n userIdOrUserWithProperties: UserId,\n userToken?: Knock[\"userToken\"],\n options?: AuthenticatedKnockClientOptions,\n): Knock;\nfunction useAuthenticatedKnockClient(\n apiKey: string,\n userIdOrUserWithProperties: UserIdOrUserWithProperties,\n userToken?: Knock[\"userToken\"],\n options?: AuthenticatedKnockClientOptions,\n): Knock;\nfunction useAuthenticatedKnockClient(\n apiKey: string,\n userIdOrUserWithProperties: UserIdOrUserWithProperties,\n userToken?: Knock[\"userToken\"],\n options: AuthenticatedKnockClientOptions = {},\n) {\n const knockRef = React.useRef<Knock | undefined>(undefined);\n\n const stableOptions = useStableOptions(options);\n const stableUserIdOrObject = useStableOptions(userIdOrUserWithProperties);\n\n return React.useMemo(() => {\n const userId =\n typeof stableUserIdOrObject === \"string\"\n ? stableUserIdOrObject\n : stableUserIdOrObject?.id;\n\n const currentKnock = knockRef.current;\n\n // If the userId and the userToken changes then just reauth\n if (\n currentKnock &&\n currentKnock.isAuthenticated() &&\n (currentKnock.userId !== userId || currentKnock.userToken !== userToken)\n ) {\n authenticateWithOptions(\n currentKnock,\n stableUserIdOrObject,\n userToken,\n stableOptions,\n );\n return currentKnock;\n }\n\n if (currentKnock) {\n currentKnock.teardown();\n }\n\n // Otherwise instantiate a new Knock client\n const knock = new Knock(apiKey, {\n host: stableOptions.host,\n logLevel: stableOptions.logLevel,\n });\n\n authenticateWithOptions(\n knock,\n stableUserIdOrObject,\n userToken,\n stableOptions,\n );\n knockRef.current = knock;\n\n return knock;\n }, [apiKey, stableUserIdOrObject, userToken, stableOptions]);\n}\n\nexport default useAuthenticatedKnockClient;\n"],"names":["authenticateWithOptions","knock","userIdOrUserWithProperties","userToken","options","authenticate","onUserTokenExpiring","timeBeforeExpirationInMs","useAuthenticatedKnockClient","apiKey","knockRef","React","useRef","undefined","stableOptions","useStableOptions","stableUserIdOrObject","useMemo","userId","id","currentKnock","current","isAuthenticated","teardown","Knock","host","logLevel"],"mappings":"qPAUA,SAASA,EACPC,EACAC,EACAC,EACAC,EAA+B,CAAA,EAC/B,CACMC,EAAAA,aAAaH,EAA4BC,EAAW,CACxDG,oBAAqBF,GAAAA,YAAAA,EAASE,oBAC9BC,yBAA0BH,GAAAA,YAAAA,EAASG,wBAAAA,CACpC,CACH,CAyBA,SAASC,EACPC,EACAP,EACAC,EACAC,EAA2C,CAAA,EAC3C,CACMM,MAAAA,EAAWC,EAAAA,QAAMC,OAA0BC,MAAS,EAEpDC,EAAgBC,EAAiBX,CAAO,EACxCY,EAAuBD,EAAiBb,CAA0B,EAEjES,OAAAA,EAAAA,QAAMM,QAAQ,IAAM,CACzB,MAAMC,EACJ,OAAOF,GAAyB,SAC5BA,EACAA,GAAAA,YAAAA,EAAsBG,GAEtBC,EAAeV,EAASW,QAI5BD,GAAAA,GACAA,EAAaE,gBAAgB,IAC5BF,EAAaF,SAAWA,GAAUE,EAAajB,YAAcA,GAG5DiB,OAAAA,EAAAA,EACAJ,EACAb,EACAW,CACF,EACOM,EAGLA,GACFA,EAAaG,SAAS,EAIlBtB,MAAAA,EAAQ,IAAIuB,EAAAA,QAAMf,EAAQ,CAC9BgB,KAAMX,EAAcW,KACpBC,SAAUZ,EAAcY,QAAAA,CACzB,EAGCzB,OAAAA,EAAAA,EACAe,EACAb,EACAW,CACF,EACAJ,EAASW,QAAUpB,EAEZA,GACN,CAACQ,EAAQO,EAAsBb,EAAWW,CAAa,CAAC,CAC7D"}
@@ -1,2 +1,2 @@
1
- "use strict";const n=require("fast-deep-equal"),r=require("react"),s=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},c=s(n);function a(t){const u=r.useRef();return r.useMemo(()=>{const e=u.current;return e&&c.default(t,e)?e:(u.current=t,t)},[t])}module.exports=a;
1
+ "use strict";const n=require("fast-deep-equal"),r=require("react"),s=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},c=s(n);function a(t){const u=r.useRef(void 0);return r.useMemo(()=>{const e=u.current;return e&&c.default(t,e)?e:(u.current=t,t)},[t])}module.exports=a;
2
2
  //# sourceMappingURL=useStableOptions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useStableOptions.js","sources":["../../../../../src/modules/core/hooks/useStableOptions.ts"],"sourcesContent":["import fastDeepEqual from \"fast-deep-equal\";\nimport { useMemo, useRef } from \"react\";\n\nexport default function useStableOptions<T>(options: T): T {\n const optionsRef = useRef<T>();\n\n return useMemo(() => {\n const currentOptions = optionsRef.current;\n\n if (currentOptions && fastDeepEqual(options, currentOptions)) {\n return currentOptions;\n }\n\n optionsRef.current = options;\n return options;\n }, [options]);\n}\n"],"names":["useStableOptions","options","optionsRef","useRef","useMemo","currentOptions","current","fastDeepEqual"],"mappings":"kIAGA,SAAwBA,EAAoBC,EAAe,CACzD,MAAMC,EAAaC,EAAAA,OAAU,EAE7B,OAAOC,UAAQ,IAAM,CACnB,MAAMC,EAAiBH,EAAWI,QAElC,OAAID,GAAkBE,EAAAA,QAAcN,EAASI,CAAc,EAClDA,GAGTH,EAAWI,QAAUL,EACdA,EAAAA,EACN,CAACA,CAAO,CAAC,CACd"}
1
+ {"version":3,"file":"useStableOptions.js","sources":["../../../../../src/modules/core/hooks/useStableOptions.ts"],"sourcesContent":["import fastDeepEqual from \"fast-deep-equal\";\nimport { useMemo, useRef } from \"react\";\n\nexport default function useStableOptions<T>(options: T): T {\n const optionsRef = useRef<T>(undefined);\n\n return useMemo(() => {\n const currentOptions = optionsRef.current;\n\n if (currentOptions && fastDeepEqual(options, currentOptions)) {\n return currentOptions;\n }\n\n optionsRef.current = options;\n return options;\n }, [options]);\n}\n"],"names":["useStableOptions","options","optionsRef","useRef","undefined","useMemo","currentOptions","current","fastDeepEqual"],"mappings":"kIAGA,SAAwBA,EAAoBC,EAAe,CACnDC,MAAAA,EAAaC,SAAUC,MAAS,EAEtC,OAAOC,UAAQ,IAAM,CACnB,MAAMC,EAAiBJ,EAAWK,QAElC,OAAID,GAAkBE,EAAAA,QAAcP,EAASK,CAAc,EAClDA,GAGTJ,EAAWK,QAAUN,EACdA,EAAAA,EACN,CAACA,CAAO,CAAC,CACd"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react"),d=require("swr"),P=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("fast-deep-equal");require("date-fns");const g=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},k=g(d),p=(e={})=>{const r=P.useKnockClient(),{preferenceSet:t,tenant:c}=e,u=["preferences",e.preferenceSet,e.tenant,r.userId],{data:a,isLoading:l,isValidating:o,mutate:s}=k.default(r.userId?u:null,()=>r.user.getPreferences({preferenceSet:t,tenant:c})),f=n.useCallback(i=>{s(r.user.setPreferences(i,{preferenceSet:t}),{revalidate:!1})},[s,r.user,t]);return{getAllPreferences:n.useCallback(async()=>await r.user.getAllPreferences(),[r.user]),setPreferences:f,preferences:a,isLoading:l,isValidating:o}};exports.usePreferences=p;
2
+ //# sourceMappingURL=usePreferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePreferences.js","sources":["../../../../../src/modules/preferences/hooks/usePreferences.ts"],"sourcesContent":["import type {\n GetPreferencesOptions,\n PreferenceSet,\n SetPreferencesProperties,\n} from \"@knocklabs/client\";\nimport { useCallback } from \"react\";\nimport useSWR, { type SWRResponse } from \"swr\";\n\nimport { useKnockClient } from \"../../core\";\n\ntype UsePreferencesReturn = {\n preferences: PreferenceSet | undefined;\n setPreferences: (setPreferencesProperties: SetPreferencesProperties) => void;\n getAllPreferences: ReturnType<\n typeof useKnockClient\n >[\"user\"][\"getAllPreferences\"];\n isLoading: SWRResponse[\"isLoading\"];\n isValidating: SWRResponse[\"isValidating\"];\n};\n\nconst usePreferences = (\n options: GetPreferencesOptions = {},\n): UsePreferencesReturn => {\n const knock = useKnockClient();\n\n const { preferenceSet, tenant } = options;\n\n const CACHE_KEY = [\n \"preferences\",\n options.preferenceSet,\n options.tenant,\n knock.userId,\n ];\n\n const {\n data: preferences,\n isLoading,\n isValidating,\n mutate,\n } = useSWR(knock.userId ? CACHE_KEY : null, () => {\n return knock.user.getPreferences({ preferenceSet, tenant });\n });\n\n const setPreferences = useCallback(\n (preferenceSetProperties: SetPreferencesProperties) => {\n mutate(\n knock.user.setPreferences(preferenceSetProperties, { preferenceSet }),\n {\n revalidate: false,\n },\n );\n },\n [mutate, knock.user, preferenceSet],\n );\n\n const getAllPreferences = useCallback(async () => {\n return await knock.user.getAllPreferences();\n }, [knock.user]);\n\n return {\n getAllPreferences,\n setPreferences,\n preferences,\n isLoading,\n isValidating,\n };\n};\n\nexport { usePreferences };\n"],"names":["usePreferences","options","knock","useKnockClient","preferenceSet","tenant","CACHE_KEY","userId","data","preferences","isLoading","isValidating","mutate","useSWR","user","getPreferences","setPreferences","useCallback","preferenceSetProperties","revalidate","getAllPreferences"],"mappings":"4TAoBMA,EAAiBA,CACrBC,EAAiC,KACR,CACzB,MAAMC,EAAQC,EAAAA,eAAe,EAEvB,CAAEC,cAAAA,EAAeC,OAAAA,CAAAA,EAAWJ,EAE5BK,EAAY,CAChB,cACAL,EAAQG,cACRH,EAAQI,OACRH,EAAMK,MAAM,EAGR,CACJC,KAAMC,EACNC,UAAAA,EACAC,aAAAA,EACAC,OAAAA,GACEC,EAAOX,QAAAA,EAAMK,OAASD,EAAY,KAAM,IACnCJ,EAAMY,KAAKC,eAAe,CAAEX,cAAAA,EAAeC,OAAAA,CAAAA,CAAQ,CAC3D,EAEKW,EAAiBC,cACpBC,GAAsD,CAEnDhB,EAAAA,EAAMY,KAAKE,eAAeE,EAAyB,CAAEd,cAAAA,CAAAA,CAAe,EACpE,CACEe,WAAY,EAAA,CAEhB,GAEF,CAACP,EAAQV,EAAMY,KAAMV,CAAa,CACpC,EAMO,MAAA,CACLgB,kBALwBH,EAAAA,YAAY,SAC7B,MAAMf,EAAMY,KAAKM,kBAAkB,EACzC,CAAClB,EAAMY,IAAI,CAAC,EAIbE,eAAAA,EACAP,YAAAA,EACAC,UAAAA,EACAC,aAAAA,CACF,CACF"}
@@ -4,7 +4,7 @@ import { default as f } from "./modules/core/hooks/useStableOptions.mjs";
4
4
  import { FilterStatus as m } from "./modules/core/constants.mjs";
5
5
  import { feedProviderKey as l, formatBadgeCount as i, formatTimestamp as c, msTeamsProviderKey as p, renderNodeOrFallback as x, slackProviderKey as k, toSentenceCase as C } from "./modules/core/utils.mjs";
6
6
  import { KnockFeedProvider as S, useKnockFeed as T } from "./modules/feed/context/KnockFeedProvider.mjs";
7
- import { default as P } from "./modules/feed/hooks/useNotifications.mjs";
7
+ import { default as v } from "./modules/feed/hooks/useNotifications.mjs";
8
8
  import { default as M } from "./modules/feed/hooks/useFeedSettings.mjs";
9
9
  import { useCreateNotificationStore as N, default as y } from "./modules/feed/hooks/useNotificationStore.mjs";
10
10
  import { KnockGuideContext as G, KnockGuideProvider as b } from "./modules/guide/context/KnockGuideProvider.mjs";
@@ -23,6 +23,7 @@ import { default as te } from "./modules/slack/hooks/useSlackAuth.mjs";
23
23
  import { I18nContext as se, KnockI18nProvider as ae } from "./modules/i18n/context/KnockI18nProvider.mjs";
24
24
  import { useTranslations as fe } from "./modules/i18n/hooks/useTranslations.mjs";
25
25
  import { locales as me } from "./modules/i18n/languages/index.mjs";
26
+ import { usePreferences as le } from "./modules/preferences/hooks/usePreferences.mjs";
26
27
  export {
27
28
  m as FilterStatus,
28
29
  se as I18nContext,
@@ -56,7 +57,8 @@ export {
56
57
  w as useMsTeamsConnectionStatus,
57
58
  H as useMsTeamsTeams,
58
59
  y as useNotificationStore,
59
- P as useNotifications,
60
+ v as useNotifications,
61
+ le as usePreferences,
60
62
  te as useSlackAuth,
61
63
  _ as useSlackChannels,
62
64
  Y as useSlackConnectionStatus,
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,29 +1,29 @@
1
- import g from "@knocklabs/client";
2
- import u from "react";
1
+ import l from "@knocklabs/client";
2
+ import a from "react";
3
3
  import "../context/KnockProvider.mjs";
4
- import x from "./useStableOptions.mjs";
4
+ import s from "./useStableOptions.mjs";
5
5
  import "date-fns";
6
- function k(m, n, a, t = {}) {
7
- m.authenticate(n, a, {
6
+ function m(o, c, r, t = {}) {
7
+ o.authenticate(c, r, {
8
8
  onUserTokenExpiring: t == null ? void 0 : t.onUserTokenExpiring,
9
9
  timeBeforeExpirationInMs: t == null ? void 0 : t.timeBeforeExpirationInMs
10
10
  });
11
11
  }
12
- function v(m, n, a, t = {}) {
13
- const l = u.useRef(), f = x(t);
14
- return u.useMemo(() => {
15
- const e = typeof n == "string" ? n : n == null ? void 0 : n.id, c = l.current;
16
- if (c && c.isAuthenticated() && (c.userId !== e || c.userToken !== a))
17
- return k(c, n, a, f), c;
18
- c && c.teardown();
19
- const o = new g(m, {
20
- host: f.host,
21
- logLevel: f.logLevel
12
+ function E(o, c, r, t = {}) {
13
+ const f = a.useRef(void 0), i = s(t), e = s(c);
14
+ return a.useMemo(() => {
15
+ const d = typeof e == "string" ? e : e == null ? void 0 : e.id, n = f.current;
16
+ if (n && n.isAuthenticated() && (n.userId !== d || n.userToken !== r))
17
+ return m(n, e, r, i), n;
18
+ n && n.teardown();
19
+ const u = new l(o, {
20
+ host: i.host,
21
+ logLevel: i.logLevel
22
22
  });
23
- return k(o, n, a, f), l.current = o, o;
24
- }, [m, n, a, f]);
23
+ return m(u, e, r, i), f.current = u, u;
24
+ }, [o, e, r, i]);
25
25
  }
26
26
  export {
27
- v as default
27
+ E as default
28
28
  };
29
29
  //# sourceMappingURL=useAuthenticatedKnockClient.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthenticatedKnockClient.mjs","sources":["../../../../../src/modules/core/hooks/useAuthenticatedKnockClient.ts"],"sourcesContent":["import Knock, {\n AuthenticateOptions,\n KnockOptions,\n UserId,\n UserIdOrUserWithProperties,\n} from \"@knocklabs/client\";\nimport React from \"react\";\n\nimport { useStableOptions } from \"../../core\";\n\nfunction authenticateWithOptions(\n knock: Knock,\n userIdOrUserWithProperties: UserIdOrUserWithProperties,\n userToken?: Knock[\"userToken\"],\n options: AuthenticateOptions = {},\n) {\n knock.authenticate(userIdOrUserWithProperties, userToken, {\n onUserTokenExpiring: options?.onUserTokenExpiring,\n timeBeforeExpirationInMs: options?.timeBeforeExpirationInMs,\n });\n}\n\nexport type AuthenticatedKnockClientOptions = KnockOptions &\n AuthenticateOptions;\n\n/**\n * @deprecated Passing `userId` as a `string` is deprecated and will be removed in a future version.\n * Please pass a `user` object instead containing an `id` value.\n * example:\n * ```ts\n * useAuthenticatedKnockClient(\"pk_test_12345\", { id: \"user_123\" });\n * ```\n */\nfunction useAuthenticatedKnockClient(\n apiKey: string,\n userIdOrUserWithProperties: UserId,\n userToken?: Knock[\"userToken\"],\n options?: AuthenticatedKnockClientOptions,\n): Knock;\nfunction useAuthenticatedKnockClient(\n apiKey: string,\n userIdOrUserWithProperties: UserIdOrUserWithProperties,\n userToken?: Knock[\"userToken\"],\n options?: AuthenticatedKnockClientOptions,\n): Knock;\nfunction useAuthenticatedKnockClient(\n apiKey: string,\n userIdOrUserWithProperties: UserIdOrUserWithProperties,\n userToken?: Knock[\"userToken\"],\n options: AuthenticatedKnockClientOptions = {},\n) {\n const knockRef = React.useRef<Knock | undefined>();\n const stableOptions = useStableOptions(options);\n\n return React.useMemo(() => {\n const userId =\n typeof userIdOrUserWithProperties === \"string\"\n ? userIdOrUserWithProperties\n : userIdOrUserWithProperties?.id;\n\n const currentKnock = knockRef.current;\n\n // If the userId and the userToken changes then just reauth\n if (\n currentKnock &&\n currentKnock.isAuthenticated() &&\n (currentKnock.userId !== userId || currentKnock.userToken !== userToken)\n ) {\n authenticateWithOptions(\n currentKnock,\n userIdOrUserWithProperties,\n userToken,\n stableOptions,\n );\n return currentKnock;\n }\n\n if (currentKnock) {\n currentKnock.teardown();\n }\n\n // Otherwise instantiate a new Knock client\n const knock = new Knock(apiKey, {\n host: stableOptions.host,\n logLevel: stableOptions.logLevel,\n });\n\n authenticateWithOptions(\n knock,\n userIdOrUserWithProperties,\n userToken,\n stableOptions,\n );\n knockRef.current = knock;\n\n return knock;\n }, [apiKey, userIdOrUserWithProperties, userToken, stableOptions]);\n}\n\nexport default useAuthenticatedKnockClient;\n"],"names":["authenticateWithOptions","knock","userIdOrUserWithProperties","userToken","options","authenticate","onUserTokenExpiring","timeBeforeExpirationInMs","useAuthenticatedKnockClient","apiKey","knockRef","React","useRef","stableOptions","useStableOptions","useMemo","userId","id","currentKnock","current","isAuthenticated","teardown","Knock","host","logLevel"],"mappings":";;;;;AAUA,SAASA,EACPC,GACAC,GACAC,GACAC,IAA+B,CAAA,GAC/B;AACMC,EAAAA,EAAAA,aAAaH,GAA4BC,GAAW;AAAA,IACxDG,qBAAqBF,KAAAA,gBAAAA,EAASE;AAAAA,IAC9BC,0BAA0BH,KAAAA,gBAAAA,EAASG;AAAAA,EAAAA,CACpC;AACH;AAyBA,SAASC,EACPC,GACAP,GACAC,GACAC,IAA2C,CAAA,GAC3C;AACMM,QAAAA,IAAWC,EAAMC,OAA0B,GAC3CC,IAAgBC,EAAiBV,CAAO;AAEvCO,SAAAA,EAAMI,QAAQ,MAAM;AACzB,UAAMC,IACJ,OAAOd,KAA+B,WAClCA,IACAA,KAAAA,gBAAAA,EAA4Be,IAE5BC,IAAeR,EAASS;AAI5BD,QAAAA,KACAA,EAAaE,gBAAgB,MAC5BF,EAAaF,WAAWA,KAAUE,EAAaf,cAAcA;AAG5De,aAAAA,EAAAA,GACAhB,GACAC,GACAU,CACF,GACOK;AAGT,IAAIA,KACFA,EAAaG,SAAS;AAIlBpB,UAAAA,IAAQ,IAAIqB,EAAMb,GAAQ;AAAA,MAC9Bc,MAAMV,EAAcU;AAAAA,MACpBC,UAAUX,EAAcW;AAAAA,IAAAA,CACzB;AAGCvB,WAAAA,EAAAA,GACAC,GACAC,GACAU,CACF,GACAH,EAASS,UAAUlB,GAEZA;AAAAA,KACN,CAACQ,GAAQP,GAA4BC,GAAWU,CAAa,CAAC;AACnE;"}
1
+ {"version":3,"file":"useAuthenticatedKnockClient.mjs","sources":["../../../../../src/modules/core/hooks/useAuthenticatedKnockClient.ts"],"sourcesContent":["import Knock, {\n AuthenticateOptions,\n KnockOptions,\n UserId,\n UserIdOrUserWithProperties,\n} from \"@knocklabs/client\";\nimport React from \"react\";\n\nimport { useStableOptions } from \"../../core\";\n\nfunction authenticateWithOptions(\n knock: Knock,\n userIdOrUserWithProperties: UserIdOrUserWithProperties,\n userToken?: Knock[\"userToken\"],\n options: AuthenticateOptions = {},\n) {\n knock.authenticate(userIdOrUserWithProperties, userToken, {\n onUserTokenExpiring: options?.onUserTokenExpiring,\n timeBeforeExpirationInMs: options?.timeBeforeExpirationInMs,\n });\n}\n\nexport type AuthenticatedKnockClientOptions = KnockOptions &\n AuthenticateOptions;\n\n/**\n * @deprecated Passing `userId` as a `string` is deprecated and will be removed in a future version.\n * Please pass a `user` object instead containing an `id` value.\n * example:\n * ```ts\n * useAuthenticatedKnockClient(\"pk_test_12345\", { id: \"user_123\" });\n * ```\n */\nfunction useAuthenticatedKnockClient(\n apiKey: string,\n userIdOrUserWithProperties: UserId,\n userToken?: Knock[\"userToken\"],\n options?: AuthenticatedKnockClientOptions,\n): Knock;\nfunction useAuthenticatedKnockClient(\n apiKey: string,\n userIdOrUserWithProperties: UserIdOrUserWithProperties,\n userToken?: Knock[\"userToken\"],\n options?: AuthenticatedKnockClientOptions,\n): Knock;\nfunction useAuthenticatedKnockClient(\n apiKey: string,\n userIdOrUserWithProperties: UserIdOrUserWithProperties,\n userToken?: Knock[\"userToken\"],\n options: AuthenticatedKnockClientOptions = {},\n) {\n const knockRef = React.useRef<Knock | undefined>(undefined);\n\n const stableOptions = useStableOptions(options);\n const stableUserIdOrObject = useStableOptions(userIdOrUserWithProperties);\n\n return React.useMemo(() => {\n const userId =\n typeof stableUserIdOrObject === \"string\"\n ? stableUserIdOrObject\n : stableUserIdOrObject?.id;\n\n const currentKnock = knockRef.current;\n\n // If the userId and the userToken changes then just reauth\n if (\n currentKnock &&\n currentKnock.isAuthenticated() &&\n (currentKnock.userId !== userId || currentKnock.userToken !== userToken)\n ) {\n authenticateWithOptions(\n currentKnock,\n stableUserIdOrObject,\n userToken,\n stableOptions,\n );\n return currentKnock;\n }\n\n if (currentKnock) {\n currentKnock.teardown();\n }\n\n // Otherwise instantiate a new Knock client\n const knock = new Knock(apiKey, {\n host: stableOptions.host,\n logLevel: stableOptions.logLevel,\n });\n\n authenticateWithOptions(\n knock,\n stableUserIdOrObject,\n userToken,\n stableOptions,\n );\n knockRef.current = knock;\n\n return knock;\n }, [apiKey, stableUserIdOrObject, userToken, stableOptions]);\n}\n\nexport default useAuthenticatedKnockClient;\n"],"names":["authenticateWithOptions","knock","userIdOrUserWithProperties","userToken","options","authenticate","onUserTokenExpiring","timeBeforeExpirationInMs","useAuthenticatedKnockClient","apiKey","knockRef","React","useRef","undefined","stableOptions","useStableOptions","stableUserIdOrObject","useMemo","userId","id","currentKnock","current","isAuthenticated","teardown","Knock","host","logLevel"],"mappings":";;;;;AAUA,SAASA,EACPC,GACAC,GACAC,GACAC,IAA+B,CAAA,GAC/B;AACMC,EAAAA,EAAAA,aAAaH,GAA4BC,GAAW;AAAA,IACxDG,qBAAqBF,KAAAA,gBAAAA,EAASE;AAAAA,IAC9BC,0BAA0BH,KAAAA,gBAAAA,EAASG;AAAAA,EAAAA,CACpC;AACH;AAyBA,SAASC,EACPC,GACAP,GACAC,GACAC,IAA2C,CAAA,GAC3C;AACMM,QAAAA,IAAWC,EAAMC,OAA0BC,MAAS,GAEpDC,IAAgBC,EAAiBX,CAAO,GACxCY,IAAuBD,EAAiBb,CAA0B;AAEjES,SAAAA,EAAMM,QAAQ,MAAM;AACzB,UAAMC,IACJ,OAAOF,KAAyB,WAC5BA,IACAA,KAAAA,gBAAAA,EAAsBG,IAEtBC,IAAeV,EAASW;AAI5BD,QAAAA,KACAA,EAAaE,gBAAgB,MAC5BF,EAAaF,WAAWA,KAAUE,EAAajB,cAAcA;AAG5DiB,aAAAA,EAAAA,GACAJ,GACAb,GACAW,CACF,GACOM;AAGT,IAAIA,KACFA,EAAaG,SAAS;AAIlBtB,UAAAA,IAAQ,IAAIuB,EAAMf,GAAQ;AAAA,MAC9BgB,MAAMX,EAAcW;AAAAA,MACpBC,UAAUZ,EAAcY;AAAAA,IAAAA,CACzB;AAGCzB,WAAAA,EAAAA,GACAe,GACAb,GACAW,CACF,GACAJ,EAASW,UAAUpB,GAEZA;AAAAA,KACN,CAACQ,GAAQO,GAAsBb,GAAWW,CAAa,CAAC;AAC7D;"}
@@ -1,7 +1,7 @@
1
1
  import u from "fast-deep-equal";
2
2
  import { useRef as n, useMemo as f } from "react";
3
3
  function c(e) {
4
- const t = n();
4
+ const t = n(void 0);
5
5
  return f(() => {
6
6
  const r = t.current;
7
7
  return r && u(e, r) ? r : (t.current = e, e);
@@ -1 +1 @@
1
- {"version":3,"file":"useStableOptions.mjs","sources":["../../../../../src/modules/core/hooks/useStableOptions.ts"],"sourcesContent":["import fastDeepEqual from \"fast-deep-equal\";\nimport { useMemo, useRef } from \"react\";\n\nexport default function useStableOptions<T>(options: T): T {\n const optionsRef = useRef<T>();\n\n return useMemo(() => {\n const currentOptions = optionsRef.current;\n\n if (currentOptions && fastDeepEqual(options, currentOptions)) {\n return currentOptions;\n }\n\n optionsRef.current = options;\n return options;\n }, [options]);\n}\n"],"names":["useStableOptions","options","optionsRef","useRef","useMemo","currentOptions","current","fastDeepEqual"],"mappings":";;AAGA,SAAwBA,EAAoBC,GAAe;AACzD,QAAMC,IAAaC,EAAU;AAE7B,SAAOC,EAAQ,MAAM;AACnB,UAAMC,IAAiBH,EAAWI;AAElC,WAAID,KAAkBE,EAAcN,GAASI,CAAc,IAClDA,KAGTH,EAAWI,UAAUL,GACdA;AAAAA,EAAAA,GACN,CAACA,CAAO,CAAC;AACd;"}
1
+ {"version":3,"file":"useStableOptions.mjs","sources":["../../../../../src/modules/core/hooks/useStableOptions.ts"],"sourcesContent":["import fastDeepEqual from \"fast-deep-equal\";\nimport { useMemo, useRef } from \"react\";\n\nexport default function useStableOptions<T>(options: T): T {\n const optionsRef = useRef<T>(undefined);\n\n return useMemo(() => {\n const currentOptions = optionsRef.current;\n\n if (currentOptions && fastDeepEqual(options, currentOptions)) {\n return currentOptions;\n }\n\n optionsRef.current = options;\n return options;\n }, [options]);\n}\n"],"names":["useStableOptions","options","optionsRef","useRef","undefined","useMemo","currentOptions","current","fastDeepEqual"],"mappings":";;AAGA,SAAwBA,EAAoBC,GAAe;AACnDC,QAAAA,IAAaC,EAAUC,MAAS;AAEtC,SAAOC,EAAQ,MAAM;AACnB,UAAMC,IAAiBJ,EAAWK;AAElC,WAAID,KAAkBE,EAAcP,GAASK,CAAc,IAClDA,KAGTJ,EAAWK,UAAUN,GACdA;AAAAA,EAAAA,GACN,CAACA,CAAO,CAAC;AACd;"}
@@ -0,0 +1,37 @@
1
+ import { useCallback as n } from "react";
2
+ import m from "swr";
3
+ import { useKnockClient as p } from "../../core/context/KnockProvider.mjs";
4
+ import "@knocklabs/client";
5
+ import "fast-deep-equal";
6
+ import "date-fns";
7
+ const E = (r = {}) => {
8
+ const e = p(), {
9
+ preferenceSet: t,
10
+ tenant: c
11
+ } = r, a = ["preferences", r.preferenceSet, r.tenant, e.userId], {
12
+ data: o,
13
+ isLoading: u,
14
+ isValidating: f,
15
+ mutate: s
16
+ } = m(e.userId ? a : null, () => e.user.getPreferences({
17
+ preferenceSet: t,
18
+ tenant: c
19
+ })), l = n((i) => {
20
+ s(e.user.setPreferences(i, {
21
+ preferenceSet: t
22
+ }), {
23
+ revalidate: !1
24
+ });
25
+ }, [s, e.user, t]);
26
+ return {
27
+ getAllPreferences: n(async () => await e.user.getAllPreferences(), [e.user]),
28
+ setPreferences: l,
29
+ preferences: o,
30
+ isLoading: u,
31
+ isValidating: f
32
+ };
33
+ };
34
+ export {
35
+ E as usePreferences
36
+ };
37
+ //# sourceMappingURL=usePreferences.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePreferences.mjs","sources":["../../../../../src/modules/preferences/hooks/usePreferences.ts"],"sourcesContent":["import type {\n GetPreferencesOptions,\n PreferenceSet,\n SetPreferencesProperties,\n} from \"@knocklabs/client\";\nimport { useCallback } from \"react\";\nimport useSWR, { type SWRResponse } from \"swr\";\n\nimport { useKnockClient } from \"../../core\";\n\ntype UsePreferencesReturn = {\n preferences: PreferenceSet | undefined;\n setPreferences: (setPreferencesProperties: SetPreferencesProperties) => void;\n getAllPreferences: ReturnType<\n typeof useKnockClient\n >[\"user\"][\"getAllPreferences\"];\n isLoading: SWRResponse[\"isLoading\"];\n isValidating: SWRResponse[\"isValidating\"];\n};\n\nconst usePreferences = (\n options: GetPreferencesOptions = {},\n): UsePreferencesReturn => {\n const knock = useKnockClient();\n\n const { preferenceSet, tenant } = options;\n\n const CACHE_KEY = [\n \"preferences\",\n options.preferenceSet,\n options.tenant,\n knock.userId,\n ];\n\n const {\n data: preferences,\n isLoading,\n isValidating,\n mutate,\n } = useSWR(knock.userId ? CACHE_KEY : null, () => {\n return knock.user.getPreferences({ preferenceSet, tenant });\n });\n\n const setPreferences = useCallback(\n (preferenceSetProperties: SetPreferencesProperties) => {\n mutate(\n knock.user.setPreferences(preferenceSetProperties, { preferenceSet }),\n {\n revalidate: false,\n },\n );\n },\n [mutate, knock.user, preferenceSet],\n );\n\n const getAllPreferences = useCallback(async () => {\n return await knock.user.getAllPreferences();\n }, [knock.user]);\n\n return {\n getAllPreferences,\n setPreferences,\n preferences,\n isLoading,\n isValidating,\n };\n};\n\nexport { usePreferences };\n"],"names":["usePreferences","options","knock","useKnockClient","preferenceSet","tenant","CACHE_KEY","userId","data","preferences","isLoading","isValidating","mutate","useSWR","user","getPreferences","setPreferences","useCallback","preferenceSetProperties","revalidate","getAllPreferences"],"mappings":";;;;;;AAoBA,MAAMA,IAAiBA,CACrBC,IAAiC,OACR;AACzB,QAAMC,IAAQC,EAAe,GAEvB;AAAA,IAAEC,eAAAA;AAAAA,IAAeC,QAAAA;AAAAA,EAAAA,IAAWJ,GAE5BK,IAAY,CAChB,eACAL,EAAQG,eACRH,EAAQI,QACRH,EAAMK,MAAM,GAGR;AAAA,IACJC,MAAMC;AAAAA,IACNC,WAAAA;AAAAA,IACAC,cAAAA;AAAAA,IACAC,QAAAA;AAAAA,MACEC,EAAOX,EAAMK,SAASD,IAAY,MAAM,MACnCJ,EAAMY,KAAKC,eAAe;AAAA,IAAEX,eAAAA;AAAAA,IAAeC,QAAAA;AAAAA,EAAAA,CAAQ,CAC3D,GAEKW,IAAiBC,EACrB,CAACC,MAAsD;AAEnDhB,IAAAA,EAAAA,EAAMY,KAAKE,eAAeE,GAAyB;AAAA,MAAEd,eAAAA;AAAAA,IAAAA,CAAe,GACpE;AAAA,MACEe,YAAY;AAAA,IAAA,CAEhB;AAAA,KAEF,CAACP,GAAQV,EAAMY,MAAMV,CAAa,CACpC;AAMO,SAAA;AAAA,IACLgB,mBALwBH,EAAY,YAC7B,MAAMf,EAAMY,KAAKM,kBAAkB,GACzC,CAAClB,EAAMY,IAAI,CAAC;AAAA,IAIbE,gBAAAA;AAAAA,IACAP,aAAAA;AAAAA,IACAC,WAAAA;AAAAA,IACAC,cAAAA;AAAAA,EACF;AACF;"}
@@ -5,4 +5,5 @@ export { type MsTeamsChannelQueryOptions, type MsTeamsTeamQueryOptions, KnockMsT
5
5
  export { KnockSlackProvider, type ContainerObject, type KnockSlackProviderProps, type KnockSlackProviderState, type SlackChannelQueryOptions, useConnectedSlackChannels, useKnockSlackClient, useSlackAuth, useSlackChannels, useSlackConnectionStatus, } from './modules/slack';
6
6
  export { I18nContext, KnockI18nProvider, locales, type I18nContent, type KnockI18nProviderProps, type Translations, useTranslations, } from './modules/i18n';
7
7
  export { type RecipientObject } from './interfaces';
8
+ export { usePreferences } from './modules/preferences';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,2BAA2B,EAC3B,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,QAAQ,EACb,0BAA0B,EAC1B,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,GACT,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,oBAAoB,EACpB,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,2BAA2B,EAC3B,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,yBAAyB,EACzB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,OAAO,EACP,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,2BAA2B,EAC3B,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,QAAQ,EACb,0BAA0B,EAC1B,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,GACT,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,oBAAoB,EACpB,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,2BAA2B,EAC3B,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,yBAAyB,EACzB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,OAAO,EACP,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthenticatedKnockClient.d.ts","sourceRoot":"","sources":["../../../../../src/modules/core/hooks/useAuthenticatedKnockClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,mBAAmB,EACnB,YAAY,EACZ,MAAM,EACN,0BAA0B,EAC3B,MAAM,mBAAmB,CAAC;AAiB3B,MAAM,MAAM,+BAA+B,GAAG,YAAY,GACxD,mBAAmB,CAAC;AAEtB;;;;;;;GAOG;AACH,iBAAS,2BAA2B,CAClC,MAAM,EAAE,MAAM,EACd,0BAA0B,EAAE,MAAM,EAClC,SAAS,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EAC9B,OAAO,CAAC,EAAE,+BAA+B,GACxC,KAAK,CAAC;AACT,iBAAS,2BAA2B,CAClC,MAAM,EAAE,MAAM,EACd,0BAA0B,EAAE,0BAA0B,EACtD,SAAS,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EAC9B,OAAO,CAAC,EAAE,+BAA+B,GACxC,KAAK,CAAC;AAuDT,eAAe,2BAA2B,CAAC"}
1
+ {"version":3,"file":"useAuthenticatedKnockClient.d.ts","sourceRoot":"","sources":["../../../../../src/modules/core/hooks/useAuthenticatedKnockClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,mBAAmB,EACnB,YAAY,EACZ,MAAM,EACN,0BAA0B,EAC3B,MAAM,mBAAmB,CAAC;AAiB3B,MAAM,MAAM,+BAA+B,GAAG,YAAY,GACxD,mBAAmB,CAAC;AAEtB;;;;;;;GAOG;AACH,iBAAS,2BAA2B,CAClC,MAAM,EAAE,MAAM,EACd,0BAA0B,EAAE,MAAM,EAClC,SAAS,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EAC9B,OAAO,CAAC,EAAE,+BAA+B,GACxC,KAAK,CAAC;AACT,iBAAS,2BAA2B,CAClC,MAAM,EAAE,MAAM,EACd,0BAA0B,EAAE,0BAA0B,EACtD,SAAS,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EAC9B,OAAO,CAAC,EAAE,+BAA+B,GACxC,KAAK,CAAC;AAyDT,eAAe,2BAA2B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { usePreferences } from './usePreferences';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/modules/preferences/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { GetPreferencesOptions, PreferenceSet, SetPreferencesProperties } from '@knocklabs/client';
2
+ import { SWRResponse } from 'swr';
3
+ import { useKnockClient } from '../../core';
4
+ type UsePreferencesReturn = {
5
+ preferences: PreferenceSet | undefined;
6
+ setPreferences: (setPreferencesProperties: SetPreferencesProperties) => void;
7
+ getAllPreferences: ReturnType<typeof useKnockClient>["user"]["getAllPreferences"];
8
+ isLoading: SWRResponse["isLoading"];
9
+ isValidating: SWRResponse["isValidating"];
10
+ };
11
+ declare const usePreferences: (options?: GetPreferencesOptions) => UsePreferencesReturn;
12
+ export { usePreferences };
13
+ //# sourceMappingURL=usePreferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePreferences.d.ts","sourceRoot":"","sources":["../../../../../src/modules/preferences/hooks/usePreferences.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,aAAa,EACb,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAE3B,OAAe,EAAE,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,KAAK,oBAAoB,GAAG;IAC1B,WAAW,EAAE,aAAa,GAAG,SAAS,CAAC;IACvC,cAAc,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,KAAK,IAAI,CAAC;IAC7E,iBAAiB,EAAE,UAAU,CAC3B,OAAO,cAAc,CACtB,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAC/B,SAAS,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IACpC,YAAY,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;CAC3C,CAAC;AAEF,QAAA,MAAM,cAAc,GAClB,UAAS,qBAA0B,KAClC,oBA4CF,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { usePreferences } from './hooks';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/preferences/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,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.7.0",
5
+ "version": "0.7.2",
6
6
  "license": "MIT",
7
7
  "main": "dist/cjs/index.js",
8
8
  "module": "dist/esm/index.mjs",
@@ -57,7 +57,8 @@
57
57
  "@codecov/vite-plugin": "^1.9.1",
58
58
  "@testing-library/dom": "^10.4.0",
59
59
  "@testing-library/react": "^16.3.0",
60
- "@types/react": "^18.3.6",
60
+ "@types/react": "^19.1.8",
61
+ "@types/react-dom": "^19.1.6",
61
62
  "@typescript-eslint/eslint-plugin": "^8.32.0",
62
63
  "@typescript-eslint/parser": "^8.32.1",
63
64
  "@vitejs/plugin-react": "^4.5.1",
@@ -66,8 +67,8 @@
66
67
  "eslint-plugin-react-hooks": "^5.2.0",
67
68
  "eslint-plugin-react-refresh": "^0.4.14",
68
69
  "jsdom": "^26.1.0",
69
- "react": "^18.2.0",
70
- "react-dom": "^18.2.0",
70
+ "react": "^19.0.0",
71
+ "react-dom": "^19.0.0",
71
72
  "rimraf": "^6.0.1",
72
73
  "rollup-plugin-execute": "^1.1.1",
73
74
  "typescript": "^5.8.3",
package/src/index.ts CHANGED
@@ -66,3 +66,5 @@ export {
66
66
  useTranslations,
67
67
  } from "./modules/i18n";
68
68
  export { type RecipientObject } from "./interfaces";
69
+
70
+ export { usePreferences } from "./modules/preferences";
@@ -49,14 +49,16 @@ function useAuthenticatedKnockClient(
49
49
  userToken?: Knock["userToken"],
50
50
  options: AuthenticatedKnockClientOptions = {},
51
51
  ) {
52
- const knockRef = React.useRef<Knock | undefined>();
52
+ const knockRef = React.useRef<Knock | undefined>(undefined);
53
+
53
54
  const stableOptions = useStableOptions(options);
55
+ const stableUserIdOrObject = useStableOptions(userIdOrUserWithProperties);
54
56
 
55
57
  return React.useMemo(() => {
56
58
  const userId =
57
- typeof userIdOrUserWithProperties === "string"
58
- ? userIdOrUserWithProperties
59
- : userIdOrUserWithProperties?.id;
59
+ typeof stableUserIdOrObject === "string"
60
+ ? stableUserIdOrObject
61
+ : stableUserIdOrObject?.id;
60
62
 
61
63
  const currentKnock = knockRef.current;
62
64
 
@@ -68,7 +70,7 @@ function useAuthenticatedKnockClient(
68
70
  ) {
69
71
  authenticateWithOptions(
70
72
  currentKnock,
71
- userIdOrUserWithProperties,
73
+ stableUserIdOrObject,
72
74
  userToken,
73
75
  stableOptions,
74
76
  );
@@ -87,14 +89,14 @@ function useAuthenticatedKnockClient(
87
89
 
88
90
  authenticateWithOptions(
89
91
  knock,
90
- userIdOrUserWithProperties,
92
+ stableUserIdOrObject,
91
93
  userToken,
92
94
  stableOptions,
93
95
  );
94
96
  knockRef.current = knock;
95
97
 
96
98
  return knock;
97
- }, [apiKey, userIdOrUserWithProperties, userToken, stableOptions]);
99
+ }, [apiKey, stableUserIdOrObject, userToken, stableOptions]);
98
100
  }
99
101
 
100
102
  export default useAuthenticatedKnockClient;
@@ -2,7 +2,7 @@ import fastDeepEqual from "fast-deep-equal";
2
2
  import { useMemo, useRef } from "react";
3
3
 
4
4
  export default function useStableOptions<T>(options: T): T {
5
- const optionsRef = useRef<T>();
5
+ const optionsRef = useRef<T>(undefined);
6
6
 
7
7
  return useMemo(() => {
8
8
  const currentOptions = optionsRef.current;
@@ -0,0 +1 @@
1
+ export { usePreferences } from "./usePreferences";
@@ -0,0 +1,69 @@
1
+ import type {
2
+ GetPreferencesOptions,
3
+ PreferenceSet,
4
+ SetPreferencesProperties,
5
+ } from "@knocklabs/client";
6
+ import { useCallback } from "react";
7
+ import useSWR, { type SWRResponse } from "swr";
8
+
9
+ import { useKnockClient } from "../../core";
10
+
11
+ type UsePreferencesReturn = {
12
+ preferences: PreferenceSet | undefined;
13
+ setPreferences: (setPreferencesProperties: SetPreferencesProperties) => void;
14
+ getAllPreferences: ReturnType<
15
+ typeof useKnockClient
16
+ >["user"]["getAllPreferences"];
17
+ isLoading: SWRResponse["isLoading"];
18
+ isValidating: SWRResponse["isValidating"];
19
+ };
20
+
21
+ const usePreferences = (
22
+ options: GetPreferencesOptions = {},
23
+ ): UsePreferencesReturn => {
24
+ const knock = useKnockClient();
25
+
26
+ const { preferenceSet, tenant } = options;
27
+
28
+ const CACHE_KEY = [
29
+ "preferences",
30
+ options.preferenceSet,
31
+ options.tenant,
32
+ knock.userId,
33
+ ];
34
+
35
+ const {
36
+ data: preferences,
37
+ isLoading,
38
+ isValidating,
39
+ mutate,
40
+ } = useSWR(knock.userId ? CACHE_KEY : null, () => {
41
+ return knock.user.getPreferences({ preferenceSet, tenant });
42
+ });
43
+
44
+ const setPreferences = useCallback(
45
+ (preferenceSetProperties: SetPreferencesProperties) => {
46
+ mutate(
47
+ knock.user.setPreferences(preferenceSetProperties, { preferenceSet }),
48
+ {
49
+ revalidate: false,
50
+ },
51
+ );
52
+ },
53
+ [mutate, knock.user, preferenceSet],
54
+ );
55
+
56
+ const getAllPreferences = useCallback(async () => {
57
+ return await knock.user.getAllPreferences();
58
+ }, [knock.user]);
59
+
60
+ return {
61
+ getAllPreferences,
62
+ setPreferences,
63
+ preferences,
64
+ isLoading,
65
+ isValidating,
66
+ };
67
+ };
68
+
69
+ export { usePreferences };
@@ -0,0 +1 @@
1
+ export { usePreferences } from "./hooks";