@novu/react 3.15.0 → 3.17.0-rc.d0046861c6
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/dist/cjs/components/NovuUI.cjs.map +1 -1
- package/dist/cjs/components/NovuUI.d.cts +2 -2
- package/dist/cjs/components/connect-chat/ConnectChat.cjs +63 -0
- package/dist/cjs/components/connect-chat/ConnectChat.cjs.map +1 -0
- package/dist/cjs/components/connect-chat/ConnectChat.d.cts +12 -0
- package/dist/cjs/components/connect-chat/DefaultConnectChat.cjs +83 -0
- package/dist/cjs/components/connect-chat/DefaultConnectChat.cjs.map +1 -0
- package/dist/cjs/components/connect-chat/DefaultConnectChat.d.cts +7 -0
- package/dist/cjs/components/index.cjs +8 -0
- package/dist/cjs/components/index.cjs.map +1 -1
- package/dist/cjs/components/index.d.cts +9 -1
- package/dist/cjs/components/msteams-connect-button/DefaultMsTeamsConnectButton.cjs +92 -0
- package/dist/cjs/components/msteams-connect-button/DefaultMsTeamsConnectButton.cjs.map +1 -0
- package/dist/cjs/components/msteams-connect-button/DefaultMsTeamsConnectButton.d.cts +7 -0
- package/dist/cjs/components/msteams-connect-button/MsTeamsConnectButton.cjs +63 -0
- package/dist/cjs/components/msteams-connect-button/MsTeamsConnectButton.cjs.map +1 -0
- package/dist/cjs/components/msteams-connect-button/MsTeamsConnectButton.d.cts +12 -0
- package/dist/cjs/components/msteams-link-user/DefaultMsTeamsLinkUser.cjs +80 -0
- package/dist/cjs/components/msteams-link-user/DefaultMsTeamsLinkUser.cjs.map +1 -0
- package/dist/cjs/components/msteams-link-user/DefaultMsTeamsLinkUser.d.cts +7 -0
- package/dist/cjs/components/msteams-link-user/MsTeamsLinkUser.cjs +63 -0
- package/dist/cjs/components/msteams-link-user/MsTeamsLinkUser.cjs.map +1 -0
- package/dist/cjs/components/msteams-link-user/MsTeamsLinkUser.d.cts +12 -0
- package/dist/cjs/components/slack-connect-button/DefaultSlackConnectButton.cjs +92 -0
- package/dist/cjs/components/slack-connect-button/DefaultSlackConnectButton.cjs.map +1 -0
- package/dist/cjs/components/slack-connect-button/DefaultSlackConnectButton.d.cts +7 -0
- package/dist/cjs/components/slack-connect-button/SlackConnectButton.cjs +63 -0
- package/dist/cjs/components/slack-connect-button/SlackConnectButton.cjs.map +1 -0
- package/dist/cjs/components/slack-connect-button/SlackConnectButton.d.cts +12 -0
- package/dist/cjs/components/slack-link-user/DefaultSlackLinkUser.cjs +80 -0
- package/dist/cjs/components/slack-link-user/DefaultSlackLinkUser.cjs.map +1 -0
- package/dist/cjs/components/slack-link-user/DefaultSlackLinkUser.d.cts +7 -0
- package/dist/cjs/components/slack-link-user/SlackLinkUser.cjs +63 -0
- package/dist/cjs/components/slack-link-user/SlackLinkUser.cjs.map +1 -0
- package/dist/cjs/components/slack-link-user/SlackLinkUser.d.cts +12 -0
- package/dist/cjs/hooks/NovuProvider.cjs +34 -22
- package/dist/cjs/hooks/NovuProvider.cjs.map +1 -1
- package/dist/cjs/hooks/NovuProvider.d.cts +13 -2
- package/dist/cjs/hooks/index.cjs +10 -0
- package/dist/cjs/hooks/index.cjs.map +1 -1
- package/dist/cjs/hooks/index.d.cts +5 -0
- package/dist/cjs/hooks/internal/useBrowserTabsChannel.cjs +5 -2
- package/dist/cjs/hooks/internal/useBrowserTabsChannel.cjs.map +1 -1
- package/dist/cjs/hooks/internal/useBrowserTabsChannel.d.cts +2 -1
- package/dist/cjs/hooks/internal/useWebsocketEvent.cjs +6 -3
- package/dist/cjs/hooks/internal/useWebsocketEvent.cjs.map +1 -1
- package/dist/cjs/hooks/internal/useWebsocketEvent.d.cts +2 -1
- package/dist/cjs/hooks/useChannelConnection.cjs +107 -0
- package/dist/cjs/hooks/useChannelConnection.cjs.map +1 -0
- package/dist/cjs/hooks/useChannelConnection.d.cts +20 -0
- package/dist/cjs/hooks/useChannelConnections.cjs +85 -0
- package/dist/cjs/hooks/useChannelConnections.cjs.map +1 -0
- package/dist/cjs/hooks/useChannelConnections.d.cts +24 -0
- package/dist/cjs/hooks/useChannelEndpoint.cjs +110 -0
- package/dist/cjs/hooks/useChannelEndpoint.cjs.map +1 -0
- package/dist/cjs/hooks/useChannelEndpoint.d.cts +20 -0
- package/dist/cjs/hooks/useCounts.cjs +5 -1
- package/dist/cjs/hooks/useCounts.cjs.map +1 -1
- package/dist/cjs/hooks/useCounts.d.cts +18 -0
- package/dist/cjs/hooks/useCreateChannelEndpoint.cjs +61 -0
- package/dist/cjs/hooks/useCreateChannelEndpoint.cjs.map +1 -0
- package/dist/cjs/hooks/useCreateChannelEndpoint.d.cts +17 -0
- package/dist/cjs/hooks/useDeleteChannelEndpoint.cjs +69 -0
- package/dist/cjs/hooks/useDeleteChannelEndpoint.cjs.map +1 -0
- package/dist/cjs/hooks/useDeleteChannelEndpoint.d.cts +17 -0
- package/dist/cjs/hooks/useNotifications.cjs +4 -0
- package/dist/cjs/hooks/useNotifications.cjs.map +1 -1
- package/dist/cjs/hooks/useNotifications.d.cts +18 -0
- package/dist/cjs/index.cjs +18 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +15 -2
- package/dist/cjs/internal/index.d.cts +1 -0
- package/dist/cjs/server/index.d.cts +1 -1
- package/dist/cjs/themes/index.d.cts +0 -1
- package/dist/cjs/utils/appearance.cjs.map +1 -1
- package/dist/cjs/utils/appearance.d.cts +2 -2
- package/dist/esm/components/NovuUI.d.ts +2 -2
- package/dist/esm/components/NovuUI.js.map +1 -1
- package/dist/esm/components/connect-chat/ConnectChat.d.ts +12 -0
- package/dist/esm/components/connect-chat/ConnectChat.js +28 -0
- package/dist/esm/components/connect-chat/ConnectChat.js.map +1 -0
- package/dist/esm/components/connect-chat/DefaultConnectChat.d.ts +7 -0
- package/dist/esm/components/connect-chat/DefaultConnectChat.js +58 -0
- package/dist/esm/components/connect-chat/DefaultConnectChat.js.map +1 -0
- package/dist/esm/components/index.d.ts +9 -1
- package/dist/esm/components/index.js +4 -0
- package/dist/esm/components/index.js.map +1 -1
- package/dist/esm/components/msteams-connect-button/DefaultMsTeamsConnectButton.d.ts +7 -0
- package/dist/esm/components/msteams-connect-button/DefaultMsTeamsConnectButton.js +67 -0
- package/dist/esm/components/msteams-connect-button/DefaultMsTeamsConnectButton.js.map +1 -0
- package/dist/esm/components/msteams-connect-button/MsTeamsConnectButton.d.ts +12 -0
- package/dist/esm/components/msteams-connect-button/MsTeamsConnectButton.js +28 -0
- package/dist/esm/components/msteams-connect-button/MsTeamsConnectButton.js.map +1 -0
- package/dist/esm/components/msteams-link-user/DefaultMsTeamsLinkUser.d.ts +7 -0
- package/dist/esm/components/msteams-link-user/DefaultMsTeamsLinkUser.js +55 -0
- package/dist/esm/components/msteams-link-user/DefaultMsTeamsLinkUser.js.map +1 -0
- package/dist/esm/components/msteams-link-user/MsTeamsLinkUser.d.ts +12 -0
- package/dist/esm/components/msteams-link-user/MsTeamsLinkUser.js +28 -0
- package/dist/esm/components/msteams-link-user/MsTeamsLinkUser.js.map +1 -0
- package/dist/esm/components/slack-connect-button/DefaultSlackConnectButton.d.ts +7 -0
- package/dist/esm/components/slack-connect-button/DefaultSlackConnectButton.js +67 -0
- package/dist/esm/components/slack-connect-button/DefaultSlackConnectButton.js.map +1 -0
- package/dist/esm/components/slack-connect-button/SlackConnectButton.d.ts +12 -0
- package/dist/esm/components/slack-connect-button/SlackConnectButton.js +28 -0
- package/dist/esm/components/slack-connect-button/SlackConnectButton.js.map +1 -0
- package/dist/esm/components/slack-link-user/DefaultSlackLinkUser.d.ts +7 -0
- package/dist/esm/components/slack-link-user/DefaultSlackLinkUser.js +55 -0
- package/dist/esm/components/slack-link-user/DefaultSlackLinkUser.js.map +1 -0
- package/dist/esm/components/slack-link-user/SlackLinkUser.d.ts +12 -0
- package/dist/esm/components/slack-link-user/SlackLinkUser.js +28 -0
- package/dist/esm/components/slack-link-user/SlackLinkUser.js.map +1 -0
- package/dist/esm/hooks/NovuProvider.d.ts +13 -2
- package/dist/esm/hooks/NovuProvider.js +33 -22
- package/dist/esm/hooks/NovuProvider.js.map +1 -1
- package/dist/esm/hooks/index.d.ts +5 -0
- package/dist/esm/hooks/index.js +5 -0
- package/dist/esm/hooks/index.js.map +1 -1
- package/dist/esm/hooks/internal/useBrowserTabsChannel.d.ts +2 -1
- package/dist/esm/hooks/internal/useBrowserTabsChannel.js +5 -2
- package/dist/esm/hooks/internal/useBrowserTabsChannel.js.map +1 -1
- package/dist/esm/hooks/internal/useWebsocketEvent.d.ts +2 -1
- package/dist/esm/hooks/internal/useWebsocketEvent.js +6 -3
- package/dist/esm/hooks/internal/useWebsocketEvent.js.map +1 -1
- package/dist/esm/hooks/useChannelConnection.d.ts +20 -0
- package/dist/esm/hooks/useChannelConnection.js +81 -0
- package/dist/esm/hooks/useChannelConnection.js.map +1 -0
- package/dist/esm/hooks/useChannelConnections.d.ts +24 -0
- package/dist/esm/hooks/useChannelConnections.js +60 -0
- package/dist/esm/hooks/useChannelConnections.js.map +1 -0
- package/dist/esm/hooks/useChannelEndpoint.d.ts +20 -0
- package/dist/esm/hooks/useChannelEndpoint.js +83 -0
- package/dist/esm/hooks/useChannelEndpoint.js.map +1 -0
- package/dist/esm/hooks/useCounts.d.ts +18 -0
- package/dist/esm/hooks/useCounts.js +6 -2
- package/dist/esm/hooks/useCounts.js.map +1 -1
- package/dist/esm/hooks/useCreateChannelEndpoint.d.ts +17 -0
- package/dist/esm/hooks/useCreateChannelEndpoint.js +36 -0
- package/dist/esm/hooks/useCreateChannelEndpoint.js.map +1 -0
- package/dist/esm/hooks/useDeleteChannelEndpoint.d.ts +17 -0
- package/dist/esm/hooks/useDeleteChannelEndpoint.js +43 -0
- package/dist/esm/hooks/useDeleteChannelEndpoint.js.map +1 -0
- package/dist/esm/hooks/useNotifications.d.ts +18 -0
- package/dist/esm/hooks/useNotifications.js +5 -1
- package/dist/esm/hooks/useNotifications.js.map +1 -1
- package/dist/esm/index.d.ts +15 -2
- package/dist/esm/index.js +18 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/index.d.ts +1 -1
- package/dist/esm/utils/appearance.d.ts +2 -2
- package/dist/esm/utils/appearance.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/hooks/internal/useBrowserTabsChannel.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nexport const useBrowserTabsChannel = <T = unknown>({\n channelName,\n onMessage,\n}: {\n channelName: string;\n onMessage: (args: T) => void;\n}) => {\n const [tabsChannel] = useState(\n typeof BroadcastChannel !== 'undefined' ? new BroadcastChannel(channelName) : undefined\n );\n\n const postMessage = (data: T) => {\n tabsChannel?.postMessage(data);\n };\n\n useEffect(() => {\n const listener = (event: MessageEvent<T>) => {\n onMessage(event.data);\n };\n\n tabsChannel?.addEventListener('message', listener);\n\n return () => {\n tabsChannel?.removeEventListener('message', listener);\n };\n }, []);\n\n return { postMessage };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAoC;AAE7B,IAAM,wBAAwB,CAAc;AAAA,EACjD;AAAA,EACA;
|
|
1
|
+
{"version":3,"sources":["../../../../src/hooks/internal/useBrowserTabsChannel.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nexport const useBrowserTabsChannel = <T = unknown>({\n channelName,\n onMessage,\n enabled = true,\n}: {\n channelName: string;\n onMessage: (args: T) => void;\n enabled?: boolean;\n}) => {\n const [tabsChannel] = useState(\n typeof BroadcastChannel !== 'undefined' ? new BroadcastChannel(channelName) : undefined\n );\n\n const postMessage = (data: T) => {\n if (!enabled) return;\n tabsChannel?.postMessage(data);\n };\n\n useEffect(() => {\n if (!enabled) return;\n\n const listener = (event: MessageEvent<T>) => {\n onMessage(event.data);\n };\n\n tabsChannel?.addEventListener('message', listener);\n\n return () => {\n tabsChannel?.removeEventListener('message', listener);\n };\n }, [enabled]);\n\n return { postMessage };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAoC;AAE7B,IAAM,wBAAwB,CAAc;AAAA,EACjD;AAAA,EACA;AAAA,EACA,UAAU;AACZ,MAIM;AACJ,QAAM,CAAC,WAAW,QAAI;AAAA,IACpB,OAAO,qBAAqB,cAAc,IAAI,iBAAiB,WAAW,IAAI;AAAA,EAChF;AAEA,QAAM,cAAc,CAAC,SAAY;AAC/B,QAAI,CAAC,QAAS;AACd,+CAAa,YAAY;AAAA,EAC3B;AAEA,8BAAU,MAAM;AACd,QAAI,CAAC,QAAS;AAEd,UAAM,WAAW,CAAC,UAA2B;AAC3C,gBAAU,MAAM,IAAI;AAAA,IACtB;AAEA,+CAAa,iBAAiB,WAAW;AAEzC,WAAO,MAAM;AACX,iDAAa,oBAAoB,WAAW;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO,EAAE,YAAY;AACvB;","names":[]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
declare const useBrowserTabsChannel: <T = unknown>({ channelName, onMessage, }: {
|
|
1
|
+
declare const useBrowserTabsChannel: <T = unknown>({ channelName, onMessage, enabled, }: {
|
|
2
2
|
channelName: string;
|
|
3
3
|
onMessage: (args: T) => void;
|
|
4
|
+
enabled?: boolean;
|
|
4
5
|
}) => {
|
|
5
6
|
postMessage: (data: T) => void;
|
|
6
7
|
};
|
|
@@ -29,19 +29,22 @@ var import_NovuProvider = require("../NovuProvider.cjs");
|
|
|
29
29
|
var import_useBrowserTabsChannel = require("./useBrowserTabsChannel.cjs");
|
|
30
30
|
var useWebSocketEvent = ({
|
|
31
31
|
event: webSocketEvent,
|
|
32
|
-
eventHandler: onMessage
|
|
32
|
+
eventHandler: onMessage,
|
|
33
|
+
enabled = true
|
|
33
34
|
}) => {
|
|
34
35
|
const novu = (0, import_NovuProvider.useNovu)();
|
|
35
36
|
const channelName = `nv_ws_connection:a=${novu.applicationIdentifier}:s=${novu.subscriberId}:c=${novu.contextKey}:e=${webSocketEvent}`;
|
|
36
37
|
const { postMessage } = (0, import_useBrowserTabsChannel.useBrowserTabsChannel)({
|
|
37
38
|
channelName,
|
|
38
|
-
onMessage
|
|
39
|
+
onMessage,
|
|
40
|
+
enabled
|
|
39
41
|
});
|
|
40
42
|
const updateReadCount = (data) => {
|
|
41
43
|
onMessage(data);
|
|
42
44
|
postMessage(data);
|
|
43
45
|
};
|
|
44
46
|
(0, import_react.useEffect)(() => {
|
|
47
|
+
if (!enabled) return;
|
|
45
48
|
let cleanup;
|
|
46
49
|
const resolveLock = (0, import_requestLock.requestLock)(channelName, () => {
|
|
47
50
|
cleanup = novu.on(webSocketEvent, updateReadCount);
|
|
@@ -52,7 +55,7 @@ var useWebSocketEvent = ({
|
|
|
52
55
|
}
|
|
53
56
|
resolveLock();
|
|
54
57
|
};
|
|
55
|
-
}, []);
|
|
58
|
+
}, [enabled]);
|
|
56
59
|
};
|
|
57
60
|
// Annotate the CommonJS export names for ESM import in node:
|
|
58
61
|
0 && (module.exports = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/hooks/internal/useWebsocketEvent.ts"],"sourcesContent":["import { EventHandler, Events, SocketEventNames } from '@novu/js';\nimport { useEffect } from 'react';\nimport { requestLock } from '../../utils/requestLock';\nimport { useNovu } from '../NovuProvider';\nimport { useBrowserTabsChannel } from './useBrowserTabsChannel';\n\nexport const useWebSocketEvent = <E extends SocketEventNames>({\n event: webSocketEvent,\n eventHandler: onMessage,\n}: {\n event: E;\n eventHandler: (args: Events[E]) => void;\n}) => {\n const novu = useNovu();\n const channelName = `nv_ws_connection:a=${novu.applicationIdentifier}:s=${novu.subscriberId}:c=${novu.contextKey}:e=${webSocketEvent}`;\n\n const { postMessage } = useBrowserTabsChannel({\n channelName,\n onMessage,\n });\n\n const updateReadCount: EventHandler<Events[E]> = (data) => {\n onMessage(data);\n postMessage(data);\n };\n\n useEffect(() => {\n let cleanup: () => void;\n const resolveLock = requestLock(channelName, () => {\n cleanup = novu.on(webSocketEvent, updateReadCount);\n });\n\n return () => {\n if (cleanup) {\n cleanup();\n }\n\n resolveLock();\n };\n }, []);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA0B;AAC1B,yBAA4B;AAC5B,0BAAwB;AACxB,mCAAsC;AAE/B,IAAM,oBAAoB,CAA6B;AAAA,EAC5D,OAAO;AAAA,EACP,cAAc;
|
|
1
|
+
{"version":3,"sources":["../../../../src/hooks/internal/useWebsocketEvent.ts"],"sourcesContent":["import { EventHandler, Events, SocketEventNames } from '@novu/js';\nimport { useEffect } from 'react';\nimport { requestLock } from '../../utils/requestLock';\nimport { useNovu } from '../NovuProvider';\nimport { useBrowserTabsChannel } from './useBrowserTabsChannel';\n\nexport const useWebSocketEvent = <E extends SocketEventNames>({\n event: webSocketEvent,\n eventHandler: onMessage,\n enabled = true,\n}: {\n event: E;\n eventHandler: (args: Events[E]) => void;\n enabled?: boolean;\n}) => {\n const novu = useNovu();\n const channelName = `nv_ws_connection:a=${novu.applicationIdentifier}:s=${novu.subscriberId}:c=${novu.contextKey}:e=${webSocketEvent}`;\n\n const { postMessage } = useBrowserTabsChannel({\n channelName,\n onMessage,\n enabled,\n });\n\n const updateReadCount: EventHandler<Events[E]> = (data) => {\n onMessage(data);\n postMessage(data);\n };\n\n useEffect(() => {\n if (!enabled) return;\n\n let cleanup: () => void;\n const resolveLock = requestLock(channelName, () => {\n cleanup = novu.on(webSocketEvent, updateReadCount);\n });\n\n return () => {\n if (cleanup) {\n cleanup();\n }\n\n resolveLock();\n };\n }, [enabled]);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA0B;AAC1B,yBAA4B;AAC5B,0BAAwB;AACxB,mCAAsC;AAE/B,IAAM,oBAAoB,CAA6B;AAAA,EAC5D,OAAO;AAAA,EACP,cAAc;AAAA,EACd,UAAU;AACZ,MAIM;AACJ,QAAM,WAAO,6BAAQ;AACrB,QAAM,cAAc,sBAAsB,KAAK,qBAAqB,MAAM,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,cAAc;AAEpI,QAAM,EAAE,YAAY,QAAI,oDAAsB;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,kBAA2C,CAAC,SAAS;AACzD,cAAU,IAAI;AACd,gBAAY,IAAI;AAAA,EAClB;AAEA,8BAAU,MAAM;AACd,QAAI,CAAC,QAAS;AAEd,QAAI;AACJ,UAAM,kBAAc,gCAAY,aAAa,MAAM;AACjD,gBAAU,KAAK,GAAG,gBAAgB,eAAe;AAAA,IACnD,CAAC;AAED,WAAO,MAAM;AACX,UAAI,SAAS;AACX,gBAAQ;AAAA,MACV;AAEA,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AACd;","names":[]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { SocketEventNames, Events } from '@novu/js';
|
|
2
2
|
|
|
3
|
-
declare const useWebSocketEvent: <E extends SocketEventNames>({ event: webSocketEvent, eventHandler: onMessage, }: {
|
|
3
|
+
declare const useWebSocketEvent: <E extends SocketEventNames>({ event: webSocketEvent, eventHandler: onMessage, enabled, }: {
|
|
4
4
|
event: E;
|
|
5
5
|
eventHandler: (args: Events[E]) => void;
|
|
6
|
+
enabled?: boolean;
|
|
6
7
|
}) => void;
|
|
7
8
|
|
|
8
9
|
export { useWebSocketEvent };
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/hooks/useChannelConnection.ts
|
|
21
|
+
var useChannelConnection_exports = {};
|
|
22
|
+
__export(useChannelConnection_exports, {
|
|
23
|
+
useChannelConnection: () => useChannelConnection
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(useChannelConnection_exports);
|
|
26
|
+
var import_react = require("react");
|
|
27
|
+
var import_NovuProvider = require("./NovuProvider.cjs");
|
|
28
|
+
var useChannelConnection = (props) => {
|
|
29
|
+
const novu = (0, import_NovuProvider.useNovu)();
|
|
30
|
+
const propsRef = (0, import_react.useRef)(props);
|
|
31
|
+
propsRef.current = props;
|
|
32
|
+
const [connection, setConnection] = (0, import_react.useState)();
|
|
33
|
+
const [error, setError] = (0, import_react.useState)();
|
|
34
|
+
const [isLoading, setIsLoading] = (0, import_react.useState)(true);
|
|
35
|
+
const [isFetching, setIsFetching] = (0, import_react.useState)(false);
|
|
36
|
+
const fetchConnection = (0, import_react.useCallback)(
|
|
37
|
+
async (options) => {
|
|
38
|
+
const { identifier, onSuccess, onError } = propsRef.current;
|
|
39
|
+
if (options == null ? void 0 : options.refetch) {
|
|
40
|
+
setError(void 0);
|
|
41
|
+
setIsLoading(true);
|
|
42
|
+
}
|
|
43
|
+
setIsFetching(true);
|
|
44
|
+
const response = await novu.channelConnections.get({ identifier });
|
|
45
|
+
if (response.error) {
|
|
46
|
+
setError(response.error);
|
|
47
|
+
onError == null ? void 0 : onError(response.error);
|
|
48
|
+
} else if (response.data !== void 0) {
|
|
49
|
+
onSuccess == null ? void 0 : onSuccess(response.data);
|
|
50
|
+
setConnection(response.data);
|
|
51
|
+
}
|
|
52
|
+
setIsLoading(false);
|
|
53
|
+
setIsFetching(false);
|
|
54
|
+
},
|
|
55
|
+
[novu]
|
|
56
|
+
);
|
|
57
|
+
(0, import_react.useEffect)(() => {
|
|
58
|
+
const cleanupGetPending = novu.on("channel-connection.get.pending", ({ args }) => {
|
|
59
|
+
if (!args || args.identifier !== propsRef.current.identifier) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
setIsFetching(true);
|
|
63
|
+
});
|
|
64
|
+
const cleanupGetResolved = novu.on("channel-connection.get.resolved", ({ args, data, error: resolvedError }) => {
|
|
65
|
+
if (!args || args.identifier !== propsRef.current.identifier) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const { onSuccess, onError } = propsRef.current;
|
|
69
|
+
if (resolvedError) {
|
|
70
|
+
setError(resolvedError);
|
|
71
|
+
onError == null ? void 0 : onError(resolvedError);
|
|
72
|
+
} else {
|
|
73
|
+
setConnection(data ?? null);
|
|
74
|
+
onSuccess == null ? void 0 : onSuccess(data ?? null);
|
|
75
|
+
}
|
|
76
|
+
setIsFetching(false);
|
|
77
|
+
});
|
|
78
|
+
const cleanupDeleteResolved = novu.on("channel-connection.delete.resolved", ({ args }) => {
|
|
79
|
+
var _a, _b;
|
|
80
|
+
if (!args || args.identifier !== propsRef.current.identifier) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
setConnection(null);
|
|
84
|
+
(_b = (_a = propsRef.current).onSuccess) == null ? void 0 : _b.call(_a, null);
|
|
85
|
+
setIsFetching(false);
|
|
86
|
+
});
|
|
87
|
+
void fetchConnection({ refetch: true });
|
|
88
|
+
return () => {
|
|
89
|
+
cleanupGetPending();
|
|
90
|
+
cleanupGetResolved();
|
|
91
|
+
cleanupDeleteResolved();
|
|
92
|
+
};
|
|
93
|
+
}, [novu, fetchConnection, props.identifier]);
|
|
94
|
+
const refetch = (0, import_react.useCallback)(() => fetchConnection({ refetch: true }), [fetchConnection]);
|
|
95
|
+
return {
|
|
96
|
+
connection,
|
|
97
|
+
error,
|
|
98
|
+
isLoading,
|
|
99
|
+
isFetching,
|
|
100
|
+
refetch
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
104
|
+
0 && (module.exports = {
|
|
105
|
+
useChannelConnection
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=useChannelConnection.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useChannelConnection.ts"],"sourcesContent":["import type { ChannelConnectionResponse, NovuError } from '@novu/js';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useNovu } from './NovuProvider';\n\nexport type UseChannelConnectionProps = {\n identifier: string;\n onSuccess?: (data: ChannelConnectionResponse | null) => void;\n onError?: (error: NovuError) => void;\n};\n\nexport type UseChannelConnectionResult = {\n connection?: ChannelConnectionResponse | null;\n error?: NovuError;\n isLoading: boolean;\n isFetching: boolean;\n refetch: () => Promise<void>;\n};\n\n/**\n * Get a channel connection by identifier.\n */\nexport const useChannelConnection = (props: UseChannelConnectionProps): UseChannelConnectionResult => {\n const novu = useNovu();\n const propsRef = useRef<UseChannelConnectionProps>(props);\n propsRef.current = props;\n\n const [connection, setConnection] = useState<ChannelConnectionResponse | null>();\n const [error, setError] = useState<NovuError>();\n const [isLoading, setIsLoading] = useState(true);\n const [isFetching, setIsFetching] = useState(false);\n\n const fetchConnection = useCallback(\n async (options?: { refetch: boolean }) => {\n const { identifier, onSuccess, onError } = propsRef.current;\n if (options?.refetch) {\n setError(undefined);\n setIsLoading(true);\n }\n\n setIsFetching(true);\n\n const response = await novu.channelConnections.get({ identifier });\n\n if (response.error) {\n setError(response.error as NovuError);\n onError?.(response.error as NovuError);\n } else if (response.data !== undefined) {\n onSuccess?.(response.data);\n setConnection(response.data);\n }\n setIsLoading(false);\n setIsFetching(false);\n },\n [novu]\n );\n\n // props.identifier triggers a re-fetch and re-registration whenever the\n // caller switches to a different identifier; fetchConnection reads it from\n // propsRef at call-time so it doesn't appear in the callback body directly.\n // biome-ignore lint/correctness/useExhaustiveDependencies: props.identifier is an intentional trigger dependency\n useEffect(() => {\n const cleanupGetPending = novu.on('channel-connection.get.pending', ({ args }) => {\n if (!args || args.identifier !== propsRef.current.identifier) {\n return;\n }\n setIsFetching(true);\n });\n\n const cleanupGetResolved = novu.on('channel-connection.get.resolved', ({ args, data, error: resolvedError }) => {\n if (!args || args.identifier !== propsRef.current.identifier) {\n return;\n }\n const { onSuccess, onError } = propsRef.current;\n if (resolvedError) {\n setError(resolvedError as NovuError);\n onError?.(resolvedError as NovuError);\n } else {\n setConnection((data as ChannelConnectionResponse) ?? null);\n onSuccess?.((data as ChannelConnectionResponse) ?? null);\n }\n setIsFetching(false);\n });\n\n const cleanupDeleteResolved = novu.on('channel-connection.delete.resolved', ({ args }) => {\n if (!args || args.identifier !== propsRef.current.identifier) {\n return;\n }\n setConnection(null);\n propsRef.current.onSuccess?.(null);\n setIsFetching(false);\n });\n\n void fetchConnection({ refetch: true });\n\n return () => {\n cleanupGetPending();\n cleanupGetResolved();\n cleanupDeleteResolved();\n };\n }, [novu, fetchConnection, props.identifier]);\n\n const refetch = useCallback(() => fetchConnection({ refetch: true }), [fetchConnection]);\n\n return {\n connection,\n error,\n isLoading,\n isFetching,\n refetch,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAyD;AACzD,0BAAwB;AAmBjB,IAAM,uBAAuB,CAAC,UAAiE;AACpG,QAAM,WAAO,6BAAQ;AACrB,QAAM,eAAW,qBAAkC,KAAK;AACxD,WAAS,UAAU;AAEnB,QAAM,CAAC,YAAY,aAAa,QAAI,uBAA2C;AAC/E,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAoB;AAC9C,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,IAAI;AAC/C,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAElD,QAAM,sBAAkB;AAAA,IACtB,OAAO,YAAmC;AACxC,YAAM,EAAE,YAAY,WAAW,QAAQ,IAAI,SAAS;AACpD,UAAI,mCAAS,SAAS;AACpB,iBAAS,MAAS;AAClB,qBAAa,IAAI;AAAA,MACnB;AAEA,oBAAc,IAAI;AAElB,YAAM,WAAW,MAAM,KAAK,mBAAmB,IAAI,EAAE,WAAW,CAAC;AAEjE,UAAI,SAAS,OAAO;AAClB,iBAAS,SAAS,KAAkB;AACpC,2CAAU,SAAS;AAAA,MACrB,WAAW,SAAS,SAAS,QAAW;AACtC,+CAAY,SAAS;AACrB,sBAAc,SAAS,IAAI;AAAA,MAC7B;AACA,mBAAa,KAAK;AAClB,oBAAc,KAAK;AAAA,IACrB;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAMA,8BAAU,MAAM;AACd,UAAM,oBAAoB,KAAK,GAAG,kCAAkC,CAAC,EAAE,KAAK,MAAM;AAChF,UAAI,CAAC,QAAQ,KAAK,eAAe,SAAS,QAAQ,YAAY;AAC5D;AAAA,MACF;AACA,oBAAc,IAAI;AAAA,IACpB,CAAC;AAED,UAAM,qBAAqB,KAAK,GAAG,mCAAmC,CAAC,EAAE,MAAM,MAAM,OAAO,cAAc,MAAM;AAC9G,UAAI,CAAC,QAAQ,KAAK,eAAe,SAAS,QAAQ,YAAY;AAC5D;AAAA,MACF;AACA,YAAM,EAAE,WAAW,QAAQ,IAAI,SAAS;AACxC,UAAI,eAAe;AACjB,iBAAS,aAA0B;AACnC,2CAAU;AAAA,MACZ,OAAO;AACL,sBAAe,QAAsC,IAAI;AACzD,+CAAa,QAAsC;AAAA,MACrD;AACA,oBAAc,KAAK;AAAA,IACrB,CAAC;AAED,UAAM,wBAAwB,KAAK,GAAG,sCAAsC,CAAC,EAAE,KAAK,MAAM;AAnF9F;AAoFM,UAAI,CAAC,QAAQ,KAAK,eAAe,SAAS,QAAQ,YAAY;AAC5D;AAAA,MACF;AACA,oBAAc,IAAI;AAClB,2BAAS,SAAQ,cAAjB,4BAA6B;AAC7B,oBAAc,KAAK;AAAA,IACrB,CAAC;AAED,SAAK,gBAAgB,EAAE,SAAS,KAAK,CAAC;AAEtC,WAAO,MAAM;AACX,wBAAkB;AAClB,yBAAmB;AACnB,4BAAsB;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,MAAM,iBAAiB,MAAM,UAAU,CAAC;AAE5C,QAAM,cAAU,0BAAY,MAAM,gBAAgB,EAAE,SAAS,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC;AAEvF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ChannelConnectionResponse, NovuError } from '@novu/js';
|
|
2
|
+
|
|
3
|
+
type UseChannelConnectionProps = {
|
|
4
|
+
identifier: string;
|
|
5
|
+
onSuccess?: (data: ChannelConnectionResponse | null) => void;
|
|
6
|
+
onError?: (error: NovuError) => void;
|
|
7
|
+
};
|
|
8
|
+
type UseChannelConnectionResult = {
|
|
9
|
+
connection?: ChannelConnectionResponse | null;
|
|
10
|
+
error?: NovuError;
|
|
11
|
+
isLoading: boolean;
|
|
12
|
+
isFetching: boolean;
|
|
13
|
+
refetch: () => Promise<void>;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Get a channel connection by identifier.
|
|
17
|
+
*/
|
|
18
|
+
declare const useChannelConnection: (props: UseChannelConnectionProps) => UseChannelConnectionResult;
|
|
19
|
+
|
|
20
|
+
export { type UseChannelConnectionProps, type UseChannelConnectionResult, useChannelConnection };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/hooks/useChannelConnections.ts
|
|
21
|
+
var useChannelConnections_exports = {};
|
|
22
|
+
__export(useChannelConnections_exports, {
|
|
23
|
+
useChannelConnections: () => useChannelConnections
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(useChannelConnections_exports);
|
|
26
|
+
var import_react = require("react");
|
|
27
|
+
var import_NovuProvider = require("./NovuProvider.cjs");
|
|
28
|
+
var useChannelConnections = (props = {}) => {
|
|
29
|
+
const novu = (0, import_NovuProvider.useNovu)();
|
|
30
|
+
const propsRef = (0, import_react.useRef)(props);
|
|
31
|
+
propsRef.current = props;
|
|
32
|
+
const [connections, setConnections] = (0, import_react.useState)([]);
|
|
33
|
+
const [error, setError] = (0, import_react.useState)();
|
|
34
|
+
const [isLoading, setIsLoading] = (0, import_react.useState)(true);
|
|
35
|
+
const [isFetching, setIsFetching] = (0, import_react.useState)(false);
|
|
36
|
+
const fetchConnections = (0, import_react.useCallback)(
|
|
37
|
+
async (options) => {
|
|
38
|
+
const { onSuccess, onError, ...listArgs } = propsRef.current;
|
|
39
|
+
if (options == null ? void 0 : options.refetch) {
|
|
40
|
+
setError(void 0);
|
|
41
|
+
setIsLoading(true);
|
|
42
|
+
}
|
|
43
|
+
setIsFetching(true);
|
|
44
|
+
try {
|
|
45
|
+
const response = await novu.channelConnections.list(listArgs);
|
|
46
|
+
if (response.error) {
|
|
47
|
+
setError(response.error);
|
|
48
|
+
onError == null ? void 0 : onError(response.error);
|
|
49
|
+
} else if (response.data !== void 0) {
|
|
50
|
+
setConnections(response.data);
|
|
51
|
+
onSuccess == null ? void 0 : onSuccess(response.data);
|
|
52
|
+
}
|
|
53
|
+
} catch (err) {
|
|
54
|
+
setError(err);
|
|
55
|
+
onError == null ? void 0 : onError(err);
|
|
56
|
+
} finally {
|
|
57
|
+
setIsLoading(false);
|
|
58
|
+
setIsFetching(false);
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
[novu]
|
|
62
|
+
);
|
|
63
|
+
(0, import_react.useEffect)(() => {
|
|
64
|
+
const cleanupDeleteResolved = novu.on("channel-connection.delete.resolved", () => {
|
|
65
|
+
void fetchConnections({ refetch: true });
|
|
66
|
+
});
|
|
67
|
+
void fetchConnections({ refetch: true });
|
|
68
|
+
return () => {
|
|
69
|
+
cleanupDeleteResolved();
|
|
70
|
+
};
|
|
71
|
+
}, [novu, fetchConnections]);
|
|
72
|
+
const refetch = (0, import_react.useCallback)(() => fetchConnections({ refetch: true }), [fetchConnections]);
|
|
73
|
+
return {
|
|
74
|
+
connections,
|
|
75
|
+
error,
|
|
76
|
+
isLoading,
|
|
77
|
+
isFetching,
|
|
78
|
+
refetch
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
82
|
+
0 && (module.exports = {
|
|
83
|
+
useChannelConnections
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=useChannelConnections.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useChannelConnections.ts"],"sourcesContent":["import type { ChannelConnectionResponse, ListChannelConnectionsArgs, NovuError } from '@novu/js';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useNovu } from './NovuProvider';\n\nexport type UseChannelConnectionsProps = ListChannelConnectionsArgs & {\n onSuccess?: (data: ChannelConnectionResponse[]) => void;\n onError?: (error: NovuError) => void;\n};\n\nexport type UseChannelConnectionsResult = {\n connections: ChannelConnectionResponse[];\n error?: NovuError;\n isLoading: boolean;\n isFetching: boolean;\n refetch: () => Promise<void>;\n};\n\n/**\n * List channel connections for the current subscriber. Use this to discover an active\n * connection identifier after a chat OAuth flow so it can be passed to `LinkUser`.\n *\n * @example\n * const { connections } = useChannelConnections({ integrationIdentifier: 'my-chat-integration' });\n * const connectionIdentifier = connections[0]?.identifier;\n */\nexport const useChannelConnections = (props: UseChannelConnectionsProps = {}): UseChannelConnectionsResult => {\n const novu = useNovu();\n const propsRef = useRef<UseChannelConnectionsProps>(props);\n propsRef.current = props;\n\n const [connections, setConnections] = useState<ChannelConnectionResponse[]>([]);\n const [error, setError] = useState<NovuError>();\n const [isLoading, setIsLoading] = useState(true);\n const [isFetching, setIsFetching] = useState(false);\n\n const fetchConnections = useCallback(\n async (options?: { refetch: boolean }) => {\n const { onSuccess, onError, ...listArgs } = propsRef.current;\n\n if (options?.refetch) {\n setError(undefined);\n setIsLoading(true);\n }\n\n setIsFetching(true);\n\n try {\n const response = await novu.channelConnections.list(listArgs);\n\n if (response.error) {\n setError(response.error as NovuError);\n onError?.(response.error as NovuError);\n } else if (response.data !== undefined) {\n setConnections(response.data);\n onSuccess?.(response.data);\n }\n } catch (err) {\n setError(err as NovuError);\n onError?.(err as NovuError);\n } finally {\n setIsLoading(false);\n setIsFetching(false);\n }\n },\n [novu]\n );\n\n useEffect(() => {\n const cleanupDeleteResolved = novu.on('channel-connection.delete.resolved', () => {\n void fetchConnections({ refetch: true });\n });\n\n void fetchConnections({ refetch: true });\n\n return () => {\n cleanupDeleteResolved();\n };\n }, [novu, fetchConnections]);\n\n const refetch = useCallback(() => fetchConnections({ refetch: true }), [fetchConnections]);\n\n return {\n connections,\n error,\n isLoading,\n isFetching,\n refetch,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAyD;AACzD,0BAAwB;AAuBjB,IAAM,wBAAwB,CAAC,QAAoC,CAAC,MAAmC;AAC5G,QAAM,WAAO,6BAAQ;AACrB,QAAM,eAAW,qBAAmC,KAAK;AACzD,WAAS,UAAU;AAEnB,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAsC,CAAC,CAAC;AAC9E,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAoB;AAC9C,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,IAAI;AAC/C,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAElD,QAAM,uBAAmB;AAAA,IACvB,OAAO,YAAmC;AACxC,YAAM,EAAE,WAAW,SAAS,GAAG,SAAS,IAAI,SAAS;AAErD,UAAI,mCAAS,SAAS;AACpB,iBAAS,MAAS;AAClB,qBAAa,IAAI;AAAA,MACnB;AAEA,oBAAc,IAAI;AAElB,UAAI;AACF,cAAM,WAAW,MAAM,KAAK,mBAAmB,KAAK,QAAQ;AAE5D,YAAI,SAAS,OAAO;AAClB,mBAAS,SAAS,KAAkB;AACpC,6CAAU,SAAS;AAAA,QACrB,WAAW,SAAS,SAAS,QAAW;AACtC,yBAAe,SAAS,IAAI;AAC5B,iDAAY,SAAS;AAAA,QACvB;AAAA,MACF,SAAS,KAAK;AACZ,iBAAS,GAAgB;AACzB,2CAAU;AAAA,MACZ,UAAE;AACA,qBAAa,KAAK;AAClB,sBAAc,KAAK;AAAA,MACrB;AAAA,IACF;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAEA,8BAAU,MAAM;AACd,UAAM,wBAAwB,KAAK,GAAG,sCAAsC,MAAM;AAChF,WAAK,iBAAiB,EAAE,SAAS,KAAK,CAAC;AAAA,IACzC,CAAC;AAED,SAAK,iBAAiB,EAAE,SAAS,KAAK,CAAC;AAEvC,WAAO,MAAM;AACX,4BAAsB;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,MAAM,gBAAgB,CAAC;AAE3B,QAAM,cAAU,0BAAY,MAAM,iBAAiB,EAAE,SAAS,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAEzF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ListChannelConnectionsArgs, ChannelConnectionResponse, NovuError } from '@novu/js';
|
|
2
|
+
|
|
3
|
+
type UseChannelConnectionsProps = ListChannelConnectionsArgs & {
|
|
4
|
+
onSuccess?: (data: ChannelConnectionResponse[]) => void;
|
|
5
|
+
onError?: (error: NovuError) => void;
|
|
6
|
+
};
|
|
7
|
+
type UseChannelConnectionsResult = {
|
|
8
|
+
connections: ChannelConnectionResponse[];
|
|
9
|
+
error?: NovuError;
|
|
10
|
+
isLoading: boolean;
|
|
11
|
+
isFetching: boolean;
|
|
12
|
+
refetch: () => Promise<void>;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* List channel connections for the current subscriber. Use this to discover an active
|
|
16
|
+
* connection identifier after a chat OAuth flow so it can be passed to `LinkUser`.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* const { connections } = useChannelConnections({ integrationIdentifier: 'my-chat-integration' });
|
|
20
|
+
* const connectionIdentifier = connections[0]?.identifier;
|
|
21
|
+
*/
|
|
22
|
+
declare const useChannelConnections: (props?: UseChannelConnectionsProps) => UseChannelConnectionsResult;
|
|
23
|
+
|
|
24
|
+
export { type UseChannelConnectionsProps, type UseChannelConnectionsResult, useChannelConnections };
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/hooks/useChannelEndpoint.ts
|
|
21
|
+
var useChannelEndpoint_exports = {};
|
|
22
|
+
__export(useChannelEndpoint_exports, {
|
|
23
|
+
useChannelEndpoint: () => useChannelEndpoint
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(useChannelEndpoint_exports);
|
|
26
|
+
var import_react = require("react");
|
|
27
|
+
var import_NovuProvider = require("./NovuProvider.cjs");
|
|
28
|
+
var useChannelEndpoint = (props) => {
|
|
29
|
+
const novu = (0, import_NovuProvider.useNovu)();
|
|
30
|
+
const propsRef = (0, import_react.useRef)(props);
|
|
31
|
+
propsRef.current = props;
|
|
32
|
+
const [endpoint, setEndpoint] = (0, import_react.useState)();
|
|
33
|
+
const [error, setError] = (0, import_react.useState)();
|
|
34
|
+
const [isLoading, setIsLoading] = (0, import_react.useState)(true);
|
|
35
|
+
const [isFetching, setIsFetching] = (0, import_react.useState)(false);
|
|
36
|
+
const fetchEndpoint = (0, import_react.useCallback)(
|
|
37
|
+
async (options) => {
|
|
38
|
+
const { identifier, onSuccess, onError } = propsRef.current;
|
|
39
|
+
if (options == null ? void 0 : options.refetch) {
|
|
40
|
+
setError(void 0);
|
|
41
|
+
setIsLoading(true);
|
|
42
|
+
}
|
|
43
|
+
setIsFetching(true);
|
|
44
|
+
const response = await novu.channelEndpoints.get({ identifier });
|
|
45
|
+
if (response.error) {
|
|
46
|
+
setError(response.error);
|
|
47
|
+
onError == null ? void 0 : onError(response.error);
|
|
48
|
+
} else if (response.data !== void 0) {
|
|
49
|
+
onSuccess == null ? void 0 : onSuccess(response.data);
|
|
50
|
+
setEndpoint(response.data);
|
|
51
|
+
}
|
|
52
|
+
setIsLoading(false);
|
|
53
|
+
setIsFetching(false);
|
|
54
|
+
},
|
|
55
|
+
[novu]
|
|
56
|
+
);
|
|
57
|
+
(0, import_react.useEffect)(() => {
|
|
58
|
+
const cleanupGetPending = novu.on("channel-endpoint.get.pending", () => {
|
|
59
|
+
setIsFetching(true);
|
|
60
|
+
});
|
|
61
|
+
const cleanupGetResolved = novu.on("channel-endpoint.get.resolved", ({ data, error: resolvedError }) => {
|
|
62
|
+
const { onSuccess, onError } = propsRef.current;
|
|
63
|
+
if (resolvedError) {
|
|
64
|
+
setError(resolvedError);
|
|
65
|
+
onError == null ? void 0 : onError(resolvedError);
|
|
66
|
+
} else {
|
|
67
|
+
setEndpoint(data ?? null);
|
|
68
|
+
onSuccess == null ? void 0 : onSuccess(data ?? null);
|
|
69
|
+
}
|
|
70
|
+
setIsFetching(false);
|
|
71
|
+
});
|
|
72
|
+
const cleanupCreateResolved = novu.on("channel-endpoint.create.resolved", ({ data }) => {
|
|
73
|
+
var _a, _b;
|
|
74
|
+
if (data) {
|
|
75
|
+
setEndpoint(data);
|
|
76
|
+
(_b = (_a = propsRef.current).onSuccess) == null ? void 0 : _b.call(_a, data);
|
|
77
|
+
}
|
|
78
|
+
setIsFetching(false);
|
|
79
|
+
});
|
|
80
|
+
const cleanupDeleteResolved = novu.on("channel-endpoint.delete.resolved", ({ args }) => {
|
|
81
|
+
var _a, _b;
|
|
82
|
+
if (!args || args.identifier !== propsRef.current.identifier) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
setEndpoint(null);
|
|
86
|
+
(_b = (_a = propsRef.current).onSuccess) == null ? void 0 : _b.call(_a, null);
|
|
87
|
+
setIsFetching(false);
|
|
88
|
+
});
|
|
89
|
+
void fetchEndpoint({ refetch: true });
|
|
90
|
+
return () => {
|
|
91
|
+
cleanupGetPending();
|
|
92
|
+
cleanupGetResolved();
|
|
93
|
+
cleanupCreateResolved();
|
|
94
|
+
cleanupDeleteResolved();
|
|
95
|
+
};
|
|
96
|
+
}, [novu, fetchEndpoint, props.identifier]);
|
|
97
|
+
const refetch = (0, import_react.useCallback)(() => fetchEndpoint({ refetch: true }), [fetchEndpoint]);
|
|
98
|
+
return {
|
|
99
|
+
endpoint,
|
|
100
|
+
error,
|
|
101
|
+
isLoading,
|
|
102
|
+
isFetching,
|
|
103
|
+
refetch
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
107
|
+
0 && (module.exports = {
|
|
108
|
+
useChannelEndpoint
|
|
109
|
+
});
|
|
110
|
+
//# sourceMappingURL=useChannelEndpoint.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useChannelEndpoint.ts"],"sourcesContent":["import type { ChannelEndpointResponse, NovuError } from '@novu/js';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useNovu } from './NovuProvider';\n\nexport type UseChannelEndpointProps = {\n identifier: string;\n onSuccess?: (data: ChannelEndpointResponse | null) => void;\n onError?: (error: NovuError) => void;\n};\n\nexport type UseChannelEndpointResult = {\n endpoint?: ChannelEndpointResponse | null;\n error?: NovuError;\n isLoading: boolean;\n isFetching: boolean;\n refetch: () => Promise<void>;\n};\n\n/**\n * Get a channel endpoint by identifier.\n */\nexport const useChannelEndpoint = (props: UseChannelEndpointProps): UseChannelEndpointResult => {\n const novu = useNovu();\n const propsRef = useRef<UseChannelEndpointProps>(props);\n propsRef.current = props;\n\n const [endpoint, setEndpoint] = useState<ChannelEndpointResponse | null>();\n const [error, setError] = useState<NovuError>();\n const [isLoading, setIsLoading] = useState(true);\n const [isFetching, setIsFetching] = useState(false);\n\n const fetchEndpoint = useCallback(\n async (options?: { refetch: boolean }) => {\n const { identifier, onSuccess, onError } = propsRef.current;\n if (options?.refetch) {\n setError(undefined);\n setIsLoading(true);\n }\n\n setIsFetching(true);\n\n const response = await novu.channelEndpoints.get({ identifier });\n\n if (response.error) {\n setError(response.error as NovuError);\n onError?.(response.error as NovuError);\n } else if (response.data !== undefined) {\n onSuccess?.(response.data);\n setEndpoint(response.data);\n }\n setIsLoading(false);\n setIsFetching(false);\n },\n [novu]\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: props.identifier is needed to re-run the effect and initial fetch when the identifier changes\n useEffect(() => {\n const cleanupGetPending = novu.on('channel-endpoint.get.pending', () => {\n setIsFetching(true);\n });\n\n const cleanupGetResolved = novu.on('channel-endpoint.get.resolved', ({ data, error: resolvedError }) => {\n const { onSuccess, onError } = propsRef.current;\n if (resolvedError) {\n setError(resolvedError as NovuError);\n onError?.(resolvedError as NovuError);\n } else {\n setEndpoint((data as ChannelEndpointResponse) ?? null);\n onSuccess?.((data as ChannelEndpointResponse) ?? null);\n }\n setIsFetching(false);\n });\n\n const cleanupCreateResolved = novu.on('channel-endpoint.create.resolved', ({ data }) => {\n if (data) {\n setEndpoint(data as ChannelEndpointResponse);\n propsRef.current.onSuccess?.(data as ChannelEndpointResponse);\n }\n setIsFetching(false);\n });\n\n const cleanupDeleteResolved = novu.on('channel-endpoint.delete.resolved', ({ args }) => {\n if (!args || args.identifier !== propsRef.current.identifier) {\n return;\n }\n setEndpoint(null);\n propsRef.current.onSuccess?.(null);\n setIsFetching(false);\n });\n\n void fetchEndpoint({ refetch: true });\n\n return () => {\n cleanupGetPending();\n cleanupGetResolved();\n cleanupCreateResolved();\n cleanupDeleteResolved();\n };\n }, [novu, fetchEndpoint, props.identifier]);\n\n const refetch = useCallback(() => fetchEndpoint({ refetch: true }), [fetchEndpoint]);\n\n return {\n endpoint,\n error,\n isLoading,\n isFetching,\n refetch,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAyD;AACzD,0BAAwB;AAmBjB,IAAM,qBAAqB,CAAC,UAA6D;AAC9F,QAAM,WAAO,6BAAQ;AACrB,QAAM,eAAW,qBAAgC,KAAK;AACtD,WAAS,UAAU;AAEnB,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAyC;AACzE,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAoB;AAC9C,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,IAAI;AAC/C,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAElD,QAAM,oBAAgB;AAAA,IACpB,OAAO,YAAmC;AACxC,YAAM,EAAE,YAAY,WAAW,QAAQ,IAAI,SAAS;AACpD,UAAI,mCAAS,SAAS;AACpB,iBAAS,MAAS;AAClB,qBAAa,IAAI;AAAA,MACnB;AAEA,oBAAc,IAAI;AAElB,YAAM,WAAW,MAAM,KAAK,iBAAiB,IAAI,EAAE,WAAW,CAAC;AAE/D,UAAI,SAAS,OAAO;AAClB,iBAAS,SAAS,KAAkB;AACpC,2CAAU,SAAS;AAAA,MACrB,WAAW,SAAS,SAAS,QAAW;AACtC,+CAAY,SAAS;AACrB,oBAAY,SAAS,IAAI;AAAA,MAC3B;AACA,mBAAa,KAAK;AAClB,oBAAc,KAAK;AAAA,IACrB;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAGA,8BAAU,MAAM;AACd,UAAM,oBAAoB,KAAK,GAAG,gCAAgC,MAAM;AACtE,oBAAc,IAAI;AAAA,IACpB,CAAC;AAED,UAAM,qBAAqB,KAAK,GAAG,iCAAiC,CAAC,EAAE,MAAM,OAAO,cAAc,MAAM;AACtG,YAAM,EAAE,WAAW,QAAQ,IAAI,SAAS;AACxC,UAAI,eAAe;AACjB,iBAAS,aAA0B;AACnC,2CAAU;AAAA,MACZ,OAAO;AACL,oBAAa,QAAoC,IAAI;AACrD,+CAAa,QAAoC;AAAA,MACnD;AACA,oBAAc,KAAK;AAAA,IACrB,CAAC;AAED,UAAM,wBAAwB,KAAK,GAAG,oCAAoC,CAAC,EAAE,KAAK,MAAM;AA1E5F;AA2EM,UAAI,MAAM;AACR,oBAAY,IAA+B;AAC3C,6BAAS,SAAQ,cAAjB,4BAA6B;AAAA,MAC/B;AACA,oBAAc,KAAK;AAAA,IACrB,CAAC;AAED,UAAM,wBAAwB,KAAK,GAAG,oCAAoC,CAAC,EAAE,KAAK,MAAM;AAlF5F;AAmFM,UAAI,CAAC,QAAQ,KAAK,eAAe,SAAS,QAAQ,YAAY;AAC5D;AAAA,MACF;AACA,kBAAY,IAAI;AAChB,2BAAS,SAAQ,cAAjB,4BAA6B;AAC7B,oBAAc,KAAK;AAAA,IACrB,CAAC;AAED,SAAK,cAAc,EAAE,SAAS,KAAK,CAAC;AAEpC,WAAO,MAAM;AACX,wBAAkB;AAClB,yBAAmB;AACnB,4BAAsB;AACtB,4BAAsB;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,MAAM,eAAe,MAAM,UAAU,CAAC;AAE1C,QAAM,cAAU,0BAAY,MAAM,cAAc,EAAE,SAAS,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC;AAEnF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ChannelEndpointResponse, NovuError } from '@novu/js';
|
|
2
|
+
|
|
3
|
+
type UseChannelEndpointProps = {
|
|
4
|
+
identifier: string;
|
|
5
|
+
onSuccess?: (data: ChannelEndpointResponse | null) => void;
|
|
6
|
+
onError?: (error: NovuError) => void;
|
|
7
|
+
};
|
|
8
|
+
type UseChannelEndpointResult = {
|
|
9
|
+
endpoint?: ChannelEndpointResponse | null;
|
|
10
|
+
error?: NovuError;
|
|
11
|
+
isLoading: boolean;
|
|
12
|
+
isFetching: boolean;
|
|
13
|
+
refetch: () => Promise<void>;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Get a channel endpoint by identifier.
|
|
17
|
+
*/
|
|
18
|
+
declare const useChannelEndpoint: (props: UseChannelEndpointProps) => UseChannelEndpointResult;
|
|
19
|
+
|
|
20
|
+
export { type UseChannelEndpointProps, type UseChannelEndpointResult, useChannelEndpoint };
|
|
@@ -29,8 +29,10 @@ var import_useDataRef = require("./internal/useDataRef.cjs");
|
|
|
29
29
|
var import_useWebsocketEvent = require("./internal/useWebsocketEvent.cjs");
|
|
30
30
|
var import_NovuProvider = require("./NovuProvider.cjs");
|
|
31
31
|
var useCounts = (props) => {
|
|
32
|
-
const { filters, onSuccess, onError } = props;
|
|
32
|
+
const { filters, realtime: propsRealtime, onSuccess, onError } = props;
|
|
33
33
|
const { notifications } = (0, import_NovuProvider.useNovu)();
|
|
34
|
+
const providerRealtime = (0, import_NovuProvider.useRealtime)();
|
|
35
|
+
const realtime = propsRealtime ?? providerRealtime;
|
|
34
36
|
const filtersRef = (0, import_useDataRef.useDataRef)(filters);
|
|
35
37
|
const [error, setError] = (0, import_react.useState)();
|
|
36
38
|
const [counts, setCounts] = (0, import_react.useState)();
|
|
@@ -81,12 +83,14 @@ var useCounts = (props) => {
|
|
|
81
83
|
};
|
|
82
84
|
(0, import_useWebsocketEvent.useWebSocketEvent)({
|
|
83
85
|
event: "notifications.notification_received",
|
|
86
|
+
enabled: realtime,
|
|
84
87
|
eventHandler: (data) => {
|
|
85
88
|
sync(data.result);
|
|
86
89
|
}
|
|
87
90
|
});
|
|
88
91
|
(0, import_useWebsocketEvent.useWebSocketEvent)({
|
|
89
92
|
event: "notifications.unread_count_changed",
|
|
93
|
+
enabled: realtime,
|
|
90
94
|
eventHandler: () => {
|
|
91
95
|
sync();
|
|
92
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/useCounts.ts"],"sourcesContent":["import { areTagsEqual, isSameFilter, Notification, NotificationFilter, NovuError } from '@novu/js';\nimport { useEffect, useState } from 'react';\nimport { useDataRef } from './internal/useDataRef';\nimport { useWebSocketEvent } from './internal/useWebsocketEvent';\nimport { useNovu } from './NovuProvider';\n\ntype Count = {\n count: number;\n filter: NotificationFilter;\n};\n\n/**\n * Props for the useCounts hook.\n *\n * @example\n * ```tsx\n * // Count unread notifications\n * const { counts } = useCounts({\n * filters: [{ read: false }]\n * });\n *\n * // Count unseen notifications with specific tags\n * const { counts } = useCounts({\n * filters: [{ seen: false, tags: ['important'] }]\n * });\n *\n * // Count seen but unread notifications\n * const { counts } = useCounts({\n * filters: [{ seen: true, read: false }]\n * });\n * ```\n */\nexport type UseCountsProps = {\n filters: NotificationFilter[];\n onSuccess?: (data: Count[]) => void;\n onError?: (error: NovuError) => void;\n};\n\nexport type UseCountsResult = {\n counts?: Count[];\n error?: NovuError;\n isLoading: boolean; // initial loading\n isFetching: boolean; // the request is in flight\n refetch: () => Promise<void>;\n};\n\nexport const useCounts = (props: UseCountsProps): UseCountsResult => {\n const { filters, onSuccess, onError } = props;\n const { notifications } = useNovu();\n const filtersRef = useDataRef<NotificationFilter[]>(filters);\n const [error, setError] = useState<NovuError>();\n const [counts, setCounts] = useState<Count[]>();\n const [isLoading, setIsLoading] = useState(true);\n const [isFetching, setIsFetching] = useState(false);\n\n const sync = async (notification?: Notification, overrideFilters?: NotificationFilter[]) => {\n const currentFilters = overrideFilters || filtersRef.current;\n const existingCounts = currentFilters.map((filter) => ({ count: 0, filter }));\n let countFiltersToFetch: NotificationFilter[] = [];\n if (notification) {\n for (let i = 0; i < existingCounts.length; i++) {\n const filter = currentFilters[i];\n const isSeverityMatches =\n !filter.severity ||\n (Array.isArray(filter.severity) && filter.severity.length === 0) ||\n (Array.isArray(filter.severity) && filter.severity.includes(notification.severity)) ||\n (!Array.isArray(filter.severity) && filter.severity === notification.severity);\n\n if (areTagsEqual(filter.tags, notification.tags) && isSeverityMatches) {\n countFiltersToFetch.push(filter);\n }\n }\n } else {\n countFiltersToFetch = currentFilters;\n }\n\n if (countFiltersToFetch.length === 0) {\n return;\n }\n\n setIsFetching(true);\n const countsRes = await notifications.count({ filters: countFiltersToFetch });\n setIsFetching(false);\n setIsLoading(false);\n if (countsRes.error) {\n setError(countsRes.error);\n onError?.(countsRes.error);\n\n return;\n }\n const data = countsRes.data!;\n onSuccess?.(data.counts);\n\n setCounts((oldCounts) => {\n const newCounts: Count[] = [];\n const countsReceived = data.counts;\n\n for (let i = 0; i < existingCounts.length; i++) {\n const existingFilter = existingCounts[i].filter;\n const countReceived = countsReceived.find((c) => isSameFilter(c.filter, existingFilter));\n const count = countReceived || oldCounts?.[i];\n if (count) {\n newCounts.push(count);\n }\n }\n\n return newCounts;\n });\n };\n\n useWebSocketEvent({\n event: 'notifications.notification_received',\n eventHandler: (data) => {\n sync(data.result);\n },\n });\n\n useWebSocketEvent({\n event: 'notifications.unread_count_changed',\n eventHandler: () => {\n sync();\n },\n });\n\n useEffect(() => {\n setError(undefined);\n setIsLoading(true);\n setIsFetching(false);\n sync(undefined, filters);\n }, [JSON.stringify(filters)]);\n\n const refetch = async () => {\n await sync();\n };\n\n return { counts, error, refetch, isLoading, isFetching };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAwF;AACxF,mBAAoC;AACpC,wBAA2B;AAC3B,+BAAkC;AAClC,
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useCounts.ts"],"sourcesContent":["import { areTagsEqual, isSameFilter, Notification, NotificationFilter, NovuError } from '@novu/js';\nimport { useEffect, useState } from 'react';\nimport { useDataRef } from './internal/useDataRef';\nimport { useWebSocketEvent } from './internal/useWebsocketEvent';\nimport { useNovu, useRealtime } from './NovuProvider';\n\ntype Count = {\n count: number;\n filter: NotificationFilter;\n};\n\n/**\n * Props for the useCounts hook.\n *\n * @example\n * ```tsx\n * // Count unread notifications\n * const { counts } = useCounts({\n * filters: [{ read: false }]\n * });\n *\n * // Count unseen notifications with specific tags\n * const { counts } = useCounts({\n * filters: [{ seen: false, tags: ['important'] }]\n * });\n *\n * // Count seen but unread notifications\n * const { counts } = useCounts({\n * filters: [{ seen: true, read: false }]\n * });\n *\n * // Opt out of the built-in realtime count updates and drive them yourself\n * const { counts, refetch } = useCounts({\n * filters: [{ read: false }],\n * realtime: false,\n * });\n * ```\n */\nexport type UseCountsProps = {\n filters: NotificationFilter[];\n /**\n * When `false`, disables the WebSocket subscriptions that auto-resync\n * counts on `notifications.notification_received` and\n * `notifications.unread_count_changed`. The filter-driven fetch and\n * `refetch()` keep working. Use alongside\n * `useNotifications({ realtime: false })` when you drive live updates\n * yourself.\n *\n * When set, this prop takes precedence over the `realtime` config on\n * `<NovuProvider />`. When omitted, the provider value (default `true`) is used.\n */\n realtime?: boolean;\n onSuccess?: (data: Count[]) => void;\n onError?: (error: NovuError) => void;\n};\n\nexport type UseCountsResult = {\n counts?: Count[];\n error?: NovuError;\n isLoading: boolean; // initial loading\n isFetching: boolean; // the request is in flight\n refetch: () => Promise<void>;\n};\n\nexport const useCounts = (props: UseCountsProps): UseCountsResult => {\n const { filters, realtime: propsRealtime, onSuccess, onError } = props;\n const { notifications } = useNovu();\n const providerRealtime = useRealtime();\n const realtime = propsRealtime ?? providerRealtime;\n const filtersRef = useDataRef<NotificationFilter[]>(filters);\n const [error, setError] = useState<NovuError>();\n const [counts, setCounts] = useState<Count[]>();\n const [isLoading, setIsLoading] = useState(true);\n const [isFetching, setIsFetching] = useState(false);\n\n const sync = async (notification?: Notification, overrideFilters?: NotificationFilter[]) => {\n const currentFilters = overrideFilters || filtersRef.current;\n const existingCounts = currentFilters.map((filter) => ({ count: 0, filter }));\n let countFiltersToFetch: NotificationFilter[] = [];\n if (notification) {\n for (let i = 0; i < existingCounts.length; i++) {\n const filter = currentFilters[i];\n const isSeverityMatches =\n !filter.severity ||\n (Array.isArray(filter.severity) && filter.severity.length === 0) ||\n (Array.isArray(filter.severity) && filter.severity.includes(notification.severity)) ||\n (!Array.isArray(filter.severity) && filter.severity === notification.severity);\n\n if (areTagsEqual(filter.tags, notification.tags) && isSeverityMatches) {\n countFiltersToFetch.push(filter);\n }\n }\n } else {\n countFiltersToFetch = currentFilters;\n }\n\n if (countFiltersToFetch.length === 0) {\n return;\n }\n\n setIsFetching(true);\n const countsRes = await notifications.count({ filters: countFiltersToFetch });\n setIsFetching(false);\n setIsLoading(false);\n if (countsRes.error) {\n setError(countsRes.error);\n onError?.(countsRes.error);\n\n return;\n }\n const data = countsRes.data!;\n onSuccess?.(data.counts);\n\n setCounts((oldCounts) => {\n const newCounts: Count[] = [];\n const countsReceived = data.counts;\n\n for (let i = 0; i < existingCounts.length; i++) {\n const existingFilter = existingCounts[i].filter;\n const countReceived = countsReceived.find((c) => isSameFilter(c.filter, existingFilter));\n const count = countReceived || oldCounts?.[i];\n if (count) {\n newCounts.push(count);\n }\n }\n\n return newCounts;\n });\n };\n\n useWebSocketEvent({\n event: 'notifications.notification_received',\n enabled: realtime,\n eventHandler: (data) => {\n sync(data.result);\n },\n });\n\n useWebSocketEvent({\n event: 'notifications.unread_count_changed',\n enabled: realtime,\n eventHandler: () => {\n sync();\n },\n });\n\n useEffect(() => {\n setError(undefined);\n setIsLoading(true);\n setIsFetching(false);\n sync(undefined, filters);\n }, [JSON.stringify(filters)]);\n\n const refetch = async () => {\n await sync();\n };\n\n return { counts, error, refetch, isLoading, isFetching };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAwF;AACxF,mBAAoC;AACpC,wBAA2B;AAC3B,+BAAkC;AAClC,0BAAqC;AA4D9B,IAAM,YAAY,CAAC,UAA2C;AACnE,QAAM,EAAE,SAAS,UAAU,eAAe,WAAW,QAAQ,IAAI;AACjE,QAAM,EAAE,cAAc,QAAI,6BAAQ;AAClC,QAAM,uBAAmB,iCAAY;AACrC,QAAM,WAAW,iBAAiB;AAClC,QAAM,iBAAa,8BAAiC,OAAO;AAC3D,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAoB;AAC9C,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAkB;AAC9C,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,IAAI;AAC/C,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAElD,QAAM,OAAO,OAAO,cAA6B,oBAA2C;AAC1F,UAAM,iBAAiB,mBAAmB,WAAW;AACrD,UAAM,iBAAiB,eAAe,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,EAAE;AAC5E,QAAI,sBAA4C,CAAC;AACjD,QAAI,cAAc;AAChB,eAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,cAAM,SAAS,eAAe,CAAC;AAC/B,cAAM,oBACJ,CAAC,OAAO,YACP,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,WAAW,KAC7D,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,SAAS,aAAa,QAAQ,KAChF,CAAC,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,aAAa,aAAa;AAEvE,gBAAI,wBAAa,OAAO,MAAM,aAAa,IAAI,KAAK,mBAAmB;AACrE,8BAAoB,KAAK,MAAM;AAAA,QACjC;AAAA,MACF;AAAA,IACF,OAAO;AACL,4BAAsB;AAAA,IACxB;AAEA,QAAI,oBAAoB,WAAW,GAAG;AACpC;AAAA,IACF;AAEA,kBAAc,IAAI;AAClB,UAAM,YAAY,MAAM,cAAc,MAAM,EAAE,SAAS,oBAAoB,CAAC;AAC5E,kBAAc,KAAK;AACnB,iBAAa,KAAK;AAClB,QAAI,UAAU,OAAO;AACnB,eAAS,UAAU,KAAK;AACxB,yCAAU,UAAU;AAEpB;AAAA,IACF;AACA,UAAM,OAAO,UAAU;AACvB,2CAAY,KAAK;AAEjB,cAAU,CAAC,cAAc;AACvB,YAAM,YAAqB,CAAC;AAC5B,YAAM,iBAAiB,KAAK;AAE5B,eAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,cAAM,iBAAiB,eAAe,CAAC,EAAE;AACzC,cAAM,gBAAgB,eAAe,KAAK,CAAC,UAAM,wBAAa,EAAE,QAAQ,cAAc,CAAC;AACvF,cAAM,QAAQ,kBAAiB,uCAAY;AAC3C,YAAI,OAAO;AACT,oBAAU,KAAK,KAAK;AAAA,QACtB;AAAA,MACF;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,kDAAkB;AAAA,IAChB,OAAO;AAAA,IACP,SAAS;AAAA,IACT,cAAc,CAAC,SAAS;AACtB,WAAK,KAAK,MAAM;AAAA,IAClB;AAAA,EACF,CAAC;AAED,kDAAkB;AAAA,IAChB,OAAO;AAAA,IACP,SAAS;AAAA,IACT,cAAc,MAAM;AAClB,WAAK;AAAA,IACP;AAAA,EACF,CAAC;AAED,8BAAU,MAAM;AACd,aAAS,MAAS;AAClB,iBAAa,IAAI;AACjB,kBAAc,KAAK;AACnB,SAAK,QAAW,OAAO;AAAA,EACzB,GAAG,CAAC,KAAK,UAAU,OAAO,CAAC,CAAC;AAE5B,QAAM,UAAU,YAAY;AAC1B,UAAM,KAAK;AAAA,EACb;AAEA,SAAO,EAAE,QAAQ,OAAO,SAAS,WAAW,WAAW;AACzD;","names":[]}
|
|
@@ -23,10 +23,28 @@ type Count = {
|
|
|
23
23
|
* const { counts } = useCounts({
|
|
24
24
|
* filters: [{ seen: true, read: false }]
|
|
25
25
|
* });
|
|
26
|
+
*
|
|
27
|
+
* // Opt out of the built-in realtime count updates and drive them yourself
|
|
28
|
+
* const { counts, refetch } = useCounts({
|
|
29
|
+
* filters: [{ read: false }],
|
|
30
|
+
* realtime: false,
|
|
31
|
+
* });
|
|
26
32
|
* ```
|
|
27
33
|
*/
|
|
28
34
|
type UseCountsProps = {
|
|
29
35
|
filters: NotificationFilter[];
|
|
36
|
+
/**
|
|
37
|
+
* When `false`, disables the WebSocket subscriptions that auto-resync
|
|
38
|
+
* counts on `notifications.notification_received` and
|
|
39
|
+
* `notifications.unread_count_changed`. The filter-driven fetch and
|
|
40
|
+
* `refetch()` keep working. Use alongside
|
|
41
|
+
* `useNotifications({ realtime: false })` when you drive live updates
|
|
42
|
+
* yourself.
|
|
43
|
+
*
|
|
44
|
+
* When set, this prop takes precedence over the `realtime` config on
|
|
45
|
+
* `<NovuProvider />`. When omitted, the provider value (default `true`) is used.
|
|
46
|
+
*/
|
|
47
|
+
realtime?: boolean;
|
|
30
48
|
onSuccess?: (data: Count[]) => void;
|
|
31
49
|
onError?: (error: NovuError) => void;
|
|
32
50
|
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/hooks/useCreateChannelEndpoint.ts
|
|
21
|
+
var useCreateChannelEndpoint_exports = {};
|
|
22
|
+
__export(useCreateChannelEndpoint_exports, {
|
|
23
|
+
useCreateChannelEndpoint: () => useCreateChannelEndpoint
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(useCreateChannelEndpoint_exports);
|
|
26
|
+
var import_react = require("react");
|
|
27
|
+
var import_NovuProvider = require("./NovuProvider.cjs");
|
|
28
|
+
var useCreateChannelEndpoint = (props = {}) => {
|
|
29
|
+
const propsRef = (0, import_react.useRef)(props);
|
|
30
|
+
propsRef.current = props;
|
|
31
|
+
const novu = (0, import_NovuProvider.useNovu)();
|
|
32
|
+
const [isCreating, setIsCreating] = (0, import_react.useState)(false);
|
|
33
|
+
const [error, setError] = (0, import_react.useState)();
|
|
34
|
+
const create = (0, import_react.useCallback)(
|
|
35
|
+
async (args) => {
|
|
36
|
+
const { onSuccess, onError } = propsRef.current;
|
|
37
|
+
setError(void 0);
|
|
38
|
+
setIsCreating(true);
|
|
39
|
+
const response = await novu.channelEndpoints.create(args);
|
|
40
|
+
setIsCreating(false);
|
|
41
|
+
if (response.error) {
|
|
42
|
+
setError(response.error);
|
|
43
|
+
onError == null ? void 0 : onError(response.error);
|
|
44
|
+
} else if (response.data) {
|
|
45
|
+
onSuccess == null ? void 0 : onSuccess(response.data);
|
|
46
|
+
}
|
|
47
|
+
return response;
|
|
48
|
+
},
|
|
49
|
+
[novu]
|
|
50
|
+
);
|
|
51
|
+
return {
|
|
52
|
+
create,
|
|
53
|
+
isCreating,
|
|
54
|
+
error
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
58
|
+
0 && (module.exports = {
|
|
59
|
+
useCreateChannelEndpoint
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=useCreateChannelEndpoint.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useCreateChannelEndpoint.ts"],"sourcesContent":["import type { ChannelEndpointResponse, CreateChannelEndpointArgs, NovuError } from '@novu/js';\nimport { useCallback, useRef, useState } from 'react';\nimport { useNovu } from './NovuProvider';\n\nexport type UseCreateChannelEndpointProps = {\n onSuccess?: (data: ChannelEndpointResponse) => void;\n onError?: (error: NovuError) => void;\n};\n\nexport type UseCreateChannelEndpointResult = {\n isCreating: boolean;\n error?: NovuError;\n create: (args: CreateChannelEndpointArgs) => Promise<{\n data?: ChannelEndpointResponse | undefined;\n error?: NovuError | undefined;\n }>;\n};\n\nexport const useCreateChannelEndpoint = (props: UseCreateChannelEndpointProps = {}): UseCreateChannelEndpointResult => {\n const propsRef = useRef<UseCreateChannelEndpointProps>(props);\n propsRef.current = props;\n const novu = useNovu();\n const [isCreating, setIsCreating] = useState(false);\n const [error, setError] = useState<NovuError>();\n\n const create = useCallback(\n async (args: CreateChannelEndpointArgs) => {\n const { onSuccess, onError } = propsRef.current;\n setError(undefined);\n setIsCreating(true);\n\n const response = await novu.channelEndpoints.create(args);\n\n setIsCreating(false);\n\n if (response.error) {\n setError(response.error as NovuError);\n onError?.(response.error as NovuError);\n } else if (response.data) {\n onSuccess?.(response.data as ChannelEndpointResponse);\n }\n\n return response as { data?: ChannelEndpointResponse; error?: NovuError };\n },\n [novu]\n );\n\n return {\n create,\n isCreating,\n error,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA8C;AAC9C,0BAAwB;AAgBjB,IAAM,2BAA2B,CAAC,QAAuC,CAAC,MAAsC;AACrH,QAAM,eAAW,qBAAsC,KAAK;AAC5D,WAAS,UAAU;AACnB,QAAM,WAAO,6BAAQ;AACrB,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAClD,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAoB;AAE9C,QAAM,aAAS;AAAA,IACb,OAAO,SAAoC;AACzC,YAAM,EAAE,WAAW,QAAQ,IAAI,SAAS;AACxC,eAAS,MAAS;AAClB,oBAAc,IAAI;AAElB,YAAM,WAAW,MAAM,KAAK,iBAAiB,OAAO,IAAI;AAExD,oBAAc,KAAK;AAEnB,UAAI,SAAS,OAAO;AAClB,iBAAS,SAAS,KAAkB;AACpC,2CAAU,SAAS;AAAA,MACrB,WAAW,SAAS,MAAM;AACxB,+CAAY,SAAS;AAAA,MACvB;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|