@novu/react 2.6.6 → 3.0.0-canary.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/Bell.cjs +63 -0
- package/dist/cjs/components/Bell.cjs.map +1 -0
- package/dist/cjs/components/Bell.d.cts +12 -0
- package/dist/cjs/components/Inbox.cjs +198 -0
- package/dist/cjs/components/Inbox.cjs.map +1 -0
- package/dist/cjs/components/Inbox.d.cts +9 -0
- package/dist/cjs/components/InboxContent.cjs +94 -0
- package/dist/cjs/components/InboxContent.cjs.map +1 -0
- package/dist/cjs/components/InboxContent.d.cts +16 -0
- package/dist/cjs/components/Mounter.cjs +51 -0
- package/dist/cjs/components/Mounter.cjs.map +1 -0
- package/dist/cjs/components/Mounter.d.cts +11 -0
- package/dist/cjs/components/Notifications.cjs +88 -0
- package/dist/cjs/components/Notifications.cjs.map +1 -0
- package/dist/cjs/components/Notifications.d.cts +14 -0
- package/dist/cjs/components/NovuUI.cjs +60 -0
- package/dist/cjs/components/NovuUI.cjs.map +1 -0
- package/dist/cjs/components/NovuUI.d.cts +12 -0
- package/dist/cjs/components/Preferences.cjs +54 -0
- package/dist/cjs/components/Preferences.cjs.map +1 -0
- package/dist/cjs/components/Preferences.d.cts +5 -0
- package/dist/cjs/components/Renderer.cjs +70 -0
- package/dist/cjs/components/Renderer.cjs.map +1 -0
- package/dist/cjs/components/Renderer.d.cts +8 -0
- package/dist/cjs/components/index.cjs +35 -0
- package/dist/cjs/components/index.cjs.map +1 -0
- package/dist/cjs/components/index.d.cts +11 -0
- package/dist/cjs/context/NovuUIContext.cjs +40 -0
- package/dist/cjs/context/NovuUIContext.cjs.map +1 -0
- package/dist/cjs/context/NovuUIContext.d.cts +14 -0
- package/dist/cjs/context/RendererContext.cjs +40 -0
- package/dist/cjs/context/RendererContext.cjs.map +1 -0
- package/dist/cjs/context/RendererContext.d.cts +15 -0
- package/dist/cjs/hooks/NovuProvider.cjs +101 -0
- package/dist/cjs/hooks/NovuProvider.cjs.map +1 -0
- package/dist/cjs/hooks/NovuProvider.d.cts +20 -0
- package/dist/cjs/hooks/index.cjs +40 -0
- package/dist/cjs/hooks/index.cjs.map +1 -0
- package/dist/cjs/hooks/index.d.cts +7 -0
- package/dist/cjs/hooks/internal/useBrowserTabsChannel.cjs +52 -0
- package/dist/cjs/hooks/internal/useBrowserTabsChannel.cjs.map +1 -0
- package/dist/cjs/hooks/internal/useBrowserTabsChannel.d.cts +8 -0
- package/dist/cjs/hooks/internal/useDataRef.cjs +36 -0
- package/dist/cjs/hooks/internal/useDataRef.cjs.map +1 -0
- package/dist/cjs/hooks/internal/useDataRef.d.cts +5 -0
- package/dist/cjs/hooks/internal/useWebsocketEvent.cjs +57 -0
- package/dist/cjs/hooks/internal/useWebsocketEvent.cjs.map +1 -0
- package/dist/cjs/hooks/internal/useWebsocketEvent.d.cts +8 -0
- package/dist/cjs/hooks/useCounts.cjs +104 -0
- package/dist/cjs/hooks/useCounts.cjs.map +1 -0
- package/dist/cjs/hooks/useCounts.d.cts +21 -0
- package/dist/cjs/hooks/useNotifications.cjs +121 -0
- package/dist/cjs/hooks/useNotifications.cjs.map +1 -0
- package/dist/cjs/hooks/useNotifications.d.cts +34 -0
- package/dist/cjs/hooks/usePreferences.cjs +80 -0
- package/dist/cjs/hooks/usePreferences.cjs.map +1 -0
- package/dist/cjs/hooks/usePreferences.d.cts +19 -0
- package/dist/cjs/index.cjs +27 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/index.d.cts +14 -0
- package/dist/cjs/server/index.cjs +92 -0
- package/dist/cjs/server/index.cjs.map +1 -0
- package/dist/cjs/server/index.d.cts +29 -0
- package/dist/cjs/themes/index.cjs +25 -0
- package/dist/cjs/themes/index.cjs.map +1 -0
- package/dist/cjs/utils/createContextAndHook.cjs +63 -0
- package/dist/cjs/utils/createContextAndHook.cjs.map +1 -0
- package/dist/cjs/utils/createContextAndHook.d.cts +19 -0
- package/dist/cjs/utils/requestLock.cjs +52 -0
- package/dist/cjs/utils/requestLock.cjs.map +1 -0
- package/dist/cjs/utils/requestLock.d.cts +3 -0
- package/dist/cjs/utils/types.cjs +19 -0
- package/dist/cjs/utils/types.cjs.map +1 -0
- package/dist/cjs/utils/types.d.cts +54 -0
- package/dist/client/{index.d.mts → components/index.d.mts} +23 -6
- package/dist/client/{index.d.ts → components/index.d.ts} +23 -6
- package/dist/client/{index.js → components/index.js} +92 -8
- package/dist/client/components/index.js.map +1 -0
- package/dist/client/{index.mjs → components/index.mjs} +77 -8
- package/dist/client/components/index.mjs.map +1 -0
- package/dist/{hooks → client/hooks}/index.js +8 -0
- package/dist/client/hooks/index.js.map +1 -0
- package/dist/client/hooks/index.mjs.map +1 -0
- package/dist/client/themes/index.d.ts +1 -0
- package/dist/{themes → client/themes}/index.js +4 -0
- package/dist/client/themes/index.js.map +1 -0
- package/dist/client/themes/index.mjs.map +1 -0
- package/dist/esm/components/Bell.d.ts +12 -0
- package/dist/esm/components/Bell.js +28 -0
- package/dist/esm/components/Bell.js.map +1 -0
- package/dist/esm/components/Inbox.d.ts +9 -0
- package/dist/esm/components/Inbox.js +163 -0
- package/dist/esm/components/Inbox.js.map +1 -0
- package/dist/esm/components/InboxContent.d.ts +16 -0
- package/dist/esm/components/InboxContent.js +59 -0
- package/dist/esm/components/InboxContent.js.map +1 -0
- package/dist/esm/components/Mounter.d.ts +11 -0
- package/dist/esm/components/Mounter.js +26 -0
- package/dist/esm/components/Mounter.js.map +1 -0
- package/dist/esm/components/Notifications.d.ts +14 -0
- package/dist/esm/components/Notifications.js +53 -0
- package/dist/esm/components/Notifications.js.map +1 -0
- package/dist/esm/components/NovuUI.d.ts +12 -0
- package/dist/esm/components/NovuUI.js +35 -0
- package/dist/esm/components/NovuUI.js.map +1 -0
- package/dist/esm/components/Preferences.d.ts +5 -0
- package/dist/esm/components/Preferences.js +19 -0
- package/dist/esm/components/Preferences.js.map +1 -0
- package/dist/esm/components/Renderer.d.ts +8 -0
- package/dist/esm/components/Renderer.js +44 -0
- package/dist/esm/components/Renderer.js.map +1 -0
- package/dist/esm/components/index.d.ts +11 -0
- package/dist/esm/components/index.js +8 -0
- package/dist/esm/components/index.js.map +1 -0
- package/dist/esm/context/NovuUIContext.d.ts +14 -0
- package/dist/esm/context/NovuUIContext.js +13 -0
- package/dist/esm/context/NovuUIContext.js.map +1 -0
- package/dist/esm/context/RendererContext.d.ts +15 -0
- package/dist/esm/context/RendererContext.js +13 -0
- package/dist/esm/context/RendererContext.js.map +1 -0
- package/dist/esm/hooks/NovuProvider.d.ts +20 -0
- package/dist/esm/hooks/NovuProvider.js +73 -0
- package/dist/esm/hooks/NovuProvider.js.map +1 -0
- package/dist/esm/hooks/index.d.ts +7 -0
- package/dist/esm/hooks/index.js +10 -0
- package/dist/esm/hooks/index.js.map +1 -0
- package/dist/esm/hooks/internal/useBrowserTabsChannel.d.ts +8 -0
- package/dist/esm/hooks/internal/useBrowserTabsChannel.js +27 -0
- package/dist/esm/hooks/internal/useBrowserTabsChannel.js.map +1 -0
- package/dist/esm/hooks/internal/useDataRef.d.ts +5 -0
- package/dist/esm/hooks/internal/useDataRef.js +11 -0
- package/dist/esm/hooks/internal/useDataRef.js.map +1 -0
- package/dist/esm/hooks/internal/useWebsocketEvent.d.ts +8 -0
- package/dist/esm/hooks/internal/useWebsocketEvent.js +32 -0
- package/dist/esm/hooks/internal/useWebsocketEvent.js.map +1 -0
- package/dist/esm/hooks/useCounts.d.ts +21 -0
- package/dist/esm/hooks/useCounts.js +76 -0
- package/dist/esm/hooks/useCounts.js.map +1 -0
- package/dist/esm/hooks/useNotifications.d.ts +34 -0
- package/dist/esm/hooks/useNotifications.js +96 -0
- package/dist/esm/hooks/useNotifications.js.map +1 -0
- package/dist/esm/hooks/usePreferences.d.ts +19 -0
- package/dist/esm/hooks/usePreferences.js +55 -0
- package/dist/esm/hooks/usePreferences.js.map +1 -0
- package/dist/esm/index.d.ts +14 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/server/index.d.ts +29 -0
- package/dist/esm/server/index.js +56 -0
- package/dist/esm/server/index.js.map +1 -0
- package/dist/esm/themes/index.d.ts +1 -0
- package/dist/esm/themes/index.js +3 -0
- package/dist/esm/themes/index.js.map +1 -0
- package/dist/esm/utils/createContextAndHook.d.ts +19 -0
- package/dist/esm/utils/createContextAndHook.js +27 -0
- package/dist/esm/utils/createContextAndHook.js.map +1 -0
- package/dist/esm/utils/requestLock.d.ts +3 -0
- package/dist/esm/utils/requestLock.js +27 -0
- package/dist/esm/utils/requestLock.js.map +1 -0
- package/dist/esm/utils/types.d.ts +54 -0
- package/dist/esm/utils/types.js +1 -0
- package/dist/esm/utils/types.js.map +1 -0
- package/dist/server/{server.d.mts → index.d.mts} +26 -5
- package/dist/server/{server.d.ts → index.d.ts} +26 -5
- package/dist/server/{server.js → index.js} +17 -20
- package/dist/server/index.js.map +1 -0
- package/dist/server/{server.mjs → index.mjs} +16 -19
- package/dist/server/index.mjs.map +1 -0
- package/hooks/package.json +3 -3
- package/package.json +61 -39
- package/server/package.json +5 -0
- package/themes/package.json +3 -3
- package/dist/client/index.js.map +0 -1
- package/dist/client/index.mjs.map +0 -1
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/index.mjs.map +0 -1
- package/dist/server/server.js.map +0 -1
- package/dist/server/server.mjs.map +0 -1
- package/dist/themes/index.js.map +0 -1
- package/dist/themes/index.mjs.map +0 -1
- /package/dist/{themes/index.d.mts → cjs/themes/index.d.cts} +0 -0
- /package/dist/{hooks → client/hooks}/index.d.mts +0 -0
- /package/dist/{hooks → client/hooks}/index.d.ts +0 -0
- /package/dist/{hooks → client/hooks}/index.mjs +0 -0
- /package/dist/{themes/index.d.ts → client/themes/index.d.mts} +0 -0
- /package/dist/{themes → client/themes}/index.mjs +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// src/components/Preferences.tsx
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { Mounter } from "./Mounter.js";
|
|
4
|
+
import { useNovuUI } from "../context/NovuUIContext.js";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
var Preferences = () => {
|
|
7
|
+
const { novuUI } = useNovuUI();
|
|
8
|
+
const mount = React.useCallback((element) => {
|
|
9
|
+
return novuUI.mountComponent({
|
|
10
|
+
name: "Preferences",
|
|
11
|
+
element
|
|
12
|
+
});
|
|
13
|
+
}, []);
|
|
14
|
+
return /* @__PURE__ */ jsx(Mounter, { mount });
|
|
15
|
+
};
|
|
16
|
+
export {
|
|
17
|
+
Preferences
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=Preferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Preferences.tsx"],"sourcesContent":["import React from 'react';\nimport { Mounter } from './Mounter';\nimport { useNovuUI } from '../context/NovuUIContext';\n\nexport const Preferences = () => {\n const { novuUI } = useNovuUI();\n\n const mount = React.useCallback((element: HTMLElement) => {\n return novuUI.mountComponent({\n name: 'Preferences',\n element,\n });\n }, []);\n\n return <Mounter mount={mount} />;\n};\n"],"mappings":";AAAA,OAAO,WAAW;AAClB,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAYjB;AAVF,IAAM,cAAc,MAAM;AAC/B,QAAM,EAAE,OAAO,IAAI,UAAU;AAE7B,QAAM,QAAQ,MAAM,YAAY,CAAC,YAAyB;AACxD,WAAO,OAAO,eAAe;AAAA,MAC3B,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,SAAO,oBAAC,WAAQ,OAAc;AAChC;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ComponentType, PropsWithChildren } from 'react';
|
|
3
|
+
|
|
4
|
+
type RendererProps = PropsWithChildren;
|
|
5
|
+
declare const Renderer: (props: RendererProps) => react_jsx_runtime.JSX.Element;
|
|
6
|
+
declare const withRenderer: <P extends object>(WrappedComponent: ComponentType<P>) => ComponentType<P & PropsWithChildren<{}>>;
|
|
7
|
+
|
|
8
|
+
export { Renderer, withRenderer };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// src/components/Renderer.tsx
|
|
2
|
+
import { useCallback, useState } from "react";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
4
|
+
import { RendererProvider } from "../context/RendererContext.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
var Renderer = (props) => {
|
|
7
|
+
const { children } = props;
|
|
8
|
+
const [mountedElements, setMountedElements] = useState(/* @__PURE__ */ new Map());
|
|
9
|
+
const mountElement = useCallback(
|
|
10
|
+
(el, mountedElement) => {
|
|
11
|
+
setMountedElements((prev) => {
|
|
12
|
+
const newMountedElements = new Map(prev);
|
|
13
|
+
newMountedElements.set(el, mountedElement);
|
|
14
|
+
return newMountedElements;
|
|
15
|
+
});
|
|
16
|
+
return () => {
|
|
17
|
+
setMountedElements((prev) => {
|
|
18
|
+
const newMountedElements = new Map(prev);
|
|
19
|
+
newMountedElements.delete(el);
|
|
20
|
+
return newMountedElements;
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
},
|
|
24
|
+
[setMountedElements]
|
|
25
|
+
);
|
|
26
|
+
return /* @__PURE__ */ jsxs(RendererProvider, { value: { mountElement }, children: [
|
|
27
|
+
[...mountedElements].map(([element, mountedElement]) => {
|
|
28
|
+
return createPortal(mountedElement, element);
|
|
29
|
+
}),
|
|
30
|
+
children
|
|
31
|
+
] });
|
|
32
|
+
};
|
|
33
|
+
var withRenderer = (WrappedComponent) => {
|
|
34
|
+
const HOC = (props) => {
|
|
35
|
+
return /* @__PURE__ */ jsx(Renderer, { children: /* @__PURE__ */ jsx(WrappedComponent, { ...props }) });
|
|
36
|
+
};
|
|
37
|
+
HOC.displayName = `WithRenderer(${WrappedComponent.displayName || WrappedComponent.name || "Component"})`;
|
|
38
|
+
return HOC;
|
|
39
|
+
};
|
|
40
|
+
export {
|
|
41
|
+
Renderer,
|
|
42
|
+
withRenderer
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=Renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Renderer.tsx"],"sourcesContent":["import { ComponentType, PropsWithChildren, useCallback, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { MountedElement, RendererProvider } from '../context/RendererContext';\n\ntype RendererProps = PropsWithChildren;\nexport const Renderer = (props: RendererProps) => {\n const { children } = props;\n const [mountedElements, setMountedElements] = useState(new Map<HTMLElement, MountedElement>());\n\n const mountElement = useCallback(\n (el: HTMLElement, mountedElement: MountedElement) => {\n setMountedElements((prev) => {\n const newMountedElements = new Map(prev);\n newMountedElements.set(el, mountedElement);\n\n return newMountedElements;\n });\n\n return () => {\n setMountedElements((prev) => {\n const newMountedElements = new Map(prev);\n newMountedElements.delete(el);\n\n return newMountedElements;\n });\n };\n },\n [setMountedElements]\n );\n\n return (\n <RendererProvider value={{ mountElement }}>\n {[...mountedElements].map(([element, mountedElement]) => {\n return createPortal(mountedElement, element);\n })}\n\n {children}\n </RendererProvider>\n );\n};\n\nexport const withRenderer = <P extends object>(\n WrappedComponent: ComponentType<P>\n): ComponentType<P & PropsWithChildren<{}>> => {\n const HOC = (props: P) => {\n return (\n <Renderer>\n <WrappedComponent {...props} />\n </Renderer>\n );\n };\n\n HOC.displayName = `WithRenderer(${WrappedComponent.displayName || WrappedComponent.name || 'Component'})`;\n\n return HOC;\n};\n"],"mappings":";AAAA,SAA2C,aAAa,gBAAgB;AACxE,SAAS,oBAAoB;AAC7B,SAAyB,wBAAwB;AA6B7C,SAgBI,KAhBJ;AA1BG,IAAM,WAAW,CAAC,UAAyB;AAChD,QAAM,EAAE,SAAS,IAAI;AACrB,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,oBAAI,IAAiC,CAAC;AAE7F,QAAM,eAAe;AAAA,IACnB,CAAC,IAAiB,mBAAmC;AACnD,yBAAmB,CAAC,SAAS;AAC3B,cAAM,qBAAqB,IAAI,IAAI,IAAI;AACvC,2BAAmB,IAAI,IAAI,cAAc;AAEzC,eAAO;AAAA,MACT,CAAC;AAED,aAAO,MAAM;AACX,2BAAmB,CAAC,SAAS;AAC3B,gBAAM,qBAAqB,IAAI,IAAI,IAAI;AACvC,6BAAmB,OAAO,EAAE;AAE5B,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,kBAAkB;AAAA,EACrB;AAEA,SACE,qBAAC,oBAAiB,OAAO,EAAE,aAAa,GACrC;AAAA,KAAC,GAAG,eAAe,EAAE,IAAI,CAAC,CAAC,SAAS,cAAc,MAAM;AACvD,aAAO,aAAa,gBAAgB,OAAO;AAAA,IAC7C,CAAC;AAAA,IAEA;AAAA,KACH;AAEJ;AAEO,IAAM,eAAe,CAC1B,qBAC6C;AAC7C,QAAM,MAAM,CAAC,UAAa;AACxB,WACE,oBAAC,YACC,8BAAC,oBAAkB,GAAG,OAAO,GAC/B;AAAA,EAEJ;AAEA,MAAI,cAAc,gBAAgB,iBAAiB,eAAe,iBAAiB,QAAQ,WAAW;AAEtG,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { Bell, BellProps } from './Bell.js';
|
|
2
|
+
export { Inbox, InboxProps } from './Inbox.js';
|
|
3
|
+
export { Preferences } from './Preferences.js';
|
|
4
|
+
export { NotificationProps, Notifications } from './Notifications.js';
|
|
5
|
+
export { InboxContent, InboxContentProps } from './InboxContent.js';
|
|
6
|
+
export { InternalNovuProvider, NovuProvider, NovuProviderProps, useNovu, useUnsafeNovu } from '../hooks/NovuProvider.js';
|
|
7
|
+
import 'react';
|
|
8
|
+
import '../utils/types.js';
|
|
9
|
+
import '@novu/js/ui';
|
|
10
|
+
import 'react/jsx-runtime';
|
|
11
|
+
import '@novu/js';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// src/components/index.ts
|
|
2
|
+
export * from "./Bell.js";
|
|
3
|
+
export * from "./Inbox.js";
|
|
4
|
+
export * from "./Preferences.js";
|
|
5
|
+
export * from "./Notifications.js";
|
|
6
|
+
export * from "./InboxContent.js";
|
|
7
|
+
export * from "../hooks/NovuProvider.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/index.ts"],"sourcesContent":["export * from './Bell';\nexport * from './Inbox';\nexport * from './Preferences';\nexport * from './Notifications';\nexport * from './InboxContent';\nexport * from '../hooks/NovuProvider';\n"],"mappings":";AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import React__default from 'react';
|
|
3
|
+
import { NovuUI } from '@novu/js/ui';
|
|
4
|
+
|
|
5
|
+
type NovuUIContextValue = {
|
|
6
|
+
novuUI: NovuUI;
|
|
7
|
+
};
|
|
8
|
+
declare const useNovuUIContext: () => NovuUIContextValue;
|
|
9
|
+
declare const useUnsafeNovuUIContext: () => NovuUIContextValue | Partial<NovuUIContextValue>;
|
|
10
|
+
declare const NovuUIProvider: (props: React__default.PropsWithChildren<{
|
|
11
|
+
value: NovuUIContextValue;
|
|
12
|
+
}>) => react_jsx_runtime.JSX.Element;
|
|
13
|
+
|
|
14
|
+
export { NovuUIProvider, useNovuUIContext as useNovuUI, useUnsafeNovuUIContext as useUnsafeNovuUI };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// src/context/NovuUIContext.tsx
|
|
2
|
+
import { createContextAndHook } from "../utils/createContextAndHook.js";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
var [NovuUIContext, useNovuUIContext, useUnsafeNovuUIContext] = createContextAndHook("NovuUIContext");
|
|
5
|
+
var NovuUIProvider = (props) => {
|
|
6
|
+
return /* @__PURE__ */ jsx(NovuUIContext.Provider, { value: { value: props.value }, children: props.children });
|
|
7
|
+
};
|
|
8
|
+
export {
|
|
9
|
+
NovuUIProvider,
|
|
10
|
+
useNovuUIContext as useNovuUI,
|
|
11
|
+
useUnsafeNovuUIContext as useUnsafeNovuUI
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=NovuUIContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/context/NovuUIContext.tsx"],"sourcesContent":["import React from 'react';\nimport type { NovuUI } from '@novu/js/ui';\nimport { createContextAndHook } from '../utils/createContextAndHook';\n\ntype NovuUIContextValue = {\n novuUI: NovuUI;\n};\n\nconst [NovuUIContext, useNovuUIContext, useUnsafeNovuUIContext] =\n createContextAndHook<NovuUIContextValue>('NovuUIContext');\n\nconst NovuUIProvider = (props: React.PropsWithChildren<{ value: NovuUIContextValue }>) => {\n return <NovuUIContext.Provider value={{ value: props.value }}>{props.children}</NovuUIContext.Provider>;\n};\n\nexport { useNovuUIContext as useNovuUI, useUnsafeNovuUIContext as useUnsafeNovuUI, NovuUIProvider };\n"],"mappings":";AAEA,SAAS,4BAA4B;AAU5B;AAJT,IAAM,CAAC,eAAe,kBAAkB,sBAAsB,IAC5D,qBAAyC,eAAe;AAE1D,IAAM,iBAAiB,CAAC,UAAkE;AACxF,SAAO,oBAAC,cAAc,UAAd,EAAuB,OAAO,EAAE,OAAO,MAAM,MAAM,GAAI,gBAAM,UAAS;AAChF;","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import React__default from 'react';
|
|
3
|
+
|
|
4
|
+
type MountedElement = React__default.ReactNode;
|
|
5
|
+
type MountedElements = Map<HTMLElement, MountedElement>;
|
|
6
|
+
type RendererContextValue = {
|
|
7
|
+
mountElement: (el: HTMLElement, mountedElement: MountedElement) => () => void;
|
|
8
|
+
};
|
|
9
|
+
declare const useRendererContext: () => RendererContextValue;
|
|
10
|
+
declare const useUnsafeRendererContext: () => RendererContextValue | Partial<RendererContextValue>;
|
|
11
|
+
declare const RendererProvider: (props: React__default.PropsWithChildren<{
|
|
12
|
+
value: RendererContextValue;
|
|
13
|
+
}>) => react_jsx_runtime.JSX.Element;
|
|
14
|
+
|
|
15
|
+
export { type MountedElement, type MountedElements, RendererProvider, useRendererContext as useRenderer, useUnsafeRendererContext as useUnsafeRenderer };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// src/context/RendererContext.tsx
|
|
2
|
+
import { createContextAndHook } from "../utils/createContextAndHook.js";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
var [RendererContext, useRendererContext, useUnsafeRendererContext] = createContextAndHook("RendererContext");
|
|
5
|
+
var RendererProvider = (props) => {
|
|
6
|
+
return /* @__PURE__ */ jsx(RendererContext.Provider, { value: { value: props.value }, children: props.children });
|
|
7
|
+
};
|
|
8
|
+
export {
|
|
9
|
+
RendererProvider,
|
|
10
|
+
useRendererContext as useRenderer,
|
|
11
|
+
useUnsafeRendererContext as useUnsafeRenderer
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=RendererContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/context/RendererContext.tsx"],"sourcesContent":["import React from 'react';\nimport type { NovuUI } from '@novu/js/ui';\nimport { createContextAndHook } from '../utils/createContextAndHook';\n\nexport type MountedElement = React.ReactNode;\nexport type MountedElements = Map<HTMLElement, MountedElement>;\n\ntype RendererContextValue = {\n mountElement: (el: HTMLElement, mountedElement: MountedElement) => () => void;\n};\n\nconst [RendererContext, useRendererContext, useUnsafeRendererContext] =\n createContextAndHook<RendererContextValue>('RendererContext');\n\nconst RendererProvider = (props: React.PropsWithChildren<{ value: RendererContextValue }>) => {\n return <RendererContext.Provider value={{ value: props.value }}>{props.children}</RendererContext.Provider>;\n};\n\nexport { useRendererContext as useRenderer, useUnsafeRendererContext as useUnsafeRenderer, RendererProvider };\n"],"mappings":";AAEA,SAAS,4BAA4B;AAa5B;AAJT,IAAM,CAAC,iBAAiB,oBAAoB,wBAAwB,IAClE,qBAA2C,iBAAiB;AAE9D,IAAM,mBAAmB,CAAC,UAAoE;AAC5F,SAAO,oBAAC,gBAAgB,UAAhB,EAAyB,OAAO,EAAE,OAAO,MAAM,MAAM,GAAI,gBAAM,UAAS;AAClF;","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { NovuOptions, Novu } from '@novu/js';
|
|
3
|
+
import { ReactNode } from 'react';
|
|
4
|
+
|
|
5
|
+
type NovuProviderProps = NovuOptions & {
|
|
6
|
+
children: ReactNode;
|
|
7
|
+
};
|
|
8
|
+
declare const NovuProvider: ({ children, applicationIdentifier, subscriberId, subscriberHash, backendUrl, socketUrl, useCache, }: NovuProviderProps) => react_jsx_runtime.JSX.Element;
|
|
9
|
+
/**
|
|
10
|
+
* @internal Should be used internally not to be exposed outside of the library
|
|
11
|
+
* This is needed to differentiate between the hooks and components user agents
|
|
12
|
+
* Better to use this internally to avoid confusion.
|
|
13
|
+
*/
|
|
14
|
+
declare const InternalNovuProvider: ({ children, applicationIdentifier, subscriberId, subscriberHash, backendUrl, socketUrl, useCache, userAgentType, }: NovuProviderProps & {
|
|
15
|
+
userAgentType: "components" | "hooks";
|
|
16
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
17
|
+
declare const useNovu: () => Novu;
|
|
18
|
+
declare const useUnsafeNovu: () => Novu | undefined;
|
|
19
|
+
|
|
20
|
+
export { InternalNovuProvider, NovuProvider, type NovuProviderProps, useNovu, useUnsafeNovu };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// src/hooks/NovuProvider.tsx
|
|
2
|
+
import { Novu } from "@novu/js";
|
|
3
|
+
import { createContext, useContext, useMemo } from "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
var version = "3.0.0-canary.0";
|
|
6
|
+
var name = "@novu/react";
|
|
7
|
+
var baseUserAgent = `${name}@${version}`;
|
|
8
|
+
var NovuContext = createContext(void 0);
|
|
9
|
+
var NovuProvider = ({
|
|
10
|
+
children,
|
|
11
|
+
applicationIdentifier,
|
|
12
|
+
subscriberId,
|
|
13
|
+
subscriberHash,
|
|
14
|
+
backendUrl,
|
|
15
|
+
socketUrl,
|
|
16
|
+
useCache
|
|
17
|
+
}) => {
|
|
18
|
+
return /* @__PURE__ */ jsx(
|
|
19
|
+
InternalNovuProvider,
|
|
20
|
+
{
|
|
21
|
+
applicationIdentifier,
|
|
22
|
+
subscriberId,
|
|
23
|
+
subscriberHash,
|
|
24
|
+
backendUrl,
|
|
25
|
+
socketUrl,
|
|
26
|
+
useCache,
|
|
27
|
+
userAgentType: "hooks",
|
|
28
|
+
children
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
};
|
|
32
|
+
var InternalNovuProvider = ({
|
|
33
|
+
children,
|
|
34
|
+
applicationIdentifier,
|
|
35
|
+
subscriberId,
|
|
36
|
+
subscriberHash,
|
|
37
|
+
backendUrl,
|
|
38
|
+
socketUrl,
|
|
39
|
+
useCache,
|
|
40
|
+
userAgentType
|
|
41
|
+
}) => {
|
|
42
|
+
const novu = useMemo(
|
|
43
|
+
() => new Novu({
|
|
44
|
+
applicationIdentifier,
|
|
45
|
+
subscriberId,
|
|
46
|
+
subscriberHash,
|
|
47
|
+
backendUrl,
|
|
48
|
+
socketUrl,
|
|
49
|
+
useCache,
|
|
50
|
+
__userAgent: `${baseUserAgent} ${userAgentType}`
|
|
51
|
+
}),
|
|
52
|
+
[applicationIdentifier, subscriberId, subscriberHash, backendUrl, socketUrl, useCache, userAgentType]
|
|
53
|
+
);
|
|
54
|
+
return /* @__PURE__ */ jsx(NovuContext.Provider, { value: novu, children });
|
|
55
|
+
};
|
|
56
|
+
var useNovu = () => {
|
|
57
|
+
const context = useContext(NovuContext);
|
|
58
|
+
if (!context) {
|
|
59
|
+
throw new Error("useNovu must be used within a <NovuProvider />");
|
|
60
|
+
}
|
|
61
|
+
return context;
|
|
62
|
+
};
|
|
63
|
+
var useUnsafeNovu = () => {
|
|
64
|
+
const context = useContext(NovuContext);
|
|
65
|
+
return context;
|
|
66
|
+
};
|
|
67
|
+
export {
|
|
68
|
+
InternalNovuProvider,
|
|
69
|
+
NovuProvider,
|
|
70
|
+
useNovu,
|
|
71
|
+
useUnsafeNovu
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=NovuProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/NovuProvider.tsx"],"sourcesContent":["import { Novu, NovuOptions } from '@novu/js';\nimport { ReactNode, createContext, useContext, useMemo } from 'react';\n\n// @ts-ignore\nconst version = PACKAGE_VERSION;\n// @ts-ignore\nconst name = PACKAGE_NAME;\nconst baseUserAgent = `${name}@${version}`;\n\nexport type NovuProviderProps = NovuOptions & {\n children: ReactNode;\n};\n\nconst NovuContext = createContext<Novu | undefined>(undefined);\n\nexport const NovuProvider = ({\n children,\n applicationIdentifier,\n subscriberId,\n subscriberHash,\n backendUrl,\n socketUrl,\n useCache,\n}: NovuProviderProps) => {\n return (\n <InternalNovuProvider\n applicationIdentifier={applicationIdentifier}\n subscriberId={subscriberId}\n subscriberHash={subscriberHash}\n backendUrl={backendUrl}\n socketUrl={socketUrl}\n useCache={useCache}\n userAgentType=\"hooks\"\n >\n {children}\n </InternalNovuProvider>\n );\n};\n\n/**\n * @internal Should be used internally not to be exposed outside of the library\n * This is needed to differentiate between the hooks and components user agents\n * Better to use this internally to avoid confusion.\n */\nexport const InternalNovuProvider = ({\n children,\n applicationIdentifier,\n subscriberId,\n subscriberHash,\n backendUrl,\n socketUrl,\n useCache,\n userAgentType,\n}: NovuProviderProps & { userAgentType: 'components' | 'hooks' }) => {\n const novu = useMemo(\n () =>\n new Novu({\n applicationIdentifier,\n subscriberId,\n subscriberHash,\n backendUrl,\n socketUrl,\n useCache,\n __userAgent: `${baseUserAgent} ${userAgentType}`,\n }),\n [applicationIdentifier, subscriberId, subscriberHash, backendUrl, socketUrl, useCache, userAgentType]\n );\n\n return <NovuContext.Provider value={novu}>{children}</NovuContext.Provider>;\n};\n\nexport const useNovu = () => {\n const context = useContext(NovuContext);\n if (!context) {\n throw new Error('useNovu must be used within a <NovuProvider />');\n }\n\n return context;\n};\n\nexport const useUnsafeNovu = () => {\n const context = useContext(NovuContext);\n\n return context;\n};\n"],"mappings":";AAAA,SAAS,YAAyB;AAClC,SAAoB,eAAe,YAAY,eAAe;AAwB1D;AArBJ,IAAM,UAAU;AAEhB,IAAM,OAAO;AACb,IAAM,gBAAgB,GAAG,IAAI,IAAI,OAAO;AAMxC,IAAM,cAAc,cAAgC,MAAS;AAEtD,IAAM,eAAe,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAyB;AACvB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAc;AAAA,MAEb;AAAA;AAAA,EACH;AAEJ;AAOO,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAqE;AACnE,QAAM,OAAO;AAAA,IACX,MACE,IAAI,KAAK;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,GAAG,aAAa,IAAI,aAAa;AAAA,IAChD,CAAC;AAAA,IACH,CAAC,uBAAuB,cAAc,gBAAgB,YAAY,WAAW,UAAU,aAAa;AAAA,EACtG;AAEA,SAAO,oBAAC,YAAY,UAAZ,EAAqB,OAAO,MAAO,UAAS;AACtD;AAEO,IAAM,UAAU,MAAM;AAC3B,QAAM,UAAU,WAAW,WAAW;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAEA,SAAO;AACT;AAEO,IAAM,gBAAgB,MAAM;AACjC,QAAM,UAAU,WAAW,WAAW;AAEtC,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { UseNotificationsProps, UseNotificationsResult, useNotifications } from './useNotifications.js';
|
|
2
|
+
export { UsePreferencesProps, UsePreferencesResult, usePreferences } from './usePreferences.js';
|
|
3
|
+
export { UseCountsProps, UseCountsResult, useCounts } from './useCounts.js';
|
|
4
|
+
export { NovuProvider, useNovu } from './NovuProvider.js';
|
|
5
|
+
import '@novu/js';
|
|
6
|
+
import 'react/jsx-runtime';
|
|
7
|
+
import 'react';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// src/hooks/index.ts
|
|
2
|
+
export * from "./useNotifications.js";
|
|
3
|
+
export * from "./usePreferences.js";
|
|
4
|
+
export * from "./useCounts.js";
|
|
5
|
+
import { NovuProvider, useNovu } from "./NovuProvider.js";
|
|
6
|
+
export {
|
|
7
|
+
NovuProvider,
|
|
8
|
+
useNovu
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/index.ts"],"sourcesContent":["export * from './useNotifications';\nexport * from './usePreferences';\nexport * from './useCounts';\nexport { NovuProvider, useNovu } from './NovuProvider';\n"],"mappings":";AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,cAAc,eAAe;","names":[]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// src/hooks/internal/useBrowserTabsChannel.ts
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
var useBrowserTabsChannel = ({
|
|
4
|
+
channelName,
|
|
5
|
+
onMessage
|
|
6
|
+
}) => {
|
|
7
|
+
const [tabsChannel] = useState(
|
|
8
|
+
typeof BroadcastChannel !== "undefined" ? new BroadcastChannel(channelName) : void 0
|
|
9
|
+
);
|
|
10
|
+
const postMessage = (data) => {
|
|
11
|
+
tabsChannel?.postMessage(data);
|
|
12
|
+
};
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
const listener = (event) => {
|
|
15
|
+
onMessage(event.data);
|
|
16
|
+
};
|
|
17
|
+
tabsChannel?.addEventListener("message", listener);
|
|
18
|
+
return () => {
|
|
19
|
+
tabsChannel?.removeEventListener("message", listener);
|
|
20
|
+
};
|
|
21
|
+
}, []);
|
|
22
|
+
return { postMessage };
|
|
23
|
+
};
|
|
24
|
+
export {
|
|
25
|
+
useBrowserTabsChannel
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=useBrowserTabsChannel.js.map
|
|
@@ -0,0 +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,SAAS,WAAW,gBAAgB;AAE7B,IAAM,wBAAwB,CAAc;AAAA,EACjD;AAAA,EACA;AACF,MAGM;AACJ,QAAM,CAAC,WAAW,IAAI;AAAA,IACpB,OAAO,qBAAqB,cAAc,IAAI,iBAAiB,WAAW,IAAI;AAAA,EAChF;AAEA,QAAM,cAAc,CAAC,SAAY;AAC/B,iBAAa,YAAY,IAAI;AAAA,EAC/B;AAEA,YAAU,MAAM;AACd,UAAM,WAAW,CAAC,UAA2B;AAC3C,gBAAU,MAAM,IAAI;AAAA,IACtB;AAEA,iBAAa,iBAAiB,WAAW,QAAQ;AAEjD,WAAO,MAAM;AACX,mBAAa,oBAAoB,WAAW,QAAQ;AAAA,IACtD;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,YAAY;AACvB;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/hooks/internal/useDataRef.ts"],"sourcesContent":["import { useRef } from 'react';\n\nexport const useDataRef = <T>(data: T) => {\n const ref = useRef(data);\n ref.current = data;\n\n return ref;\n};\n"],"mappings":";AAAA,SAAS,cAAc;AAEhB,IAAM,aAAa,CAAI,SAAY;AACxC,QAAM,MAAM,OAAO,IAAI;AACvB,MAAI,UAAU;AAEd,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { SocketEventNames, Events } from '@novu/js';
|
|
2
|
+
|
|
3
|
+
declare const useWebSocketEvent: <E extends SocketEventNames>({ event: webSocketEvent, eventHandler: onMessage, }: {
|
|
4
|
+
event: E;
|
|
5
|
+
eventHandler: (args: Events[E]) => void;
|
|
6
|
+
}) => void;
|
|
7
|
+
|
|
8
|
+
export { useWebSocketEvent };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// src/hooks/internal/useWebsocketEvent.ts
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
import { useNovu } from "../NovuProvider.js";
|
|
4
|
+
import { requestLock } from "../../utils/requestLock.js";
|
|
5
|
+
import { useBrowserTabsChannel } from "./useBrowserTabsChannel.js";
|
|
6
|
+
var useWebSocketEvent = ({
|
|
7
|
+
event: webSocketEvent,
|
|
8
|
+
eventHandler: onMessage
|
|
9
|
+
}) => {
|
|
10
|
+
const novu = useNovu();
|
|
11
|
+
const { postMessage } = useBrowserTabsChannel({ channelName: `nv.${webSocketEvent}`, onMessage });
|
|
12
|
+
const updateReadCount = (data) => {
|
|
13
|
+
onMessage(data);
|
|
14
|
+
postMessage(data);
|
|
15
|
+
};
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
let cleanup;
|
|
18
|
+
const resolveLock = requestLock(`nv.${webSocketEvent}`, () => {
|
|
19
|
+
cleanup = novu.on(webSocketEvent, updateReadCount);
|
|
20
|
+
});
|
|
21
|
+
return () => {
|
|
22
|
+
if (cleanup) {
|
|
23
|
+
cleanup();
|
|
24
|
+
}
|
|
25
|
+
resolveLock();
|
|
26
|
+
};
|
|
27
|
+
}, []);
|
|
28
|
+
};
|
|
29
|
+
export {
|
|
30
|
+
useWebSocketEvent
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=useWebsocketEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/hooks/internal/useWebsocketEvent.ts"],"sourcesContent":["import { EventHandler, Events, SocketEventNames } from '@novu/js';\nimport { useEffect } from 'react';\nimport { useNovu } from '../NovuProvider';\nimport { requestLock } from '../../utils/requestLock';\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 { postMessage } = useBrowserTabsChannel({ channelName: `nv.${webSocketEvent}`, onMessage });\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(`nv.${webSocketEvent}`, () => {\n cleanup = novu.on(webSocketEvent, updateReadCount);\n });\n\n return () => {\n if (cleanup) {\n cleanup();\n }\n\n resolveLock();\n };\n }, []);\n};\n"],"mappings":";AACA,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAC5B,SAAS,6BAA6B;AAE/B,IAAM,oBAAoB,CAA6B;AAAA,EAC5D,OAAO;AAAA,EACP,cAAc;AAChB,MAGM;AACJ,QAAM,OAAO,QAAQ;AACrB,QAAM,EAAE,YAAY,IAAI,sBAAsB,EAAE,aAAa,MAAM,cAAc,IAAI,UAAU,CAAC;AAEhG,QAAM,kBAA2C,CAAC,SAAS;AACzD,cAAU,IAAI;AACd,gBAAY,IAAI;AAAA,EAClB;AAEA,YAAU,MAAM;AACd,QAAI;AACJ,UAAM,cAAc,YAAY,MAAM,cAAc,IAAI,MAAM;AAC5D,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,CAAC;AACP;","names":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { NotificationFilter, NovuError } from '@novu/js';
|
|
2
|
+
|
|
3
|
+
type Count = {
|
|
4
|
+
count: number;
|
|
5
|
+
filter: NotificationFilter;
|
|
6
|
+
};
|
|
7
|
+
type UseCountsProps = {
|
|
8
|
+
filters: NotificationFilter[];
|
|
9
|
+
onSuccess?: (data: Count[]) => void;
|
|
10
|
+
onError?: (error: NovuError) => void;
|
|
11
|
+
};
|
|
12
|
+
type UseCountsResult = {
|
|
13
|
+
counts?: Count[];
|
|
14
|
+
error?: NovuError;
|
|
15
|
+
isLoading: boolean;
|
|
16
|
+
isFetching: boolean;
|
|
17
|
+
refetch: () => Promise<void>;
|
|
18
|
+
};
|
|
19
|
+
declare const useCounts: (props: UseCountsProps) => UseCountsResult;
|
|
20
|
+
|
|
21
|
+
export { type UseCountsProps, type UseCountsResult, useCounts };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// src/hooks/useCounts.ts
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { areTagsEqual } from "@novu/js";
|
|
4
|
+
import { useNovu } from "./NovuProvider.js";
|
|
5
|
+
import { useWebSocketEvent } from "./internal/useWebsocketEvent.js";
|
|
6
|
+
var useCounts = (props) => {
|
|
7
|
+
const { filters, onSuccess, onError } = props;
|
|
8
|
+
const { notifications } = useNovu();
|
|
9
|
+
const [error, setError] = useState();
|
|
10
|
+
const [counts, setCounts] = useState();
|
|
11
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
12
|
+
const [isFetching, setIsFetching] = useState(false);
|
|
13
|
+
const sync = async (notification) => {
|
|
14
|
+
const existingCounts = counts ?? new Array(filters.length).fill(void 0);
|
|
15
|
+
let countFiltersToFetch = [];
|
|
16
|
+
if (notification) {
|
|
17
|
+
for (let i = 0; i < existingCounts.length; i++) {
|
|
18
|
+
const filter = filters[i];
|
|
19
|
+
if (areTagsEqual(filter.tags, notification.tags)) {
|
|
20
|
+
countFiltersToFetch.push(filter);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
} else {
|
|
24
|
+
countFiltersToFetch = filters;
|
|
25
|
+
}
|
|
26
|
+
if (countFiltersToFetch.length === 0) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
setIsFetching(true);
|
|
30
|
+
const countsRes = await notifications.count({ filters: countFiltersToFetch });
|
|
31
|
+
setIsFetching(false);
|
|
32
|
+
setIsLoading(false);
|
|
33
|
+
if (countsRes.error) {
|
|
34
|
+
setError(countsRes.error);
|
|
35
|
+
onError?.(countsRes.error);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const data = countsRes.data;
|
|
39
|
+
onSuccess?.(data.counts);
|
|
40
|
+
setCounts((oldCounts) => {
|
|
41
|
+
const newCounts = [];
|
|
42
|
+
const countsReceived = data.counts;
|
|
43
|
+
for (let i = 0; i < existingCounts.length; i++) {
|
|
44
|
+
const countReceived = countsReceived.find((c) => areTagsEqual(c.filter.tags, existingCounts[i]?.filter.tags));
|
|
45
|
+
newCounts.push(countReceived || oldCounts[i]);
|
|
46
|
+
}
|
|
47
|
+
return newCounts;
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
useWebSocketEvent({
|
|
51
|
+
event: "notifications.notification_received",
|
|
52
|
+
eventHandler: (data) => {
|
|
53
|
+
sync(data.result);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
useWebSocketEvent({
|
|
57
|
+
event: "notifications.unread_count_changed",
|
|
58
|
+
eventHandler: () => {
|
|
59
|
+
sync();
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
setError(void 0);
|
|
64
|
+
setIsLoading(true);
|
|
65
|
+
setIsFetching(false);
|
|
66
|
+
sync();
|
|
67
|
+
}, [JSON.stringify(filters)]);
|
|
68
|
+
const refetch = async () => {
|
|
69
|
+
await sync();
|
|
70
|
+
};
|
|
71
|
+
return { counts, error, refetch, isLoading, isFetching };
|
|
72
|
+
};
|
|
73
|
+
export {
|
|
74
|
+
useCounts
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=useCounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useCounts.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { Notification, NotificationFilter, NovuError, areTagsEqual } from '@novu/js';\nimport { useNovu } from './NovuProvider';\nimport { useWebSocketEvent } from './internal/useWebsocketEvent';\n\ntype Count = {\n count: number;\n filter: NotificationFilter;\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 [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) => {\n const existingCounts = counts ?? (new Array(filters.length).fill(undefined) as (Count | undefined)[]);\n let countFiltersToFetch: NotificationFilter[] = [];\n if (notification) {\n // eslint-disable-next-line no-plusplus\n for (let i = 0; i < existingCounts.length; i++) {\n const filter = filters[i];\n if (areTagsEqual(filter.tags, notification.tags)) {\n countFiltersToFetch.push(filter);\n }\n }\n } else {\n countFiltersToFetch = filters;\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 // eslint-disable-next-line no-plusplus\n for (let i = 0; i < existingCounts.length; i++) {\n const countReceived = countsReceived.find((c) => areTagsEqual(c.filter.tags, existingCounts[i]?.filter.tags));\n\n newCounts.push(countReceived || oldCounts![i]);\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();\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,SAAS,WAAW,gBAAgB;AACpC,SAAsD,oBAAoB;AAC1E,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAqB3B,IAAM,YAAY,CAAC,UAA2C;AACnE,QAAM,EAAE,SAAS,WAAW,QAAQ,IAAI;AACxC,QAAM,EAAE,cAAc,IAAI,QAAQ;AAClC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAoB;AAC9C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAkB;AAC9C,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,IAAI;AAC/C,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAElD,QAAM,OAAO,OAAO,iBAAgC;AAClD,UAAM,iBAAiB,UAAW,IAAI,MAAM,QAAQ,MAAM,EAAE,KAAK,MAAS;AAC1E,QAAI,sBAA4C,CAAC;AACjD,QAAI,cAAc;AAEhB,eAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,cAAM,SAAS,QAAQ,CAAC;AACxB,YAAI,aAAa,OAAO,MAAM,aAAa,IAAI,GAAG;AAChD,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,gBAAU,UAAU,KAAK;AAEzB;AAAA,IACF;AACA,UAAM,OAAO,UAAU;AACvB,gBAAY,KAAK,MAAM;AAEvB,cAAU,CAAC,cAAc;AACvB,YAAM,YAAqB,CAAC;AAC5B,YAAM,iBAAiB,KAAK;AAG5B,eAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,cAAM,gBAAgB,eAAe,KAAK,CAAC,MAAM,aAAa,EAAE,OAAO,MAAM,eAAe,CAAC,GAAG,OAAO,IAAI,CAAC;AAE5G,kBAAU,KAAK,iBAAiB,UAAW,CAAC,CAAC;AAAA,MAC/C;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,oBAAkB;AAAA,IAChB,OAAO;AAAA,IACP,cAAc,CAAC,SAAS;AACtB,WAAK,KAAK,MAAM;AAAA,IAClB;AAAA,EACF,CAAC;AAED,oBAAkB;AAAA,IAChB,OAAO;AAAA,IACP,cAAc,MAAM;AAClB,WAAK;AAAA,IACP;AAAA,EACF,CAAC;AAED,YAAU,MAAM;AACd,aAAS,MAAS;AAClB,iBAAa,IAAI;AACjB,kBAAc,KAAK;AACnB,SAAK;AAAA,EACP,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":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Notification, NovuError } from '@novu/js';
|
|
2
|
+
|
|
3
|
+
type UseNotificationsProps = {
|
|
4
|
+
tags?: string[];
|
|
5
|
+
read?: boolean;
|
|
6
|
+
archived?: boolean;
|
|
7
|
+
limit?: number;
|
|
8
|
+
onSuccess?: (data: Notification[]) => void;
|
|
9
|
+
onError?: (error: NovuError) => void;
|
|
10
|
+
};
|
|
11
|
+
type UseNotificationsResult = {
|
|
12
|
+
notifications?: Notification[];
|
|
13
|
+
error?: NovuError;
|
|
14
|
+
isLoading: boolean;
|
|
15
|
+
isFetching: boolean;
|
|
16
|
+
hasMore: boolean;
|
|
17
|
+
readAll: () => Promise<{
|
|
18
|
+
data?: void | undefined;
|
|
19
|
+
error?: NovuError | undefined;
|
|
20
|
+
}>;
|
|
21
|
+
archiveAll: () => Promise<{
|
|
22
|
+
data?: void | undefined;
|
|
23
|
+
error?: NovuError | undefined;
|
|
24
|
+
}>;
|
|
25
|
+
archiveAllRead: () => Promise<{
|
|
26
|
+
data?: void | undefined;
|
|
27
|
+
error?: NovuError | undefined;
|
|
28
|
+
}>;
|
|
29
|
+
refetch: () => Promise<void>;
|
|
30
|
+
fetchMore: () => Promise<void>;
|
|
31
|
+
};
|
|
32
|
+
declare const useNotifications: (props?: UseNotificationsProps) => UseNotificationsResult;
|
|
33
|
+
|
|
34
|
+
export { type UseNotificationsProps, type UseNotificationsResult, useNotifications };
|