@novu/react 3.15.0 → 3.16.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.
- 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 +4 -0
- package/dist/cjs/components/index.cjs.map +1 -1
- package/dist/cjs/components/index.d.cts +5 -1
- package/dist/cjs/components/slack-connect-button/DefaultSlackConnectButton.cjs +89 -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 +14 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +11 -2
- package/dist/cjs/internal/index.d.cts +1 -0
- 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/cjs/utils/types.d.cts +1 -1
- 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 +5 -1
- package/dist/esm/components/index.js +2 -0
- package/dist/esm/components/index.js.map +1 -1
- package/dist/esm/components/slack-connect-button/DefaultSlackConnectButton.d.ts +7 -0
- package/dist/esm/components/slack-connect-button/DefaultSlackConnectButton.js +64 -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 +11 -2
- package/dist/esm/index.js +14 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/utils/appearance.d.ts +2 -2
- package/dist/esm/utils/appearance.js.map +1 -1
- package/dist/esm/utils/types.d.ts +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import React__default from 'react';
|
|
3
|
+
import { NovuUIOptions } from '../NovuUI.cjs';
|
|
4
|
+
import { DefaultSlackLinkUserProps } from './DefaultSlackLinkUser.cjs';
|
|
5
|
+
import '@novu/js';
|
|
6
|
+
import '@novu/js/ui';
|
|
7
|
+
import '../../utils/types.cjs';
|
|
8
|
+
|
|
9
|
+
type SlackLinkUserProps = DefaultSlackLinkUserProps & Pick<NovuUIOptions, 'container' | 'appearance'>;
|
|
10
|
+
declare const SlackLinkUser: React__default.MemoExoticComponent<(props: SlackLinkUserProps) => react_jsx_runtime.JSX.Element>;
|
|
11
|
+
|
|
12
|
+
export { SlackLinkUser, type SlackLinkUserProps };
|
|
@@ -23,6 +23,7 @@ __export(NovuProvider_exports, {
|
|
|
23
23
|
InternalNovuProvider: () => InternalNovuProvider,
|
|
24
24
|
NovuProvider: () => NovuProvider,
|
|
25
25
|
useNovu: () => useNovu,
|
|
26
|
+
useRealtime: () => useRealtime,
|
|
26
27
|
useUnsafeNovu: () => useUnsafeNovu
|
|
27
28
|
});
|
|
28
29
|
module.exports = __toCommonJS(NovuProvider_exports);
|
|
@@ -30,9 +31,9 @@ var import_js = require("@novu/js");
|
|
|
30
31
|
var import_internal = require("@novu/js/internal");
|
|
31
32
|
var import_react = require("react");
|
|
32
33
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
33
|
-
var NovuContext = (0, import_react.createContext)(void 0);
|
|
34
|
+
var NovuContext = (0, import_react.createContext)({ novu: void 0, realtime: true });
|
|
34
35
|
var NovuProvider = (props) => {
|
|
35
|
-
const { subscriberId, ...propsWithoutSubscriberId } = props;
|
|
36
|
+
const { subscriberId, realtime = true, ...propsWithoutSubscriberId } = props;
|
|
36
37
|
const subscriberObj = (0, import_react.useMemo)(
|
|
37
38
|
() => (0, import_internal.buildSubscriber)({ subscriberId, subscriber: props.subscriber }),
|
|
38
39
|
[subscriberId, props.subscriber]
|
|
@@ -41,7 +42,8 @@ var NovuProvider = (props) => {
|
|
|
41
42
|
const providerProps = {
|
|
42
43
|
...propsWithoutSubscriberId,
|
|
43
44
|
applicationIdentifier,
|
|
44
|
-
subscriber: subscriberObj
|
|
45
|
+
subscriber: subscriberObj,
|
|
46
|
+
realtime
|
|
45
47
|
};
|
|
46
48
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InternalNovuProvider, { ...providerProps, applicationIdentifier, children: props.children });
|
|
47
49
|
};
|
|
@@ -61,21 +63,25 @@ var InternalNovuProvider = (props) => {
|
|
|
61
63
|
socketOptions,
|
|
62
64
|
useCache,
|
|
63
65
|
defaultSchedule,
|
|
64
|
-
context
|
|
66
|
+
context,
|
|
67
|
+
realtime = true
|
|
65
68
|
} = props;
|
|
66
|
-
const
|
|
67
|
-
() =>
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
69
|
+
const value = (0, import_react.useMemo)(
|
|
70
|
+
() => ({
|
|
71
|
+
novu: new import_js.Novu({
|
|
72
|
+
applicationIdentifier,
|
|
73
|
+
subscriberHash,
|
|
74
|
+
contextHash,
|
|
75
|
+
backendUrl,
|
|
76
|
+
apiUrl,
|
|
77
|
+
socketUrl,
|
|
78
|
+
socketOptions,
|
|
79
|
+
useCache,
|
|
80
|
+
subscriber: subscriberObj,
|
|
81
|
+
defaultSchedule,
|
|
82
|
+
context
|
|
83
|
+
}),
|
|
84
|
+
realtime
|
|
79
85
|
}),
|
|
80
86
|
[
|
|
81
87
|
applicationIdentifier,
|
|
@@ -87,27 +93,33 @@ var InternalNovuProvider = (props) => {
|
|
|
87
93
|
apiUrl,
|
|
88
94
|
socketUrl,
|
|
89
95
|
socketOptions,
|
|
90
|
-
useCache
|
|
96
|
+
useCache,
|
|
97
|
+
realtime
|
|
91
98
|
]
|
|
92
99
|
);
|
|
93
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(NovuContext.Provider, { value
|
|
100
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(NovuContext.Provider, { value, children });
|
|
94
101
|
};
|
|
95
102
|
var useNovu = () => {
|
|
96
103
|
const context = (0, import_react.useContext)(NovuContext);
|
|
97
|
-
if (!context) {
|
|
104
|
+
if (!context.novu) {
|
|
98
105
|
throw new Error("useNovu must be used within a <NovuProvider />");
|
|
99
106
|
}
|
|
100
|
-
return context;
|
|
107
|
+
return context.novu;
|
|
101
108
|
};
|
|
102
109
|
var useUnsafeNovu = () => {
|
|
103
110
|
const context = (0, import_react.useContext)(NovuContext);
|
|
104
|
-
return context;
|
|
111
|
+
return context.novu;
|
|
112
|
+
};
|
|
113
|
+
var useRealtime = () => {
|
|
114
|
+
const context = (0, import_react.useContext)(NovuContext);
|
|
115
|
+
return context.realtime;
|
|
105
116
|
};
|
|
106
117
|
// Annotate the CommonJS export names for ESM import in node:
|
|
107
118
|
0 && (module.exports = {
|
|
108
119
|
InternalNovuProvider,
|
|
109
120
|
NovuProvider,
|
|
110
121
|
useNovu,
|
|
122
|
+
useRealtime,
|
|
111
123
|
useUnsafeNovu
|
|
112
124
|
});
|
|
113
125
|
//# sourceMappingURL=NovuProvider.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/NovuProvider.tsx"],"sourcesContent":["import { Novu, NovuOptions } from '@novu/js';\nimport { buildSubscriber } from '@novu/js/internal';\nimport { createContext, ReactNode, useContext, useMemo } from 'react';\n\nexport type NovuProviderProps = NovuOptions & {\n children: ReactNode;\n};\n\nconst NovuContext = createContext<Novu
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/NovuProvider.tsx"],"sourcesContent":["import { Novu, NovuOptions } from '@novu/js';\nimport { buildSubscriber } from '@novu/js/internal';\nimport { createContext, ReactNode, useContext, useMemo } from 'react';\n\nexport type NovuProviderProps = NovuOptions & {\n /**\n * When `false`, disables the WebSocket subscription that auto-injects\n * newly received notifications into the list and subscription that auto-resync\n * notification counts. Built-in mutations like\n * `readAll`, `seenAll`, `archiveAll`, and `archiveAllRead` continue to\n * update local state. Use this when you want to drive new-notification updates yourself (e.g.\n * via your own `novu.on('notifications.notification_received', ...)`\n * handler combined with `refetch()`). Defaults to `true`.\n */\n realtime?: boolean;\n children: ReactNode;\n};\n\nconst NovuContext = createContext<{ novu: Novu; realtime: boolean }>({ novu: undefined as any, realtime: true });\n\nexport const NovuProvider = (props: NovuProviderProps) => {\n const { subscriberId, realtime = true, ...propsWithoutSubscriberId } = props;\n const subscriberObj = useMemo(\n () => buildSubscriber({ subscriberId, subscriber: props.subscriber }),\n [subscriberId, props.subscriber]\n );\n const applicationIdentifier = propsWithoutSubscriberId.applicationIdentifier\n ? propsWithoutSubscriberId.applicationIdentifier\n : '';\n\n const providerProps: NovuProviderProps = {\n ...propsWithoutSubscriberId,\n applicationIdentifier,\n subscriber: subscriberObj,\n realtime,\n };\n\n return (\n <InternalNovuProvider {...providerProps} applicationIdentifier={applicationIdentifier}>\n {props.children}\n </InternalNovuProvider>\n );\n};\n\n/**\n * @internal Should be used internally not to be exposed outside of the library\n */\nexport const InternalNovuProvider = (props: NovuProviderProps) => {\n const applicationIdentifier = props.applicationIdentifier || '';\n const subscriberObj = useMemo(\n () => buildSubscriber({ subscriberId: props.subscriberId, subscriber: props.subscriber }),\n [props.subscriberId, props.subscriber]\n );\n\n const {\n children,\n subscriberHash,\n contextHash,\n backendUrl,\n apiUrl,\n socketUrl,\n socketOptions,\n useCache,\n defaultSchedule,\n context,\n realtime = true,\n } = props;\n\n const value = useMemo(\n () => ({\n novu: new Novu({\n applicationIdentifier,\n subscriberHash,\n contextHash,\n backendUrl,\n apiUrl,\n socketUrl,\n socketOptions,\n useCache,\n subscriber: subscriberObj,\n defaultSchedule,\n context,\n }),\n realtime,\n }),\n [\n applicationIdentifier,\n subscriberHash,\n subscriberObj,\n context,\n contextHash,\n backendUrl,\n apiUrl,\n socketUrl,\n socketOptions,\n useCache,\n realtime,\n ]\n );\n\n return <NovuContext.Provider value={value}>{children}</NovuContext.Provider>;\n};\n\nexport const useNovu = () => {\n const context = useContext(NovuContext);\n if (!context.novu) {\n throw new Error('useNovu must be used within a <NovuProvider />');\n }\n\n return context.novu;\n};\n\nexport const useUnsafeNovu = () => {\n const context = useContext(NovuContext);\n\n return context.novu;\n};\n\nexport const useRealtime = () => {\n const context = useContext(NovuContext);\n\n return context.realtime;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAkC;AAClC,sBAAgC;AAChC,mBAA8D;AAoC1D;AApBJ,IAAM,kBAAc,4BAAiD,EAAE,MAAM,QAAkB,UAAU,KAAK,CAAC;AAExG,IAAM,eAAe,CAAC,UAA6B;AACxD,QAAM,EAAE,cAAc,WAAW,MAAM,GAAG,yBAAyB,IAAI;AACvE,QAAM,oBAAgB;AAAA,IACpB,UAAM,iCAAgB,EAAE,cAAc,YAAY,MAAM,WAAW,CAAC;AAAA,IACpE,CAAC,cAAc,MAAM,UAAU;AAAA,EACjC;AACA,QAAM,wBAAwB,yBAAyB,wBACnD,yBAAyB,wBACzB;AAEJ,QAAM,gBAAmC;AAAA,IACvC,GAAG;AAAA,IACH;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,EACF;AAEA,SACE,4CAAC,wBAAsB,GAAG,eAAe,uBACtC,gBAAM,UACT;AAEJ;AAKO,IAAM,uBAAuB,CAAC,UAA6B;AAChE,QAAM,wBAAwB,MAAM,yBAAyB;AAC7D,QAAM,oBAAgB;AAAA,IACpB,UAAM,iCAAgB,EAAE,cAAc,MAAM,cAAc,YAAY,MAAM,WAAW,CAAC;AAAA,IACxF,CAAC,MAAM,cAAc,MAAM,UAAU;AAAA,EACvC;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb,IAAI;AAEJ,QAAM,YAAQ;AAAA,IACZ,OAAO;AAAA,MACL,MAAM,IAAI,eAAK;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,4CAAC,YAAY,UAAZ,EAAqB,OAAe,UAAS;AACvD;AAEO,IAAM,UAAU,MAAM;AAC3B,QAAM,cAAU,yBAAW,WAAW;AACtC,MAAI,CAAC,QAAQ,MAAM;AACjB,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAEA,SAAO,QAAQ;AACjB;AAEO,IAAM,gBAAgB,MAAM;AACjC,QAAM,cAAU,yBAAW,WAAW;AAEtC,SAAO,QAAQ;AACjB;AAEO,IAAM,cAAc,MAAM;AAC/B,QAAM,cAAU,yBAAW,WAAW;AAEtC,SAAO,QAAQ;AACjB;","names":[]}
|
|
@@ -3,6 +3,16 @@ import { NovuOptions, Novu } from '@novu/js';
|
|
|
3
3
|
import { ReactNode } from 'react';
|
|
4
4
|
|
|
5
5
|
type NovuProviderProps = NovuOptions & {
|
|
6
|
+
/**
|
|
7
|
+
* When `false`, disables the WebSocket subscription that auto-injects
|
|
8
|
+
* newly received notifications into the list and subscription that auto-resync
|
|
9
|
+
* notification counts. Built-in mutations like
|
|
10
|
+
* `readAll`, `seenAll`, `archiveAll`, and `archiveAllRead` continue to
|
|
11
|
+
* update local state. Use this when you want to drive new-notification updates yourself (e.g.
|
|
12
|
+
* via your own `novu.on('notifications.notification_received', ...)`
|
|
13
|
+
* handler combined with `refetch()`). Defaults to `true`.
|
|
14
|
+
*/
|
|
15
|
+
realtime?: boolean;
|
|
6
16
|
children: ReactNode;
|
|
7
17
|
};
|
|
8
18
|
declare const NovuProvider: (props: NovuProviderProps) => react_jsx_runtime.JSX.Element;
|
|
@@ -11,6 +21,7 @@ declare const NovuProvider: (props: NovuProviderProps) => react_jsx_runtime.JSX.
|
|
|
11
21
|
*/
|
|
12
22
|
declare const InternalNovuProvider: (props: NovuProviderProps) => react_jsx_runtime.JSX.Element;
|
|
13
23
|
declare const useNovu: () => Novu;
|
|
14
|
-
declare const useUnsafeNovu: () => Novu
|
|
24
|
+
declare const useUnsafeNovu: () => Novu;
|
|
25
|
+
declare const useRealtime: () => boolean;
|
|
15
26
|
|
|
16
|
-
export { InternalNovuProvider, NovuProvider, type NovuProviderProps, useNovu, useUnsafeNovu };
|
|
27
|
+
export { InternalNovuProvider, NovuProvider, type NovuProviderProps, useNovu, useRealtime, useUnsafeNovu };
|
package/dist/cjs/hooks/index.cjs
CHANGED
|
@@ -30,8 +30,13 @@ __export(hooks_exports, {
|
|
|
30
30
|
module.exports = __toCommonJS(hooks_exports);
|
|
31
31
|
var import_js = require("@novu/js");
|
|
32
32
|
var import_NovuProvider = require("./NovuProvider.cjs");
|
|
33
|
+
__reExport(hooks_exports, require("./useChannelConnection.cjs"), module.exports);
|
|
34
|
+
__reExport(hooks_exports, require("./useChannelConnections.cjs"), module.exports);
|
|
35
|
+
__reExport(hooks_exports, require("./useChannelEndpoint.cjs"), module.exports);
|
|
33
36
|
__reExport(hooks_exports, require("./useCounts.cjs"), module.exports);
|
|
37
|
+
__reExport(hooks_exports, require("./useCreateChannelEndpoint.cjs"), module.exports);
|
|
34
38
|
__reExport(hooks_exports, require("./useCreateSubscription.cjs"), module.exports);
|
|
39
|
+
__reExport(hooks_exports, require("./useDeleteChannelEndpoint.cjs"), module.exports);
|
|
35
40
|
__reExport(hooks_exports, require("./useNotifications.cjs"), module.exports);
|
|
36
41
|
__reExport(hooks_exports, require("./usePreferences.cjs"), module.exports);
|
|
37
42
|
__reExport(hooks_exports, require("./useRemoveSubscription.cjs"), module.exports);
|
|
@@ -46,8 +51,13 @@ __reExport(hooks_exports, require("./useUpdateSubscription.cjs"), module.exports
|
|
|
46
51
|
SeverityLevelEnum,
|
|
47
52
|
WorkflowCriticalityEnum,
|
|
48
53
|
useNovu,
|
|
54
|
+
...require("./useChannelConnection.cjs"),
|
|
55
|
+
...require("./useChannelConnections.cjs"),
|
|
56
|
+
...require("./useChannelEndpoint.cjs"),
|
|
49
57
|
...require("./useCounts.cjs"),
|
|
58
|
+
...require("./useCreateChannelEndpoint.cjs"),
|
|
50
59
|
...require("./useCreateSubscription.cjs"),
|
|
60
|
+
...require("./useDeleteChannelEndpoint.cjs"),
|
|
51
61
|
...require("./useNotifications.cjs"),
|
|
52
62
|
...require("./usePreferences.cjs"),
|
|
53
63
|
...require("./useRemoveSubscription.cjs"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/index.ts"],"sourcesContent":["export type * from '@novu/js';\nexport { PreferenceLevel, SeverityLevelEnum, WorkflowCriticalityEnum } from '@novu/js';\nexport { NovuProvider, useNovu } from './NovuProvider';\nexport * from './useCounts';\nexport * from './useCreateSubscription';\nexport * from './useNotifications';\nexport * from './usePreferences';\nexport * from './useRemoveSubscription';\nexport * from './useSchedule';\nexport * from './useSubscription';\nexport * from './useSubscriptions';\nexport * from './useUpdateSubscription';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAA4E;AAC5E,0BAAsC;AACtC,0BAAc,
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/index.ts"],"sourcesContent":["export type * from '@novu/js';\nexport { PreferenceLevel, SeverityLevelEnum, WorkflowCriticalityEnum } from '@novu/js';\nexport { NovuProvider, useNovu } from './NovuProvider';\nexport * from './useChannelConnection';\nexport * from './useChannelConnections';\nexport * from './useChannelEndpoint';\nexport * from './useCounts';\nexport * from './useCreateChannelEndpoint';\nexport * from './useCreateSubscription';\nexport * from './useDeleteChannelEndpoint';\nexport * from './useNotifications';\nexport * from './usePreferences';\nexport * from './useRemoveSubscription';\nexport * from './useSchedule';\nexport * from './useSubscription';\nexport * from './useSubscriptions';\nexport * from './useUpdateSubscription';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAA4E;AAC5E,0BAAsC;AACtC,0BAAc,uCAHd;AAIA,0BAAc,wCAJd;AAKA,0BAAc,qCALd;AAMA,0BAAc,4BANd;AAOA,0BAAc,2CAPd;AAQA,0BAAc,wCARd;AASA,0BAAc,2CATd;AAUA,0BAAc,mCAVd;AAWA,0BAAc,iCAXd;AAYA,0BAAc,wCAZd;AAaA,0BAAc,8BAbd;AAcA,0BAAc,kCAdd;AAeA,0BAAc,mCAfd;AAgBA,0BAAc,wCAhBd;","names":[]}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
export * from '@novu/js';
|
|
2
2
|
export { PreferenceLevel, SeverityLevelEnum, WorkflowCriticalityEnum } from '@novu/js';
|
|
3
3
|
export { NovuProvider, useNovu } from './NovuProvider.cjs';
|
|
4
|
+
export { UseChannelConnectionProps, UseChannelConnectionResult, useChannelConnection } from './useChannelConnection.cjs';
|
|
5
|
+
export { UseChannelConnectionsProps, UseChannelConnectionsResult, useChannelConnections } from './useChannelConnections.cjs';
|
|
6
|
+
export { UseChannelEndpointProps, UseChannelEndpointResult, useChannelEndpoint } from './useChannelEndpoint.cjs';
|
|
4
7
|
export { UseCountsProps, UseCountsResult, useCounts } from './useCounts.cjs';
|
|
8
|
+
export { UseCreateChannelEndpointProps, UseCreateChannelEndpointResult, useCreateChannelEndpoint } from './useCreateChannelEndpoint.cjs';
|
|
5
9
|
export { UseCreateSubscriptionProps, UseCreateSubscriptionResult, useCreateSubscription } from './useCreateSubscription.cjs';
|
|
10
|
+
export { UseDeleteChannelEndpointProps, UseDeleteChannelEndpointResult, useDeleteChannelEndpoint } from './useDeleteChannelEndpoint.cjs';
|
|
6
11
|
export { UseNotificationsProps, UseNotificationsResult, useNotifications } from './useNotifications.cjs';
|
|
7
12
|
export { UsePreferencesProps, UsePreferencesResult, usePreferences } from './usePreferences.cjs';
|
|
8
13
|
export { UseRemoveSubscriptionProps, UseRemoveSubscriptionResult, useRemoveSubscription } from './useRemoveSubscription.cjs';
|
|
@@ -26,15 +26,18 @@ module.exports = __toCommonJS(useBrowserTabsChannel_exports);
|
|
|
26
26
|
var import_react = require("react");
|
|
27
27
|
var useBrowserTabsChannel = ({
|
|
28
28
|
channelName,
|
|
29
|
-
onMessage
|
|
29
|
+
onMessage,
|
|
30
|
+
enabled = true
|
|
30
31
|
}) => {
|
|
31
32
|
const [tabsChannel] = (0, import_react.useState)(
|
|
32
33
|
typeof BroadcastChannel !== "undefined" ? new BroadcastChannel(channelName) : void 0
|
|
33
34
|
);
|
|
34
35
|
const postMessage = (data) => {
|
|
36
|
+
if (!enabled) return;
|
|
35
37
|
tabsChannel == null ? void 0 : tabsChannel.postMessage(data);
|
|
36
38
|
};
|
|
37
39
|
(0, import_react.useEffect)(() => {
|
|
40
|
+
if (!enabled) return;
|
|
38
41
|
const listener = (event) => {
|
|
39
42
|
onMessage(event.data);
|
|
40
43
|
};
|
|
@@ -42,7 +45,7 @@ var useBrowserTabsChannel = ({
|
|
|
42
45
|
return () => {
|
|
43
46
|
tabsChannel == null ? void 0 : tabsChannel.removeEventListener("message", listener);
|
|
44
47
|
};
|
|
45
|
-
}, []);
|
|
48
|
+
}, [enabled]);
|
|
46
49
|
return { postMessage };
|
|
47
50
|
};
|
|
48
51
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -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 };
|