@knocklabs/react-core 0.2.7 → 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 +9 -0
- package/dist/cjs/modules/slack/context/KnockSlackProvider.js +1 -1
- package/dist/cjs/modules/slack/context/KnockSlackProvider.js.map +1 -1
- package/dist/cjs/modules/slack/hooks/useConnectedSlackChannels.js +1 -1
- package/dist/cjs/modules/slack/hooks/useConnectedSlackChannels.js.map +1 -1
- package/dist/cjs/modules/slack/hooks/useSlackAuth.js +1 -1
- package/dist/cjs/modules/slack/hooks/useSlackAuth.js.map +1 -1
- package/dist/cjs/modules/slack/hooks/useSlackChannels.js +1 -1
- package/dist/cjs/modules/slack/hooks/useSlackChannels.js.map +1 -1
- package/dist/esm/modules/slack/context/KnockSlackProvider.mjs +39 -39
- package/dist/esm/modules/slack/context/KnockSlackProvider.mjs.map +1 -1
- package/dist/esm/modules/slack/hooks/useConnectedSlackChannels.mjs +1 -1
- package/dist/esm/modules/slack/hooks/useSlackAuth.mjs +1 -1
- package/dist/esm/modules/slack/hooks/useSlackChannels.mjs +37 -38
- package/dist/esm/modules/slack/hooks/useSlackChannels.mjs.map +1 -1
- package/dist/types/modules/slack/context/KnockSlackProvider.d.ts.map +1 -1
- package/dist/types/modules/slack/hooks/useSlackChannels.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/modules/slack/context/KnockSlackProvider.tsx +1 -4
- package/src/modules/slack/hooks/useSlackChannels.ts +62 -34
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
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
|
+
|
|
3
12
|
## 0.2.7
|
|
4
13
|
|
|
5
14
|
### Patch Changes
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const 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
|
|
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("
|
|
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":"
|
|
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("
|
|
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":"
|
|
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
|
|
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 {
|
|
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
|
|
2
|
-
import
|
|
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
|
|
7
|
+
import { slackProviderKey as v } from "../../core/utils.mjs";
|
|
8
8
|
import "../../i18n/context/KnockI18nProvider.mjs";
|
|
9
|
-
const
|
|
10
|
-
knockSlackChannelId:
|
|
11
|
-
tenant:
|
|
12
|
-
children:
|
|
9
|
+
const n = i.createContext(null), L = ({
|
|
10
|
+
knockSlackChannelId: o,
|
|
11
|
+
tenant: t,
|
|
12
|
+
children: c
|
|
13
13
|
}) => {
|
|
14
|
-
const
|
|
15
|
-
connectionStatus:
|
|
16
|
-
setConnectionStatus:
|
|
17
|
-
errorLabel:
|
|
18
|
-
setErrorLabel:
|
|
19
|
-
actionLabel:
|
|
20
|
-
setActionLabel:
|
|
21
|
-
} =
|
|
22
|
-
return /* @__PURE__ */
|
|
23
|
-
|
|
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:
|
|
27
|
-
setConnectionStatus:
|
|
28
|
-
errorLabel:
|
|
29
|
-
setErrorLabel:
|
|
30
|
-
actionLabel:
|
|
31
|
-
setActionLabel:
|
|
32
|
-
knockSlackChannelId:
|
|
33
|
-
tenant:
|
|
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:
|
|
35
|
+
children: c
|
|
36
36
|
},
|
|
37
|
-
|
|
38
|
-
knockSlackChannelId:
|
|
39
|
-
tenant:
|
|
40
|
-
connectionStatus:
|
|
41
|
-
errorLabel:
|
|
37
|
+
v({
|
|
38
|
+
knockSlackChannelId: o,
|
|
39
|
+
tenant: t,
|
|
40
|
+
connectionStatus: r,
|
|
41
|
+
errorLabel: e
|
|
42
42
|
})
|
|
43
43
|
);
|
|
44
|
-
},
|
|
45
|
-
const
|
|
46
|
-
|
|
44
|
+
}, w = () => {
|
|
45
|
+
const o = i.useContext(
|
|
46
|
+
n
|
|
47
47
|
);
|
|
48
|
-
if (
|
|
48
|
+
if (o === void 0)
|
|
49
49
|
throw new Error(
|
|
50
50
|
"useKnockSlackClient must be used within a KnockSlackProvider"
|
|
51
51
|
);
|
|
52
|
-
return
|
|
52
|
+
return o;
|
|
53
53
|
};
|
|
54
54
|
export {
|
|
55
|
-
|
|
56
|
-
|
|
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
|
|
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 "
|
|
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 "
|
|
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
|
|
2
|
-
import { useMemo as N, useEffect as
|
|
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
|
|
5
|
-
import { useKnockClient as
|
|
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
|
|
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:
|
|
13
|
+
queryOptions: n
|
|
11
14
|
}) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
...
|
|
17
|
-
cursor:
|
|
18
|
-
limit: (
|
|
19
|
-
types: (
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
42
|
-
f,
|
|
43
|
-
i,
|
|
34
|
+
r.length,
|
|
44
35
|
m,
|
|
45
|
-
|
|
36
|
+
f,
|
|
46
37
|
h,
|
|
47
|
-
|
|
48
|
-
|
|
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 {
|
|
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":"
|
|
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,
|
|
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.
|
|
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": "
|
|
48
|
+
"react": "^16.11.0 || ^17.0.0 || ^18.0.0"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@knocklabs/client": "^0.10.
|
|
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
|
-
|
|
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 = (
|
|
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:
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
!
|
|
74
|
-
|
|
92
|
+
!isLoading &&
|
|
93
|
+
!isValidating &&
|
|
94
|
+
slackChannels.length < maxCount
|
|
75
95
|
) {
|
|
76
|
-
|
|
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
|
|
80
|
-
|
|
101
|
+
slackChannels.length,
|
|
102
|
+
setSize,
|
|
103
|
+
size,
|
|
81
104
|
hasNextPage,
|
|
82
|
-
|
|
105
|
+
isLoading,
|
|
106
|
+
isValidating,
|
|
83
107
|
maxCount,
|
|
84
108
|
error,
|
|
85
109
|
connectionStatus,
|
|
86
110
|
]);
|
|
87
111
|
|
|
88
|
-
return {
|
|
112
|
+
return {
|
|
113
|
+
data: slackChannels,
|
|
114
|
+
isLoading: isLoading || isValidating,
|
|
115
|
+
refetch: () => mutate(),
|
|
116
|
+
};
|
|
89
117
|
}
|
|
90
118
|
|
|
91
119
|
export default useSlackChannels;
|