@knocklabs/react-core 0.2.26 → 0.2.28-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/modules/core/utils.js.map +1 -1
  3. package/dist/cjs/modules/slack/hooks/useConnectedSlackChannels.js.map +1 -1
  4. package/dist/cjs/modules/slack/hooks/useSlackAuth.js +1 -1
  5. package/dist/cjs/modules/slack/hooks/useSlackAuth.js.map +1 -1
  6. package/dist/cjs/modules/slack/hooks/useSlackConnectionStatus.js.map +1 -1
  7. package/dist/esm/modules/core/utils.mjs.map +1 -1
  8. package/dist/esm/modules/slack/hooks/useConnectedSlackChannels.mjs +2 -2
  9. package/dist/esm/modules/slack/hooks/useConnectedSlackChannels.mjs.map +1 -1
  10. package/dist/esm/modules/slack/hooks/useSlackAuth.mjs.map +1 -1
  11. package/dist/esm/modules/slack/hooks/useSlackConnectionStatus.mjs.map +1 -1
  12. package/dist/types/modules/core/context/KnockProvider.d.ts +0 -1
  13. package/dist/types/modules/core/hooks/useAuthenticatedKnockClient.d.ts +0 -1
  14. package/dist/types/modules/core/utils.d.ts +0 -1
  15. package/dist/types/modules/feed/context/KnockFeedProvider.d.ts +0 -1
  16. package/dist/types/modules/feed/hooks/useFeedSettings.d.ts +0 -1
  17. package/dist/types/modules/feed/hooks/useNotificationStore.d.ts +0 -1
  18. package/dist/types/modules/feed/hooks/useNotifications.d.ts +0 -1
  19. package/dist/types/modules/i18n/context/KnockI18nProvider.d.ts +0 -1
  20. package/dist/types/modules/i18n/languages/de.d.ts +0 -1
  21. package/dist/types/modules/i18n/languages/en.d.ts +0 -1
  22. package/dist/types/modules/slack/hooks/useConnectedSlackChannels.d.ts +0 -1
  23. package/dist/types/modules/slack/hooks/useSlackChannels.d.ts +0 -1
  24. package/dist/types/modules/slack/hooks/useSlackConnectionStatus.d.ts +0 -1
  25. package/package.json +11 -11
  26. package/src/modules/core/utils.ts +1 -1
  27. package/src/modules/slack/hooks/useConnectedSlackChannels.ts +1 -1
  28. package/src/modules/slack/hooks/useSlackAuth.ts +1 -1
  29. package/src/modules/slack/hooks/useSlackConnectionStatus.ts +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.28-rc.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [a859722]
8
+ - @knocklabs/client@0.10.16-rc.0
9
+
10
+ ## 0.2.27
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies [26166e3]
15
+ - @knocklabs/client@0.10.15
16
+
3
17
  ## 0.2.26
4
18
 
5
19
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../src/modules/core/utils.ts"],"sourcesContent":["import { FeedClientOptions } from \"@knocklabs/client\";\nimport { intlFormatDistance, parseISO } from \"date-fns\";\nimport { ReactNode } from \"react\";\n\nexport function formatBadgeCount(count: number): string | number {\n return count > 9 ? \"9+\" : count;\n}\n\ntype FormatTimestampOptions = {\n locale?: string | string[];\n};\n\nexport function formatTimestamp(\n ts: string,\n options: FormatTimestampOptions = {},\n) {\n try {\n const parsedTs = parseISO(ts);\n const formatted = intlFormatDistance(parsedTs, new Date(), {\n locale: options.locale,\n });\n\n return formatted;\n } catch (e) {\n return ts;\n }\n}\n\nexport function toSentenceCase(string: string): string {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nexport function renderNodeOrFallback(node: ReactNode, fallback: ReactNode) {\n return node !== undefined ? node : fallback;\n}\n\n/*\n Used to build a consistent key for the KnockFeedProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function feedProviderKey(\n userId: string | undefined,\n feedId: string,\n options: FeedClientOptions = {},\n) {\n return [\n userId,\n feedId,\n options.source,\n options.tenant,\n options.has_tenant,\n options.archived,\n ]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n\n/*\n Used to build a consistent key for the KnockSlackProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function slackProviderKey({\n knockSlackChannelId,\n tenant,\n connectionStatus,\n errorLabel,\n}: {\n knockSlackChannelId: string;\n tenant: string;\n connectionStatus: string;\n errorLabel: string | null;\n}) {\n return [knockSlackChannelId, tenant, connectionStatus, errorLabel]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n"],"names":["formatBadgeCount","count","formatTimestamp","ts","options","parsedTs","parseISO","formatted","intlFormatDistance","Date","locale","toSentenceCase","string","charAt","toUpperCase","slice","renderNodeOrFallback","node","fallback","undefined","feedProviderKey","userId","feedId","source","tenant","has_tenant","archived","filter","f","join","slackProviderKey","knockSlackChannelId","connectionStatus","errorLabel"],"mappings":"4GAIO,SAASA,EAAiBC,EAAgC,CACxDA,OAAAA,EAAQ,EAAI,KAAOA,CAC5B,CAMO,SAASC,EACdC,EACAC,EAAkC,GAClC,CACI,GAAA,CACIC,MAAAA,EAAWC,WAASH,CAAE,EAKrBI,OAJWC,EAAAA,mBAAmBH,EAAU,IAAII,KAAQ,CACzDC,OAAQN,EAAQM,MAAAA,CACjB,OAGS,CACHP,OAAAA,CACT,CACF,CAEO,SAASQ,EAAeC,EAAwB,CAC9CA,OAAAA,EAAOC,OAAO,CAAC,EAAEC,cAAgBF,EAAOG,MAAM,CAAC,CACxD,CAEgBC,SAAAA,EAAqBC,EAAiBC,EAAqB,CAClED,OAAAA,IAASE,OAAYF,EAAOC,CACrC,CAMO,SAASE,EACdC,EACAC,EACAlB,EAA6B,CAAA,EAC7B,CACO,MAAA,CACLiB,EACAC,EACAlB,EAAQmB,OACRnB,EAAQoB,OACRpB,EAAQqB,WACRrB,EAAQsB,QAAQ,EAEfC,UAAcC,GAAM,IAAuB,EAC3CC,KAAK,GAAG,CACb,CAMO,SAASC,EAAiB,CAC/BC,oBAAAA,EACAP,OAAAA,EACAQ,iBAAAA,EACAC,WAAAA,CAMF,EAAG,CACD,MAAO,CAACF,EAAqBP,EAAQQ,EAAkBC,CAAU,EAC9DN,OAAcC,GAAAA,GAAM,IAAuB,EAC3CC,KAAK,GAAG,CACb"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../src/modules/core/utils.ts"],"sourcesContent":["import { FeedClientOptions } from \"@knocklabs/client\";\nimport { intlFormatDistance, parseISO } from \"date-fns\";\nimport { ReactNode } from \"react\";\n\nexport function formatBadgeCount(count: number): string | number {\n return count > 9 ? \"9+\" : count;\n}\n\ntype FormatTimestampOptions = {\n locale?: string | string[];\n};\n\nexport function formatTimestamp(\n ts: string,\n options: FormatTimestampOptions = {},\n) {\n try {\n const parsedTs = parseISO(ts);\n const formatted = intlFormatDistance(parsedTs, new Date(), {\n locale: options.locale,\n });\n\n return formatted;\n } catch (_e) {\n return ts;\n }\n}\n\nexport function toSentenceCase(string: string): string {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nexport function renderNodeOrFallback(node: ReactNode, fallback: ReactNode) {\n return node !== undefined ? node : fallback;\n}\n\n/*\n Used to build a consistent key for the KnockFeedProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function feedProviderKey(\n userId: string | undefined,\n feedId: string,\n options: FeedClientOptions = {},\n) {\n return [\n userId,\n feedId,\n options.source,\n options.tenant,\n options.has_tenant,\n options.archived,\n ]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n\n/*\n Used to build a consistent key for the KnockSlackProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function slackProviderKey({\n knockSlackChannelId,\n tenant,\n connectionStatus,\n errorLabel,\n}: {\n knockSlackChannelId: string;\n tenant: string;\n connectionStatus: string;\n errorLabel: string | null;\n}) {\n return [knockSlackChannelId, tenant, connectionStatus, errorLabel]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n"],"names":["formatBadgeCount","count","formatTimestamp","ts","options","parsedTs","parseISO","formatted","intlFormatDistance","Date","locale","toSentenceCase","string","charAt","toUpperCase","slice","renderNodeOrFallback","node","fallback","undefined","feedProviderKey","userId","feedId","source","tenant","has_tenant","archived","filter","f","join","slackProviderKey","knockSlackChannelId","connectionStatus","errorLabel"],"mappings":"4GAIO,SAASA,EAAiBC,EAAgC,CACxDA,OAAAA,EAAQ,EAAI,KAAOA,CAC5B,CAMO,SAASC,EACdC,EACAC,EAAkC,GAClC,CACI,GAAA,CACIC,MAAAA,EAAWC,WAASH,CAAE,EAKrBI,OAJWC,EAAAA,mBAAmBH,EAAU,IAAII,KAAQ,CACzDC,OAAQN,EAAQM,MAAAA,CACjB,OAGU,CACJP,OAAAA,CACT,CACF,CAEO,SAASQ,EAAeC,EAAwB,CAC9CA,OAAAA,EAAOC,OAAO,CAAC,EAAEC,cAAgBF,EAAOG,MAAM,CAAC,CACxD,CAEgBC,SAAAA,EAAqBC,EAAiBC,EAAqB,CAClED,OAAAA,IAASE,OAAYF,EAAOC,CACrC,CAMO,SAASE,EACdC,EACAC,EACAlB,EAA6B,CAAA,EAC7B,CACO,MAAA,CACLiB,EACAC,EACAlB,EAAQmB,OACRnB,EAAQoB,OACRpB,EAAQqB,WACRrB,EAAQsB,QAAQ,EAEfC,UAAcC,GAAM,IAAuB,EAC3CC,KAAK,GAAG,CACb,CAMO,SAASC,EAAiB,CAC/BC,oBAAAA,EACAP,OAAAA,EACAQ,iBAAAA,EACAC,WAAAA,CAMF,EAAG,CACD,MAAO,CAACF,EAAqBP,EAAQQ,EAAkBC,CAAU,EAC9DN,OAAcC,GAAAA,GAAM,IAAuB,EAC3CC,KAAK,GAAG,CACb"}
@@ -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","slackChannelsRecipientObject","objectId","collection","t","useTranslations","knock","useKnockClient","connectionStatus","knockSlackChannelId","useKnockSlackClient","connectedChannels","setConnectedChannels","useState","error","setError","isLoading","setIsLoading","isUpdating","setIsUpdating","fetchAndSetConnectedChannels","useCallback","objects","getChannelData","channelId","then","res","data","connections","catch","useEffect","updateConnectedChannels","channelsToSendToKnock","setChannelData","updating","loading"],"mappings":"yVAqBA,SAASA,EAA0B,CACjCC,6BAA8B,CAAEC,SAAAA,EAAUC,WAAAA,CAAW,CAChC,EAA0B,CACzC,KAAA,CAAEC,EAAAA,GAAMC,EAAgB,gBAAA,EACxBC,EAAQC,EAAAA,iBACR,CAAEC,iBAAAA,EAAkBC,oBAAAA,GAAwBC,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,EAAMgB,QAAQC,eAAe,CACjCpB,WAAAA,EACAD,SAAAA,EACAsB,UAAWf,CAAAA,CACZ,GAEkB,EAClBgB,KAAcC,GAAA,UACTA,EAAAA,GAAAA,YAAAA,EAAKC,OAALD,MAAAA,EAAWE,YACQF,GAAAA,EAAAA,GAAAA,YAAAA,EAAKC,OAALD,YAAAA,EAAWE,WAAW,EAE3ChB,EAAqB,CAAE,CAAA,EAEzBG,EAAS,IAAI,EACbE,EAAa,EAAK,CAAA,CACnB,EACAY,MAAM,IAAM,CACXjB,EAAqB,CAAE,CAAA,EACvBG,EAAS,IAAI,EACbE,EAAa,EAAK,CAAA,CACnB,CAAA,EACF,CAACd,EAAYG,EAAMgB,QAASb,EAAqBP,CAAQ,CAAC,EAE7D4B,OAAAA,EAAAA,UAAU,IAAM,CAEZtB,IAAqB,aACrB,CAACG,GACD,CAACG,GACD,CAACE,GAE4BI,GAC/B,EACC,CACDT,EACAS,EACAJ,EACAF,EACAN,CAAgB,CACjB,EAoBM,CACLmB,KAAMhB,EACNoB,wBApB8B,MAC9BC,GACG,CACHb,EAAc,EAAI,EACd,GAAA,CACIb,MAAAA,EAAMgB,QAAQW,eAAe,CACjC/B,SAAAA,EACAC,WAAAA,EACAqB,UAAWf,EACXkB,KAAM,CAAEC,YAAaI,CAAsB,CAAA,CAC5C,EAC4BZ,SACf,CACLhB,EAAAA,EAAE,sBAAsB,GAAK,EAAE,CAC1C,CACAe,EAAc,EAAK,CAAA,EAMnBe,SAAUhB,EACViB,QAASnB,EACTF,MAAAA,CAAAA,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","slackChannelsRecipientObject","objectId","collection","t","useTranslations","knock","useKnockClient","connectionStatus","knockSlackChannelId","useKnockSlackClient","connectedChannels","setConnectedChannels","useState","error","setError","isLoading","setIsLoading","isUpdating","setIsUpdating","fetchAndSetConnectedChannels","useCallback","objects","getChannelData","channelId","then","res","data","connections","catch","useEffect","updateConnectedChannels","channelsToSendToKnock","setChannelData","updating","loading"],"mappings":"yVAqBA,SAASA,EAA0B,CACjCC,6BAA8B,CAAEC,SAAAA,EAAUC,WAAAA,CAAW,CAChC,EAA0B,CACzC,KAAA,CAAEC,EAAAA,GAAMC,EAAgB,gBAAA,EACxBC,EAAQC,EAAAA,iBACR,CAAEC,iBAAAA,EAAkBC,oBAAAA,GAAwBC,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,EAAMgB,QAAQC,eAAe,CACjCpB,WAAAA,EACAD,SAAAA,EACAsB,UAAWf,CAAAA,CACZ,GAEkB,EAClBgB,KAAcC,GAAA,UACTA,EAAAA,GAAAA,YAAAA,EAAKC,OAALD,MAAAA,EAAWE,YACQF,GAAAA,EAAAA,GAAAA,YAAAA,EAAKC,OAALD,YAAAA,EAAWE,WAAW,EAE3ChB,EAAqB,CAAE,CAAA,EAEzBG,EAAS,IAAI,EACbE,EAAa,EAAK,CAAA,CACnB,EACAY,MAAM,IAAM,CACXjB,EAAqB,CAAE,CAAA,EACvBG,EAAS,IAAI,EACbE,EAAa,EAAK,CAAA,CACnB,CAAA,EACF,CAACd,EAAYG,EAAMgB,QAASb,EAAqBP,CAAQ,CAAC,EAE7D4B,OAAAA,EAAAA,UAAU,IAAM,CAEZtB,IAAqB,aACrB,CAACG,GACD,CAACG,GACD,CAACE,GAE4BI,GAC/B,EACC,CACDT,EACAS,EACAJ,EACAF,EACAN,CAAgB,CACjB,EAoBM,CACLmB,KAAMhB,EACNoB,wBApB8B,MAC9BC,GACG,CACHb,EAAc,EAAI,EACd,GAAA,CACIb,MAAAA,EAAMgB,QAAQW,eAAe,CACjC/B,SAAAA,EACAC,WAAAA,EACAqB,UAAWf,EACXkB,KAAM,CAAEC,YAAaI,CAAsB,CAAA,CAC5C,EAC4BZ,SACd,CACNhB,EAAAA,EAAE,sBAAsB,GAAK,EAAE,CAC1C,CACAe,EAAc,EAAK,CAAA,EAMnBe,SAAUhB,EACViB,QAASnB,EACTF,MAAAA,CAAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- "use strict";const S=require("../context/KnockSlackProvider.js"),k=require("react");require("../../i18n/context/KnockI18nProvider.js");require("swr/infinite");const _=require("../../core/context/KnockProvider.js"),C=require("@knocklabs/client");require("zustand/shallow");require("date-fns");const d="https://slack.com/oauth/v2/authorize",l=["chat:write","chat:write.public","channels:read","groups:read"];function A(s,a,o){const e=_.useKnockClient(),{setConnectionStatus:c,knockSlackChannelId:n,tenant:r,setActionLabel:i}=S.useKnockSlackClient(),u=o&&o.length>0?Array.from(new Set(l.concat(o))):l,h=k.useCallback(async()=>{i(null),c("disconnecting");try{const t=await e.slack.revokeAccessToken({tenant:r,knockChannelId:n});c(t==="ok"?"disconnected":"error")}catch{c("error")}},[c,e.slack,r,n,i]);return{buildSlackAuthUrl:k.useCallback(()=>{const t={state:JSON.stringify({redirect_url:a,access_token_object:{object_id:r,collection:C.TENANT_OBJECT_COLLECTION},channel_id:n,public_key:e.apiKey,user_token:e.userToken}),client_id:s,scope:u.join(",")};return`${d}?${new URLSearchParams(t)}`},[a,r,n,e.apiKey,e.userToken,s,u]),disconnectFromSlack:h}}module.exports=A;
1
+ "use strict";const _=require("../context/KnockSlackProvider.js"),k=require("react");require("../../i18n/context/KnockI18nProvider.js");require("swr/infinite");const S=require("../../core/context/KnockProvider.js"),C=require("@knocklabs/client");require("zustand/shallow");require("date-fns");const d="https://slack.com/oauth/v2/authorize",l=["chat:write","chat:write.public","channels:read","groups:read"];function A(s,a,o){const e=S.useKnockClient(),{setConnectionStatus:c,knockSlackChannelId:n,tenant:r,setActionLabel:i}=_.useKnockSlackClient(),u=o&&o.length>0?Array.from(new Set(l.concat(o))):l,h=k.useCallback(async()=>{i(null),c("disconnecting");try{const t=await e.slack.revokeAccessToken({tenant:r,knockChannelId:n});c(t==="ok"?"disconnected":"error")}catch{c("error")}},[c,e.slack,r,n,i]);return{buildSlackAuthUrl:k.useCallback(()=>{const t={state:JSON.stringify({redirect_url:a,access_token_object:{object_id:r,collection:C.TENANT_OBJECT_COLLECTION},channel_id:n,public_key:e.apiKey,user_token:e.userToken}),client_id:s,scope:u.join(",")};return`${d}?${new URLSearchParams(t)}`},[a,r,n,e.apiKey,e.userToken,s,u]),disconnectFromSlack:h}}module.exports=A;
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 additionalScopes?: string[],\n): UseSlackAuthOutput {\n const knock = useKnockClient();\n const { setConnectionStatus, knockSlackChannelId, tenant, setActionLabel } =\n useKnockSlackClient();\n\n const combinedScopes =\n additionalScopes && additionalScopes.length > 0\n ? Array.from(new Set(DEFAULT_SLACK_SCOPES.concat(additionalScopes)))\n : DEFAULT_SLACK_SCOPES;\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: combinedScopes.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 combinedScopes,\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","additionalScopes","knock","useKnockClient","setConnectionStatus","knockSlackChannelId","tenant","setActionLabel","useKnockSlackClient","combinedScopes","length","Array","from","Set","concat","disconnectFromSlack","useCallback","revoke","slack","revokeAccessToken","knockChannelId","buildSlackAuthUrl","rawParams","state","JSON","stringify","redirect_url","access_token_object","object_id","collection","TENANT_OBJECT_COLLECTION","channel_id","public_key","apiKey","user_token","userToken","client_id","scope","join","URLSearchParams"],"mappings":"oSAMA,MAAMA,EAAsB,uCACtBC,EAAuB,CAC3B,aACA,oBACA,gBACA,aAAa,EAQf,SAASC,EACPC,EACAC,EACAC,EACoB,CACpB,MAAMC,EAAQC,EAAAA,iBACR,CAAEC,oBAAAA,EAAqBC,oBAAAA,EAAqBC,OAAAA,EAAQC,eAAAA,GACxDC,EAAoB,oBAAA,EAEhBC,EACJR,GAAoBA,EAAiBS,OAAS,EAC1CC,MAAMC,KAAK,IAAIC,IAAIhB,EAAqBiB,OAAOb,CAAgB,CAAC,CAAC,EACjEJ,EAEAkB,EAAsBC,EAAAA,YAAY,SAAY,CAClDT,EAAe,IAAI,EACnBH,EAAoB,eAAe,EAC/B,GAAA,CACF,MAAMa,EAAS,MAAMf,EAAMgB,MAAMC,kBAAkB,CACjDb,OAAAA,EACAc,eAAgBf,CAAAA,CACjB,EAGCD,EADEa,IAAW,KACO,eAEA,OAFc,OAItB,CACdb,EAAoB,OAAO,CAC7B,CAAA,EACC,CACDA,EACAF,EAAMgB,MACNZ,EACAD,EACAE,CAAc,CACf,EA4BM,MAAA,CACLc,kBA3BwBL,EAAAA,YAAY,IAAM,CAC1C,MAAMM,EAAY,CAChBC,MAAOC,KAAKC,UAAU,CACpBC,aAAc1B,EACd2B,oBAAqB,CACnBC,UAAWtB,EACXuB,WAAYC,EAAAA,wBACd,EACAC,WAAY1B,EACZ2B,WAAY9B,EAAM+B,OAClBC,WAAYhC,EAAMiC,SAAAA,CACnB,EACDC,UAAWrC,EACXsC,MAAO5B,EAAe6B,KAAK,GAAG,CAAA,EAEhC,MAAO,GAAG1C,CAAmB,IAAI,IAAI2C,gBAAgBjB,CAAS,CAAC,EACjE,EAAG,CACDtB,EACAM,EACAD,EACAH,EAAM+B,OACN/B,EAAMiC,UACNpC,EACAU,CAAc,CACf,EAICM,oBAAAA,CAAAA,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 additionalScopes?: string[],\n): UseSlackAuthOutput {\n const knock = useKnockClient();\n const { setConnectionStatus, knockSlackChannelId, tenant, setActionLabel } =\n useKnockSlackClient();\n\n const combinedScopes =\n additionalScopes && additionalScopes.length > 0\n ? Array.from(new Set(DEFAULT_SLACK_SCOPES.concat(additionalScopes)))\n : DEFAULT_SLACK_SCOPES;\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: combinedScopes.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 combinedScopes,\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","additionalScopes","knock","useKnockClient","setConnectionStatus","knockSlackChannelId","tenant","setActionLabel","useKnockSlackClient","combinedScopes","length","Array","from","Set","concat","disconnectFromSlack","useCallback","revoke","slack","revokeAccessToken","knockChannelId","buildSlackAuthUrl","rawParams","state","JSON","stringify","redirect_url","access_token_object","object_id","collection","TENANT_OBJECT_COLLECTION","channel_id","public_key","apiKey","user_token","userToken","client_id","scope","join","URLSearchParams"],"mappings":"oSAMA,MAAMA,EAAsB,uCACtBC,EAAuB,CAC3B,aACA,oBACA,gBACA,aAAa,EAQf,SAASC,EACPC,EACAC,EACAC,EACoB,CACpB,MAAMC,EAAQC,EAAAA,iBACR,CAAEC,oBAAAA,EAAqBC,oBAAAA,EAAqBC,OAAAA,EAAQC,eAAAA,GACxDC,EAAoB,oBAAA,EAEhBC,EACJR,GAAoBA,EAAiBS,OAAS,EAC1CC,MAAMC,KAAK,IAAIC,IAAIhB,EAAqBiB,OAAOb,CAAgB,CAAC,CAAC,EACjEJ,EAEAkB,EAAsBC,EAAAA,YAAY,SAAY,CAClDT,EAAe,IAAI,EACnBH,EAAoB,eAAe,EAC/B,GAAA,CACF,MAAMa,EAAS,MAAMf,EAAMgB,MAAMC,kBAAkB,CACjDb,OAAAA,EACAc,eAAgBf,CAAAA,CACjB,EAGCD,EADEa,IAAW,KACO,eAEA,OAFc,OAIrB,CACfb,EAAoB,OAAO,CAC7B,CAAA,EACC,CACDA,EACAF,EAAMgB,MACNZ,EACAD,EACAE,CAAc,CACf,EA4BM,MAAA,CACLc,kBA3BwBL,EAAAA,YAAY,IAAM,CAC1C,MAAMM,EAAY,CAChBC,MAAOC,KAAKC,UAAU,CACpBC,aAAc1B,EACd2B,oBAAqB,CACnBC,UAAWtB,EACXuB,WAAYC,EAAAA,wBACd,EACAC,WAAY1B,EACZ2B,WAAY9B,EAAM+B,OAClBC,WAAYhC,EAAMiC,SAAAA,CACnB,EACDC,UAAWrC,EACXsC,MAAO5B,EAAe6B,KAAK,GAAG,CAAA,EAEhC,MAAO,GAAG1C,CAAmB,IAAI,IAAI2C,gBAAgBjB,CAAS,CAAC,EACjE,EAAG,CACDtB,EACAM,EACAD,EACAH,EAAM+B,OACN/B,EAAMiC,UACNpC,EACAU,CAAc,CACf,EAICM,oBAAAA,CAAAA,CAEJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"useSlackConnectionStatus.js","sources":["../../../../../src/modules/slack/hooks/useSlackConnectionStatus.ts"],"sourcesContent":["import Knock from \"@knocklabs/client\";\nimport { useEffect, useState } from \"react\";\n\nimport { useTranslations } from \"../../i18n\";\n\nexport type ConnectionStatus =\n | \"connecting\"\n | \"connected\"\n | \"disconnected\"\n | \"error\"\n | \"disconnecting\";\n\ntype UseSlackConnectionStatusOutput = {\n connectionStatus: ConnectionStatus;\n setConnectionStatus: (status: ConnectionStatus) => void;\n errorLabel: string | null;\n setErrorLabel: (errorLabel: string) => void;\n actionLabel: string | null;\n setActionLabel: (actionLabel: string | null) => void;\n};\n\n/**\n * Transforms a slack error message into\n * a formatted one. Slack error messages: https://api.slack.com/methods/auth.test#errors\n *\n * Ex.: \"account_inactive\" -> \"Account inactive\"\n */\nconst formatSlackErrorMessage = (errorMessage: string) => {\n const firstLetter = errorMessage.substring(0, 1).toUpperCase();\n const rest = errorMessage.substring(1);\n return firstLetter?.concat(rest).replace(\"_\", \" \");\n};\n\nfunction useSlackConnectionStatus(\n knock: Knock,\n knockSlackChannelId: string,\n tenant: string,\n): UseSlackConnectionStatusOutput {\n const { t } = useTranslations();\n const [connectionStatus, setConnectionStatus] =\n useState<ConnectionStatus>(\"connecting\");\n const [errorLabel, setErrorLabel] = useState<string | null>(null);\n const [actionLabel, setActionLabel] = useState<string | null>(null);\n\n useEffect(() => {\n const checkAuthStatus = async () => {\n if (connectionStatus !== \"connecting\") return;\n\n try {\n const authRes = await knock.slack.authCheck({\n tenant,\n knockChannelId: knockSlackChannelId,\n });\n\n if (authRes.connection?.ok) {\n return setConnectionStatus(\"connected\");\n }\n\n if (!authRes.connection?.ok) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is a normal response for a tenant that doesn't have an access\n // token set on it, meaning it's not connected to Slack, so we\n // give it a \"disconnected\" status instead of an error status.\n if (\n authRes.code === \"ERR_BAD_REQUEST\" &&\n authRes.response?.data?.message === t(\"slackAccessTokenNotSet\")\n ) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is for an error coming directly from Slack.\n if (!authRes.connection?.ok && authRes.connection?.error) {\n const errorLabel = formatSlackErrorMessage(authRes.connection?.error);\n setErrorLabel(errorLabel);\n setConnectionStatus(\"error\");\n return;\n }\n\n // This is for any Knock errors that would require a reconnect.\n\n setConnectionStatus(\"error\");\n } catch (error) {\n setConnectionStatus(\"error\");\n }\n };\n\n checkAuthStatus();\n }, [connectionStatus, tenant, knockSlackChannelId, knock.slack, t]);\n\n return {\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n };\n}\n\nexport default useSlackConnectionStatus;\n"],"names":["formatSlackErrorMessage","errorMessage","firstLetter","substring","toUpperCase","rest","concat","replace","useSlackConnectionStatus","knock","knockSlackChannelId","tenant","t","useTranslations","connectionStatus","setConnectionStatus","useState","errorLabel","setErrorLabel","actionLabel","setActionLabel","useEffect","authRes","slack","authCheck","knockChannelId","connection","ok","code","response","data","message","error"],"mappings":"gJA2BMA,EAA2BC,GAAyB,CACxD,MAAMC,EAAcD,EAAaE,UAAU,EAAG,CAAC,EAAEC,cAC3CC,EAAOJ,EAAaE,UAAU,CAAC,EACrC,OAAOD,GAAAA,YAAAA,EAAaI,OAAOD,GAAME,QAAQ,IAAK,IAChD,EAEA,SAASC,EACPC,EACAC,EACAC,EACgC,CAC1B,KAAA,CAAEC,EAAAA,GAAMC,EAAgB,gBAAA,EACxB,CAACC,EAAkBC,CAAmB,EAC1CC,WAA2B,YAAY,EACnC,CAACC,EAAYC,CAAa,EAAIF,WAAwB,IAAI,EAC1D,CAACG,EAAaC,CAAc,EAAIJ,WAAwB,IAAI,EAElEK,OAAAA,EAAAA,UAAU,IAAM,EACU,SAAY,mBAClC,GAAIP,IAAqB,aAErB,GAAA,CACF,MAAMQ,EAAU,MAAMb,EAAMc,MAAMC,UAAU,CAC1Cb,OAAAA,EACAc,eAAgBf,CAAAA,CACjB,EAEGY,IAAAA,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBK,GACtB,OAAOZ,EAAoB,WAAW,EAWtCO,GARE,GAACA,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBK,KAQvBL,EAAQM,OAAS,qBACjBN,GAAAA,EAAAA,EAAQO,WAARP,YAAAA,EAAkBQ,OAAlBR,YAAAA,EAAwBS,WAAYnB,EAAE,wBAAwB,EAE9D,OAAOG,EAAoB,cAAc,EAI3C,GAAI,GAACO,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBK,OAAML,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBU,OAAO,CACxD,MAAMf,EAAajB,GAAwBsB,EAAAA,EAAQI,aAARJ,YAAAA,EAAoBU,KAAK,EACpEd,EAAcD,CAAU,EACxBF,EAAoB,OAAO,EAC3B,MACF,CAIAA,EAAoB,OAAO,OACb,CACdA,EAAoB,OAAO,CAC7B,CAAA,IAGc,EACf,CAACD,EAAkBH,EAAQD,EAAqBD,EAAMc,MAAOX,CAAC,CAAC,EAE3D,CACLE,iBAAAA,EACAC,oBAAAA,EACAE,WAAAA,EACAC,cAAAA,EACAC,YAAAA,EACAC,eAAAA,CAAAA,CAEJ"}
1
+ {"version":3,"file":"useSlackConnectionStatus.js","sources":["../../../../../src/modules/slack/hooks/useSlackConnectionStatus.ts"],"sourcesContent":["import Knock from \"@knocklabs/client\";\nimport { useEffect, useState } from \"react\";\n\nimport { useTranslations } from \"../../i18n\";\n\nexport type ConnectionStatus =\n | \"connecting\"\n | \"connected\"\n | \"disconnected\"\n | \"error\"\n | \"disconnecting\";\n\ntype UseSlackConnectionStatusOutput = {\n connectionStatus: ConnectionStatus;\n setConnectionStatus: (status: ConnectionStatus) => void;\n errorLabel: string | null;\n setErrorLabel: (errorLabel: string) => void;\n actionLabel: string | null;\n setActionLabel: (actionLabel: string | null) => void;\n};\n\n/**\n * Transforms a slack error message into\n * a formatted one. Slack error messages: https://api.slack.com/methods/auth.test#errors\n *\n * Ex.: \"account_inactive\" -> \"Account inactive\"\n */\nconst formatSlackErrorMessage = (errorMessage: string) => {\n const firstLetter = errorMessage.substring(0, 1).toUpperCase();\n const rest = errorMessage.substring(1);\n return firstLetter?.concat(rest).replace(\"_\", \" \");\n};\n\nfunction useSlackConnectionStatus(\n knock: Knock,\n knockSlackChannelId: string,\n tenant: string,\n): UseSlackConnectionStatusOutput {\n const { t } = useTranslations();\n const [connectionStatus, setConnectionStatus] =\n useState<ConnectionStatus>(\"connecting\");\n const [errorLabel, setErrorLabel] = useState<string | null>(null);\n const [actionLabel, setActionLabel] = useState<string | null>(null);\n\n useEffect(() => {\n const checkAuthStatus = async () => {\n if (connectionStatus !== \"connecting\") return;\n\n try {\n const authRes = await knock.slack.authCheck({\n tenant,\n knockChannelId: knockSlackChannelId,\n });\n\n if (authRes.connection?.ok) {\n return setConnectionStatus(\"connected\");\n }\n\n if (!authRes.connection?.ok) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is a normal response for a tenant that doesn't have an access\n // token set on it, meaning it's not connected to Slack, so we\n // give it a \"disconnected\" status instead of an error status.\n if (\n authRes.code === \"ERR_BAD_REQUEST\" &&\n authRes.response?.data?.message === t(\"slackAccessTokenNotSet\")\n ) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is for an error coming directly from Slack.\n if (!authRes.connection?.ok && authRes.connection?.error) {\n const errorLabel = formatSlackErrorMessage(authRes.connection?.error);\n setErrorLabel(errorLabel);\n setConnectionStatus(\"error\");\n return;\n }\n\n // This is for any Knock errors that would require a reconnect.\n\n setConnectionStatus(\"error\");\n } catch (_error) {\n setConnectionStatus(\"error\");\n }\n };\n\n checkAuthStatus();\n }, [connectionStatus, tenant, knockSlackChannelId, knock.slack, t]);\n\n return {\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n };\n}\n\nexport default useSlackConnectionStatus;\n"],"names":["formatSlackErrorMessage","errorMessage","firstLetter","substring","toUpperCase","rest","concat","replace","useSlackConnectionStatus","knock","knockSlackChannelId","tenant","t","useTranslations","connectionStatus","setConnectionStatus","useState","errorLabel","setErrorLabel","actionLabel","setActionLabel","useEffect","authRes","slack","authCheck","knockChannelId","connection","ok","code","response","data","message","error"],"mappings":"gJA2BMA,EAA2BC,GAAyB,CACxD,MAAMC,EAAcD,EAAaE,UAAU,EAAG,CAAC,EAAEC,cAC3CC,EAAOJ,EAAaE,UAAU,CAAC,EACrC,OAAOD,GAAAA,YAAAA,EAAaI,OAAOD,GAAME,QAAQ,IAAK,IAChD,EAEA,SAASC,EACPC,EACAC,EACAC,EACgC,CAC1B,KAAA,CAAEC,EAAAA,GAAMC,EAAgB,gBAAA,EACxB,CAACC,EAAkBC,CAAmB,EAC1CC,WAA2B,YAAY,EACnC,CAACC,EAAYC,CAAa,EAAIF,WAAwB,IAAI,EAC1D,CAACG,EAAaC,CAAc,EAAIJ,WAAwB,IAAI,EAElEK,OAAAA,EAAAA,UAAU,IAAM,EACU,SAAY,mBAClC,GAAIP,IAAqB,aAErB,GAAA,CACF,MAAMQ,EAAU,MAAMb,EAAMc,MAAMC,UAAU,CAC1Cb,OAAAA,EACAc,eAAgBf,CAAAA,CACjB,EAEGY,IAAAA,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBK,GACtB,OAAOZ,EAAoB,WAAW,EAWtCO,GARE,GAACA,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBK,KAQvBL,EAAQM,OAAS,qBACjBN,GAAAA,EAAAA,EAAQO,WAARP,YAAAA,EAAkBQ,OAAlBR,YAAAA,EAAwBS,WAAYnB,EAAE,wBAAwB,EAE9D,OAAOG,EAAoB,cAAc,EAI3C,GAAI,GAACO,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBK,OAAML,EAAAA,EAAQI,aAARJ,MAAAA,EAAoBU,OAAO,CACxD,MAAMf,EAAajB,GAAwBsB,EAAAA,EAAQI,aAARJ,YAAAA,EAAoBU,KAAK,EACpEd,EAAcD,CAAU,EACxBF,EAAoB,OAAO,EAC3B,MACF,CAIAA,EAAoB,OAAO,OACZ,CACfA,EAAoB,OAAO,CAC7B,CAAA,IAGc,EACf,CAACD,EAAkBH,EAAQD,EAAqBD,EAAMc,MAAOX,CAAC,CAAC,EAE3D,CACLE,iBAAAA,EACAC,oBAAAA,EACAE,WAAAA,EACAC,cAAAA,EACAC,YAAAA,EACAC,eAAAA,CAAAA,CAEJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","sources":["../../../../src/modules/core/utils.ts"],"sourcesContent":["import { FeedClientOptions } from \"@knocklabs/client\";\nimport { intlFormatDistance, parseISO } from \"date-fns\";\nimport { ReactNode } from \"react\";\n\nexport function formatBadgeCount(count: number): string | number {\n return count > 9 ? \"9+\" : count;\n}\n\ntype FormatTimestampOptions = {\n locale?: string | string[];\n};\n\nexport function formatTimestamp(\n ts: string,\n options: FormatTimestampOptions = {},\n) {\n try {\n const parsedTs = parseISO(ts);\n const formatted = intlFormatDistance(parsedTs, new Date(), {\n locale: options.locale,\n });\n\n return formatted;\n } catch (e) {\n return ts;\n }\n}\n\nexport function toSentenceCase(string: string): string {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nexport function renderNodeOrFallback(node: ReactNode, fallback: ReactNode) {\n return node !== undefined ? node : fallback;\n}\n\n/*\n Used to build a consistent key for the KnockFeedProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function feedProviderKey(\n userId: string | undefined,\n feedId: string,\n options: FeedClientOptions = {},\n) {\n return [\n userId,\n feedId,\n options.source,\n options.tenant,\n options.has_tenant,\n options.archived,\n ]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n\n/*\n Used to build a consistent key for the KnockSlackProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function slackProviderKey({\n knockSlackChannelId,\n tenant,\n connectionStatus,\n errorLabel,\n}: {\n knockSlackChannelId: string;\n tenant: string;\n connectionStatus: string;\n errorLabel: string | null;\n}) {\n return [knockSlackChannelId, tenant, connectionStatus, errorLabel]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n"],"names":["formatBadgeCount","count","formatTimestamp","ts","options","parsedTs","parseISO","formatted","intlFormatDistance","Date","locale","toSentenceCase","string","charAt","toUpperCase","slice","renderNodeOrFallback","node","fallback","undefined","feedProviderKey","userId","feedId","source","tenant","has_tenant","archived","filter","f","join","slackProviderKey","knockSlackChannelId","connectionStatus","errorLabel"],"mappings":";AAIO,SAASA,EAAiBC,GAAgC;AACxDA,SAAAA,IAAQ,IAAI,OAAOA;AAC5B;AAMO,SAASC,EACdC,GACAC,IAAkC,IAClC;AACI,MAAA;AACIC,UAAAA,IAAWC,EAASH,CAAE;AAKrBI,WAJWC,EAAmBH,GAAU,oBAAII,QAAQ;AAAA,MACzDC,QAAQN,EAAQM;AAAAA,IAAAA,CACjB;AAAA,UAGS;AACHP,WAAAA;AAAAA,EACT;AACF;AAEO,SAASQ,EAAeC,GAAwB;AAC9CA,SAAAA,EAAOC,OAAO,CAAC,EAAEC,gBAAgBF,EAAOG,MAAM,CAAC;AACxD;AAEgBC,SAAAA,EAAqBC,GAAiBC,GAAqB;AAClED,SAAAA,MAASE,SAAYF,IAAOC;AACrC;AAMO,SAASE,EACdC,GACAC,GACAlB,IAA6B,CAAA,GAC7B;AACO,SAAA,CACLiB,GACAC,GACAlB,EAAQmB,QACRnB,EAAQoB,QACRpB,EAAQqB,YACRrB,EAAQsB,QAAQ,EAEfC,OAAQC,OAAMA,KAAM,IAAuB,EAC3CC,KAAK,GAAG;AACb;AAMO,SAASC,EAAiB;AAAA,EAC/BC,qBAAAA;AAAAA,EACAP,QAAAA;AAAAA,EACAQ,kBAAAA;AAAAA,EACAC,YAAAA;AAMF,GAAG;AACD,SAAO,CAACF,GAAqBP,GAAQQ,GAAkBC,CAAU,EAC9DN,OAAQC,CAAMA,MAAAA,KAAM,IAAuB,EAC3CC,KAAK,GAAG;AACb;"}
1
+ {"version":3,"file":"utils.mjs","sources":["../../../../src/modules/core/utils.ts"],"sourcesContent":["import { FeedClientOptions } from \"@knocklabs/client\";\nimport { intlFormatDistance, parseISO } from \"date-fns\";\nimport { ReactNode } from \"react\";\n\nexport function formatBadgeCount(count: number): string | number {\n return count > 9 ? \"9+\" : count;\n}\n\ntype FormatTimestampOptions = {\n locale?: string | string[];\n};\n\nexport function formatTimestamp(\n ts: string,\n options: FormatTimestampOptions = {},\n) {\n try {\n const parsedTs = parseISO(ts);\n const formatted = intlFormatDistance(parsedTs, new Date(), {\n locale: options.locale,\n });\n\n return formatted;\n } catch (_e) {\n return ts;\n }\n}\n\nexport function toSentenceCase(string: string): string {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nexport function renderNodeOrFallback(node: ReactNode, fallback: ReactNode) {\n return node !== undefined ? node : fallback;\n}\n\n/*\n Used to build a consistent key for the KnockFeedProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function feedProviderKey(\n userId: string | undefined,\n feedId: string,\n options: FeedClientOptions = {},\n) {\n return [\n userId,\n feedId,\n options.source,\n options.tenant,\n options.has_tenant,\n options.archived,\n ]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n\n/*\n Used to build a consistent key for the KnockSlackProvider so that React knows when\n to trigger a re-render of the context when a key property changes.\n*/\nexport function slackProviderKey({\n knockSlackChannelId,\n tenant,\n connectionStatus,\n errorLabel,\n}: {\n knockSlackChannelId: string;\n tenant: string;\n connectionStatus: string;\n errorLabel: string | null;\n}) {\n return [knockSlackChannelId, tenant, connectionStatus, errorLabel]\n .filter((f) => f !== null && f !== undefined)\n .join(\"-\");\n}\n"],"names":["formatBadgeCount","count","formatTimestamp","ts","options","parsedTs","parseISO","formatted","intlFormatDistance","Date","locale","toSentenceCase","string","charAt","toUpperCase","slice","renderNodeOrFallback","node","fallback","undefined","feedProviderKey","userId","feedId","source","tenant","has_tenant","archived","filter","f","join","slackProviderKey","knockSlackChannelId","connectionStatus","errorLabel"],"mappings":";AAIO,SAASA,EAAiBC,GAAgC;AACxDA,SAAAA,IAAQ,IAAI,OAAOA;AAC5B;AAMO,SAASC,EACdC,GACAC,IAAkC,IAClC;AACI,MAAA;AACIC,UAAAA,IAAWC,EAASH,CAAE;AAKrBI,WAJWC,EAAmBH,GAAU,oBAAII,QAAQ;AAAA,MACzDC,QAAQN,EAAQM;AAAAA,IAAAA,CACjB;AAAA,UAGU;AACJP,WAAAA;AAAAA,EACT;AACF;AAEO,SAASQ,EAAeC,GAAwB;AAC9CA,SAAAA,EAAOC,OAAO,CAAC,EAAEC,gBAAgBF,EAAOG,MAAM,CAAC;AACxD;AAEgBC,SAAAA,EAAqBC,GAAiBC,GAAqB;AAClED,SAAAA,MAASE,SAAYF,IAAOC;AACrC;AAMO,SAASE,EACdC,GACAC,GACAlB,IAA6B,CAAA,GAC7B;AACO,SAAA,CACLiB,GACAC,GACAlB,EAAQmB,QACRnB,EAAQoB,QACRpB,EAAQqB,YACRrB,EAAQsB,QAAQ,EAEfC,OAAQC,OAAMA,KAAM,IAAuB,EAC3CC,KAAK,GAAG;AACb;AAMO,SAASC,EAAiB;AAAA,EAC/BC,qBAAAA;AAAAA,EACAP,QAAAA;AAAAA,EACAQ,kBAAAA;AAAAA,EACAC,YAAAA;AAMF,GAAG;AACD,SAAO,CAACF,GAAqBP,GAAQQ,GAAkBC,CAAU,EAC9DN,OAAQC,CAAMA,MAAAA,KAAM,IAAuB,EAC3CC,KAAK,GAAG;AACb;"}
@@ -7,7 +7,7 @@ import { useKnockClient as j } from "../../core/context/KnockProvider.mjs";
7
7
  import "@knocklabs/client";
8
8
  import "zustand/shallow";
9
9
  import "date-fns";
10
- function q({
10
+ function _({
11
11
  slackChannelsRecipientObject: {
12
12
  objectId: e,
13
13
  collection: a
@@ -56,6 +56,6 @@ function q({
56
56
  };
57
57
  }
58
58
  export {
59
- q as default
59
+ _ as default
60
60
  };
61
61
  //# sourceMappingURL=useConnectedSlackChannels.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useConnectedSlackChannels.mjs","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","slackChannelsRecipientObject","objectId","collection","t","useTranslations","knock","useKnockClient","connectionStatus","knockSlackChannelId","useKnockSlackClient","connectedChannels","setConnectedChannels","useState","error","setError","isLoading","setIsLoading","isUpdating","setIsUpdating","fetchAndSetConnectedChannels","useCallback","objects","getChannelData","channelId","then","res","data","connections","catch","useEffect","updateConnectedChannels","channelsToSendToKnock","setChannelData","updating","loading"],"mappings":";;;;;;;;;AAqBA,SAASA,EAA0B;AAAA,EACjCC,8BAA8B;AAAA,IAAEC,UAAAA;AAAAA,IAAUC,YAAAA;AAAAA,EAAW;AAChC,GAA0B;AACzC,QAAA;AAAA,IAAEC,GAAAA;AAAAA,MAAMC,EAAgB,GACxBC,IAAQC,KACR;AAAA,IAAEC,kBAAAA;AAAAA,IAAkBC,qBAAAA;AAAAA,MAAwBC,EAAoB,GAChE,CAACC,GAAmBC,CAAoB,IAAIC,EAEhD,IAAI,GACA,CAACC,GAAOC,CAAQ,IAAIF,EAAwB,IAAI,GAChD,CAACG,GAAWC,CAAY,IAAIJ,EAAS,EAAK,GAC1C,CAACK,GAAYC,CAAa,IAAIN,EAAS,EAAK,GAE5CO,IAA+BC,EAAY,MAAM;AACrDJ,IAAAA,EAAa,EAAI,IACY,YAC3B,MAAMX,EAAMgB,QAAQC,eAAe;AAAA,MACjCpB,YAAAA;AAAAA,MACAD,UAAAA;AAAAA,MACAsB,WAAWf;AAAAA,IAAAA,CACZ,GAEkB,EAClBgB,KAAMC,CAAQA,MAAA;;AACTA,OAAAA,IAAAA,KAAAA,gBAAAA,EAAKC,SAALD,QAAAA,EAAWE,cACQF,GAAAA,IAAAA,KAAAA,gBAAAA,EAAKC,SAALD,gBAAAA,EAAWE,WAAW,IAE3ChB,EAAqB,CAAE,CAAA,GAEzBG,EAAS,IAAI,GACbE,EAAa,EAAK;AAAA,IAAA,CACnB,EACAY,MAAM,MAAM;AACXjB,MAAAA,EAAqB,CAAE,CAAA,GACvBG,EAAS,IAAI,GACbE,EAAa,EAAK;AAAA,IAAA,CACnB;AAAA,EAAA,GACF,CAACd,GAAYG,EAAMgB,SAASb,GAAqBP,CAAQ,CAAC;AAE7D4B,SAAAA,EAAU,MAAM;AACd,IACEtB,MAAqB,eACrB,CAACG,KACD,CAACG,KACD,CAACE,KAE4BI;EAC/B,GACC,CACDT,GACAS,GACAJ,GACAF,GACAN,CAAgB,CACjB,GAoBM;AAAA,IACLmB,MAAMhB;AAAAA,IACNoB,yBApB8B,OAC9BC,MACG;AACHb,MAAAA,EAAc,EAAI;AACd,UAAA;AACIb,cAAAA,EAAMgB,QAAQW,eAAe;AAAA,UACjC/B,UAAAA;AAAAA,UACAC,YAAAA;AAAAA,UACAqB,WAAWf;AAAAA,UACXkB,MAAM;AAAA,YAAEC,aAAaI;AAAAA,UAAsB;AAAA,QAAA,CAC5C,GAC4BZ;cACf;AACLhB,QAAAA,EAAAA,EAAE,sBAAsB,KAAK,EAAE;AAAA,MAC1C;AACAe,MAAAA,EAAc,EAAK;AAAA,IAAA;AAAA,IAMnBe,UAAUhB;AAAAA,IACViB,SAASnB;AAAAA,IACTF,OAAAA;AAAAA,EAAAA;AAEJ;"}
1
+ {"version":3,"file":"useConnectedSlackChannels.mjs","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","slackChannelsRecipientObject","objectId","collection","t","useTranslations","knock","useKnockClient","connectionStatus","knockSlackChannelId","useKnockSlackClient","connectedChannels","setConnectedChannels","useState","error","setError","isLoading","setIsLoading","isUpdating","setIsUpdating","fetchAndSetConnectedChannels","useCallback","objects","getChannelData","channelId","then","res","data","connections","catch","useEffect","updateConnectedChannels","channelsToSendToKnock","setChannelData","updating","loading"],"mappings":";;;;;;;;;AAqBA,SAASA,EAA0B;AAAA,EACjCC,8BAA8B;AAAA,IAAEC,UAAAA;AAAAA,IAAUC,YAAAA;AAAAA,EAAW;AAChC,GAA0B;AACzC,QAAA;AAAA,IAAEC,GAAAA;AAAAA,MAAMC,EAAgB,GACxBC,IAAQC,KACR;AAAA,IAAEC,kBAAAA;AAAAA,IAAkBC,qBAAAA;AAAAA,MAAwBC,EAAoB,GAChE,CAACC,GAAmBC,CAAoB,IAAIC,EAEhD,IAAI,GACA,CAACC,GAAOC,CAAQ,IAAIF,EAAwB,IAAI,GAChD,CAACG,GAAWC,CAAY,IAAIJ,EAAS,EAAK,GAC1C,CAACK,GAAYC,CAAa,IAAIN,EAAS,EAAK,GAE5CO,IAA+BC,EAAY,MAAM;AACrDJ,IAAAA,EAAa,EAAI,IACY,YAC3B,MAAMX,EAAMgB,QAAQC,eAAe;AAAA,MACjCpB,YAAAA;AAAAA,MACAD,UAAAA;AAAAA,MACAsB,WAAWf;AAAAA,IAAAA,CACZ,GAEkB,EAClBgB,KAAMC,CAAQA,MAAA;;AACTA,OAAAA,IAAAA,KAAAA,gBAAAA,EAAKC,SAALD,QAAAA,EAAWE,cACQF,GAAAA,IAAAA,KAAAA,gBAAAA,EAAKC,SAALD,gBAAAA,EAAWE,WAAW,IAE3ChB,EAAqB,CAAE,CAAA,GAEzBG,EAAS,IAAI,GACbE,EAAa,EAAK;AAAA,IAAA,CACnB,EACAY,MAAM,MAAM;AACXjB,MAAAA,EAAqB,CAAE,CAAA,GACvBG,EAAS,IAAI,GACbE,EAAa,EAAK;AAAA,IAAA,CACnB;AAAA,EAAA,GACF,CAACd,GAAYG,EAAMgB,SAASb,GAAqBP,CAAQ,CAAC;AAE7D4B,SAAAA,EAAU,MAAM;AACd,IACEtB,MAAqB,eACrB,CAACG,KACD,CAACG,KACD,CAACE,KAE4BI;EAC/B,GACC,CACDT,GACAS,GACAJ,GACAF,GACAN,CAAgB,CACjB,GAoBM;AAAA,IACLmB,MAAMhB;AAAAA,IACNoB,yBApB8B,OAC9BC,MACG;AACHb,MAAAA,EAAc,EAAI;AACd,UAAA;AACIb,cAAAA,EAAMgB,QAAQW,eAAe;AAAA,UACjC/B,UAAAA;AAAAA,UACAC,YAAAA;AAAAA,UACAqB,WAAWf;AAAAA,UACXkB,MAAM;AAAA,YAAEC,aAAaI;AAAAA,UAAsB;AAAA,QAAA,CAC5C,GAC4BZ;cACd;AACNhB,QAAAA,EAAAA,EAAE,sBAAsB,KAAK,EAAE;AAAA,MAC1C;AACAe,MAAAA,EAAc,EAAK;AAAA,IAAA;AAAA,IAMnBe,UAAUhB;AAAAA,IACViB,SAASnB;AAAAA,IACTF,OAAAA;AAAAA,EAAAA;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useSlackAuth.mjs","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 additionalScopes?: string[],\n): UseSlackAuthOutput {\n const knock = useKnockClient();\n const { setConnectionStatus, knockSlackChannelId, tenant, setActionLabel } =\n useKnockSlackClient();\n\n const combinedScopes =\n additionalScopes && additionalScopes.length > 0\n ? Array.from(new Set(DEFAULT_SLACK_SCOPES.concat(additionalScopes)))\n : DEFAULT_SLACK_SCOPES;\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: combinedScopes.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 combinedScopes,\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","additionalScopes","knock","useKnockClient","setConnectionStatus","knockSlackChannelId","tenant","setActionLabel","useKnockSlackClient","combinedScopes","length","Array","from","Set","concat","disconnectFromSlack","useCallback","revoke","slack","revokeAccessToken","knockChannelId","buildSlackAuthUrl","rawParams","state","JSON","stringify","redirect_url","access_token_object","object_id","collection","TENANT_OBJECT_COLLECTION","channel_id","public_key","apiKey","user_token","userToken","client_id","scope","join","URLSearchParams"],"mappings":";;;;;;;;AAMA,MAAMA,IAAsB,wCACtBC,IAAuB,CAC3B,cACA,qBACA,iBACA,aAAa;AAQf,SAASC,EACPC,GACAC,GACAC,GACoB;AACpB,QAAMC,IAAQC,KACR;AAAA,IAAEC,qBAAAA;AAAAA,IAAqBC,qBAAAA;AAAAA,IAAqBC,QAAAA;AAAAA,IAAQC,gBAAAA;AAAAA,MACxDC,EAAoB,GAEhBC,IACJR,KAAoBA,EAAiBS,SAAS,IAC1CC,MAAMC,KAAK,IAAIC,IAAIhB,EAAqBiB,OAAOb,CAAgB,CAAC,CAAC,IACjEJ,GAEAkB,IAAsBC,EAAY,YAAY;AAClDT,IAAAA,EAAe,IAAI,GACnBH,EAAoB,eAAe;AAC/B,QAAA;AACF,YAAMa,IAAS,MAAMf,EAAMgB,MAAMC,kBAAkB;AAAA,QACjDb,QAAAA;AAAAA,QACAc,gBAAgBf;AAAAA,MAAAA,CACjB;AAED,MACED,EADEa,MAAW,OACO,iBAEA,OAFc;AAAA,YAItB;AACdb,MAAAA,EAAoB,OAAO;AAAA,IAC7B;AAAA,EAAA,GACC,CACDA,GACAF,EAAMgB,OACNZ,GACAD,GACAE,CAAc,CACf;AA4BM,SAAA;AAAA,IACLc,mBA3BwBL,EAAY,MAAM;AAC1C,YAAMM,IAAY;AAAA,QAChBC,OAAOC,KAAKC,UAAU;AAAA,UACpBC,cAAc1B;AAAAA,UACd2B,qBAAqB;AAAA,YACnBC,WAAWtB;AAAAA,YACXuB,YAAYC;AAAAA,UACd;AAAA,UACAC,YAAY1B;AAAAA,UACZ2B,YAAY9B,EAAM+B;AAAAA,UAClBC,YAAYhC,EAAMiC;AAAAA,QAAAA,CACnB;AAAA,QACDC,WAAWrC;AAAAA,QACXsC,OAAO5B,EAAe6B,KAAK,GAAG;AAAA,MAAA;AAEhC,aAAO,GAAG1C,CAAmB,IAAI,IAAI2C,gBAAgBjB,CAAS,CAAC;AAAA,IACjE,GAAG,CACDtB,GACAM,GACAD,GACAH,EAAM+B,QACN/B,EAAMiC,WACNpC,GACAU,CAAc,CACf;AAAA,IAICM,qBAAAA;AAAAA,EAAAA;AAEJ;"}
1
+ {"version":3,"file":"useSlackAuth.mjs","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 additionalScopes?: string[],\n): UseSlackAuthOutput {\n const knock = useKnockClient();\n const { setConnectionStatus, knockSlackChannelId, tenant, setActionLabel } =\n useKnockSlackClient();\n\n const combinedScopes =\n additionalScopes && additionalScopes.length > 0\n ? Array.from(new Set(DEFAULT_SLACK_SCOPES.concat(additionalScopes)))\n : DEFAULT_SLACK_SCOPES;\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: combinedScopes.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 combinedScopes,\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","additionalScopes","knock","useKnockClient","setConnectionStatus","knockSlackChannelId","tenant","setActionLabel","useKnockSlackClient","combinedScopes","length","Array","from","Set","concat","disconnectFromSlack","useCallback","revoke","slack","revokeAccessToken","knockChannelId","buildSlackAuthUrl","rawParams","state","JSON","stringify","redirect_url","access_token_object","object_id","collection","TENANT_OBJECT_COLLECTION","channel_id","public_key","apiKey","user_token","userToken","client_id","scope","join","URLSearchParams"],"mappings":";;;;;;;;AAMA,MAAMA,IAAsB,wCACtBC,IAAuB,CAC3B,cACA,qBACA,iBACA,aAAa;AAQf,SAASC,EACPC,GACAC,GACAC,GACoB;AACpB,QAAMC,IAAQC,KACR;AAAA,IAAEC,qBAAAA;AAAAA,IAAqBC,qBAAAA;AAAAA,IAAqBC,QAAAA;AAAAA,IAAQC,gBAAAA;AAAAA,MACxDC,EAAoB,GAEhBC,IACJR,KAAoBA,EAAiBS,SAAS,IAC1CC,MAAMC,KAAK,IAAIC,IAAIhB,EAAqBiB,OAAOb,CAAgB,CAAC,CAAC,IACjEJ,GAEAkB,IAAsBC,EAAY,YAAY;AAClDT,IAAAA,EAAe,IAAI,GACnBH,EAAoB,eAAe;AAC/B,QAAA;AACF,YAAMa,IAAS,MAAMf,EAAMgB,MAAMC,kBAAkB;AAAA,QACjDb,QAAAA;AAAAA,QACAc,gBAAgBf;AAAAA,MAAAA,CACjB;AAED,MACED,EADEa,MAAW,OACO,iBAEA,OAFc;AAAA,YAIrB;AACfb,MAAAA,EAAoB,OAAO;AAAA,IAC7B;AAAA,EAAA,GACC,CACDA,GACAF,EAAMgB,OACNZ,GACAD,GACAE,CAAc,CACf;AA4BM,SAAA;AAAA,IACLc,mBA3BwBL,EAAY,MAAM;AAC1C,YAAMM,IAAY;AAAA,QAChBC,OAAOC,KAAKC,UAAU;AAAA,UACpBC,cAAc1B;AAAAA,UACd2B,qBAAqB;AAAA,YACnBC,WAAWtB;AAAAA,YACXuB,YAAYC;AAAAA,UACd;AAAA,UACAC,YAAY1B;AAAAA,UACZ2B,YAAY9B,EAAM+B;AAAAA,UAClBC,YAAYhC,EAAMiC;AAAAA,QAAAA,CACnB;AAAA,QACDC,WAAWrC;AAAAA,QACXsC,OAAO5B,EAAe6B,KAAK,GAAG;AAAA,MAAA;AAEhC,aAAO,GAAG1C,CAAmB,IAAI,IAAI2C,gBAAgBjB,CAAS,CAAC;AAAA,IACjE,GAAG,CACDtB,GACAM,GACAD,GACAH,EAAM+B,QACN/B,EAAMiC,WACNpC,GACAU,CAAc,CACf;AAAA,IAICM,qBAAAA;AAAAA,EAAAA;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useSlackConnectionStatus.mjs","sources":["../../../../../src/modules/slack/hooks/useSlackConnectionStatus.ts"],"sourcesContent":["import Knock from \"@knocklabs/client\";\nimport { useEffect, useState } from \"react\";\n\nimport { useTranslations } from \"../../i18n\";\n\nexport type ConnectionStatus =\n | \"connecting\"\n | \"connected\"\n | \"disconnected\"\n | \"error\"\n | \"disconnecting\";\n\ntype UseSlackConnectionStatusOutput = {\n connectionStatus: ConnectionStatus;\n setConnectionStatus: (status: ConnectionStatus) => void;\n errorLabel: string | null;\n setErrorLabel: (errorLabel: string) => void;\n actionLabel: string | null;\n setActionLabel: (actionLabel: string | null) => void;\n};\n\n/**\n * Transforms a slack error message into\n * a formatted one. Slack error messages: https://api.slack.com/methods/auth.test#errors\n *\n * Ex.: \"account_inactive\" -> \"Account inactive\"\n */\nconst formatSlackErrorMessage = (errorMessage: string) => {\n const firstLetter = errorMessage.substring(0, 1).toUpperCase();\n const rest = errorMessage.substring(1);\n return firstLetter?.concat(rest).replace(\"_\", \" \");\n};\n\nfunction useSlackConnectionStatus(\n knock: Knock,\n knockSlackChannelId: string,\n tenant: string,\n): UseSlackConnectionStatusOutput {\n const { t } = useTranslations();\n const [connectionStatus, setConnectionStatus] =\n useState<ConnectionStatus>(\"connecting\");\n const [errorLabel, setErrorLabel] = useState<string | null>(null);\n const [actionLabel, setActionLabel] = useState<string | null>(null);\n\n useEffect(() => {\n const checkAuthStatus = async () => {\n if (connectionStatus !== \"connecting\") return;\n\n try {\n const authRes = await knock.slack.authCheck({\n tenant,\n knockChannelId: knockSlackChannelId,\n });\n\n if (authRes.connection?.ok) {\n return setConnectionStatus(\"connected\");\n }\n\n if (!authRes.connection?.ok) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is a normal response for a tenant that doesn't have an access\n // token set on it, meaning it's not connected to Slack, so we\n // give it a \"disconnected\" status instead of an error status.\n if (\n authRes.code === \"ERR_BAD_REQUEST\" &&\n authRes.response?.data?.message === t(\"slackAccessTokenNotSet\")\n ) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is for an error coming directly from Slack.\n if (!authRes.connection?.ok && authRes.connection?.error) {\n const errorLabel = formatSlackErrorMessage(authRes.connection?.error);\n setErrorLabel(errorLabel);\n setConnectionStatus(\"error\");\n return;\n }\n\n // This is for any Knock errors that would require a reconnect.\n\n setConnectionStatus(\"error\");\n } catch (error) {\n setConnectionStatus(\"error\");\n }\n };\n\n checkAuthStatus();\n }, [connectionStatus, tenant, knockSlackChannelId, knock.slack, t]);\n\n return {\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n };\n}\n\nexport default useSlackConnectionStatus;\n"],"names":["formatSlackErrorMessage","errorMessage","firstLetter","substring","toUpperCase","rest","concat","replace","useSlackConnectionStatus","knock","knockSlackChannelId","tenant","t","useTranslations","connectionStatus","setConnectionStatus","useState","errorLabel","setErrorLabel","actionLabel","setActionLabel","useEffect","authRes","slack","authCheck","knockChannelId","connection","ok","code","response","data","message","error"],"mappings":";;;AA2BA,MAAMA,IAA0BA,CAACC,MAAyB;AACxD,QAAMC,IAAcD,EAAaE,UAAU,GAAG,CAAC,EAAEC,eAC3CC,IAAOJ,EAAaE,UAAU,CAAC;AACrC,SAAOD,KAAAA,gBAAAA,EAAaI,OAAOD,GAAME,QAAQ,KAAK;AAChD;AAEA,SAASC,EACPC,GACAC,GACAC,GACgC;AAC1B,QAAA;AAAA,IAAEC,GAAAA;AAAAA,MAAMC,EAAgB,GACxB,CAACC,GAAkBC,CAAmB,IAC1CC,EAA2B,YAAY,GACnC,CAACC,GAAYC,CAAa,IAAIF,EAAwB,IAAI,GAC1D,CAACG,GAAaC,CAAc,IAAIJ,EAAwB,IAAI;AAElEK,SAAAA,EAAU,MAAM;AA4CE,KA3CQ,YAAY;;AAClC,UAAIP,MAAqB;AAErB,YAAA;AACF,gBAAMQ,IAAU,MAAMb,EAAMc,MAAMC,UAAU;AAAA,YAC1Cb,QAAAA;AAAAA,YACAc,gBAAgBf;AAAAA,UAAAA,CACjB;AAEGY,eAAAA,IAAAA,EAAQI,eAARJ,QAAAA,EAAoBK;AACtB,mBAAOZ,EAAoB,WAAW;AAWtCO,cARE,GAACA,IAAAA,EAAQI,eAARJ,QAAAA,EAAoBK,OAQvBL,EAAQM,SAAS,uBACjBN,KAAAA,IAAAA,EAAQO,aAARP,gBAAAA,EAAkBQ,SAAlBR,gBAAAA,EAAwBS,aAAYnB,EAAE,wBAAwB;AAE9D,mBAAOG,EAAoB,cAAc;AAI3C,cAAI,GAACO,IAAAA,EAAQI,eAARJ,QAAAA,EAAoBK,SAAML,IAAAA,EAAQI,eAARJ,QAAAA,EAAoBU,QAAO;AACxD,kBAAMf,IAAajB,GAAwBsB,IAAAA,EAAQI,eAARJ,gBAAAA,EAAoBU,KAAK;AACpEd,YAAAA,EAAcD,CAAU,GACxBF,EAAoB,OAAO;AAC3B;AAAA,UACF;AAIAA,UAAAA,EAAoB,OAAO;AAAA,gBACb;AACdA,UAAAA,EAAoB,OAAO;AAAA,QAC7B;AAAA,IAAA;EAGc,GACf,CAACD,GAAkBH,GAAQD,GAAqBD,EAAMc,OAAOX,CAAC,CAAC,GAE3D;AAAA,IACLE,kBAAAA;AAAAA,IACAC,qBAAAA;AAAAA,IACAE,YAAAA;AAAAA,IACAC,eAAAA;AAAAA,IACAC,aAAAA;AAAAA,IACAC,gBAAAA;AAAAA,EAAAA;AAEJ;"}
1
+ {"version":3,"file":"useSlackConnectionStatus.mjs","sources":["../../../../../src/modules/slack/hooks/useSlackConnectionStatus.ts"],"sourcesContent":["import Knock from \"@knocklabs/client\";\nimport { useEffect, useState } from \"react\";\n\nimport { useTranslations } from \"../../i18n\";\n\nexport type ConnectionStatus =\n | \"connecting\"\n | \"connected\"\n | \"disconnected\"\n | \"error\"\n | \"disconnecting\";\n\ntype UseSlackConnectionStatusOutput = {\n connectionStatus: ConnectionStatus;\n setConnectionStatus: (status: ConnectionStatus) => void;\n errorLabel: string | null;\n setErrorLabel: (errorLabel: string) => void;\n actionLabel: string | null;\n setActionLabel: (actionLabel: string | null) => void;\n};\n\n/**\n * Transforms a slack error message into\n * a formatted one. Slack error messages: https://api.slack.com/methods/auth.test#errors\n *\n * Ex.: \"account_inactive\" -> \"Account inactive\"\n */\nconst formatSlackErrorMessage = (errorMessage: string) => {\n const firstLetter = errorMessage.substring(0, 1).toUpperCase();\n const rest = errorMessage.substring(1);\n return firstLetter?.concat(rest).replace(\"_\", \" \");\n};\n\nfunction useSlackConnectionStatus(\n knock: Knock,\n knockSlackChannelId: string,\n tenant: string,\n): UseSlackConnectionStatusOutput {\n const { t } = useTranslations();\n const [connectionStatus, setConnectionStatus] =\n useState<ConnectionStatus>(\"connecting\");\n const [errorLabel, setErrorLabel] = useState<string | null>(null);\n const [actionLabel, setActionLabel] = useState<string | null>(null);\n\n useEffect(() => {\n const checkAuthStatus = async () => {\n if (connectionStatus !== \"connecting\") return;\n\n try {\n const authRes = await knock.slack.authCheck({\n tenant,\n knockChannelId: knockSlackChannelId,\n });\n\n if (authRes.connection?.ok) {\n return setConnectionStatus(\"connected\");\n }\n\n if (!authRes.connection?.ok) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is a normal response for a tenant that doesn't have an access\n // token set on it, meaning it's not connected to Slack, so we\n // give it a \"disconnected\" status instead of an error status.\n if (\n authRes.code === \"ERR_BAD_REQUEST\" &&\n authRes.response?.data?.message === t(\"slackAccessTokenNotSet\")\n ) {\n return setConnectionStatus(\"disconnected\");\n }\n\n // This is for an error coming directly from Slack.\n if (!authRes.connection?.ok && authRes.connection?.error) {\n const errorLabel = formatSlackErrorMessage(authRes.connection?.error);\n setErrorLabel(errorLabel);\n setConnectionStatus(\"error\");\n return;\n }\n\n // This is for any Knock errors that would require a reconnect.\n\n setConnectionStatus(\"error\");\n } catch (_error) {\n setConnectionStatus(\"error\");\n }\n };\n\n checkAuthStatus();\n }, [connectionStatus, tenant, knockSlackChannelId, knock.slack, t]);\n\n return {\n connectionStatus,\n setConnectionStatus,\n errorLabel,\n setErrorLabel,\n actionLabel,\n setActionLabel,\n };\n}\n\nexport default useSlackConnectionStatus;\n"],"names":["formatSlackErrorMessage","errorMessage","firstLetter","substring","toUpperCase","rest","concat","replace","useSlackConnectionStatus","knock","knockSlackChannelId","tenant","t","useTranslations","connectionStatus","setConnectionStatus","useState","errorLabel","setErrorLabel","actionLabel","setActionLabel","useEffect","authRes","slack","authCheck","knockChannelId","connection","ok","code","response","data","message","error"],"mappings":";;;AA2BA,MAAMA,IAA0BA,CAACC,MAAyB;AACxD,QAAMC,IAAcD,EAAaE,UAAU,GAAG,CAAC,EAAEC,eAC3CC,IAAOJ,EAAaE,UAAU,CAAC;AACrC,SAAOD,KAAAA,gBAAAA,EAAaI,OAAOD,GAAME,QAAQ,KAAK;AAChD;AAEA,SAASC,EACPC,GACAC,GACAC,GACgC;AAC1B,QAAA;AAAA,IAAEC,GAAAA;AAAAA,MAAMC,EAAgB,GACxB,CAACC,GAAkBC,CAAmB,IAC1CC,EAA2B,YAAY,GACnC,CAACC,GAAYC,CAAa,IAAIF,EAAwB,IAAI,GAC1D,CAACG,GAAaC,CAAc,IAAIJ,EAAwB,IAAI;AAElEK,SAAAA,EAAU,MAAM;AA4CE,KA3CQ,YAAY;;AAClC,UAAIP,MAAqB;AAErB,YAAA;AACF,gBAAMQ,IAAU,MAAMb,EAAMc,MAAMC,UAAU;AAAA,YAC1Cb,QAAAA;AAAAA,YACAc,gBAAgBf;AAAAA,UAAAA,CACjB;AAEGY,eAAAA,IAAAA,EAAQI,eAARJ,QAAAA,EAAoBK;AACtB,mBAAOZ,EAAoB,WAAW;AAWtCO,cARE,GAACA,IAAAA,EAAQI,eAARJ,QAAAA,EAAoBK,OAQvBL,EAAQM,SAAS,uBACjBN,KAAAA,IAAAA,EAAQO,aAARP,gBAAAA,EAAkBQ,SAAlBR,gBAAAA,EAAwBS,aAAYnB,EAAE,wBAAwB;AAE9D,mBAAOG,EAAoB,cAAc;AAI3C,cAAI,GAACO,IAAAA,EAAQI,eAARJ,QAAAA,EAAoBK,SAAML,IAAAA,EAAQI,eAARJ,QAAAA,EAAoBU,QAAO;AACxD,kBAAMf,IAAajB,GAAwBsB,IAAAA,EAAQI,eAARJ,gBAAAA,EAAoBU,KAAK;AACpEd,YAAAA,EAAcD,CAAU,GACxBF,EAAoB,OAAO;AAC3B;AAAA,UACF;AAIAA,UAAAA,EAAoB,OAAO;AAAA,gBACZ;AACfA,UAAAA,EAAoB,OAAO;AAAA,QAC7B;AAAA,IAAA;EAGc,GACf,CAACD,GAAkBH,GAAQD,GAAqBD,EAAMc,OAAOX,CAAC,CAAC,GAE3D;AAAA,IACLE,kBAAAA;AAAAA,IACAC,qBAAAA;AAAAA,IACAE,YAAAA;AAAAA,IACAC,eAAAA;AAAAA,IACAC,aAAAA;AAAAA,IACAC,gBAAAA;AAAAA,EAAAA;AAEJ;"}
@@ -1,7 +1,6 @@
1
1
  import { default as Knock, AuthenticateOptions, LogLevel } from '@knocklabs/client';
2
2
  import { PropsWithChildren } from 'react';
3
3
  import { I18nContent } from '../../i18n';
4
-
5
4
  import * as React from "react";
6
5
  export interface KnockProviderState {
7
6
  knock: Knock;
@@ -1,5 +1,4 @@
1
1
  import { default as Knock, AuthenticateOptions, KnockOptions } from '@knocklabs/client';
2
-
3
2
  export type AuthenticatedKnockClientOptions = KnockOptions & AuthenticateOptions;
4
3
  declare function useAuthenticatedKnockClient(apiKey: string, userId: string, userToken?: string, options?: AuthenticatedKnockClientOptions): Knock;
5
4
  export default useAuthenticatedKnockClient;
@@ -1,6 +1,5 @@
1
1
  import { FeedClientOptions } from '@knocklabs/client';
2
2
  import { ReactNode } from 'react';
3
-
4
3
  export declare function formatBadgeCount(count: number): string | number;
5
4
  type FormatTimestampOptions = {
6
5
  locale?: string | string[];
@@ -2,7 +2,6 @@ import { default as Knock, Feed, FeedClientOptions, FeedStoreState } from '@knoc
2
2
  import { PropsWithChildren } from 'react';
3
3
  import { UseBoundStore } from 'zustand';
4
4
  import { ColorMode } from '../../core/constants';
5
-
6
5
  import * as React from "react";
7
6
  export interface KnockFeedProviderState {
8
7
  knock: Knock;
@@ -1,5 +1,4 @@
1
1
  import { Feed } from '@knocklabs/client';
2
-
3
2
  export type FeedSettings = {
4
3
  features: {
5
4
  branding_required: boolean;
@@ -1,6 +1,5 @@
1
1
  import { Feed, FeedStoreState } from '@knocklabs/client';
2
2
  import { StateSelector } from 'zustand';
3
-
4
3
  declare function useCreateNotificationStore(feedClient: Feed): import('zustand').UseBoundStore<FeedStoreState, import('zustand').StoreApi<FeedStoreState>>;
5
4
  declare function useNotificationStore(feedClient: Feed, selector?: StateSelector<FeedStoreState, FeedStoreState>): FeedStoreState;
6
5
  export { useCreateNotificationStore };
@@ -1,5 +1,4 @@
1
1
  import { default as Knock, Feed, FeedClientOptions } from '@knocklabs/client';
2
-
3
2
  declare function useNotifications(knock: Knock, feedChannelId: string, options?: FeedClientOptions): Feed;
4
3
  export default useNotifications;
5
4
  //# sourceMappingURL=useNotifications.d.ts.map
@@ -1,6 +1,5 @@
1
1
  import { default as React, FunctionComponent, PropsWithChildren } from 'react';
2
2
  import { I18nContent } from '../languages';
3
-
4
3
  export declare const I18nContext: React.Context<I18nContent>;
5
4
  export interface KnockI18nProviderProps {
6
5
  i18n?: I18nContent;
@@ -1,5 +1,4 @@
1
1
  import { I18nContent } from '.';
2
-
3
2
  declare const de: I18nContent;
4
3
  export default de;
5
4
  //# sourceMappingURL=de.d.ts.map
@@ -1,5 +1,4 @@
1
1
  import { I18nContent } from '.';
2
-
3
2
  declare const en: I18nContent;
4
3
  export default en;
5
4
  //# sourceMappingURL=en.d.ts.map
@@ -1,6 +1,5 @@
1
1
  import { ContainerObject } from '..';
2
2
  import { SlackChannelConnection } from '@knocklabs/client';
3
-
4
3
  type UseSlackChannelsProps = {
5
4
  slackChannelsRecipientObject: ContainerObject;
6
5
  };
@@ -1,6 +1,5 @@
1
1
  import { SlackChannelQueryOptions } from '..';
2
2
  import { SlackChannel } from '@knocklabs/client';
3
-
4
3
  type UseSlackChannelsProps = {
5
4
  queryOptions?: SlackChannelQueryOptions;
6
5
  };
@@ -1,5 +1,4 @@
1
1
  import { default as Knock } from '@knocklabs/client';
2
-
3
2
  export type ConnectionStatus = "connecting" | "connected" | "disconnected" | "error" | "disconnecting";
4
3
  type UseSlackConnectionStatusOutput = {
5
4
  connectionStatus: ConnectionStatus;
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.26",
5
+ "version": "0.2.28-rc.0",
6
6
  "license": "MIT",
7
7
  "main": "dist/cjs/index.js",
8
8
  "module": "dist/esm/index.mjs",
@@ -49,7 +49,7 @@
49
49
  "react": "^16.11.0 || ^17.0.0 || ^18.0.0"
50
50
  },
51
51
  "dependencies": {
52
- "@knocklabs/client": "^0.10.14",
52
+ "@knocklabs/client": "^0.10.16-rc.0",
53
53
  "date-fns": "^4.0.0",
54
54
  "swr": "^2.2.5",
55
55
  "zustand": "^3.7.2"
@@ -57,21 +57,21 @@
57
57
  "devDependencies": {
58
58
  "@testing-library/react": "^14.2.0",
59
59
  "@types/react": "^18.3.6",
60
- "@typescript-eslint/eslint-plugin": "^6.20.0",
61
- "@typescript-eslint/parser": "^8.8.1",
62
- "@vitejs/plugin-react": "^4.3.2",
60
+ "@typescript-eslint/eslint-plugin": "^8.14.0",
61
+ "@typescript-eslint/parser": "^8.16.0",
62
+ "@vitejs/plugin-react": "^4.3.3",
63
63
  "babel-plugin-react-require": "^4.0.3",
64
64
  "eslint": "^8.56.0",
65
- "eslint-plugin-react-hooks": "^4.6.0",
66
- "eslint-plugin-react-refresh": "^0.4.4",
67
- "jsdom": "^24.0.0",
65
+ "eslint-plugin-react-hooks": "^5.0.0",
66
+ "eslint-plugin-react-refresh": "^0.4.14",
67
+ "jsdom": "^25.0.1",
68
68
  "react": "^18.2.0",
69
69
  "rimraf": "^6.0.1",
70
70
  "rollup-plugin-execute": "^1.1.1",
71
- "typescript": "^5.6.2",
71
+ "typescript": "^5.6.3",
72
72
  "vite": "^5.0.0",
73
- "vite-plugin-dts": "^3.6.3",
73
+ "vite-plugin-dts": "^4.3.0",
74
74
  "vite-plugin-no-bundle": "^4.0.0",
75
- "vitest": "^2.0.5"
75
+ "vitest": "^2.1.4"
76
76
  }
77
77
  }
@@ -21,7 +21,7 @@ export function formatTimestamp(
21
21
  });
22
22
 
23
23
  return formatted;
24
- } catch (e) {
24
+ } catch (_e) {
25
25
  return ts;
26
26
  }
27
27
  }
@@ -87,7 +87,7 @@ function useConnectedSlackChannels({
87
87
  data: { connections: channelsToSendToKnock },
88
88
  });
89
89
  fetchAndSetConnectedChannels();
90
- } catch (error) {
90
+ } catch (_error) {
91
91
  setError(t("slackChannelSetError") || "");
92
92
  }
93
93
  setIsUpdating(false);
@@ -45,7 +45,7 @@ function useSlackAuth(
45
45
  } else {
46
46
  setConnectionStatus("error");
47
47
  }
48
- } catch (error) {
48
+ } catch (_error) {
49
49
  setConnectionStatus("error");
50
50
  }
51
51
  }, [
@@ -81,7 +81,7 @@ function useSlackConnectionStatus(
81
81
  // This is for any Knock errors that would require a reconnect.
82
82
 
83
83
  setConnectionStatus("error");
84
- } catch (error) {
84
+ } catch (_error) {
85
85
  setConnectionStatus("error");
86
86
  }
87
87
  };