@knocklabs/react-core 0.2.6 → 0.2.8

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 CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.8
4
+
5
+ ### Patch Changes
6
+
7
+ - 3c277cb: fix: remove react-query and replace with swr for react 16+ support
8
+ - Updated dependencies [3c277cb]
9
+ - Updated dependencies [567e24f]
10
+ - @knocklabs/client@0.10.1
11
+
12
+ ## 0.2.7
13
+
14
+ ### Patch Changes
15
+
16
+ - Updated dependencies [8bdc75b]
17
+ - @knocklabs/client@0.10.0
18
+
3
19
  ## 0.2.6
4
20
 
5
21
  ### Patch Changes
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react/jsx-runtime"),S=require("../hooks/useSlackConnectionStatus.js"),u=require("@tanstack/react-query"),f=require("react"),v=require("../../core/context/KnockProvider.js");require("@knocklabs/client");const y=require("../../core/utils.js");require("../../i18n/context/KnockI18nProvider.js");function C(e){if(e&&typeof e=="object"&&"default"in e)return e;const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,o.get?o:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const s=C(f),P=new u.QueryClient,l=s.createContext(null),j=({knockSlackChannelId:e,tenant:t,children:r})=>{const o=v.useKnockClient(),{connectionStatus:n,setConnectionStatus:a,errorLabel:c,setErrorLabel:d,actionLabel:b,setActionLabel:k}=S(o,e,t);return i.jsx(l.Provider,{value:{connectionStatus:n,setConnectionStatus:a,errorLabel:c,setErrorLabel:d,actionLabel:b,setActionLabel:k,knockSlackChannelId:e,tenant:t},children:i.jsx(u.QueryClientProvider,{client:P,children:r})},y.slackProviderKey({knockSlackChannelId:e,tenant:t,connectionStatus:n,errorLabel:c}))},p=()=>{const e=s.useContext(l);if(e===void 0)throw new Error("useKnockSlackClient must be used within a KnockSlackProvider");return e};exports.KnockSlackProvider=j;exports.useKnockSlackClient=p;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("react/jsx-runtime"),k=require("../hooks/useSlackConnectionStatus.js"),S=require("react");require("swr/infinite");const f=require("../../core/context/KnockProvider.js");require("@knocklabs/client");const v=require("../../core/utils.js");require("../../i18n/context/KnockI18nProvider.js");function P(e){if(e&&typeof e=="object"&&"default"in e)return e;const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,o.get?o:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const i=P(S),u=i.createContext(null),p=({knockSlackChannelId:e,tenant:t,children:r})=>{const o=f.useKnockClient(),{connectionStatus:n,setConnectionStatus:s,errorLabel:c,setErrorLabel:a,actionLabel:l,setActionLabel:d}=k(o,e,t);return b.jsx(u.Provider,{value:{connectionStatus:n,setConnectionStatus:s,errorLabel:c,setErrorLabel:a,actionLabel:l,setActionLabel:d,knockSlackChannelId:e,tenant:t},children:r},v.slackProviderKey({knockSlackChannelId:e,tenant:t,connectionStatus:n,errorLabel:c}))},K=()=>{const e=i.useContext(u);if(e===void 0)throw new Error("useKnockSlackClient must be used within a KnockSlackProvider");return e};exports.KnockSlackProvider=p;exports.useKnockSlackClient=K;
2
2
  //# sourceMappingURL=KnockSlackProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"KnockSlackProvider.js","sources":["../../../../../src/modules/slack/context/KnockSlackProvider.tsx"],"sourcesContent":["import { useSlackConnectionStatus } from \"..\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport * as React from \"react\";\n\nimport { slackProviderKey } from \"../../core\";\nimport { useKnockClient } from \"../../core\";\nimport { ConnectionStatus } from \"../hooks/useSlackConnectionStatus\";\n\nconst queryClient = new QueryClient();\n\nexport interface KnockSlackProviderState {\n knockSlackChannelId: string;\n tenant: string;\n connectionStatus: ConnectionStatus;\n setConnectionStatus: (connectionStatus: ConnectionStatus) => void;\n errorLabel: string | null;\n setErrorLabel: (label: string) => void;\n actionLabel: string | null;\n setActionLabel: (label: string | null) => void;\n}\n\nconst SlackProviderStateContext =\n React.createContext<KnockSlackProviderState | null>(null);\n\nexport interface KnockSlackProviderProps {\n knockSlackChannelId: string;\n tenant: string;\n children?: React.ReactElement;\n}\n\nexport const KnockSlackProvider: React.FC<KnockSlackProviderProps> = ({\n knockSlackChannelId,\n tenant,\n children,\n}) => {\n const knock = useKnockClient();\n\n const {\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n } = useSlackConnectionStatus(knock, knockSlackChannelId, tenant);\n\n return (\n <SlackProviderStateContext.Provider\n key={slackProviderKey({\n knockSlackChannelId,\n tenant,\n connectionStatus,\n errorLabel,\n })}\n value={{\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n knockSlackChannelId,\n tenant,\n }}\n >\n <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>\n </SlackProviderStateContext.Provider>\n );\n};\n\nexport const useKnockSlackClient = (): KnockSlackProviderState => {\n const context = React.useContext(\n SlackProviderStateContext,\n ) as KnockSlackProviderState;\n if (context === undefined) {\n throw new Error(\n \"useKnockSlackClient must be used within a KnockSlackProvider\",\n );\n }\n return context as KnockSlackProviderState;\n};\n"],"names":["queryClient","QueryClient","SlackProviderStateContext","React","KnockSlackProvider","knockSlackChannelId","tenant","children","knock","useKnockClient","connectionStatus","setConnectionStatus","errorLabel","setErrorLabel","actionLabel","setActionLabel","useSlackConnectionStatus","jsx","QueryClientProvider","slackProviderKey","useKnockSlackClient","context"],"mappings":"gtBAQMA,EAAc,IAAIC,EAAAA,YAalBC,EACJC,EAAM,cAA8C,IAAI,EAQ7CC,EAAwD,CAAC,CACpE,oBAAAC,EACA,OAAAC,EACA,SAAAC,CACF,IAAM,CACJ,MAAMC,EAAQC,EAAAA,iBAER,CACJ,iBAAAC,EACA,oBAAAC,EACA,WAAAC,EACA,cAAAC,EACA,YAAAC,EACA,eAAAC,CACE,EAAAC,EAAyBR,EAAOH,EAAqBC,CAAM,EAG7D,OAAAW,EAAA,IAACf,EAA0B,SAA1B,CAOC,MAAO,CACL,iBAAAQ,EACA,oBAAAC,EACA,WAAAC,EACA,cAAAC,EACA,YAAAC,EACA,eAAAC,EACA,oBAAAV,EACA,OAAAC,CACF,EAEA,SAACW,EAAA,IAAAC,EAAA,oBAAA,CAAoB,OAAQlB,EAAc,SAAAO,EAAS,CAAA,EAjB/CY,mBAAiB,CACpB,oBAAAd,EACA,OAAAC,EACA,iBAAAI,EACA,WAAAE,CAAA,CACD,CAAA,CAeP,EAEaQ,EAAsB,IAA+B,CAChE,MAAMC,EAAUlB,EAAM,WACpBD,CAAA,EAEF,GAAImB,IAAY,OACd,MAAM,IAAI,MACR,8DAAA,EAGG,OAAAA,CACT"}
1
+ {"version":3,"file":"KnockSlackProvider.js","sources":["../../../../../src/modules/slack/context/KnockSlackProvider.tsx"],"sourcesContent":["import { useSlackConnectionStatus } from \"..\";\nimport * as React from \"react\";\n\nimport { slackProviderKey } from \"../../core\";\nimport { useKnockClient } from \"../../core\";\nimport { ConnectionStatus } from \"../hooks/useSlackConnectionStatus\";\n\nexport interface KnockSlackProviderState {\n knockSlackChannelId: string;\n tenant: string;\n connectionStatus: ConnectionStatus;\n setConnectionStatus: (connectionStatus: ConnectionStatus) => void;\n errorLabel: string | null;\n setErrorLabel: (label: string) => void;\n actionLabel: string | null;\n setActionLabel: (label: string | null) => void;\n}\n\nconst SlackProviderStateContext =\n React.createContext<KnockSlackProviderState | null>(null);\n\nexport interface KnockSlackProviderProps {\n knockSlackChannelId: string;\n tenant: string;\n children?: React.ReactElement;\n}\n\nexport const KnockSlackProvider: React.FC<KnockSlackProviderProps> = ({\n knockSlackChannelId,\n tenant,\n children,\n}) => {\n const knock = useKnockClient();\n\n const {\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n } = useSlackConnectionStatus(knock, knockSlackChannelId, tenant);\n\n return (\n <SlackProviderStateContext.Provider\n key={slackProviderKey({\n knockSlackChannelId,\n tenant,\n connectionStatus,\n errorLabel,\n })}\n value={{\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n knockSlackChannelId,\n tenant,\n }}\n >\n {children}\n </SlackProviderStateContext.Provider>\n );\n};\n\nexport const useKnockSlackClient = (): KnockSlackProviderState => {\n const context = React.useContext(\n SlackProviderStateContext,\n ) as KnockSlackProviderState;\n if (context === undefined) {\n throw new Error(\n \"useKnockSlackClient must be used within a KnockSlackProvider\",\n );\n }\n return context as KnockSlackProviderState;\n};\n"],"names":["SlackProviderStateContext","React","KnockSlackProvider","knockSlackChannelId","tenant","children","knock","useKnockClient","connectionStatus","setConnectionStatus","errorLabel","setErrorLabel","actionLabel","setActionLabel","useSlackConnectionStatus","jsx","slackProviderKey","useKnockSlackClient","context"],"mappings":"2sBAkBMA,EACJC,EAAM,cAA8C,IAAI,EAQ7CC,EAAwD,CAAC,CACpE,oBAAAC,EACA,OAAAC,EACA,SAAAC,CACF,IAAM,CACJ,MAAMC,EAAQC,EAAAA,iBAER,CACJ,iBAAAC,EACA,oBAAAC,EACA,WAAAC,EACA,cAAAC,EACA,YAAAC,EACA,eAAAC,CACE,EAAAC,EAAyBR,EAAOH,EAAqBC,CAAM,EAG7D,OAAAW,EAAA,IAACf,EAA0B,SAA1B,CAOC,MAAO,CACL,iBAAAQ,EACA,oBAAAC,EACA,WAAAC,EACA,cAAAC,EACA,YAAAC,EACA,eAAAC,EACA,oBAAAV,EACA,OAAAC,CACF,EAEC,SAAAC,CAAA,EAjBIW,mBAAiB,CACpB,oBAAAb,EACA,OAAAC,EACA,iBAAAI,EACA,WAAAE,CAAA,CACD,CAAA,CAeP,EAEaO,EAAsB,IAA+B,CAChE,MAAMC,EAAUjB,EAAM,WACpBD,CAAA,EAEF,GAAIkB,IAAY,OACd,MAAM,IAAI,MACR,8DAAA,EAGG,OAAAA,CACT"}
@@ -1,2 +1,2 @@
1
- "use strict";const K=require("../context/KnockSlackProvider.js"),e=require("react");require("../../i18n/context/KnockI18nProvider.js");const b=require("../../i18n/hooks/useTranslations.js");require("@tanstack/react-query");const y=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("date-fns");function E({slackChannelsRecipientObject:{objectId:t,collection:a}}){const{t:q}=b.useTranslations(),c=y.useKnockClient(),{connectionStatus:h,knockSlackChannelId:s}=K.useKnockSlackClient(),[o,l]=e.useState(null),[i,r]=e.useState(null),[u,d]=e.useState(!1),[p,k]=e.useState(!1),C=e.useCallback(()=>{d(!0),(async()=>await c.objects.getChannelData({collection:a,objectId:t,channelId:s}))().then(n=>{var S,g;(S=n==null?void 0:n.data)!=null&&S.connections?l((g=n==null?void 0:n.data)==null?void 0:g.connections):l([]),r(null),d(!1)}).catch(()=>{l([]),r(null),d(!1)})},[a,c.objects,s,t]);return e.useEffect(()=>{h==="connected"&&!o&&!i&&!u&&C()},[o,C,u,i,h]),{data:o,updateConnectedChannels:async f=>{k(!0);try{await c.objects.setChannelData({objectId:t,collection:a,channelId:s,data:{connections:f}}),C()}catch{r(q("slackChannelSetError")||"")}k(!1)},updating:p,loading:u,error:i}}module.exports=E;
1
+ "use strict";const K=require("../context/KnockSlackProvider.js"),e=require("react");require("../../i18n/context/KnockI18nProvider.js");const b=require("../../i18n/hooks/useTranslations.js");require("swr/infinite");const y=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("date-fns");function E({slackChannelsRecipientObject:{objectId:t,collection:a}}){const{t:q}=b.useTranslations(),c=y.useKnockClient(),{connectionStatus:h,knockSlackChannelId:s}=K.useKnockSlackClient(),[o,l]=e.useState(null),[i,r]=e.useState(null),[u,d]=e.useState(!1),[p,k]=e.useState(!1),C=e.useCallback(()=>{d(!0),(async()=>await c.objects.getChannelData({collection:a,objectId:t,channelId:s}))().then(n=>{var S,g;(S=n==null?void 0:n.data)!=null&&S.connections?l((g=n==null?void 0:n.data)==null?void 0:g.connections):l([]),r(null),d(!1)}).catch(()=>{l([]),r(null),d(!1)})},[a,c.objects,s,t]);return e.useEffect(()=>{h==="connected"&&!o&&!i&&!u&&C()},[o,C,u,i,h]),{data:o,updateConnectedChannels:async f=>{k(!0);try{await c.objects.setChannelData({objectId:t,collection:a,channelId:s,data:{connections:f}}),C()}catch{r(q("slackChannelSetError")||"")}k(!1)},updating:p,loading:u,error:i}}module.exports=E;
2
2
  //# sourceMappingURL=useConnectedSlackChannels.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useConnectedSlackChannels.js","sources":["../../../../../src/modules/slack/hooks/useConnectedSlackChannels.ts"],"sourcesContent":["import { ContainerObject, useKnockSlackClient } from \"..\";\nimport { SlackChannelConnection } from \"@knocklabs/client\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { useKnockClient } from \"../../core\";\nimport { useTranslations } from \"../../i18n\";\n\ntype UseSlackChannelsProps = {\n slackChannelsRecipientObject: ContainerObject;\n};\n\ntype UseSlackChannelOutput = {\n data: SlackChannelConnection[] | null;\n updateConnectedChannels: (\n connectedChannels: SlackChannelConnection[],\n ) => void;\n loading: boolean;\n error: string | null;\n updating: boolean;\n};\n\nfunction useConnectedSlackChannels({\n slackChannelsRecipientObject: { objectId, collection },\n}: UseSlackChannelsProps): UseSlackChannelOutput {\n const { t } = useTranslations();\n const knock = useKnockClient();\n const { connectionStatus, knockSlackChannelId } = useKnockSlackClient();\n const [connectedChannels, setConnectedChannels] = useState<\n null | SlackChannelConnection[]\n >(null);\n const [error, setError] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isUpdating, setIsUpdating] = useState(false);\n\n const fetchAndSetConnectedChannels = useCallback(() => {\n setIsLoading(true);\n const getConnectedChannels = async () =>\n await knock.objects.getChannelData({\n collection,\n objectId,\n channelId: knockSlackChannelId,\n });\n\n getConnectedChannels()\n .then((res) => {\n if (res?.data?.connections) {\n setConnectedChannels(res?.data?.connections);\n } else {\n setConnectedChannels([]);\n }\n setError(null);\n setIsLoading(false);\n })\n .catch(() => {\n setConnectedChannels([]);\n setError(null);\n setIsLoading(false);\n });\n }, [collection, knock.objects, knockSlackChannelId, objectId]);\n\n useEffect(() => {\n if (\n connectionStatus === \"connected\" &&\n !connectedChannels &&\n !error &&\n !isLoading\n ) {\n fetchAndSetConnectedChannels();\n }\n }, [\n connectedChannels,\n fetchAndSetConnectedChannels,\n isLoading,\n error,\n connectionStatus,\n ]);\n\n const updateConnectedChannels = async (\n channelsToSendToKnock: SlackChannelConnection[],\n ) => {\n setIsUpdating(true);\n try {\n await knock.objects.setChannelData({\n objectId,\n collection,\n channelId: knockSlackChannelId,\n data: { connections: channelsToSendToKnock },\n });\n fetchAndSetConnectedChannels();\n } catch (error) {\n setError(t(\"slackChannelSetError\") || \"\");\n }\n setIsUpdating(false);\n };\n\n return {\n data: connectedChannels,\n updateConnectedChannels,\n updating: isUpdating,\n loading: isLoading,\n error,\n };\n}\n\nexport default useConnectedSlackChannels;\n"],"names":["useConnectedSlackChannels","objectId","collection","t","useTranslations","knock","useKnockClient","connectionStatus","knockSlackChannelId","useKnockSlackClient","connectedChannels","setConnectedChannels","useState","error","setError","isLoading","setIsLoading","isUpdating","setIsUpdating","fetchAndSetConnectedChannels","useCallback","res","_a","_b","useEffect","channelsToSendToKnock"],"mappings":"uUAqBA,SAASA,EAA0B,CACjC,6BAA8B,CAAE,SAAAC,EAAU,WAAAC,CAAW,CACvD,EAAiD,CACzC,KAAA,CAAE,EAAAC,GAAMC,EAAAA,kBACRC,EAAQC,EAAAA,iBACR,CAAE,iBAAAC,EAAkB,oBAAAC,CAAoB,EAAIC,EAAoB,oBAAA,EAChE,CAACC,EAAmBC,CAAoB,EAAIC,WAEhD,IAAI,EACA,CAACC,EAAOC,CAAQ,EAAIF,WAAwB,IAAI,EAChD,CAACG,EAAWC,CAAY,EAAIJ,WAAS,EAAK,EAC1C,CAACK,EAAYC,CAAa,EAAIN,WAAS,EAAK,EAE5CO,EAA+BC,EAAAA,YAAY,IAAM,CACrDJ,EAAa,EAAI,GACY,SAC3B,MAAMX,EAAM,QAAQ,eAAe,CACjC,WAAAH,EACA,SAAAD,EACA,UAAWO,CAAA,CACZ,GAEkB,EAClB,KAAMa,GAAQ,UACTC,EAAAD,GAAA,YAAAA,EAAK,OAAL,MAAAC,EAAW,YACQX,GAAAY,EAAAF,GAAA,YAAAA,EAAK,OAAL,YAAAE,EAAW,WAAW,EAE3CZ,EAAqB,CAAE,CAAA,EAEzBG,EAAS,IAAI,EACbE,EAAa,EAAK,CAAA,CACnB,EACA,MAAM,IAAM,CACXL,EAAqB,CAAE,CAAA,EACvBG,EAAS,IAAI,EACbE,EAAa,EAAK,CAAA,CACnB,CAAA,EACF,CAACd,EAAYG,EAAM,QAASG,EAAqBP,CAAQ,CAAC,EAE7DuB,OAAAA,EAAAA,UAAU,IAAM,CAEZjB,IAAqB,aACrB,CAACG,GACD,CAACG,GACD,CAACE,GAE4BI,GAC/B,EACC,CACDT,EACAS,EACAJ,EACAF,EACAN,CAAA,CACD,EAoBM,CACL,KAAMG,EACN,wBApB8B,MAC9Be,GACG,CACHP,EAAc,EAAI,EACd,GAAA,CACI,MAAAb,EAAM,QAAQ,eAAe,CACjC,SAAAJ,EACA,WAAAC,EACA,UAAWM,EACX,KAAM,CAAE,YAAaiB,CAAsB,CAAA,CAC5C,EAC4BN,SACf,CACLL,EAAAX,EAAE,sBAAsB,GAAK,EAAE,CAC1C,CACAe,EAAc,EAAK,CAAA,EAMnB,SAAUD,EACV,QAASF,EACT,MAAAF,CAAA,CAEJ"}
1
+ {"version":3,"file":"useConnectedSlackChannels.js","sources":["../../../../../src/modules/slack/hooks/useConnectedSlackChannels.ts"],"sourcesContent":["import { ContainerObject, useKnockSlackClient } from \"..\";\nimport { SlackChannelConnection } from \"@knocklabs/client\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { useKnockClient } from \"../../core\";\nimport { useTranslations } from \"../../i18n\";\n\ntype UseSlackChannelsProps = {\n slackChannelsRecipientObject: ContainerObject;\n};\n\ntype UseSlackChannelOutput = {\n data: SlackChannelConnection[] | null;\n updateConnectedChannels: (\n connectedChannels: SlackChannelConnection[],\n ) => void;\n loading: boolean;\n error: string | null;\n updating: boolean;\n};\n\nfunction useConnectedSlackChannels({\n slackChannelsRecipientObject: { objectId, collection },\n}: UseSlackChannelsProps): UseSlackChannelOutput {\n const { t } = useTranslations();\n const knock = useKnockClient();\n const { connectionStatus, knockSlackChannelId } = useKnockSlackClient();\n const [connectedChannels, setConnectedChannels] = useState<\n null | SlackChannelConnection[]\n >(null);\n const [error, setError] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isUpdating, setIsUpdating] = useState(false);\n\n const fetchAndSetConnectedChannels = useCallback(() => {\n setIsLoading(true);\n const getConnectedChannels = async () =>\n await knock.objects.getChannelData({\n collection,\n objectId,\n channelId: knockSlackChannelId,\n });\n\n getConnectedChannels()\n .then((res) => {\n if (res?.data?.connections) {\n setConnectedChannels(res?.data?.connections);\n } else {\n setConnectedChannels([]);\n }\n setError(null);\n setIsLoading(false);\n })\n .catch(() => {\n setConnectedChannels([]);\n setError(null);\n setIsLoading(false);\n });\n }, [collection, knock.objects, knockSlackChannelId, objectId]);\n\n useEffect(() => {\n if (\n connectionStatus === \"connected\" &&\n !connectedChannels &&\n !error &&\n !isLoading\n ) {\n fetchAndSetConnectedChannels();\n }\n }, [\n connectedChannels,\n fetchAndSetConnectedChannels,\n isLoading,\n error,\n connectionStatus,\n ]);\n\n const updateConnectedChannels = async (\n channelsToSendToKnock: SlackChannelConnection[],\n ) => {\n setIsUpdating(true);\n try {\n await knock.objects.setChannelData({\n objectId,\n collection,\n channelId: knockSlackChannelId,\n data: { connections: channelsToSendToKnock },\n });\n fetchAndSetConnectedChannels();\n } catch (error) {\n setError(t(\"slackChannelSetError\") || \"\");\n }\n setIsUpdating(false);\n };\n\n return {\n data: connectedChannels,\n updateConnectedChannels,\n updating: isUpdating,\n loading: isLoading,\n error,\n };\n}\n\nexport default useConnectedSlackChannels;\n"],"names":["useConnectedSlackChannels","objectId","collection","t","useTranslations","knock","useKnockClient","connectionStatus","knockSlackChannelId","useKnockSlackClient","connectedChannels","setConnectedChannels","useState","error","setError","isLoading","setIsLoading","isUpdating","setIsUpdating","fetchAndSetConnectedChannels","useCallback","res","_a","_b","useEffect","channelsToSendToKnock"],"mappings":"8TAqBA,SAASA,EAA0B,CACjC,6BAA8B,CAAE,SAAAC,EAAU,WAAAC,CAAW,CACvD,EAAiD,CACzC,KAAA,CAAE,EAAAC,GAAMC,EAAAA,kBACRC,EAAQC,EAAAA,iBACR,CAAE,iBAAAC,EAAkB,oBAAAC,CAAoB,EAAIC,EAAoB,oBAAA,EAChE,CAACC,EAAmBC,CAAoB,EAAIC,WAEhD,IAAI,EACA,CAACC,EAAOC,CAAQ,EAAIF,WAAwB,IAAI,EAChD,CAACG,EAAWC,CAAY,EAAIJ,WAAS,EAAK,EAC1C,CAACK,EAAYC,CAAa,EAAIN,WAAS,EAAK,EAE5CO,EAA+BC,EAAAA,YAAY,IAAM,CACrDJ,EAAa,EAAI,GACY,SAC3B,MAAMX,EAAM,QAAQ,eAAe,CACjC,WAAAH,EACA,SAAAD,EACA,UAAWO,CAAA,CACZ,GAEkB,EAClB,KAAMa,GAAQ,UACTC,EAAAD,GAAA,YAAAA,EAAK,OAAL,MAAAC,EAAW,YACQX,GAAAY,EAAAF,GAAA,YAAAA,EAAK,OAAL,YAAAE,EAAW,WAAW,EAE3CZ,EAAqB,CAAE,CAAA,EAEzBG,EAAS,IAAI,EACbE,EAAa,EAAK,CAAA,CACnB,EACA,MAAM,IAAM,CACXL,EAAqB,CAAE,CAAA,EACvBG,EAAS,IAAI,EACbE,EAAa,EAAK,CAAA,CACnB,CAAA,EACF,CAACd,EAAYG,EAAM,QAASG,EAAqBP,CAAQ,CAAC,EAE7DuB,OAAAA,EAAAA,UAAU,IAAM,CAEZjB,IAAqB,aACrB,CAACG,GACD,CAACG,GACD,CAACE,GAE4BI,GAC/B,EACC,CACDT,EACAS,EACAJ,EACAF,EACAN,CAAA,CACD,EAoBM,CACL,KAAMG,EACN,wBApB8B,MAC9Be,GACG,CACHP,EAAc,EAAI,EACd,GAAA,CACI,MAAAb,EAAM,QAAQ,eAAe,CACjC,SAAAJ,EACA,WAAAC,EACA,UAAWM,EACX,KAAM,CAAE,YAAaiB,CAAsB,CAAA,CAC5C,EAC4BN,SACf,CACLL,EAAAX,EAAE,sBAAsB,GAAK,EAAE,CAC1C,CACAe,EAAc,EAAK,CAAA,EAMnB,SAAUD,EACV,QAASF,EACT,MAAAF,CAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- "use strict";const k=require("../context/KnockSlackProvider.js"),i=require("react");require("../../i18n/context/KnockI18nProvider.js");require("@tanstack/react-query");const l=require("../../core/context/KnockProvider.js"),d=require("@knocklabs/client");require("date-fns");const h="https://slack.com/oauth/v2/authorize",S=["chat:write","chat:write.public","channels:read","groups:read"];function _(o,s){const e=l.useKnockClient(),{setConnectionStatus:c,knockSlackChannelId:n,tenant:t,setActionLabel:a}=k.useKnockSlackClient(),u=i.useCallback(async()=>{a(null),c("disconnecting");try{const r=await e.slack.revokeAccessToken({tenant:t,knockChannelId:n});c(r==="ok"?"disconnected":"error")}catch{c("error")}},[c,e.slack,t,n,a]);return{buildSlackAuthUrl:i.useCallback(()=>{const r={state:JSON.stringify({redirect_url:s,access_token_object:{object_id:t,collection:d.TENANT_OBJECT_COLLECTION},channel_id:n,public_key:e.apiKey,user_token:e.userToken}),client_id:o,scope:S.join(",")};return`${h}?${new URLSearchParams(r)}`},[s,t,n,e.apiKey,e.userToken,o]),disconnectFromSlack:u}}module.exports=_;
1
+ "use strict";const k=require("../context/KnockSlackProvider.js"),i=require("react");require("../../i18n/context/KnockI18nProvider.js");require("swr/infinite");const l=require("../../core/context/KnockProvider.js"),d=require("@knocklabs/client");require("date-fns");const h="https://slack.com/oauth/v2/authorize",S=["chat:write","chat:write.public","channels:read","groups:read"];function _(o,s){const e=l.useKnockClient(),{setConnectionStatus:c,knockSlackChannelId:n,tenant:t,setActionLabel:a}=k.useKnockSlackClient(),u=i.useCallback(async()=>{a(null),c("disconnecting");try{const r=await e.slack.revokeAccessToken({tenant:t,knockChannelId:n});c(r==="ok"?"disconnected":"error")}catch{c("error")}},[c,e.slack,t,n,a]);return{buildSlackAuthUrl:i.useCallback(()=>{const r={state:JSON.stringify({redirect_url:s,access_token_object:{object_id:t,collection:d.TENANT_OBJECT_COLLECTION},channel_id:n,public_key:e.apiKey,user_token:e.userToken}),client_id:o,scope:S.join(",")};return`${h}?${new URLSearchParams(r)}`},[s,t,n,e.apiKey,e.userToken,o]),disconnectFromSlack:u}}module.exports=_;
2
2
  //# sourceMappingURL=useSlackAuth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSlackAuth.js","sources":["../../../../../src/modules/slack/hooks/useSlackAuth.ts"],"sourcesContent":["import { useKnockSlackClient } from \"..\";\nimport { TENANT_OBJECT_COLLECTION } from \"@knocklabs/client\";\nimport { useCallback } from \"react\";\n\nimport { useKnockClient } from \"../../core\";\n\nconst SLACK_AUTHORIZE_URL = \"https://slack.com/oauth/v2/authorize\";\nconst DEFAULT_SLACK_SCOPES = [\n \"chat:write\",\n \"chat:write.public\",\n \"channels:read\",\n \"groups:read\"\n];\n\ntype UseSlackAuthOutput = {\n buildSlackAuthUrl: () => string;\n disconnectFromSlack: () => void;\n};\n\nfunction useSlackAuth(\n slackClientId: string,\n redirectUrl?: string,\n): UseSlackAuthOutput {\n const knock = useKnockClient();\n const { setConnectionStatus, knockSlackChannelId, tenant, setActionLabel } =\n useKnockSlackClient();\n\n const disconnectFromSlack = useCallback(async () => {\n setActionLabel(null);\n setConnectionStatus(\"disconnecting\");\n try {\n const revoke = await knock.slack.revokeAccessToken({\n tenant,\n knockChannelId: knockSlackChannelId,\n });\n\n if (revoke === \"ok\") {\n setConnectionStatus(\"disconnected\");\n } else {\n setConnectionStatus(\"error\");\n }\n } catch (error) {\n setConnectionStatus(\"error\");\n }\n }, [\n setConnectionStatus,\n knock.slack,\n tenant,\n knockSlackChannelId,\n setActionLabel,\n ]);\n\n const buildSlackAuthUrl = useCallback(() => {\n const rawParams = {\n state: JSON.stringify({\n redirect_url: redirectUrl,\n access_token_object: {\n object_id: tenant,\n collection: TENANT_OBJECT_COLLECTION,\n },\n channel_id: knockSlackChannelId,\n public_key: knock.apiKey,\n user_token: knock.userToken,\n }),\n client_id: slackClientId,\n scope: DEFAULT_SLACK_SCOPES.join(\",\"),\n };\n return `${SLACK_AUTHORIZE_URL}?${new URLSearchParams(rawParams)}`;\n }, [\n redirectUrl,\n tenant,\n knockSlackChannelId,\n knock.apiKey,\n knock.userToken,\n slackClientId,\n ]);\n\n return {\n buildSlackAuthUrl,\n disconnectFromSlack,\n };\n}\n\nexport default useSlackAuth;\n"],"names":["SLACK_AUTHORIZE_URL","DEFAULT_SLACK_SCOPES","useSlackAuth","slackClientId","redirectUrl","knock","useKnockClient","setConnectionStatus","knockSlackChannelId","tenant","setActionLabel","useKnockSlackClient","disconnectFromSlack","useCallback","revoke","rawParams","TENANT_OBJECT_COLLECTION"],"mappings":"kRAMA,MAAMA,EAAsB,uCACtBC,EAAuB,CAC3B,aACA,oBACA,gBACA,aACF,EAOA,SAASC,EACPC,EACAC,EACoB,CACpB,MAAMC,EAAQC,EAAAA,iBACR,CAAE,oBAAAC,EAAqB,oBAAAC,EAAqB,OAAAC,EAAQ,eAAAC,CAAA,EACxDC,EAAAA,sBAEIC,EAAsBC,EAAAA,YAAY,SAAY,CAClDH,EAAe,IAAI,EACnBH,EAAoB,eAAe,EAC/B,GAAA,CACF,MAAMO,EAAS,MAAMT,EAAM,MAAM,kBAAkB,CACjD,OAAAI,EACA,eAAgBD,CAAA,CACjB,EAGCD,EADEO,IAAW,KACO,eAEA,OAFc,OAItB,CACdP,EAAoB,OAAO,CAC7B,CAAA,EACC,CACDA,EACAF,EAAM,MACNI,EACAD,EACAE,CAAA,CACD,EA2BM,MAAA,CACL,kBA1BwBG,EAAAA,YAAY,IAAM,CAC1C,MAAME,EAAY,CAChB,MAAO,KAAK,UAAU,CACpB,aAAcX,EACd,oBAAqB,CACnB,UAAWK,EACX,WAAYO,EAAA,wBACd,EACA,WAAYR,EACZ,WAAYH,EAAM,OAClB,WAAYA,EAAM,SAAA,CACnB,EACD,UAAWF,EACX,MAAOF,EAAqB,KAAK,GAAG,CAAA,EAEtC,MAAO,GAAGD,CAAmB,IAAI,IAAI,gBAAgBe,CAAS,CAAC,EAAA,EAC9D,CACDX,EACAK,EACAD,EACAH,EAAM,OACNA,EAAM,UACNF,CAAA,CACD,EAIC,oBAAAS,CAAA,CAEJ"}
1
+ {"version":3,"file":"useSlackAuth.js","sources":["../../../../../src/modules/slack/hooks/useSlackAuth.ts"],"sourcesContent":["import { useKnockSlackClient } from \"..\";\nimport { TENANT_OBJECT_COLLECTION } from \"@knocklabs/client\";\nimport { useCallback } from \"react\";\n\nimport { useKnockClient } from \"../../core\";\n\nconst SLACK_AUTHORIZE_URL = \"https://slack.com/oauth/v2/authorize\";\nconst DEFAULT_SLACK_SCOPES = [\n \"chat:write\",\n \"chat:write.public\",\n \"channels:read\",\n \"groups:read\"\n];\n\ntype UseSlackAuthOutput = {\n buildSlackAuthUrl: () => string;\n disconnectFromSlack: () => void;\n};\n\nfunction useSlackAuth(\n slackClientId: string,\n redirectUrl?: string,\n): UseSlackAuthOutput {\n const knock = useKnockClient();\n const { setConnectionStatus, knockSlackChannelId, tenant, setActionLabel } =\n useKnockSlackClient();\n\n const disconnectFromSlack = useCallback(async () => {\n setActionLabel(null);\n setConnectionStatus(\"disconnecting\");\n try {\n const revoke = await knock.slack.revokeAccessToken({\n tenant,\n knockChannelId: knockSlackChannelId,\n });\n\n if (revoke === \"ok\") {\n setConnectionStatus(\"disconnected\");\n } else {\n setConnectionStatus(\"error\");\n }\n } catch (error) {\n setConnectionStatus(\"error\");\n }\n }, [\n setConnectionStatus,\n knock.slack,\n tenant,\n knockSlackChannelId,\n setActionLabel,\n ]);\n\n const buildSlackAuthUrl = useCallback(() => {\n const rawParams = {\n state: JSON.stringify({\n redirect_url: redirectUrl,\n access_token_object: {\n object_id: tenant,\n collection: TENANT_OBJECT_COLLECTION,\n },\n channel_id: knockSlackChannelId,\n public_key: knock.apiKey,\n user_token: knock.userToken,\n }),\n client_id: slackClientId,\n scope: DEFAULT_SLACK_SCOPES.join(\",\"),\n };\n return `${SLACK_AUTHORIZE_URL}?${new URLSearchParams(rawParams)}`;\n }, [\n redirectUrl,\n tenant,\n knockSlackChannelId,\n knock.apiKey,\n knock.userToken,\n slackClientId,\n ]);\n\n return {\n buildSlackAuthUrl,\n disconnectFromSlack,\n };\n}\n\nexport default useSlackAuth;\n"],"names":["SLACK_AUTHORIZE_URL","DEFAULT_SLACK_SCOPES","useSlackAuth","slackClientId","redirectUrl","knock","useKnockClient","setConnectionStatus","knockSlackChannelId","tenant","setActionLabel","useKnockSlackClient","disconnectFromSlack","useCallback","revoke","rawParams","TENANT_OBJECT_COLLECTION"],"mappings":"yQAMA,MAAMA,EAAsB,uCACtBC,EAAuB,CAC3B,aACA,oBACA,gBACA,aACF,EAOA,SAASC,EACPC,EACAC,EACoB,CACpB,MAAMC,EAAQC,EAAAA,iBACR,CAAE,oBAAAC,EAAqB,oBAAAC,EAAqB,OAAAC,EAAQ,eAAAC,CAAA,EACxDC,EAAAA,sBAEIC,EAAsBC,EAAAA,YAAY,SAAY,CAClDH,EAAe,IAAI,EACnBH,EAAoB,eAAe,EAC/B,GAAA,CACF,MAAMO,EAAS,MAAMT,EAAM,MAAM,kBAAkB,CACjD,OAAAI,EACA,eAAgBD,CAAA,CACjB,EAGCD,EADEO,IAAW,KACO,eAEA,OAFc,OAItB,CACdP,EAAoB,OAAO,CAC7B,CAAA,EACC,CACDA,EACAF,EAAM,MACNI,EACAD,EACAE,CAAA,CACD,EA2BM,MAAA,CACL,kBA1BwBG,EAAAA,YAAY,IAAM,CAC1C,MAAME,EAAY,CAChB,MAAO,KAAK,UAAU,CACpB,aAAcX,EACd,oBAAqB,CACnB,UAAWK,EACX,WAAYO,EAAA,wBACd,EACA,WAAYR,EACZ,WAAYH,EAAM,OAClB,WAAYA,EAAM,SAAA,CACnB,EACD,UAAWF,EACX,MAAOF,EAAqB,KAAK,GAAG,CAAA,EAEtC,MAAO,GAAGD,CAAmB,IAAI,IAAI,gBAAgBe,CAAS,CAAC,EAAA,EAC9D,CACDX,EACAK,EACAD,EACAH,EAAM,OACNA,EAAM,UACNF,CAAA,CACD,EAIC,oBAAAS,CAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- "use strict";const N=require("../context/KnockSlackProvider.js"),s=require("react");require("../../i18n/context/KnockI18nProvider.js");const S=require("@tanstack/react-query"),E=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("date-fns");const I=1e3,K=200,d="private_channel,public_channel";function M({queryOptions:n}){const f=E.useKnockClient(),{knockSlackChannelId:C,tenant:_,connectionStatus:o}=N.useKnockSlackClient(),x=({pageParam:e})=>f.slack.getChannels({tenant:_,knockChannelId:C,queryOptions:{...n,cursor:e,limit:(n==null?void 0:n.limitPerPage)||K,types:(n==null?void 0:n.types)||d}}),{data:r,isLoading:a,isFetching:i,fetchNextPage:u,hasNextPage:k,refetch:m,error:h}=S.useInfiniteQuery({queryKey:["slackChannels"],queryFn:x,initialPageParam:"",getNextPageParam:e=>(e==null?void 0:e.next_cursor)===""?null:e==null?void 0:e.next_cursor}),c=s.useMemo(()=>{var e;return((e=r==null?void 0:r.pages)==null?void 0:e.flatMap(t=>t==null?void 0:t.slack_channels).filter(t=>!!t))||[]},[r==null?void 0:r.pages]),l=(n==null?void 0:n.maxCount)||I;return s.useEffect(()=>{o==="connected"&&!h&&k&&!i&&(c==null?void 0:c.length)<l&&u()},[c==null?void 0:c.length,u,k,i,l,h,o]),{data:c,isLoading:a,refetch:m}}module.exports=M;
1
+ "use strict";const I=require("../context/KnockSlackProvider.js"),d=require("react");require("../../i18n/context/KnockI18nProvider.js");const K=require("swr/infinite"),L=require("../../core/context/KnockProvider.js");require("@knocklabs/client");require("date-fns");const N=n=>n&&typeof n=="object"&&"default"in n?n:{default:n},g=N(K),A=1e3,R=200,M="private_channel,public_channel",S="SLACK_CHANNELS";function z(n,c){return n===0?[S,""]:c&&["",null].includes(c.next_cursor)?null:[S,c.next_cursor]}function T({queryOptions:n}){var h,C;const c=L.useKnockClient(),{knockSlackChannelId:x,tenant:E,connectionStatus:a}=I.useKnockSlackClient(),m=t=>c.slack.getChannels({tenant:E,knockChannelId:x,queryOptions:{...n,cursor:t?t[1]:"",limit:(n==null?void 0:n.limitPerPage)||R,types:(n==null?void 0:n.types)||M}}),{data:e,error:i,isLoading:l,isValidating:s,size:u,setSize:f,mutate:P}=g.default(z,m,{initialSize:0}),r=(e==null?void 0:e.length)||0,k=r===0||e&&((h=e[r])==null?void 0:h.next_cursor)&&((C=e[r])==null?void 0:C.next_cursor)!=="",o=d.useMemo(()=>(e??[]).flatMap(t=>t==null?void 0:t.slack_channels).filter(t=>!!t),[e]),_=(n==null?void 0:n.maxCount)||A;return d.useEffect(()=>{a==="connected"&&!i&&k&&!l&&!s&&o.length<_&&f(u+1)},[o.length,f,u,k,l,s,_,i,a]),{data:o,isLoading:l||s,refetch:()=>P()}}module.exports=T;
2
2
  //# sourceMappingURL=useSlackChannels.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSlackChannels.js","sources":["../../../../../src/modules/slack/hooks/useSlackChannels.ts"],"sourcesContent":["import { SlackChannelQueryOptions, useKnockSlackClient } from \"..\";\nimport { SlackChannel } from \"@knocklabs/client\";\nimport { useInfiniteQuery } from \"@tanstack/react-query\";\nimport { useEffect, useMemo } from \"react\";\n\nimport { useKnockClient } from \"../../core\";\n\nconst MAX_COUNT = 1000;\nconst LIMIT_PER_PAGE = 200;\nconst CHANNEL_TYPES = \"private_channel,public_channel\";\n\ntype UseSlackChannelsProps = {\n queryOptions?: SlackChannelQueryOptions;\n};\n\ntype UseSlackChannelOutput = {\n data: SlackChannel[];\n isLoading: boolean;\n refetch: () => void;\n};\n\nfunction useSlackChannels({\n queryOptions,\n}: UseSlackChannelsProps): UseSlackChannelOutput {\n const knock = useKnockClient();\n const { knockSlackChannelId, tenant, connectionStatus } =\n useKnockSlackClient();\n\n const fetchChannels = ({ pageParam }: { pageParam: string }) => {\n return knock.slack.getChannels({\n tenant,\n knockChannelId: knockSlackChannelId,\n queryOptions: {\n ...queryOptions,\n cursor: pageParam,\n limit: queryOptions?.limitPerPage || LIMIT_PER_PAGE,\n types: queryOptions?.types || CHANNEL_TYPES,\n },\n });\n };\n\n const {\n data,\n isLoading,\n isFetching,\n fetchNextPage,\n hasNextPage,\n refetch,\n error,\n } = useInfiniteQuery({\n queryKey: [\"slackChannels\"],\n queryFn: fetchChannels,\n initialPageParam: \"\",\n getNextPageParam: (lastPage) =>\n lastPage?.next_cursor === \"\" ? null : lastPage?.next_cursor,\n });\n\n const slackChannels = useMemo(() => {\n return (\n data?.pages\n ?.flatMap((page) => page?.slack_channels)\n .filter((channel) => !!channel) || []\n );\n }, [data?.pages]);\n\n const maxCount = queryOptions?.maxCount || MAX_COUNT;\n\n useEffect(() => {\n if (\n connectionStatus === \"connected\" &&\n !error &&\n hasNextPage &&\n !isFetching &&\n slackChannels?.length < maxCount\n ) {\n fetchNextPage();\n }\n }, [\n slackChannels?.length,\n fetchNextPage,\n hasNextPage,\n isFetching,\n maxCount,\n error,\n connectionStatus,\n ]);\n\n return { data: slackChannels, isLoading, refetch };\n}\n\nexport default useSlackChannels;\n"],"names":["MAX_COUNT","LIMIT_PER_PAGE","CHANNEL_TYPES","useSlackChannels","queryOptions","knock","useKnockClient","knockSlackChannelId","tenant","connectionStatus","useKnockSlackClient","fetchChannels","pageParam","data","isLoading","isFetching","fetchNextPage","hasNextPage","refetch","error","useInfiniteQuery","lastPage","slackChannels","useMemo","_a","page","channel","maxCount","useEffect"],"mappings":"kRAOA,MAAMA,EAAY,IACZC,EAAiB,IACjBC,EAAgB,iCAYtB,SAASC,EAAiB,CACxB,aAAAC,CACF,EAAiD,CAC/C,MAAMC,EAAQC,EAAAA,iBACR,CAAE,oBAAAC,EAAqB,OAAAC,EAAQ,iBAAAC,GACnCC,EAAoB,oBAAA,EAEhBC,EAAgB,CAAC,CAAE,UAAAC,KAChBP,EAAM,MAAM,YAAY,CAC7B,OAAAG,EACA,eAAgBD,EAChB,aAAc,CACZ,GAAGH,EACH,OAAQQ,EACR,OAAOR,GAAA,YAAAA,EAAc,eAAgBH,EACrC,OAAOG,GAAA,YAAAA,EAAc,QAASF,CAChC,CAAA,CACD,EAGG,CACJ,KAAAW,EACA,UAAAC,EACA,WAAAC,EACA,cAAAC,EACA,YAAAC,EACA,QAAAC,EACA,MAAAC,GACEC,mBAAiB,CACnB,SAAU,CAAC,eAAe,EAC1B,QAAST,EACT,iBAAkB,GAClB,iBAAmBU,IACjBA,GAAA,YAAAA,EAAU,eAAgB,GAAK,KAAOA,GAAA,YAAAA,EAAU,WAAA,CACnD,EAEKC,EAAgBC,EAAAA,QAAQ,IAAM,OAClC,QACEC,EAAAX,GAAA,YAAAA,EAAM,QAAN,YAAAW,EACI,QAASC,GAASA,GAAA,YAAAA,EAAM,gBACzB,OAAQC,GAAY,CAAC,CAACA,KAAY,CAAA,CAAC,EAEvC,CAACb,GAAA,YAAAA,EAAM,KAAK,CAAC,EAEVc,GAAWvB,GAAA,YAAAA,EAAc,WAAYJ,EAE3C4B,OAAAA,EAAAA,UAAU,IAAM,CAEZnB,IAAqB,aACrB,CAACU,GACDF,GACA,CAACF,IACDO,GAAA,YAAAA,EAAe,QAASK,GAEVX,GAChB,EACC,CACDM,GAAA,YAAAA,EAAe,OACfN,EACAC,EACAF,EACAY,EACAR,EACAV,CAAA,CACD,EAEM,CAAE,KAAMa,EAAe,UAAAR,EAAW,QAAAI,CAAQ,CACnD"}
1
+ {"version":3,"file":"useSlackChannels.js","sources":["../../../../../src/modules/slack/hooks/useSlackChannels.ts"],"sourcesContent":["import { SlackChannelQueryOptions, useKnockSlackClient } from \"..\";\nimport { GetSlackChannelsResponse, SlackChannel } from \"@knocklabs/client\";\nimport { useEffect, useMemo } from \"react\";\nimport useSWRInfinite from \"swr/infinite\";\n\nimport { useKnockClient } from \"../../core\";\n\nconst MAX_COUNT = 1000;\nconst LIMIT_PER_PAGE = 200;\nconst CHANNEL_TYPES = \"private_channel,public_channel\";\n\nconst QUERY_KEY = \"SLACK_CHANNELS\";\n\ntype UseSlackChannelsProps = {\n queryOptions?: SlackChannelQueryOptions;\n};\n\ntype UseSlackChannelOutput = {\n data: SlackChannel[];\n isLoading: boolean;\n refetch: () => void;\n};\n\ntype QueryKey = [key: string, cursor: string] | null;\n\nfunction getQueryKey(\n pageIndex: number,\n previousPageData: GetSlackChannelsResponse,\n): QueryKey {\n // First page so just pass empty\n if (pageIndex === 0) {\n return [QUERY_KEY, \"\"];\n }\n\n // If there's no more data then return an empty next cursor\n if (previousPageData && [\"\", null].includes(previousPageData.next_cursor)) {\n return null;\n }\n\n // Next cursor exists so pass it\n return [QUERY_KEY, previousPageData.next_cursor];\n}\n\nfunction useSlackChannels({\n queryOptions,\n}: UseSlackChannelsProps): UseSlackChannelOutput {\n const knock = useKnockClient();\n const { knockSlackChannelId, tenant, connectionStatus } =\n useKnockSlackClient();\n\n const fetchChannels = (queryKey: QueryKey) => {\n return knock.slack.getChannels({\n tenant,\n knockChannelId: knockSlackChannelId,\n queryOptions: {\n ...queryOptions,\n cursor: queryKey ? queryKey[1] : \"\",\n limit: queryOptions?.limitPerPage || LIMIT_PER_PAGE,\n types: queryOptions?.types || CHANNEL_TYPES,\n },\n });\n };\n\n const { data, error, isLoading, isValidating, size, setSize, mutate } =\n useSWRInfinite<GetSlackChannelsResponse>(getQueryKey, fetchChannels, {\n initialSize: 0,\n });\n\n const currentPage = data?.length || 0;\n\n const hasNextPage =\n currentPage === 0 ||\n (data &&\n data[currentPage]?.next_cursor &&\n data[currentPage]?.next_cursor !== \"\");\n\n const slackChannels: SlackChannel[] = useMemo(\n () =>\n (data ?? [])\n .flatMap((page) => page?.slack_channels)\n .filter((channel) => !!channel),\n [data],\n );\n\n const maxCount = queryOptions?.maxCount || MAX_COUNT;\n\n useEffect(() => {\n if (\n connectionStatus === \"connected\" &&\n !error &&\n hasNextPage &&\n !isLoading &&\n !isValidating &&\n slackChannels.length < maxCount\n ) {\n // Fetch a page at a time until we have nothing else left to fetch\n // or we've already hit the max amount of channels to fetch\n setSize(size + 1);\n }\n }, [\n slackChannels.length,\n setSize,\n size,\n hasNextPage,\n isLoading,\n isValidating,\n maxCount,\n error,\n connectionStatus,\n ]);\n\n return {\n data: slackChannels,\n isLoading: isLoading || isValidating,\n refetch: () => mutate(),\n };\n}\n\nexport default useSlackChannels;\n"],"names":["MAX_COUNT","LIMIT_PER_PAGE","CHANNEL_TYPES","QUERY_KEY","getQueryKey","pageIndex","previousPageData","useSlackChannels","queryOptions","knock","useKnockClient","knockSlackChannelId","tenant","connectionStatus","useKnockSlackClient","fetchChannels","queryKey","data","error","isLoading","isValidating","size","setSize","mutate","useSWRInfinite","currentPage","hasNextPage","_a","_b","slackChannels","useMemo","page","channel","maxCount","useEffect"],"mappings":"8UAOMA,EAAY,IACZC,EAAiB,IACjBC,EAAgB,iCAEhBC,EAAY,iBAclB,SAASC,EACPC,EACAC,EACU,CAEV,OAAID,IAAc,EACT,CAACF,EAAW,EAAE,EAInBG,GAAoB,CAAC,GAAI,IAAI,EAAE,SAASA,EAAiB,WAAW,EAC/D,KAIF,CAACH,EAAWG,EAAiB,WAAW,CACjD,CAEA,SAASC,EAAiB,CACxB,aAAAC,CACF,EAAiD,SAC/C,MAAMC,EAAQC,EAAAA,iBACR,CAAE,oBAAAC,EAAqB,OAAAC,EAAQ,iBAAAC,GACnCC,EAAoB,oBAAA,EAEhBC,EAAiBC,GACdP,EAAM,MAAM,YAAY,CAC7B,OAAAG,EACA,eAAgBD,EAChB,aAAc,CACZ,GAAGH,EACH,OAAQQ,EAAWA,EAAS,CAAC,EAAI,GACjC,OAAOR,GAAA,YAAAA,EAAc,eAAgBP,EACrC,OAAOO,GAAA,YAAAA,EAAc,QAASN,CAChC,CAAA,CACD,EAGG,CAAE,KAAAe,EAAM,MAAAC,EAAO,UAAAC,EAAW,aAAAC,EAAc,KAAAC,EAAM,QAAAC,EAAS,OAAAC,CAAO,EAClEC,UAAyCpB,EAAaW,EAAe,CACnE,YAAa,CAAA,CACd,EAEGU,GAAcR,GAAA,YAAAA,EAAM,SAAU,EAE9BS,EACJD,IAAgB,GACfR,KACCU,EAAAV,EAAKQ,CAAW,IAAhB,YAAAE,EAAmB,gBACnBC,EAAAX,EAAKQ,CAAW,IAAhB,YAAAG,EAAmB,eAAgB,GAEjCC,EAAgCC,EAAA,QACpC,KACGb,GAAQ,CAAA,GACN,QAASc,GAASA,GAAA,YAAAA,EAAM,cAAc,EACtC,OAAQC,GAAY,CAAC,CAACA,CAAO,EAClC,CAACf,CAAI,CAAA,EAGDgB,GAAWzB,GAAA,YAAAA,EAAc,WAAYR,EAE3CkC,OAAAA,EAAAA,UAAU,IAAM,CAEZrB,IAAqB,aACrB,CAACK,GACDQ,GACA,CAACP,GACD,CAACC,GACDS,EAAc,OAASI,GAIvBX,EAAQD,EAAO,CAAC,CAClB,EACC,CACDQ,EAAc,OACdP,EACAD,EACAK,EACAP,EACAC,EACAa,EACAf,EACAL,CAAA,CACD,EAEM,CACL,KAAMgB,EACN,UAAWV,GAAaC,EACxB,QAAS,IAAMG,EAAO,CAAA,CAE1B"}
@@ -1,58 +1,58 @@
1
- import { jsx as n } from "react/jsx-runtime";
2
- import C from "../hooks/useSlackConnectionStatus.mjs";
3
- import { QueryClient as k, QueryClientProvider as v } from "@tanstack/react-query";
1
+ import { jsx as p } from "react/jsx-runtime";
2
+ import k from "../hooks/useSlackConnectionStatus.mjs";
4
3
  import * as i from "react";
4
+ import "swr/infinite";
5
5
  import { useKnockClient as S } from "../../core/context/KnockProvider.mjs";
6
6
  import "@knocklabs/client";
7
- import { slackProviderKey as d } from "../../core/utils.mjs";
7
+ import { slackProviderKey as v } from "../../core/utils.mjs";
8
8
  import "../../i18n/context/KnockI18nProvider.mjs";
9
- const f = new k(), c = i.createContext(null), E = ({
10
- knockSlackChannelId: t,
11
- tenant: o,
12
- children: s
9
+ const n = i.createContext(null), L = ({
10
+ knockSlackChannelId: o,
11
+ tenant: t,
12
+ children: c
13
13
  }) => {
14
- const l = S(), {
15
- connectionStatus: e,
16
- setConnectionStatus: u,
17
- errorLabel: r,
18
- setErrorLabel: a,
19
- actionLabel: m,
20
- setActionLabel: p
21
- } = C(l, t, o);
22
- return /* @__PURE__ */ n(
23
- c.Provider,
14
+ const s = S(), {
15
+ connectionStatus: r,
16
+ setConnectionStatus: a,
17
+ errorLabel: e,
18
+ setErrorLabel: m,
19
+ actionLabel: u,
20
+ setActionLabel: l
21
+ } = k(s, o, t);
22
+ return /* @__PURE__ */ p(
23
+ n.Provider,
24
24
  {
25
25
  value: {
26
- connectionStatus: e,
27
- setConnectionStatus: u,
28
- errorLabel: r,
29
- setErrorLabel: a,
30
- actionLabel: m,
31
- setActionLabel: p,
32
- knockSlackChannelId: t,
33
- tenant: o
26
+ connectionStatus: r,
27
+ setConnectionStatus: a,
28
+ errorLabel: e,
29
+ setErrorLabel: m,
30
+ actionLabel: u,
31
+ setActionLabel: l,
32
+ knockSlackChannelId: o,
33
+ tenant: t
34
34
  },
35
- children: /* @__PURE__ */ n(v, { client: f, children: s })
35
+ children: c
36
36
  },
37
- d({
38
- knockSlackChannelId: t,
39
- tenant: o,
40
- connectionStatus: e,
41
- errorLabel: r
37
+ v({
38
+ knockSlackChannelId: o,
39
+ tenant: t,
40
+ connectionStatus: r,
41
+ errorLabel: e
42
42
  })
43
43
  );
44
- }, Q = () => {
45
- const t = i.useContext(
46
- c
44
+ }, w = () => {
45
+ const o = i.useContext(
46
+ n
47
47
  );
48
- if (t === void 0)
48
+ if (o === void 0)
49
49
  throw new Error(
50
50
  "useKnockSlackClient must be used within a KnockSlackProvider"
51
51
  );
52
- return t;
52
+ return o;
53
53
  };
54
54
  export {
55
- E as KnockSlackProvider,
56
- Q as useKnockSlackClient
55
+ L as KnockSlackProvider,
56
+ w as useKnockSlackClient
57
57
  };
58
58
  //# sourceMappingURL=KnockSlackProvider.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"KnockSlackProvider.mjs","sources":["../../../../../src/modules/slack/context/KnockSlackProvider.tsx"],"sourcesContent":["import { useSlackConnectionStatus } from \"..\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport * as React from \"react\";\n\nimport { slackProviderKey } from \"../../core\";\nimport { useKnockClient } from \"../../core\";\nimport { ConnectionStatus } from \"../hooks/useSlackConnectionStatus\";\n\nconst queryClient = new QueryClient();\n\nexport interface KnockSlackProviderState {\n knockSlackChannelId: string;\n tenant: string;\n connectionStatus: ConnectionStatus;\n setConnectionStatus: (connectionStatus: ConnectionStatus) => void;\n errorLabel: string | null;\n setErrorLabel: (label: string) => void;\n actionLabel: string | null;\n setActionLabel: (label: string | null) => void;\n}\n\nconst SlackProviderStateContext =\n React.createContext<KnockSlackProviderState | null>(null);\n\nexport interface KnockSlackProviderProps {\n knockSlackChannelId: string;\n tenant: string;\n children?: React.ReactElement;\n}\n\nexport const KnockSlackProvider: React.FC<KnockSlackProviderProps> = ({\n knockSlackChannelId,\n tenant,\n children,\n}) => {\n const knock = useKnockClient();\n\n const {\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n } = useSlackConnectionStatus(knock, knockSlackChannelId, tenant);\n\n return (\n <SlackProviderStateContext.Provider\n key={slackProviderKey({\n knockSlackChannelId,\n tenant,\n connectionStatus,\n errorLabel,\n })}\n value={{\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n knockSlackChannelId,\n tenant,\n }}\n >\n <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>\n </SlackProviderStateContext.Provider>\n );\n};\n\nexport const useKnockSlackClient = (): KnockSlackProviderState => {\n const context = React.useContext(\n SlackProviderStateContext,\n ) as KnockSlackProviderState;\n if (context === undefined) {\n throw new Error(\n \"useKnockSlackClient must be used within a KnockSlackProvider\",\n );\n }\n return context as KnockSlackProviderState;\n};\n"],"names":["queryClient","QueryClient","SlackProviderStateContext","React","KnockSlackProvider","knockSlackChannelId","tenant","children","knock","useKnockClient","connectionStatus","setConnectionStatus","errorLabel","setErrorLabel","actionLabel","setActionLabel","useSlackConnectionStatus","jsx","QueryClientProvider","slackProviderKey","useKnockSlackClient","context"],"mappings":";;;;;;;;AAQA,MAAMA,IAAc,IAAIC,KAalBC,IACJC,EAAM,cAA8C,IAAI,GAQ7CC,IAAwD,CAAC;AAAA,EACpE,qBAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AACF,MAAM;AACJ,QAAMC,IAAQC,KAER;AAAA,IACJ,kBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,eAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,EACE,IAAAC,EAAyBR,GAAOH,GAAqBC,CAAM;AAG7D,SAAA,gBAAAW;AAAA,IAACf,EAA0B;AAAA,IAA1B;AAAA,MAOC,OAAO;AAAA,QACL,kBAAAQ;AAAA,QACA,qBAAAC;AAAA,QACA,YAAAC;AAAA,QACA,eAAAC;AAAA,QACA,aAAAC;AAAA,QACA,gBAAAC;AAAA,QACA,qBAAAV;AAAA,QACA,QAAAC;AAAA,MACF;AAAA,MAEA,UAAC,gBAAAW,EAAAC,GAAA,EAAoB,QAAQlB,GAAc,UAAAO,GAAS;AAAA,IAAA;AAAA,IAjB/CY,EAAiB;AAAA,MACpB,qBAAAd;AAAA,MACA,QAAAC;AAAA,MACA,kBAAAI;AAAA,MACA,YAAAE;AAAA,IAAA,CACD;AAAA,EAAA;AAeP,GAEaQ,IAAsB,MAA+B;AAChE,QAAMC,IAAUlB,EAAM;AAAA,IACpBD;AAAA,EAAA;AAEF,MAAImB,MAAY;AACd,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAGG,SAAAA;AACT;"}
1
+ {"version":3,"file":"KnockSlackProvider.mjs","sources":["../../../../../src/modules/slack/context/KnockSlackProvider.tsx"],"sourcesContent":["import { useSlackConnectionStatus } from \"..\";\nimport * as React from \"react\";\n\nimport { slackProviderKey } from \"../../core\";\nimport { useKnockClient } from \"../../core\";\nimport { ConnectionStatus } from \"../hooks/useSlackConnectionStatus\";\n\nexport interface KnockSlackProviderState {\n knockSlackChannelId: string;\n tenant: string;\n connectionStatus: ConnectionStatus;\n setConnectionStatus: (connectionStatus: ConnectionStatus) => void;\n errorLabel: string | null;\n setErrorLabel: (label: string) => void;\n actionLabel: string | null;\n setActionLabel: (label: string | null) => void;\n}\n\nconst SlackProviderStateContext =\n React.createContext<KnockSlackProviderState | null>(null);\n\nexport interface KnockSlackProviderProps {\n knockSlackChannelId: string;\n tenant: string;\n children?: React.ReactElement;\n}\n\nexport const KnockSlackProvider: React.FC<KnockSlackProviderProps> = ({\n knockSlackChannelId,\n tenant,\n children,\n}) => {\n const knock = useKnockClient();\n\n const {\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n } = useSlackConnectionStatus(knock, knockSlackChannelId, tenant);\n\n return (\n <SlackProviderStateContext.Provider\n key={slackProviderKey({\n knockSlackChannelId,\n tenant,\n connectionStatus,\n errorLabel,\n })}\n value={{\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n knockSlackChannelId,\n tenant,\n }}\n >\n {children}\n </SlackProviderStateContext.Provider>\n );\n};\n\nexport const useKnockSlackClient = (): KnockSlackProviderState => {\n const context = React.useContext(\n SlackProviderStateContext,\n ) as KnockSlackProviderState;\n if (context === undefined) {\n throw new Error(\n \"useKnockSlackClient must be used within a KnockSlackProvider\",\n );\n }\n return context as KnockSlackProviderState;\n};\n"],"names":["SlackProviderStateContext","React","KnockSlackProvider","knockSlackChannelId","tenant","children","knock","useKnockClient","connectionStatus","setConnectionStatus","errorLabel","setErrorLabel","actionLabel","setActionLabel","useSlackConnectionStatus","jsx","slackProviderKey","useKnockSlackClient","context"],"mappings":";;;;;;;;AAkBA,MAAMA,IACJC,EAAM,cAA8C,IAAI,GAQ7CC,IAAwD,CAAC;AAAA,EACpE,qBAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AACF,MAAM;AACJ,QAAMC,IAAQC,KAER;AAAA,IACJ,kBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,eAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,EACE,IAAAC,EAAyBR,GAAOH,GAAqBC,CAAM;AAG7D,SAAA,gBAAAW;AAAA,IAACf,EAA0B;AAAA,IAA1B;AAAA,MAOC,OAAO;AAAA,QACL,kBAAAQ;AAAA,QACA,qBAAAC;AAAA,QACA,YAAAC;AAAA,QACA,eAAAC;AAAA,QACA,aAAAC;AAAA,QACA,gBAAAC;AAAA,QACA,qBAAAV;AAAA,QACA,QAAAC;AAAA,MACF;AAAA,MAEC,UAAAC;AAAA,IAAA;AAAA,IAjBIW,EAAiB;AAAA,MACpB,qBAAAb;AAAA,MACA,QAAAC;AAAA,MACA,kBAAAI;AAAA,MACA,YAAAE;AAAA,IAAA,CACD;AAAA,EAAA;AAeP,GAEaO,IAAsB,MAA+B;AAChE,QAAMC,IAAUjB,EAAM;AAAA,IACpBD;AAAA,EAAA;AAEF,MAAIkB,MAAY;AACd,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAGG,SAAAA;AACT;"}
@@ -2,7 +2,7 @@ import { useKnockSlackClient as b } from "../context/KnockSlackProvider.mjs";
2
2
  import { useState as t, useCallback as y, useEffect as E } from "react";
3
3
  import "../../i18n/context/KnockI18nProvider.mjs";
4
4
  import { useTranslations as I } from "../../i18n/hooks/useTranslations.mjs";
5
- import "@tanstack/react-query";
5
+ import "swr/infinite";
6
6
  import { useKnockClient as j } from "../../core/context/KnockProvider.mjs";
7
7
  import "@knocklabs/client";
8
8
  import "date-fns";
@@ -1,7 +1,7 @@
1
1
  import { useKnockSlackClient as k } from "../context/KnockSlackProvider.mjs";
2
2
  import { useCallback as i } from "react";
3
3
  import "../../i18n/context/KnockI18nProvider.mjs";
4
- import "@tanstack/react-query";
4
+ import "swr/infinite";
5
5
  import { useKnockClient as u } from "../../core/context/KnockProvider.mjs";
6
6
  import { TENANT_OBJECT_COLLECTION as m } from "@knocklabs/client";
7
7
  import "date-fns";
@@ -1,51 +1,50 @@
1
- import { useKnockSlackClient as s } from "../context/KnockSlackProvider.mjs";
2
- import { useMemo as N, useEffect as E } from "react";
1
+ import { useKnockSlackClient as L } from "../context/KnockSlackProvider.mjs";
2
+ import { useMemo as N, useEffect as g } from "react";
3
3
  import "../../i18n/context/KnockI18nProvider.mjs";
4
- import { useInfiniteQuery as I } from "@tanstack/react-query";
5
- import { useKnockClient as S } from "../../core/context/KnockProvider.mjs";
4
+ import A from "swr/infinite";
5
+ import { useKnockClient as I } from "../../core/context/KnockProvider.mjs";
6
6
  import "@knocklabs/client";
7
7
  import "date-fns";
8
- const M = 1e3, d = 200, A = "private_channel,public_channel";
8
+ const P = 1e3, K = 200, M = "private_channel,public_channel", u = "SLACK_CHANNELS";
9
+ function z(n, e) {
10
+ return n === 0 ? [u, ""] : e && ["", null].includes(e.next_cursor) ? null : [u, e.next_cursor];
11
+ }
9
12
  function G({
10
- queryOptions: c
13
+ queryOptions: n
11
14
  }) {
12
- const k = S(), { knockSlackChannelId: C, tenant: _, connectionStatus: r } = s(), u = ({ pageParam: n }) => k.slack.getChannels({
13
- tenant: _,
14
- knockChannelId: C,
15
+ var C, _;
16
+ const e = I(), { knockSlackChannelId: S, tenant: d, connectionStatus: a } = L(), x = (c) => e.slack.getChannels({
17
+ tenant: d,
18
+ knockChannelId: S,
15
19
  queryOptions: {
16
- ...c,
17
- cursor: n,
18
- limit: (c == null ? void 0 : c.limitPerPage) || d,
19
- types: (c == null ? void 0 : c.types) || A
20
+ ...n,
21
+ cursor: c ? c[1] : "",
22
+ limit: (n == null ? void 0 : n.limitPerPage) || K,
23
+ types: (n == null ? void 0 : n.types) || M
20
24
  }
21
- }), {
22
- data: t,
23
- isLoading: x,
24
- isFetching: m,
25
- fetchNextPage: f,
26
- hasNextPage: i,
27
- refetch: a,
28
- error: h
29
- } = I({
30
- queryKey: ["slackChannels"],
31
- queryFn: u,
32
- initialPageParam: "",
33
- getNextPageParam: (n) => (n == null ? void 0 : n.next_cursor) === "" ? null : n == null ? void 0 : n.next_cursor
34
- }), e = N(() => {
35
- var n;
36
- return ((n = t == null ? void 0 : t.pages) == null ? void 0 : n.flatMap((o) => o == null ? void 0 : o.slack_channels).filter((o) => !!o)) || [];
37
- }, [t == null ? void 0 : t.pages]), l = (c == null ? void 0 : c.maxCount) || M;
38
- return E(() => {
39
- r === "connected" && !h && i && !m && (e == null ? void 0 : e.length) < l && f();
25
+ }), { data: t, error: i, isLoading: l, isValidating: o, size: f, setSize: m, mutate: E } = A(z, x, {
26
+ initialSize: 0
27
+ }), s = (t == null ? void 0 : t.length) || 0, h = s === 0 || t && ((C = t[s]) == null ? void 0 : C.next_cursor) && ((_ = t[s]) == null ? void 0 : _.next_cursor) !== "", r = N(
28
+ () => (t ?? []).flatMap((c) => c == null ? void 0 : c.slack_channels).filter((c) => !!c),
29
+ [t]
30
+ ), k = (n == null ? void 0 : n.maxCount) || P;
31
+ return g(() => {
32
+ a === "connected" && !i && h && !l && !o && r.length < k && m(f + 1);
40
33
  }, [
41
- e == null ? void 0 : e.length,
42
- f,
43
- i,
34
+ r.length,
44
35
  m,
45
- l,
36
+ f,
46
37
  h,
47
- r
48
- ]), { data: e, isLoading: x, refetch: a };
38
+ l,
39
+ o,
40
+ k,
41
+ i,
42
+ a
43
+ ]), {
44
+ data: r,
45
+ isLoading: l || o,
46
+ refetch: () => E()
47
+ };
49
48
  }
50
49
  export {
51
50
  G as default
@@ -1 +1 @@
1
- {"version":3,"file":"useSlackChannels.mjs","sources":["../../../../../src/modules/slack/hooks/useSlackChannels.ts"],"sourcesContent":["import { SlackChannelQueryOptions, useKnockSlackClient } from \"..\";\nimport { SlackChannel } from \"@knocklabs/client\";\nimport { useInfiniteQuery } from \"@tanstack/react-query\";\nimport { useEffect, useMemo } from \"react\";\n\nimport { useKnockClient } from \"../../core\";\n\nconst MAX_COUNT = 1000;\nconst LIMIT_PER_PAGE = 200;\nconst CHANNEL_TYPES = \"private_channel,public_channel\";\n\ntype UseSlackChannelsProps = {\n queryOptions?: SlackChannelQueryOptions;\n};\n\ntype UseSlackChannelOutput = {\n data: SlackChannel[];\n isLoading: boolean;\n refetch: () => void;\n};\n\nfunction useSlackChannels({\n queryOptions,\n}: UseSlackChannelsProps): UseSlackChannelOutput {\n const knock = useKnockClient();\n const { knockSlackChannelId, tenant, connectionStatus } =\n useKnockSlackClient();\n\n const fetchChannels = ({ pageParam }: { pageParam: string }) => {\n return knock.slack.getChannels({\n tenant,\n knockChannelId: knockSlackChannelId,\n queryOptions: {\n ...queryOptions,\n cursor: pageParam,\n limit: queryOptions?.limitPerPage || LIMIT_PER_PAGE,\n types: queryOptions?.types || CHANNEL_TYPES,\n },\n });\n };\n\n const {\n data,\n isLoading,\n isFetching,\n fetchNextPage,\n hasNextPage,\n refetch,\n error,\n } = useInfiniteQuery({\n queryKey: [\"slackChannels\"],\n queryFn: fetchChannels,\n initialPageParam: \"\",\n getNextPageParam: (lastPage) =>\n lastPage?.next_cursor === \"\" ? null : lastPage?.next_cursor,\n });\n\n const slackChannels = useMemo(() => {\n return (\n data?.pages\n ?.flatMap((page) => page?.slack_channels)\n .filter((channel) => !!channel) || []\n );\n }, [data?.pages]);\n\n const maxCount = queryOptions?.maxCount || MAX_COUNT;\n\n useEffect(() => {\n if (\n connectionStatus === \"connected\" &&\n !error &&\n hasNextPage &&\n !isFetching &&\n slackChannels?.length < maxCount\n ) {\n fetchNextPage();\n }\n }, [\n slackChannels?.length,\n fetchNextPage,\n hasNextPage,\n isFetching,\n maxCount,\n error,\n connectionStatus,\n ]);\n\n return { data: slackChannels, isLoading, refetch };\n}\n\nexport default useSlackChannels;\n"],"names":["MAX_COUNT","LIMIT_PER_PAGE","CHANNEL_TYPES","useSlackChannels","queryOptions","knock","useKnockClient","knockSlackChannelId","tenant","connectionStatus","useKnockSlackClient","fetchChannels","pageParam","data","isLoading","isFetching","fetchNextPage","hasNextPage","refetch","error","useInfiniteQuery","lastPage","slackChannels","useMemo","_a","page","channel","maxCount","useEffect"],"mappings":";;;;;;;AAOA,MAAMA,IAAY,KACZC,IAAiB,KACjBC,IAAgB;AAYtB,SAASC,EAAiB;AAAA,EACxB,cAAAC;AACF,GAAiD;AAC/C,QAAMC,IAAQC,KACR,EAAE,qBAAAC,GAAqB,QAAAC,GAAQ,kBAAAC,MACnCC,EAAoB,GAEhBC,IAAgB,CAAC,EAAE,WAAAC,QAChBP,EAAM,MAAM,YAAY;AAAA,IAC7B,QAAAG;AAAA,IACA,gBAAgBD;AAAA,IAChB,cAAc;AAAA,MACZ,GAAGH;AAAA,MACH,QAAQQ;AAAA,MACR,QAAOR,KAAA,gBAAAA,EAAc,iBAAgBH;AAAA,MACrC,QAAOG,KAAA,gBAAAA,EAAc,UAASF;AAAA,IAChC;AAAA,EAAA,CACD,GAGG;AAAA,IACJ,MAAAW;AAAA,IACA,WAAAC;AAAA,IACA,YAAAC;AAAA,IACA,eAAAC;AAAA,IACA,aAAAC;AAAA,IACA,SAAAC;AAAA,IACA,OAAAC;AAAA,MACEC,EAAiB;AAAA,IACnB,UAAU,CAAC,eAAe;AAAA,IAC1B,SAAST;AAAA,IACT,kBAAkB;AAAA,IAClB,kBAAkB,CAACU,OACjBA,KAAA,gBAAAA,EAAU,iBAAgB,KAAK,OAAOA,KAAA,gBAAAA,EAAU;AAAA,EAAA,CACnD,GAEKC,IAAgBC,EAAQ,MAAM;;AAClC,aACEC,IAAAX,KAAA,gBAAAA,EAAM,UAAN,gBAAAW,EACI,QAAQ,CAACC,MAASA,KAAA,gBAAAA,EAAM,gBACzB,OAAO,CAACC,MAAY,CAAC,CAACA,OAAY,CAAA;AAAA,EAAC,GAEvC,CAACb,KAAA,gBAAAA,EAAM,KAAK,CAAC,GAEVc,KAAWvB,KAAA,gBAAAA,EAAc,aAAYJ;AAE3C,SAAA4B,EAAU,MAAM;AAEZ,IAAAnB,MAAqB,eACrB,CAACU,KACDF,KACA,CAACF,MACDO,KAAA,gBAAAA,EAAe,UAASK,KAEVX;EAChB,GACC;AAAA,IACDM,KAAA,gBAAAA,EAAe;AAAA,IACfN;AAAA,IACAC;AAAA,IACAF;AAAA,IACAY;AAAA,IACAR;AAAA,IACAV;AAAA,EAAA,CACD,GAEM,EAAE,MAAMa,GAAe,WAAAR,GAAW,SAAAI,EAAQ;AACnD;"}
1
+ {"version":3,"file":"useSlackChannels.mjs","sources":["../../../../../src/modules/slack/hooks/useSlackChannels.ts"],"sourcesContent":["import { SlackChannelQueryOptions, useKnockSlackClient } from \"..\";\nimport { GetSlackChannelsResponse, SlackChannel } from \"@knocklabs/client\";\nimport { useEffect, useMemo } from \"react\";\nimport useSWRInfinite from \"swr/infinite\";\n\nimport { useKnockClient } from \"../../core\";\n\nconst MAX_COUNT = 1000;\nconst LIMIT_PER_PAGE = 200;\nconst CHANNEL_TYPES = \"private_channel,public_channel\";\n\nconst QUERY_KEY = \"SLACK_CHANNELS\";\n\ntype UseSlackChannelsProps = {\n queryOptions?: SlackChannelQueryOptions;\n};\n\ntype UseSlackChannelOutput = {\n data: SlackChannel[];\n isLoading: boolean;\n refetch: () => void;\n};\n\ntype QueryKey = [key: string, cursor: string] | null;\n\nfunction getQueryKey(\n pageIndex: number,\n previousPageData: GetSlackChannelsResponse,\n): QueryKey {\n // First page so just pass empty\n if (pageIndex === 0) {\n return [QUERY_KEY, \"\"];\n }\n\n // If there's no more data then return an empty next cursor\n if (previousPageData && [\"\", null].includes(previousPageData.next_cursor)) {\n return null;\n }\n\n // Next cursor exists so pass it\n return [QUERY_KEY, previousPageData.next_cursor];\n}\n\nfunction useSlackChannels({\n queryOptions,\n}: UseSlackChannelsProps): UseSlackChannelOutput {\n const knock = useKnockClient();\n const { knockSlackChannelId, tenant, connectionStatus } =\n useKnockSlackClient();\n\n const fetchChannels = (queryKey: QueryKey) => {\n return knock.slack.getChannels({\n tenant,\n knockChannelId: knockSlackChannelId,\n queryOptions: {\n ...queryOptions,\n cursor: queryKey ? queryKey[1] : \"\",\n limit: queryOptions?.limitPerPage || LIMIT_PER_PAGE,\n types: queryOptions?.types || CHANNEL_TYPES,\n },\n });\n };\n\n const { data, error, isLoading, isValidating, size, setSize, mutate } =\n useSWRInfinite<GetSlackChannelsResponse>(getQueryKey, fetchChannels, {\n initialSize: 0,\n });\n\n const currentPage = data?.length || 0;\n\n const hasNextPage =\n currentPage === 0 ||\n (data &&\n data[currentPage]?.next_cursor &&\n data[currentPage]?.next_cursor !== \"\");\n\n const slackChannels: SlackChannel[] = useMemo(\n () =>\n (data ?? [])\n .flatMap((page) => page?.slack_channels)\n .filter((channel) => !!channel),\n [data],\n );\n\n const maxCount = queryOptions?.maxCount || MAX_COUNT;\n\n useEffect(() => {\n if (\n connectionStatus === \"connected\" &&\n !error &&\n hasNextPage &&\n !isLoading &&\n !isValidating &&\n slackChannels.length < maxCount\n ) {\n // Fetch a page at a time until we have nothing else left to fetch\n // or we've already hit the max amount of channels to fetch\n setSize(size + 1);\n }\n }, [\n slackChannels.length,\n setSize,\n size,\n hasNextPage,\n isLoading,\n isValidating,\n maxCount,\n error,\n connectionStatus,\n ]);\n\n return {\n data: slackChannels,\n isLoading: isLoading || isValidating,\n refetch: () => mutate(),\n };\n}\n\nexport default useSlackChannels;\n"],"names":["MAX_COUNT","LIMIT_PER_PAGE","CHANNEL_TYPES","QUERY_KEY","getQueryKey","pageIndex","previousPageData","useSlackChannels","queryOptions","knock","useKnockClient","knockSlackChannelId","tenant","connectionStatus","useKnockSlackClient","fetchChannels","queryKey","data","error","isLoading","isValidating","size","setSize","mutate","useSWRInfinite","currentPage","hasNextPage","_a","_b","slackChannels","useMemo","page","channel","maxCount","useEffect"],"mappings":";;;;;;;AAOA,MAAMA,IAAY,KACZC,IAAiB,KACjBC,IAAgB,kCAEhBC,IAAY;AAclB,SAASC,EACPC,GACAC,GACU;AAEV,SAAID,MAAc,IACT,CAACF,GAAW,EAAE,IAInBG,KAAoB,CAAC,IAAI,IAAI,EAAE,SAASA,EAAiB,WAAW,IAC/D,OAIF,CAACH,GAAWG,EAAiB,WAAW;AACjD;AAEA,SAASC,EAAiB;AAAA,EACxB,cAAAC;AACF,GAAiD;;AAC/C,QAAMC,IAAQC,KACR,EAAE,qBAAAC,GAAqB,QAAAC,GAAQ,kBAAAC,MACnCC,EAAoB,GAEhBC,IAAgB,CAACC,MACdP,EAAM,MAAM,YAAY;AAAA,IAC7B,QAAAG;AAAA,IACA,gBAAgBD;AAAA,IAChB,cAAc;AAAA,MACZ,GAAGH;AAAA,MACH,QAAQQ,IAAWA,EAAS,CAAC,IAAI;AAAA,MACjC,QAAOR,KAAA,gBAAAA,EAAc,iBAAgBP;AAAA,MACrC,QAAOO,KAAA,gBAAAA,EAAc,UAASN;AAAA,IAChC;AAAA,EAAA,CACD,GAGG,EAAE,MAAAe,GAAM,OAAAC,GAAO,WAAAC,GAAW,cAAAC,GAAc,MAAAC,GAAM,SAAAC,GAAS,QAAAC,EAAO,IAClEC,EAAyCpB,GAAaW,GAAe;AAAA,IACnE,aAAa;AAAA,EAAA,CACd,GAEGU,KAAcR,KAAA,gBAAAA,EAAM,WAAU,GAE9BS,IACJD,MAAgB,KACfR,OACCU,IAAAV,EAAKQ,CAAW,MAAhB,gBAAAE,EAAmB,kBACnBC,IAAAX,EAAKQ,CAAW,MAAhB,gBAAAG,EAAmB,iBAAgB,IAEjCC,IAAgCC;AAAA,IACpC,OACGb,KAAQ,CAAA,GACN,QAAQ,CAACc,MAASA,KAAA,gBAAAA,EAAM,cAAc,EACtC,OAAO,CAACC,MAAY,CAAC,CAACA,CAAO;AAAA,IAClC,CAACf,CAAI;AAAA,EAAA,GAGDgB,KAAWzB,KAAA,gBAAAA,EAAc,aAAYR;AAE3C,SAAAkC,EAAU,MAAM;AAEZ,IAAArB,MAAqB,eACrB,CAACK,KACDQ,KACA,CAACP,KACD,CAACC,KACDS,EAAc,SAASI,KAIvBX,EAAQD,IAAO,CAAC;AAAA,EAClB,GACC;AAAA,IACDQ,EAAc;AAAA,IACdP;AAAA,IACAD;AAAA,IACAK;AAAA,IACAP;AAAA,IACAC;AAAA,IACAa;AAAA,IACAf;AAAA,IACAL;AAAA,EAAA,CACD,GAEM;AAAA,IACL,MAAMgB;AAAA,IACN,WAAWV,KAAaC;AAAA,IACxB,SAAS,MAAMG,EAAO;AAAA,EAAA;AAE1B;"}
@@ -1 +1 @@
1
- {"version":3,"file":"KnockSlackProvider.d.ts","sourceRoot":"","sources":["../../../../../src/modules/slack/context/KnockSlackProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAIrE,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,mBAAmB,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAChD;AAKD,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;CAC/B;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAsChE,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAO,uBAUtC,CAAC"}
1
+ {"version":3,"file":"KnockSlackProvider.d.ts","sourceRoot":"","sources":["../../../../../src/modules/slack/context/KnockSlackProvider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAErE,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,mBAAmB,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAChD;AAKD,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;CAC/B;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAsChE,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAO,uBAUtC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useSlackChannels.d.ts","sourceRoot":"","sources":["../../../../../src/modules/slack/hooks/useSlackChannels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAuB,MAAM,IAAI,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAUjD,KAAK,qBAAqB,GAAG;IAC3B,YAAY,CAAC,EAAE,wBAAwB,CAAC;CACzC,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,iBAAS,gBAAgB,CAAC,EACxB,YAAY,GACb,EAAE,qBAAqB,GAAG,qBAAqB,CAiE/C;AAED,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"useSlackChannels.d.ts","sourceRoot":"","sources":["../../../../../src/modules/slack/hooks/useSlackChannels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAuB,MAAM,IAAI,CAAC;AACnE,OAAO,EAA4B,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAY3E,KAAK,qBAAqB,GAAG;IAC3B,YAAY,CAAC,EAAE,wBAAwB,CAAC;CACzC,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAsBF,iBAAS,gBAAgB,CAAC,EACxB,YAAY,GACb,EAAE,qBAAqB,GAAG,qBAAqB,CAuE/C;AAED,eAAe,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@knocklabs/react-core",
3
3
  "description": "A set of React components to build notification experiences powered by Knock",
4
4
  "author": "@knocklabs",
5
- "version": "0.2.6",
5
+ "version": "0.2.8",
6
6
  "license": "MIT",
7
7
  "main": "dist/cjs/index.js",
8
8
  "module": "dist/esm/index.mjs",
@@ -45,12 +45,12 @@
45
45
  "url": "https://github.com/knocklabs/javascript/issues"
46
46
  },
47
47
  "peerDependencies": {
48
- "react": ">=16.8.0"
48
+ "react": "^16.11.0 || ^17.0.0 || ^18.0.0"
49
49
  },
50
50
  "dependencies": {
51
- "@knocklabs/client": "^0.9.4",
52
- "@tanstack/react-query": "^5.18.1",
51
+ "@knocklabs/client": "^0.10.1",
53
52
  "date-fns": "^3.3.1",
53
+ "swr": "^2.2.5",
54
54
  "zustand": "^3.7.2"
55
55
  },
56
56
  "devDependencies": {
@@ -1,13 +1,10 @@
1
1
  import { useSlackConnectionStatus } from "..";
2
- import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
3
2
  import * as React from "react";
4
3
 
5
4
  import { slackProviderKey } from "../../core";
6
5
  import { useKnockClient } from "../../core";
7
6
  import { ConnectionStatus } from "../hooks/useSlackConnectionStatus";
8
7
 
9
- const queryClient = new QueryClient();
10
-
11
8
  export interface KnockSlackProviderState {
12
9
  knockSlackChannelId: string;
13
10
  tenant: string;
@@ -63,7 +60,7 @@ export const KnockSlackProvider: React.FC<KnockSlackProviderProps> = ({
63
60
  tenant,
64
61
  }}
65
62
  >
66
- <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
63
+ {children}
67
64
  </SlackProviderStateContext.Provider>
68
65
  );
69
66
  };
@@ -1,7 +1,7 @@
1
1
  import { SlackChannelQueryOptions, useKnockSlackClient } from "..";
2
- import { SlackChannel } from "@knocklabs/client";
3
- import { useInfiniteQuery } from "@tanstack/react-query";
2
+ import { GetSlackChannelsResponse, SlackChannel } from "@knocklabs/client";
4
3
  import { useEffect, useMemo } from "react";
4
+ import useSWRInfinite from "swr/infinite";
5
5
 
6
6
  import { useKnockClient } from "../../core";
7
7
 
@@ -9,6 +9,8 @@ const MAX_COUNT = 1000;
9
9
  const LIMIT_PER_PAGE = 200;
10
10
  const CHANNEL_TYPES = "private_channel,public_channel";
11
11
 
12
+ const QUERY_KEY = "SLACK_CHANNELS";
13
+
12
14
  type UseSlackChannelsProps = {
13
15
  queryOptions?: SlackChannelQueryOptions;
14
16
  };
@@ -19,6 +21,26 @@ type UseSlackChannelOutput = {
19
21
  refetch: () => void;
20
22
  };
21
23
 
24
+ type QueryKey = [key: string, cursor: string] | null;
25
+
26
+ function getQueryKey(
27
+ pageIndex: number,
28
+ previousPageData: GetSlackChannelsResponse,
29
+ ): QueryKey {
30
+ // First page so just pass empty
31
+ if (pageIndex === 0) {
32
+ return [QUERY_KEY, ""];
33
+ }
34
+
35
+ // If there's no more data then return an empty next cursor
36
+ if (previousPageData && ["", null].includes(previousPageData.next_cursor)) {
37
+ return null;
38
+ }
39
+
40
+ // Next cursor exists so pass it
41
+ return [QUERY_KEY, previousPageData.next_cursor];
42
+ }
43
+
22
44
  function useSlackChannels({
23
45
  queryOptions,
24
46
  }: UseSlackChannelsProps): UseSlackChannelOutput {
@@ -26,42 +48,39 @@ function useSlackChannels({
26
48
  const { knockSlackChannelId, tenant, connectionStatus } =
27
49
  useKnockSlackClient();
28
50
 
29
- const fetchChannels = ({ pageParam }: { pageParam: string }) => {
51
+ const fetchChannels = (queryKey: QueryKey) => {
30
52
  return knock.slack.getChannels({
31
53
  tenant,
32
54
  knockChannelId: knockSlackChannelId,
33
55
  queryOptions: {
34
56
  ...queryOptions,
35
- cursor: pageParam,
57
+ cursor: queryKey ? queryKey[1] : "",
36
58
  limit: queryOptions?.limitPerPage || LIMIT_PER_PAGE,
37
59
  types: queryOptions?.types || CHANNEL_TYPES,
38
60
  },
39
61
  });
40
62
  };
41
63
 
42
- const {
43
- data,
44
- isLoading,
45
- isFetching,
46
- fetchNextPage,
47
- hasNextPage,
48
- refetch,
49
- error,
50
- } = useInfiniteQuery({
51
- queryKey: ["slackChannels"],
52
- queryFn: fetchChannels,
53
- initialPageParam: "",
54
- getNextPageParam: (lastPage) =>
55
- lastPage?.next_cursor === "" ? null : lastPage?.next_cursor,
56
- });
57
-
58
- const slackChannels = useMemo(() => {
59
- return (
60
- data?.pages
61
- ?.flatMap((page) => page?.slack_channels)
62
- .filter((channel) => !!channel) || []
63
- );
64
- }, [data?.pages]);
64
+ const { data, error, isLoading, isValidating, size, setSize, mutate } =
65
+ useSWRInfinite<GetSlackChannelsResponse>(getQueryKey, fetchChannels, {
66
+ initialSize: 0,
67
+ });
68
+
69
+ const currentPage = data?.length || 0;
70
+
71
+ const hasNextPage =
72
+ currentPage === 0 ||
73
+ (data &&
74
+ data[currentPage]?.next_cursor &&
75
+ data[currentPage]?.next_cursor !== "");
76
+
77
+ const slackChannels: SlackChannel[] = useMemo(
78
+ () =>
79
+ (data ?? [])
80
+ .flatMap((page) => page?.slack_channels)
81
+ .filter((channel) => !!channel),
82
+ [data],
83
+ );
65
84
 
66
85
  const maxCount = queryOptions?.maxCount || MAX_COUNT;
67
86
 
@@ -70,22 +89,31 @@ function useSlackChannels({
70
89
  connectionStatus === "connected" &&
71
90
  !error &&
72
91
  hasNextPage &&
73
- !isFetching &&
74
- slackChannels?.length < maxCount
92
+ !isLoading &&
93
+ !isValidating &&
94
+ slackChannels.length < maxCount
75
95
  ) {
76
- fetchNextPage();
96
+ // Fetch a page at a time until we have nothing else left to fetch
97
+ // or we've already hit the max amount of channels to fetch
98
+ setSize(size + 1);
77
99
  }
78
100
  }, [
79
- slackChannels?.length,
80
- fetchNextPage,
101
+ slackChannels.length,
102
+ setSize,
103
+ size,
81
104
  hasNextPage,
82
- isFetching,
105
+ isLoading,
106
+ isValidating,
83
107
  maxCount,
84
108
  error,
85
109
  connectionStatus,
86
110
  ]);
87
111
 
88
- return { data: slackChannels, isLoading, refetch };
112
+ return {
113
+ data: slackChannels,
114
+ isLoading: isLoading || isValidating,
115
+ refetch: () => mutate(),
116
+ };
89
117
  }
90
118
 
91
119
  export default useSlackChannels;