@novu/react 3.11.0 → 3.12.0-rc.2
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/README.md +10 -18
- package/dist/cjs/components/Inbox.cjs +5 -1
- package/dist/cjs/components/Inbox.cjs.map +1 -1
- package/dist/cjs/components/NovuUI.cjs +3 -1
- package/dist/cjs/components/NovuUI.cjs.map +1 -1
- package/dist/cjs/components/NovuUI.d.cts +9 -9
- package/dist/cjs/components/index.cjs +7 -1
- package/dist/cjs/components/index.cjs.map +1 -1
- package/dist/cjs/components/index.d.cts +5 -0
- package/dist/cjs/components/subscription/DefaultSubscription.cjs +59 -0
- package/dist/cjs/components/subscription/DefaultSubscription.cjs.map +1 -0
- package/dist/cjs/components/subscription/DefaultSubscription.d.cts +11 -0
- package/dist/cjs/components/subscription/Subscription.cjs +80 -0
- package/dist/cjs/components/subscription/Subscription.cjs.map +1 -0
- package/dist/cjs/components/subscription/Subscription.d.cts +22 -0
- package/dist/cjs/components/subscription/SubscriptionButton.cjs +91 -0
- package/dist/cjs/components/subscription/SubscriptionButton.cjs.map +1 -0
- package/dist/cjs/components/subscription/SubscriptionButton.d.cts +8 -0
- package/dist/cjs/components/subscription/SubscriptionPreferences.cjs +91 -0
- package/dist/cjs/components/subscription/SubscriptionPreferences.cjs.map +1 -0
- package/dist/cjs/components/subscription/SubscriptionPreferences.d.cts +8 -0
- package/dist/cjs/hooks/NovuProvider.cjs +21 -18
- package/dist/cjs/hooks/NovuProvider.cjs.map +1 -1
- package/dist/cjs/hooks/index.cjs +11 -1
- package/dist/cjs/hooks/index.cjs.map +1 -1
- package/dist/cjs/hooks/index.d.cts +7 -1
- package/dist/cjs/hooks/useCreateSubscription.cjs +61 -0
- package/dist/cjs/hooks/useCreateSubscription.cjs.map +1 -0
- package/dist/cjs/hooks/useCreateSubscription.d.cts +17 -0
- package/dist/cjs/hooks/useDeleteSubscription.cjs +61 -0
- package/dist/cjs/hooks/useDeleteSubscription.cjs.map +1 -0
- package/dist/cjs/hooks/useDeleteSubscription.d.cts +17 -0
- package/dist/cjs/hooks/useSubscription.cjs +156 -0
- package/dist/cjs/hooks/useSubscription.cjs.map +1 -0
- package/dist/cjs/hooks/useSubscription.d.cts +21 -0
- package/dist/cjs/hooks/useSubscriptions.cjs +121 -0
- package/dist/cjs/hooks/useSubscriptions.cjs.map +1 -0
- package/dist/cjs/hooks/useSubscriptions.d.cts +36 -0
- package/dist/cjs/hooks/useUpdateSubscription.cjs +61 -0
- package/dist/cjs/hooks/useUpdateSubscription.cjs.map +1 -0
- package/dist/cjs/hooks/useUpdateSubscription.d.cts +18 -0
- package/dist/cjs/index.cjs +18 -2
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +14 -3
- package/dist/cjs/server/index.cjs +61 -2
- package/dist/cjs/server/index.cjs.map +1 -1
- package/dist/cjs/server/index.d.cts +18 -4
- package/dist/cjs/utils/appearance.cjs.map +1 -1
- package/dist/cjs/utils/appearance.d.cts +3 -3
- package/dist/cjs/utils/types.cjs.map +1 -1
- package/dist/cjs/utils/types.d.cts +32 -11
- package/dist/esm/components/Inbox.js +5 -1
- package/dist/esm/components/Inbox.js.map +1 -1
- package/dist/esm/components/NovuUI.d.ts +9 -9
- package/dist/esm/components/NovuUI.js +3 -1
- package/dist/esm/components/NovuUI.js.map +1 -1
- package/dist/esm/components/index.d.ts +5 -0
- package/dist/esm/components/index.js +3 -0
- package/dist/esm/components/index.js.map +1 -1
- package/dist/esm/components/subscription/DefaultSubscription.d.ts +11 -0
- package/dist/esm/components/subscription/DefaultSubscription.js +34 -0
- package/dist/esm/components/subscription/DefaultSubscription.js.map +1 -0
- package/dist/esm/components/subscription/Subscription.d.ts +22 -0
- package/dist/esm/components/subscription/Subscription.js +45 -0
- package/dist/esm/components/subscription/Subscription.js.map +1 -0
- package/dist/esm/components/subscription/SubscriptionButton.d.ts +8 -0
- package/dist/esm/components/subscription/SubscriptionButton.js +56 -0
- package/dist/esm/components/subscription/SubscriptionButton.js.map +1 -0
- package/dist/esm/components/subscription/SubscriptionPreferences.d.ts +8 -0
- package/dist/esm/components/subscription/SubscriptionPreferences.js +56 -0
- package/dist/esm/components/subscription/SubscriptionPreferences.js.map +1 -0
- package/dist/esm/hooks/NovuProvider.js +22 -19
- package/dist/esm/hooks/NovuProvider.js.map +1 -1
- package/dist/esm/hooks/index.d.ts +7 -1
- package/dist/esm/hooks/index.js +5 -0
- package/dist/esm/hooks/index.js.map +1 -1
- package/dist/esm/hooks/useCreateSubscription.d.ts +17 -0
- package/dist/esm/hooks/useCreateSubscription.js +36 -0
- package/dist/esm/hooks/useCreateSubscription.js.map +1 -0
- package/dist/esm/hooks/useDeleteSubscription.d.ts +17 -0
- package/dist/esm/hooks/useDeleteSubscription.js +36 -0
- package/dist/esm/hooks/useDeleteSubscription.js.map +1 -0
- package/dist/esm/hooks/useSubscription.d.ts +21 -0
- package/dist/esm/hooks/useSubscription.js +129 -0
- package/dist/esm/hooks/useSubscription.js.map +1 -0
- package/dist/esm/hooks/useSubscriptions.d.ts +36 -0
- package/dist/esm/hooks/useSubscriptions.js +96 -0
- package/dist/esm/hooks/useSubscriptions.js.map +1 -0
- package/dist/esm/hooks/useUpdateSubscription.d.ts +18 -0
- package/dist/esm/hooks/useUpdateSubscription.js +36 -0
- package/dist/esm/hooks/useUpdateSubscription.js.map +1 -0
- package/dist/esm/index.d.ts +14 -3
- package/dist/esm/index.js +32 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/index.d.ts +18 -4
- package/dist/esm/server/index.js +53 -2
- package/dist/esm/server/index.js.map +1 -1
- package/dist/esm/utils/appearance.d.ts +3 -3
- package/dist/esm/utils/appearance.js.map +1 -1
- package/dist/esm/utils/types.d.ts +32 -11
- package/package.json +11 -11
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * from '@novu/js';
|
|
2
|
+
export { PreferenceLevel, SeverityLevelEnum, WorkflowCriticalityEnum } from '@novu/js';
|
|
2
3
|
export { NovuProvider, useNovu } from './NovuProvider.js';
|
|
3
4
|
export { UseCountsProps, UseCountsResult, useCounts } from './useCounts.js';
|
|
5
|
+
export { UseCreateSubscriptionProps, UseCreateSubscriptionResult, useCreateSubscription } from './useCreateSubscription.js';
|
|
6
|
+
export { UseDeleteSubscriptionProps, UseDeleteSubscriptionResult, useDeleteSubscription } from './useDeleteSubscription.js';
|
|
4
7
|
export { UseNotificationsProps, UseNotificationsResult, useNotifications } from './useNotifications.js';
|
|
5
8
|
export { UsePreferencesProps, UsePreferencesResult, usePreferences } from './usePreferences.js';
|
|
6
9
|
export { UseScheduleProps, UseScheduleResult, useSchedule } from './useSchedule.js';
|
|
10
|
+
export { UseSubscriptionProps, UseSubscriptionResult, useSubscription } from './useSubscription.js';
|
|
11
|
+
export { UseSubscriptionsProps, UseSubscriptionsResult, useSubscriptions } from './useSubscriptions.js';
|
|
12
|
+
export { UseUpdateSubscriptionProps, UseUpdateSubscriptionResult, useUpdateSubscription } from './useUpdateSubscription.js';
|
|
7
13
|
import 'react/jsx-runtime';
|
|
8
14
|
import 'react';
|
package/dist/esm/hooks/index.js
CHANGED
|
@@ -2,9 +2,14 @@
|
|
|
2
2
|
import { PreferenceLevel, SeverityLevelEnum, WorkflowCriticalityEnum } from "@novu/js";
|
|
3
3
|
import { NovuProvider, useNovu } from "./NovuProvider.js";
|
|
4
4
|
export * from "./useCounts.js";
|
|
5
|
+
export * from "./useCreateSubscription.js";
|
|
6
|
+
export * from "./useDeleteSubscription.js";
|
|
5
7
|
export * from "./useNotifications.js";
|
|
6
8
|
export * from "./usePreferences.js";
|
|
7
9
|
export * from "./useSchedule.js";
|
|
10
|
+
export * from "./useSubscription.js";
|
|
11
|
+
export * from "./useSubscriptions.js";
|
|
12
|
+
export * from "./useUpdateSubscription.js";
|
|
8
13
|
export {
|
|
9
14
|
NovuProvider,
|
|
10
15
|
PreferenceLevel,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/index.ts"],"sourcesContent":["export type
|
|
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 './useDeleteSubscription';\nexport * from './useNotifications';\nexport * from './usePreferences';\nexport * from './useSchedule';\nexport * from './useSubscription';\nexport * from './useSubscriptions';\nexport * from './useUpdateSubscription';\n"],"mappings":";AACA,SAAS,iBAAiB,mBAAmB,+BAA+B;AAC5E,SAAS,cAAc,eAAe;AACtC,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { TopicSubscription, NovuError, CreateSubscriptionArgs } from '@novu/js';
|
|
2
|
+
|
|
3
|
+
type UseCreateSubscriptionProps = {
|
|
4
|
+
onSuccess?: (data: TopicSubscription) => void;
|
|
5
|
+
onError?: (error: NovuError) => void;
|
|
6
|
+
};
|
|
7
|
+
type UseCreateSubscriptionResult = {
|
|
8
|
+
isCreating: boolean;
|
|
9
|
+
error?: NovuError;
|
|
10
|
+
create: (args: CreateSubscriptionArgs) => Promise<{
|
|
11
|
+
data?: TopicSubscription | undefined;
|
|
12
|
+
error?: NovuError | undefined;
|
|
13
|
+
}>;
|
|
14
|
+
};
|
|
15
|
+
declare const useCreateSubscription: (props?: UseCreateSubscriptionProps) => UseCreateSubscriptionResult;
|
|
16
|
+
|
|
17
|
+
export { type UseCreateSubscriptionProps, type UseCreateSubscriptionResult, useCreateSubscription };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// src/hooks/useCreateSubscription.ts
|
|
2
|
+
import { useCallback, useRef, useState } from "react";
|
|
3
|
+
import { useNovu } from "./NovuProvider.js";
|
|
4
|
+
var useCreateSubscription = (props = {}) => {
|
|
5
|
+
const propsRef = useRef(props);
|
|
6
|
+
propsRef.current = props;
|
|
7
|
+
const novu = useNovu();
|
|
8
|
+
const [isCreating, setIsCreating] = useState(false);
|
|
9
|
+
const [error, setError] = useState();
|
|
10
|
+
const create = useCallback(
|
|
11
|
+
async (args) => {
|
|
12
|
+
const { onSuccess, onError } = propsRef.current;
|
|
13
|
+
setError(void 0);
|
|
14
|
+
setIsCreating(true);
|
|
15
|
+
const response = await novu.subscriptions.create(args);
|
|
16
|
+
setIsCreating(false);
|
|
17
|
+
if (response.error) {
|
|
18
|
+
setError(response.error);
|
|
19
|
+
onError?.(response.error);
|
|
20
|
+
} else if (response.data) {
|
|
21
|
+
onSuccess?.(response.data);
|
|
22
|
+
}
|
|
23
|
+
return response;
|
|
24
|
+
},
|
|
25
|
+
[novu]
|
|
26
|
+
);
|
|
27
|
+
return {
|
|
28
|
+
create,
|
|
29
|
+
isCreating,
|
|
30
|
+
error
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
export {
|
|
34
|
+
useCreateSubscription
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=useCreateSubscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useCreateSubscription.ts"],"sourcesContent":["import { CreateSubscriptionArgs, NovuError, TopicSubscription } from '@novu/js';\nimport { useCallback, useRef, useState } from 'react';\nimport { useNovu } from './NovuProvider';\n\nexport type UseCreateSubscriptionProps = {\n onSuccess?: (data: TopicSubscription) => void;\n onError?: (error: NovuError) => void;\n};\n\nexport type UseCreateSubscriptionResult = {\n isCreating: boolean;\n error?: NovuError;\n create: (args: CreateSubscriptionArgs) => Promise<{\n data?: TopicSubscription | undefined;\n error?: NovuError | undefined;\n }>;\n};\n\nexport const useCreateSubscription = (props: UseCreateSubscriptionProps = {}): UseCreateSubscriptionResult => {\n const propsRef = useRef<UseCreateSubscriptionProps>(props);\n propsRef.current = props;\n const novu = useNovu();\n const [isCreating, setIsCreating] = useState(false);\n const [error, setError] = useState<NovuError>();\n\n const create = useCallback(\n async (args: CreateSubscriptionArgs) => {\n const { onSuccess, onError } = propsRef.current;\n setError(undefined);\n setIsCreating(true);\n\n const response = await novu.subscriptions.create(args);\n\n setIsCreating(false);\n\n if (response.error) {\n setError(response.error);\n onError?.(response.error);\n } else if (response.data) {\n onSuccess?.(response.data);\n }\n\n return response;\n },\n [novu]\n );\n\n return {\n create,\n isCreating,\n error,\n };\n};\n"],"mappings":";AACA,SAAS,aAAa,QAAQ,gBAAgB;AAC9C,SAAS,eAAe;AAgBjB,IAAM,wBAAwB,CAAC,QAAoC,CAAC,MAAmC;AAC5G,QAAM,WAAW,OAAmC,KAAK;AACzD,WAAS,UAAU;AACnB,QAAM,OAAO,QAAQ;AACrB,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAoB;AAE9C,QAAM,SAAS;AAAA,IACb,OAAO,SAAiC;AACtC,YAAM,EAAE,WAAW,QAAQ,IAAI,SAAS;AACxC,eAAS,MAAS;AAClB,oBAAc,IAAI;AAElB,YAAM,WAAW,MAAM,KAAK,cAAc,OAAO,IAAI;AAErD,oBAAc,KAAK;AAEnB,UAAI,SAAS,OAAO;AAClB,iBAAS,SAAS,KAAK;AACvB,kBAAU,SAAS,KAAK;AAAA,MAC1B,WAAW,SAAS,MAAM;AACxB,oBAAY,SAAS,IAAI;AAAA,MAC3B;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { NovuError, DeleteSubscriptionArgs } from '@novu/js';
|
|
2
|
+
|
|
3
|
+
type UseDeleteSubscriptionProps = {
|
|
4
|
+
onSuccess?: () => void;
|
|
5
|
+
onError?: (error: NovuError) => void;
|
|
6
|
+
};
|
|
7
|
+
type DeleteResult = Promise<{
|
|
8
|
+
error?: NovuError;
|
|
9
|
+
}>;
|
|
10
|
+
type UseDeleteSubscriptionResult = {
|
|
11
|
+
isDeleting: boolean;
|
|
12
|
+
error?: NovuError;
|
|
13
|
+
delete: (args: DeleteSubscriptionArgs) => DeleteResult;
|
|
14
|
+
};
|
|
15
|
+
declare const useDeleteSubscription: (props?: UseDeleteSubscriptionProps) => UseDeleteSubscriptionResult;
|
|
16
|
+
|
|
17
|
+
export { type UseDeleteSubscriptionProps, type UseDeleteSubscriptionResult, useDeleteSubscription };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// src/hooks/useDeleteSubscription.ts
|
|
2
|
+
import { useCallback, useRef, useState } from "react";
|
|
3
|
+
import { useNovu } from "./NovuProvider.js";
|
|
4
|
+
var useDeleteSubscription = (props = {}) => {
|
|
5
|
+
const propsRef = useRef(props);
|
|
6
|
+
propsRef.current = props;
|
|
7
|
+
const novu = useNovu();
|
|
8
|
+
const [isDeleting, setIsDeleting] = useState(false);
|
|
9
|
+
const [error, setError] = useState();
|
|
10
|
+
const deleteCallback = useCallback(
|
|
11
|
+
async (args) => {
|
|
12
|
+
const { onSuccess, onError } = propsRef.current;
|
|
13
|
+
setError(void 0);
|
|
14
|
+
setIsDeleting(true);
|
|
15
|
+
const response = await novu.subscriptions.delete(args);
|
|
16
|
+
setIsDeleting(false);
|
|
17
|
+
if (response.error) {
|
|
18
|
+
setError(response.error);
|
|
19
|
+
onError?.(response.error);
|
|
20
|
+
} else if (response.data) {
|
|
21
|
+
onSuccess?.();
|
|
22
|
+
}
|
|
23
|
+
return response;
|
|
24
|
+
},
|
|
25
|
+
[novu]
|
|
26
|
+
);
|
|
27
|
+
return {
|
|
28
|
+
delete: deleteCallback,
|
|
29
|
+
isDeleting,
|
|
30
|
+
error
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
export {
|
|
34
|
+
useDeleteSubscription
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=useDeleteSubscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useDeleteSubscription.ts"],"sourcesContent":["import { BaseDeleteSubscriptionArgs, DeleteSubscriptionArgs, NovuError } from '@novu/js';\nimport { useCallback, useRef, useState } from 'react';\nimport { useNovu } from './NovuProvider';\n\nexport type UseDeleteSubscriptionProps = {\n onSuccess?: () => void;\n onError?: (error: NovuError) => void;\n};\n\ntype DeleteResult = Promise<{\n error?: NovuError;\n}>;\n\nexport type UseDeleteSubscriptionResult = {\n isDeleting: boolean;\n error?: NovuError;\n delete: (args: DeleteSubscriptionArgs) => DeleteResult;\n};\n\nexport const useDeleteSubscription = (props: UseDeleteSubscriptionProps = {}): UseDeleteSubscriptionResult => {\n const propsRef = useRef<UseDeleteSubscriptionProps>(props);\n propsRef.current = props;\n const novu = useNovu();\n const [isDeleting, setIsDeleting] = useState(false);\n const [error, setError] = useState<NovuError>();\n\n const deleteCallback = useCallback(\n async (args: DeleteSubscriptionArgs): DeleteResult => {\n const { onSuccess, onError } = propsRef.current;\n setError(undefined);\n setIsDeleting(true);\n\n const response = await novu.subscriptions.delete(args as BaseDeleteSubscriptionArgs);\n\n setIsDeleting(false);\n\n if (response.error) {\n setError(response.error);\n onError?.(response.error);\n } else if (response.data) {\n onSuccess?.();\n }\n\n return response;\n },\n [novu]\n );\n\n return {\n delete: deleteCallback,\n isDeleting,\n error,\n };\n};\n"],"mappings":";AACA,SAAS,aAAa,QAAQ,gBAAgB;AAC9C,SAAS,eAAe;AAiBjB,IAAM,wBAAwB,CAAC,QAAoC,CAAC,MAAmC;AAC5G,QAAM,WAAW,OAAmC,KAAK;AACzD,WAAS,UAAU;AACnB,QAAM,OAAO,QAAQ;AACrB,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAoB;AAE9C,QAAM,iBAAiB;AAAA,IACrB,OAAO,SAA+C;AACpD,YAAM,EAAE,WAAW,QAAQ,IAAI,SAAS;AACxC,eAAS,MAAS;AAClB,oBAAc,IAAI;AAElB,YAAM,WAAW,MAAM,KAAK,cAAc,OAAO,IAAkC;AAEnF,oBAAc,KAAK;AAEnB,UAAI,SAAS,OAAO;AAClB,iBAAS,SAAS,KAAK;AACvB,kBAAU,SAAS,KAAK;AAAA,MAC1B,WAAW,SAAS,MAAM;AACxB,oBAAY;AAAA,MACd;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { TopicSubscription, NovuError } from '@novu/js';
|
|
2
|
+
|
|
3
|
+
type UseSubscriptionProps = {
|
|
4
|
+
topicKey: string;
|
|
5
|
+
identifier?: string;
|
|
6
|
+
onSuccess?: (data: TopicSubscription | null) => void;
|
|
7
|
+
onError?: (error: NovuError) => void;
|
|
8
|
+
};
|
|
9
|
+
type UseSubscriptionResult = {
|
|
10
|
+
subscription?: TopicSubscription | null;
|
|
11
|
+
error?: NovuError;
|
|
12
|
+
isLoading: boolean;
|
|
13
|
+
isFetching: boolean;
|
|
14
|
+
refetch: () => Promise<void>;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Get a subscription for a topic.
|
|
18
|
+
*/
|
|
19
|
+
declare const useSubscription: (props: UseSubscriptionProps) => UseSubscriptionResult;
|
|
20
|
+
|
|
21
|
+
export { type UseSubscriptionProps, type UseSubscriptionResult, useSubscription };
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// src/hooks/useSubscription.ts
|
|
2
|
+
import { buildSubscriptionIdentifier } from "@novu/js/internal";
|
|
3
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
4
|
+
import { useNovu } from "./NovuProvider.js";
|
|
5
|
+
var useSubscription = (props) => {
|
|
6
|
+
const novu = useNovu();
|
|
7
|
+
const propsRef = useRef(props);
|
|
8
|
+
propsRef.current = {
|
|
9
|
+
...props,
|
|
10
|
+
identifier: props.identifier ?? buildSubscriptionIdentifier({ topicKey: props.topicKey, subscriberId: novu.subscriberId })
|
|
11
|
+
};
|
|
12
|
+
const [subscription, setSubscription] = useState();
|
|
13
|
+
const subscriptionRef = useRef(null);
|
|
14
|
+
subscriptionRef.current = subscription ?? null;
|
|
15
|
+
const [error, setError] = useState();
|
|
16
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
17
|
+
const [isFetching, setIsFetching] = useState(false);
|
|
18
|
+
const fetchSubscription = useCallback(
|
|
19
|
+
async (options) => {
|
|
20
|
+
const { topicKey, identifier, onSuccess, onError } = propsRef.current;
|
|
21
|
+
if (options?.refetch) {
|
|
22
|
+
setError(void 0);
|
|
23
|
+
setIsLoading(true);
|
|
24
|
+
}
|
|
25
|
+
setIsFetching(true);
|
|
26
|
+
const response = await novu.subscriptions.get(
|
|
27
|
+
{
|
|
28
|
+
topicKey,
|
|
29
|
+
identifier
|
|
30
|
+
},
|
|
31
|
+
{ refetch: options?.refetch }
|
|
32
|
+
);
|
|
33
|
+
if (response.error) {
|
|
34
|
+
setError(response.error);
|
|
35
|
+
onError?.(response.error);
|
|
36
|
+
} else if (response.data !== void 0) {
|
|
37
|
+
onSuccess?.(response.data);
|
|
38
|
+
setSubscription(response.data);
|
|
39
|
+
}
|
|
40
|
+
setIsLoading(false);
|
|
41
|
+
setIsFetching(false);
|
|
42
|
+
},
|
|
43
|
+
[novu]
|
|
44
|
+
);
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
const listener = ({ data: subscription2 }) => {
|
|
47
|
+
const { topicKey, identifier } = propsRef.current;
|
|
48
|
+
if (!subscription2 || subscription2.topicKey !== topicKey || subscription2.identifier !== identifier) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
setSubscription(subscription2);
|
|
52
|
+
setIsFetching(false);
|
|
53
|
+
};
|
|
54
|
+
const cleanupGetPending = novu.on("subscription.get.pending", ({ args }) => {
|
|
55
|
+
const { topicKey, identifier } = propsRef.current;
|
|
56
|
+
if (!args || args.topicKey !== topicKey || args.identifier !== identifier) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
setIsFetching(true);
|
|
60
|
+
});
|
|
61
|
+
const cleanupGetResolved = novu.on("subscription.get.resolved", ({ args, data, error: error2 }) => {
|
|
62
|
+
const { topicKey, identifier, onSuccess, onError } = propsRef.current;
|
|
63
|
+
if (!args || args.topicKey !== topicKey || args.identifier !== identifier) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (error2) {
|
|
67
|
+
setError(error2);
|
|
68
|
+
onError?.(error2);
|
|
69
|
+
} else {
|
|
70
|
+
setSubscription(data ?? null);
|
|
71
|
+
onSuccess?.(data ?? null);
|
|
72
|
+
}
|
|
73
|
+
setIsFetching(false);
|
|
74
|
+
});
|
|
75
|
+
const cleanupCreatePending = novu.on("subscription.create.pending", ({ args }) => {
|
|
76
|
+
const { topicKey, identifier } = propsRef.current;
|
|
77
|
+
if (!args || args.topicKey !== topicKey || args.identifier !== identifier) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
setIsFetching(true);
|
|
81
|
+
});
|
|
82
|
+
const cleanupCreateResolved = novu.on("subscription.create.resolved", listener);
|
|
83
|
+
const cleanupUpdateResolved = novu.on("subscription.update.resolved", listener);
|
|
84
|
+
const cleanupDeletePending = novu.on("subscription.delete.pending", ({ args }) => {
|
|
85
|
+
const subscriptionId = subscriptionRef.current?.id;
|
|
86
|
+
const subscriptionIdentifier = subscriptionRef.current?.identifier;
|
|
87
|
+
if (!subscriptionId || !subscriptionIdentifier) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (!args || "subscriptionId" in args && args.subscriptionId !== subscriptionId && args.subscriptionId !== subscriptionIdentifier || "subscription" in args && args.subscription.id !== subscriptionId && args.subscription.identifier !== subscriptionIdentifier) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
setIsFetching(true);
|
|
94
|
+
});
|
|
95
|
+
const cleanupDeleteResolved = novu.on("subscription.delete.resolved", ({ args }) => {
|
|
96
|
+
const subscriptionId = subscriptionRef.current?.id;
|
|
97
|
+
const subscriptionIdentifier = subscriptionRef.current?.identifier;
|
|
98
|
+
if (!subscriptionId || !subscriptionIdentifier) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if ("subscriptionId" in args && args.subscriptionId === subscriptionId || "subscriptionId" in args && args.subscriptionId === subscriptionIdentifier || "subscription" in args && args.subscription.id === subscriptionId || "subscription" in args && args.subscription.identifier === subscriptionIdentifier) {
|
|
102
|
+
setSubscription(null);
|
|
103
|
+
setIsFetching(false);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
void fetchSubscription({ refetch: true });
|
|
107
|
+
return () => {
|
|
108
|
+
cleanupGetPending();
|
|
109
|
+
cleanupGetResolved();
|
|
110
|
+
cleanupCreatePending();
|
|
111
|
+
cleanupCreateResolved();
|
|
112
|
+
cleanupUpdateResolved();
|
|
113
|
+
cleanupDeletePending();
|
|
114
|
+
cleanupDeleteResolved();
|
|
115
|
+
};
|
|
116
|
+
}, [novu, fetchSubscription]);
|
|
117
|
+
const refetch = useCallback(() => fetchSubscription({ refetch: true }), [fetchSubscription]);
|
|
118
|
+
return {
|
|
119
|
+
subscription,
|
|
120
|
+
error,
|
|
121
|
+
isLoading,
|
|
122
|
+
isFetching,
|
|
123
|
+
refetch
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
export {
|
|
127
|
+
useSubscription
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=useSubscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useSubscription.ts"],"sourcesContent":["import { NovuError, TopicSubscription } from '@novu/js';\nimport { buildSubscriptionIdentifier } from '@novu/js/internal';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useNovu } from './NovuProvider';\n\nexport type UseSubscriptionProps = {\n topicKey: string;\n identifier?: string;\n onSuccess?: (data: TopicSubscription | null) => void;\n onError?: (error: NovuError) => void;\n};\n\nexport type UseSubscriptionResult = {\n subscription?: TopicSubscription | null;\n error?: NovuError;\n isLoading: boolean;\n isFetching: boolean;\n refetch: () => Promise<void>;\n};\n\n/**\n * Get a subscription for a topic.\n */\nexport const useSubscription = (props: UseSubscriptionProps): UseSubscriptionResult => {\n const novu = useNovu();\n const propsRef = useRef<UseSubscriptionProps>(props);\n propsRef.current = {\n ...props,\n identifier:\n props.identifier ?? buildSubscriptionIdentifier({ topicKey: props.topicKey, subscriberId: novu.subscriberId }),\n };\n const [subscription, setSubscription] = useState<TopicSubscription | null>();\n const subscriptionRef = useRef<TopicSubscription | null>(null);\n subscriptionRef.current = subscription ?? null;\n const [error, setError] = useState<NovuError>();\n const [isLoading, setIsLoading] = useState(true);\n const [isFetching, setIsFetching] = useState(false);\n\n const fetchSubscription = useCallback(\n async (options?: { refetch: boolean }) => {\n const { topicKey, 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.subscriptions.get(\n {\n topicKey,\n identifier,\n },\n { refetch: options?.refetch }\n );\n\n if (response.error) {\n setError(response.error);\n onError?.(response.error);\n } else if (response.data !== undefined) {\n onSuccess?.(response.data);\n setSubscription(response.data);\n }\n setIsLoading(false);\n setIsFetching(false);\n },\n [novu]\n );\n\n useEffect(() => {\n const listener = ({ data: subscription }: { data?: TopicSubscription }) => {\n const { topicKey, identifier } = propsRef.current;\n if (!subscription || subscription.topicKey !== topicKey || subscription.identifier !== identifier) {\n return;\n }\n\n setSubscription(subscription);\n setIsFetching(false);\n };\n\n const cleanupGetPending = novu.on('subscription.get.pending', ({ args }) => {\n const { topicKey, identifier } = propsRef.current;\n if (!args || args.topicKey !== topicKey || args.identifier !== identifier) {\n return;\n }\n setIsFetching(true);\n });\n\n const cleanupGetResolved = novu.on('subscription.get.resolved', ({ args, data, error }) => {\n const { topicKey, identifier, onSuccess, onError } = propsRef.current;\n if (!args || args.topicKey !== topicKey || args.identifier !== identifier) {\n return;\n }\n if (error) {\n setError(error as NovuError);\n onError?.(error as NovuError);\n } else {\n setSubscription(data ?? null);\n onSuccess?.(data ?? null);\n }\n setIsFetching(false);\n });\n\n const cleanupCreatePending = novu.on('subscription.create.pending', ({ args }) => {\n const { topicKey, identifier } = propsRef.current;\n if (!args || args.topicKey !== topicKey || args.identifier !== identifier) {\n return;\n }\n setIsFetching(true);\n });\n\n const cleanupCreateResolved = novu.on('subscription.create.resolved', listener);\n\n const cleanupUpdateResolved = novu.on('subscription.update.resolved', listener);\n\n const cleanupDeletePending = novu.on('subscription.delete.pending', ({ args }) => {\n const subscriptionId = subscriptionRef.current?.id;\n const subscriptionIdentifier = subscriptionRef.current?.identifier;\n if (!subscriptionId || !subscriptionIdentifier) {\n return;\n }\n\n if (\n !args ||\n ('subscriptionId' in args &&\n args.subscriptionId !== subscriptionId &&\n args.subscriptionId !== subscriptionIdentifier) ||\n ('subscription' in args &&\n args.subscription.id !== subscriptionId &&\n args.subscription.identifier !== subscriptionIdentifier)\n ) {\n return;\n }\n setIsFetching(true);\n });\n\n const cleanupDeleteResolved = novu.on('subscription.delete.resolved', ({ args }) => {\n const subscriptionId = subscriptionRef.current?.id;\n const subscriptionIdentifier = subscriptionRef.current?.identifier;\n if (!subscriptionId || !subscriptionIdentifier) {\n return;\n }\n\n if (\n ('subscriptionId' in args && args.subscriptionId === subscriptionId) ||\n ('subscriptionId' in args && args.subscriptionId === subscriptionIdentifier) ||\n ('subscription' in args && args.subscription.id === subscriptionId) ||\n ('subscription' in args && args.subscription.identifier === subscriptionIdentifier)\n ) {\n setSubscription(null);\n setIsFetching(false);\n }\n });\n\n void fetchSubscription({ refetch: true });\n\n return () => {\n cleanupGetPending();\n cleanupGetResolved();\n cleanupCreatePending();\n cleanupCreateResolved();\n cleanupUpdateResolved();\n cleanupDeletePending();\n cleanupDeleteResolved();\n };\n }, [novu, fetchSubscription]);\n\n const refetch = useCallback(() => fetchSubscription({ refetch: true }), [fetchSubscription]);\n\n return {\n subscription,\n error,\n isLoading,\n isFetching,\n refetch,\n };\n};\n"],"mappings":"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","names":["subscription","error"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { TopicSubscription, NovuError } from '@novu/js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Get all subscriptions for a topic.
|
|
5
|
+
* Props for the useSubscriptions hook.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* // Get all subscriptions for a topic
|
|
10
|
+
* const { subscriptions } = useSubscriptions({
|
|
11
|
+
* topicKey: 'my-topic'
|
|
12
|
+
* });
|
|
13
|
+
*
|
|
14
|
+
* // Get subscriptions with callbacks
|
|
15
|
+
* const { subscriptions, refetch } = useSubscriptions({
|
|
16
|
+
* topicKey: 'my-topic',
|
|
17
|
+
* onSuccess: (data) => console.log('Loaded:', data),
|
|
18
|
+
* onError: (error) => console.error('Error:', error)
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
type UseSubscriptionsProps = {
|
|
23
|
+
topicKey: string;
|
|
24
|
+
onSuccess?: (data: TopicSubscription[]) => void;
|
|
25
|
+
onError?: (error: NovuError) => void;
|
|
26
|
+
};
|
|
27
|
+
type UseSubscriptionsResult = {
|
|
28
|
+
subscriptions?: TopicSubscription[];
|
|
29
|
+
error?: NovuError;
|
|
30
|
+
isLoading: boolean;
|
|
31
|
+
isFetching: boolean;
|
|
32
|
+
refetch: () => Promise<void>;
|
|
33
|
+
};
|
|
34
|
+
declare const useSubscriptions: ({ topicKey, onSuccess, onError }: UseSubscriptionsProps) => UseSubscriptionsResult;
|
|
35
|
+
|
|
36
|
+
export { type UseSubscriptionsProps, type UseSubscriptionsResult, useSubscriptions };
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// src/hooks/useSubscriptions.ts
|
|
2
|
+
import { useCallback, useEffect, useState } from "react";
|
|
3
|
+
import { useNovu } from "./NovuProvider.js";
|
|
4
|
+
var useSubscriptions = ({ topicKey, onSuccess, onError }) => {
|
|
5
|
+
const novu = useNovu();
|
|
6
|
+
const [data, setData] = useState();
|
|
7
|
+
const [error, setError] = useState();
|
|
8
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
9
|
+
const [isFetching, setIsFetching] = useState(false);
|
|
10
|
+
const fetchSubscriptions = useCallback(
|
|
11
|
+
async (options) => {
|
|
12
|
+
if (options?.refetch) {
|
|
13
|
+
setError(void 0);
|
|
14
|
+
setIsLoading(true);
|
|
15
|
+
novu.subscriptions.cache.invalidate({ topicKey });
|
|
16
|
+
}
|
|
17
|
+
setIsFetching(true);
|
|
18
|
+
const response = await novu.subscriptions.list({ topicKey }, { refetch: options?.refetch });
|
|
19
|
+
if (response.error) {
|
|
20
|
+
setError(response.error);
|
|
21
|
+
onError?.(response.error);
|
|
22
|
+
} else if (response.data) {
|
|
23
|
+
onSuccess?.(response.data);
|
|
24
|
+
setData(response.data);
|
|
25
|
+
}
|
|
26
|
+
setIsLoading(false);
|
|
27
|
+
setIsFetching(false);
|
|
28
|
+
},
|
|
29
|
+
[novu, topicKey, onError, onSuccess]
|
|
30
|
+
);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
const cleanupListPending = novu.on("subscriptions.list.pending", ({ args }) => {
|
|
33
|
+
if (args.topicKey !== topicKey) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
setIsFetching(true);
|
|
37
|
+
});
|
|
38
|
+
const cleanupListResolved = novu.on("subscriptions.list.resolved", ({ args, data: data2, error: error2 }) => {
|
|
39
|
+
if (args.topicKey !== topicKey) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (error2) {
|
|
43
|
+
setError(error2);
|
|
44
|
+
onError?.(error2);
|
|
45
|
+
} else if (data2) {
|
|
46
|
+
onSuccess?.(data2);
|
|
47
|
+
setData(data2);
|
|
48
|
+
}
|
|
49
|
+
setIsLoading(false);
|
|
50
|
+
setIsFetching(false);
|
|
51
|
+
});
|
|
52
|
+
const cleanupListUpdated = novu.on("subscriptions.list.updated", ({ data: data2 }) => {
|
|
53
|
+
if (data2.topicKey !== topicKey) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
setData(data2.subscriptions);
|
|
57
|
+
});
|
|
58
|
+
const cleanupCreateResolved = novu.on("subscription.create.resolved", ({ args, data: data2 }) => {
|
|
59
|
+
if (args.topicKey !== topicKey) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (data2) {
|
|
63
|
+
void fetchSubscriptions({ refetch: true });
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
const cleanupDeleteResolved = novu.on("subscription.delete.resolved", ({ args }) => {
|
|
67
|
+
const deleteTopicKey = "subscription" in args ? args.subscription.topicKey : topicKey;
|
|
68
|
+
if (deleteTopicKey !== topicKey) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
void fetchSubscriptions({ refetch: true });
|
|
72
|
+
});
|
|
73
|
+
void fetchSubscriptions({ refetch: true });
|
|
74
|
+
return () => {
|
|
75
|
+
cleanupListPending();
|
|
76
|
+
cleanupListResolved();
|
|
77
|
+
cleanupListUpdated();
|
|
78
|
+
cleanupCreateResolved();
|
|
79
|
+
cleanupDeleteResolved();
|
|
80
|
+
};
|
|
81
|
+
}, [topicKey, novu, fetchSubscriptions, onError, onSuccess]);
|
|
82
|
+
const refetch = useCallback(() => {
|
|
83
|
+
return fetchSubscriptions({ refetch: true });
|
|
84
|
+
}, [fetchSubscriptions]);
|
|
85
|
+
return {
|
|
86
|
+
subscriptions: data,
|
|
87
|
+
error,
|
|
88
|
+
isLoading,
|
|
89
|
+
isFetching,
|
|
90
|
+
refetch
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
export {
|
|
94
|
+
useSubscriptions
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=useSubscriptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useSubscriptions.ts"],"sourcesContent":["import { NovuError, TopicSubscription } from '@novu/js';\nimport { useCallback, useEffect, useState } from 'react';\nimport { useNovu } from './NovuProvider';\n\n/**\n * Get all subscriptions for a topic.\n * Props for the useSubscriptions hook.\n *\n * @example\n * ```tsx\n * // Get all subscriptions for a topic\n * const { subscriptions } = useSubscriptions({\n * topicKey: 'my-topic'\n * });\n *\n * // Get subscriptions with callbacks\n * const { subscriptions, refetch } = useSubscriptions({\n * topicKey: 'my-topic',\n * onSuccess: (data) => console.log('Loaded:', data),\n * onError: (error) => console.error('Error:', error)\n * });\n * ```\n */\nexport type UseSubscriptionsProps = {\n topicKey: string;\n onSuccess?: (data: TopicSubscription[]) => void;\n onError?: (error: NovuError) => void;\n};\n\nexport type UseSubscriptionsResult = {\n subscriptions?: TopicSubscription[];\n error?: NovuError;\n isLoading: boolean;\n isFetching: boolean;\n refetch: () => Promise<void>;\n};\n\nexport const useSubscriptions = ({ topicKey, onSuccess, onError }: UseSubscriptionsProps): UseSubscriptionsResult => {\n const novu = useNovu();\n const [data, setData] = useState<TopicSubscription[]>();\n const [error, setError] = useState<NovuError>();\n const [isLoading, setIsLoading] = useState(true);\n const [isFetching, setIsFetching] = useState(false);\n\n const fetchSubscriptions = useCallback(\n async (options?: { refetch: boolean }) => {\n if (options?.refetch) {\n setError(undefined);\n setIsLoading(true);\n novu.subscriptions.cache.invalidate({ topicKey });\n }\n setIsFetching(true);\n\n const response = await novu.subscriptions.list({ topicKey }, { refetch: options?.refetch });\n\n if (response.error) {\n setError(response.error);\n onError?.(response.error);\n } else if (response.data) {\n onSuccess?.(response.data);\n setData(response.data);\n }\n setIsLoading(false);\n setIsFetching(false);\n },\n [novu, topicKey, onError, onSuccess]\n );\n\n useEffect(() => {\n const cleanupListPending = novu.on('subscriptions.list.pending', ({ args }) => {\n if (args.topicKey !== topicKey) {\n return;\n }\n setIsFetching(true);\n });\n\n const cleanupListResolved = novu.on('subscriptions.list.resolved', ({ args, data, error }) => {\n if (args.topicKey !== topicKey) {\n return;\n }\n if (error) {\n setError(error as NovuError);\n onError?.(error as NovuError);\n } else if (data) {\n onSuccess?.(data);\n setData(data);\n }\n setIsLoading(false);\n setIsFetching(false);\n });\n\n const cleanupListUpdated = novu.on('subscriptions.list.updated', ({ data }) => {\n if (data.topicKey !== topicKey) {\n return;\n }\n setData(data.subscriptions);\n });\n\n const cleanupCreateResolved = novu.on('subscription.create.resolved', ({ args, data }) => {\n if (args.topicKey !== topicKey) {\n return;\n }\n if (data) {\n void fetchSubscriptions({ refetch: true });\n }\n });\n\n const cleanupDeleteResolved = novu.on('subscription.delete.resolved', ({ args }) => {\n const deleteTopicKey = 'subscription' in args ? args.subscription.topicKey : topicKey;\n if (deleteTopicKey !== topicKey) {\n return;\n }\n void fetchSubscriptions({ refetch: true });\n });\n\n void fetchSubscriptions({ refetch: true });\n\n return () => {\n cleanupListPending();\n cleanupListResolved();\n cleanupListUpdated();\n cleanupCreateResolved();\n cleanupDeleteResolved();\n };\n }, [topicKey, novu, fetchSubscriptions, onError, onSuccess]);\n\n const refetch = useCallback(() => {\n return fetchSubscriptions({ refetch: true });\n }, [fetchSubscriptions]);\n\n return {\n subscriptions: data,\n error,\n isLoading,\n isFetching,\n refetch,\n };\n};\n"],"mappings":"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","names":["data","error"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { TopicSubscription, NovuError, UpdateSubscriptionArgs } from '@novu/js';
|
|
2
|
+
|
|
3
|
+
type UseUpdateSubscriptionProps = {
|
|
4
|
+
onSuccess?: (data: TopicSubscription) => void;
|
|
5
|
+
onError?: (error: NovuError) => void;
|
|
6
|
+
};
|
|
7
|
+
type UpdateResult = Promise<{
|
|
8
|
+
data?: TopicSubscription | undefined;
|
|
9
|
+
error?: NovuError;
|
|
10
|
+
}>;
|
|
11
|
+
type UseUpdateSubscriptionResult = {
|
|
12
|
+
isUpdating: boolean;
|
|
13
|
+
error?: NovuError;
|
|
14
|
+
update: (args: UpdateSubscriptionArgs) => UpdateResult;
|
|
15
|
+
};
|
|
16
|
+
declare const useUpdateSubscription: (props?: UseUpdateSubscriptionProps) => UseUpdateSubscriptionResult;
|
|
17
|
+
|
|
18
|
+
export { type UseUpdateSubscriptionProps, type UseUpdateSubscriptionResult, useUpdateSubscription };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// src/hooks/useUpdateSubscription.ts
|
|
2
|
+
import { useCallback, useRef, useState } from "react";
|
|
3
|
+
import { useNovu } from "./NovuProvider.js";
|
|
4
|
+
var useUpdateSubscription = (props = {}) => {
|
|
5
|
+
const propsRef = useRef(props);
|
|
6
|
+
propsRef.current = props;
|
|
7
|
+
const novu = useNovu();
|
|
8
|
+
const [isUpdating, setIsUpdating] = useState(false);
|
|
9
|
+
const [error, setError] = useState();
|
|
10
|
+
const update = useCallback(
|
|
11
|
+
async (args) => {
|
|
12
|
+
const { onSuccess, onError } = propsRef.current;
|
|
13
|
+
setError(void 0);
|
|
14
|
+
setIsUpdating(true);
|
|
15
|
+
const response = await novu.subscriptions.update(args);
|
|
16
|
+
setIsUpdating(false);
|
|
17
|
+
if (response.error) {
|
|
18
|
+
setError(response.error);
|
|
19
|
+
onError?.(response.error);
|
|
20
|
+
} else if (response.data) {
|
|
21
|
+
onSuccess?.(response.data);
|
|
22
|
+
}
|
|
23
|
+
return response;
|
|
24
|
+
},
|
|
25
|
+
[novu]
|
|
26
|
+
);
|
|
27
|
+
return {
|
|
28
|
+
update,
|
|
29
|
+
isUpdating,
|
|
30
|
+
error
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
export {
|
|
34
|
+
useUpdateSubscription
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=useUpdateSubscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useUpdateSubscription.ts"],"sourcesContent":["import { BaseUpdateSubscriptionArgs, NovuError, TopicSubscription, UpdateSubscriptionArgs } from '@novu/js';\nimport { useCallback, useRef, useState } from 'react';\nimport { useNovu } from './NovuProvider';\n\nexport type UseUpdateSubscriptionProps = {\n onSuccess?: (data: TopicSubscription) => void;\n onError?: (error: NovuError) => void;\n};\n\ntype UpdateResult = Promise<{\n data?: TopicSubscription | undefined;\n error?: NovuError;\n}>;\n\nexport type UseUpdateSubscriptionResult = {\n isUpdating: boolean;\n error?: NovuError;\n update: (args: UpdateSubscriptionArgs) => UpdateResult;\n};\n\nexport const useUpdateSubscription = (props: UseUpdateSubscriptionProps = {}): UseUpdateSubscriptionResult => {\n const propsRef = useRef<UseUpdateSubscriptionProps>(props);\n propsRef.current = props;\n const novu = useNovu();\n const [isUpdating, setIsUpdating] = useState(false);\n const [error, setError] = useState<NovuError>();\n\n const update = useCallback(\n async (args: UpdateSubscriptionArgs): UpdateResult => {\n const { onSuccess, onError } = propsRef.current;\n setError(undefined);\n setIsUpdating(true);\n\n const response = await novu.subscriptions.update(args as BaseUpdateSubscriptionArgs);\n\n setIsUpdating(false);\n\n if (response.error) {\n setError(response.error);\n onError?.(response.error);\n } else if (response.data) {\n onSuccess?.(response.data);\n }\n\n return response;\n },\n [novu]\n );\n\n return {\n update,\n isUpdating,\n error,\n };\n};\n"],"mappings":";AACA,SAAS,aAAa,QAAQ,gBAAgB;AAC9C,SAAS,eAAe;AAkBjB,IAAM,wBAAwB,CAAC,QAAoC,CAAC,MAAmC;AAC5G,QAAM,WAAW,OAAmC,KAAK;AACzD,WAAS,UAAU;AACnB,QAAM,OAAO,QAAQ;AACrB,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAoB;AAE9C,QAAM,SAAS;AAAA,IACb,OAAO,SAA+C;AACpD,YAAM,EAAE,WAAW,QAAQ,IAAI,SAAS;AACxC,eAAS,MAAS;AAClB,oBAAc,IAAI;AAElB,YAAM,WAAW,MAAM,KAAK,cAAc,OAAO,IAAkC;AAEnF,oBAAc,KAAK;AAEnB,UAAI,SAAS,OAAO;AAClB,iBAAS,SAAS,KAAK;AACvB,kBAAU,SAAS,KAAK;AAAA,MAC1B,WAAW,SAAS,MAAM;AACxB,oBAAY,SAAS,IAAI;AAAA,MAC3B;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,IAAI;AAAA,EACP;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,15 +1,26 @@
|
|
|
1
|
-
export
|
|
2
|
-
export {
|
|
1
|
+
export * from '@novu/js';
|
|
2
|
+
export { PreferenceLevel, SeverityLevelEnum, WorkflowCriticalityEnum } from '@novu/js';
|
|
3
|
+
export { AllLocalization, AllLocalizationKey, ElementStyles, InboxAppearance, InboxAppearanceCallback, InboxAppearanceCallbackFunction, InboxAppearanceCallbackKeys, InboxAppearanceKey, InboxElements, InboxLocalization, InboxLocalizationKey, InboxTheme, NotificationActionClickHandler, NotificationClickHandler, NotificationRenderer, PreferenceGroups, PreferencesFilter, RouterPush, SubscriptionAppearance, SubscriptionAppearanceCallback, SubscriptionAppearanceCallbackFunction, SubscriptionAppearanceCallbackKeys, SubscriptionAppearanceKey, SubscriptionElements, SubscriptionLocalization, SubscriptionLocalizationKey, SubscriptionTheme, Tab, Variables } from '@novu/js/ui';
|
|
3
4
|
export { NovuProvider, NovuProviderProps, useNovu } from './hooks/NovuProvider.js';
|
|
4
5
|
export { Bell, BellProps } from './components/Bell.js';
|
|
5
6
|
export { Inbox, InboxProps } from './components/Inbox.js';
|
|
6
7
|
export { InboxContent, InboxContentProps } from './components/InboxContent.js';
|
|
7
8
|
export { NotificationProps, Notifications } from './components/Notifications.js';
|
|
8
9
|
export { Preferences } from './components/Preferences.js';
|
|
10
|
+
export { Subscription, SubscriptionProps } from './components/subscription/Subscription.js';
|
|
11
|
+
export { SubscriptionButton, SubscriptionButtonProps } from './components/subscription/SubscriptionButton.js';
|
|
12
|
+
export { SubscriptionPreferences, SubscriptionPreferencesProps } from './components/subscription/SubscriptionPreferences.js';
|
|
9
13
|
export { UseCountsProps, UseCountsResult, useCounts } from './hooks/useCounts.js';
|
|
14
|
+
export { useCreateSubscription } from './hooks/useCreateSubscription.js';
|
|
15
|
+
export { useDeleteSubscription } from './hooks/useDeleteSubscription.js';
|
|
10
16
|
export { UseNotificationsProps, UseNotificationsResult, useNotifications } from './hooks/useNotifications.js';
|
|
11
17
|
export { UsePreferencesResult, usePreferences } from './hooks/usePreferences.js';
|
|
12
18
|
export { UseScheduleProps as UsePreferencesProps, useSchedule } from './hooks/useSchedule.js';
|
|
13
|
-
export {
|
|
19
|
+
export { useSubscription } from './hooks/useSubscription.js';
|
|
20
|
+
export { useSubscriptions } from './hooks/useSubscriptions.js';
|
|
21
|
+
export { useUpdateSubscription } from './hooks/useUpdateSubscription.js';
|
|
22
|
+
export { BaseProps, BellRenderer, BodyRenderer, DefaultInboxProps, DefaultProps, NoRendererProps, NotificationRendererProps, NotificationsRenderer, ReactInboxAppearance, ReactInboxTheme, ReactSubscriptionAppearance, ReactSubscriptionTheme, SubjectBodyRendererProps, SubjectRenderer, WithChildrenProps } from './utils/types.js';
|
|
14
23
|
import 'react/jsx-runtime';
|
|
15
24
|
import 'react';
|
|
25
|
+
import './components/NovuUI.js';
|
|
26
|
+
import './components/subscription/DefaultSubscription.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -1,7 +1,28 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import { PreferenceLevel, SeverityLevelEnum, WorkflowCriticalityEnum } from "@novu/js";
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
Bell,
|
|
5
|
+
Inbox,
|
|
6
|
+
InboxContent,
|
|
7
|
+
Notifications,
|
|
8
|
+
NovuProvider,
|
|
9
|
+
Preferences,
|
|
10
|
+
Subscription,
|
|
11
|
+
SubscriptionButton,
|
|
12
|
+
SubscriptionPreferences
|
|
13
|
+
} from "./components/index.js";
|
|
14
|
+
import {
|
|
15
|
+
useCounts,
|
|
16
|
+
useCreateSubscription,
|
|
17
|
+
useDeleteSubscription,
|
|
18
|
+
useNotifications,
|
|
19
|
+
useNovu,
|
|
20
|
+
usePreferences,
|
|
21
|
+
useSchedule,
|
|
22
|
+
useSubscription,
|
|
23
|
+
useSubscriptions,
|
|
24
|
+
useUpdateSubscription
|
|
25
|
+
} from "./hooks/index.js";
|
|
5
26
|
export {
|
|
6
27
|
Bell,
|
|
7
28
|
Inbox,
|
|
@@ -11,11 +32,19 @@ export {
|
|
|
11
32
|
PreferenceLevel,
|
|
12
33
|
Preferences,
|
|
13
34
|
SeverityLevelEnum,
|
|
35
|
+
Subscription,
|
|
36
|
+
SubscriptionButton,
|
|
37
|
+
SubscriptionPreferences,
|
|
14
38
|
WorkflowCriticalityEnum,
|
|
15
39
|
useCounts,
|
|
40
|
+
useCreateSubscription,
|
|
41
|
+
useDeleteSubscription,
|
|
16
42
|
useNotifications,
|
|
17
43
|
useNovu,
|
|
18
44
|
usePreferences,
|
|
19
|
-
useSchedule
|
|
45
|
+
useSchedule,
|
|
46
|
+
useSubscription,
|
|
47
|
+
useSubscriptions,
|
|
48
|
+
useUpdateSubscription
|
|
20
49
|
};
|
|
21
50
|
//# sourceMappingURL=index.js.map
|