@bodhveda/react 0.0.5 → 0.1.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/README.md +22 -11
- package/dist/hooks.d.ts +9 -6
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +22 -7
- package/dist/hooks.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -4,6 +4,8 @@ Official React SDK for Bodhveda.
|
|
|
4
4
|
|
|
5
5
|
It extends the core `bodhveda` SDK to provide you with hooks to make it easy to build custom notification UX with React.
|
|
6
6
|
|
|
7
|
+
> This package re-exports everything from the core [`bodhveda`](https://www.npmjs.com/package/bodhveda) SDK, including the email/contacts types. The hooks here cover the recipient **inbox** (in-app notifications and preferences). Email delivery, recipient contacts, and provider configuration are server-side concerns — use the core SDK for those (email addresses should never ride a browser request).
|
|
8
|
+
|
|
7
9
|
> This SDK uses [TanStack Query](https://tanstack.com/query/v5/docs/framework/react/overview) to manage Bodhveda API state for you - including caching and invalidation as well. You will need to add `@tanstack/react-query` and wrap your React app with `QueryClientProvider` and then put `BodhvedaProvider` inside it so that `@bodhveda/react` can use the ReactQuery's `QueryClient`.
|
|
8
10
|
|
|
9
11
|
## Installation
|
|
@@ -32,21 +34,30 @@ import { useNotifications } from "@bodhveda/react";
|
|
|
32
34
|
|
|
33
35
|
function NotificationInbox() {
|
|
34
36
|
// Fetch recipient's notifications.
|
|
35
|
-
const { data } =
|
|
37
|
+
const { data, isLoading, isError, isFetching, fetchNextPage, hasNextPage } =
|
|
38
|
+
useNotifications();
|
|
36
39
|
|
|
37
40
|
// ...
|
|
38
41
|
// Handle loading and error states.
|
|
39
42
|
// ...
|
|
40
43
|
|
|
41
|
-
// Render the notifications
|
|
44
|
+
// Render the notifications as per your requirements.
|
|
42
45
|
return (
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
<>
|
|
47
|
+
<ul>
|
|
48
|
+
{data.notifications.map((notification) => (
|
|
49
|
+
<li key={notification.id}>
|
|
50
|
+
<NotificationItem notification={notification} />
|
|
51
|
+
</li>
|
|
52
|
+
))}
|
|
53
|
+
</ul>
|
|
54
|
+
|
|
55
|
+
{hasNextPage && (
|
|
56
|
+
<Button onClick={() => fetchNextPage()} loading={isFetching}>
|
|
57
|
+
Load more
|
|
58
|
+
</Button>
|
|
59
|
+
)}
|
|
60
|
+
</>
|
|
50
61
|
);
|
|
51
62
|
}
|
|
52
63
|
```
|
|
@@ -61,9 +72,9 @@ Returns the Bodhveda client instance.
|
|
|
61
72
|
|
|
62
73
|
Returns the current recipient ID.
|
|
63
74
|
|
|
64
|
-
### `useNotifications(options?)`
|
|
75
|
+
### `useNotifications(req?, options?)`
|
|
65
76
|
|
|
66
|
-
Fetches
|
|
77
|
+
Fetches notifications for the current recipient in a infinite scrolling manner.
|
|
67
78
|
|
|
68
79
|
### `useNotificationsUnreadCount(options?)`
|
|
69
80
|
|
package/dist/hooks.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AnyUseMutationOptions, AnyUseQueryOptions, UseQueryResult } from "@tanstack/react-query";
|
|
2
|
-
import { ListNotificationsResponse, ListPreferencesResponse, UpdateNotificationsStateRequest, UpdateNotificationsStateResponse, SetPreferenceRequest, SetPreferenceResponse, DeleteNotificationsResponse, DeleteNotificationsRequest, Target, CheckPreferenceResponse } from "bodhveda";
|
|
1
|
+
import { AnyUseMutationOptions, AnyUseQueryOptions, UseInfiniteQueryOptions, UseInfiniteQueryResult, UseQueryResult } from "@tanstack/react-query";
|
|
2
|
+
import { ListNotificationsResponse, ListPreferencesResponse, UpdateNotificationsStateRequest, UpdateNotificationsStateResponse, SetPreferenceRequest, SetPreferenceResponse, DeleteNotificationsResponse, DeleteNotificationsRequest, Target, CheckPreferenceResponse, ListNotificationsRequest } from "bodhveda";
|
|
3
3
|
type QueryOptions = Omit<AnyUseQueryOptions, "queryKey">;
|
|
4
4
|
type MutationOptions = AnyUseMutationOptions;
|
|
5
5
|
export declare const QueryKeys: {
|
|
@@ -23,12 +23,15 @@ export declare function useBodhveda(): import("bodhveda").Bodhveda;
|
|
|
23
23
|
*/
|
|
24
24
|
export declare function useRecipientID(): string;
|
|
25
25
|
/**
|
|
26
|
-
* Fetches the list of notifications for the current recipient.
|
|
26
|
+
* Fetches the list of notifications for the current recipient with infinite scrolling support.
|
|
27
27
|
*
|
|
28
|
-
* @param
|
|
29
|
-
* @
|
|
28
|
+
* @param req - Optional request parameters for listing notifications.
|
|
29
|
+
* @param options - Optional react-query infinite query options.
|
|
30
|
+
* @returns {UseInfiniteQueryResult<ListNotificationsResponse, Error>} Infinite query result containing notifications and pagination info.
|
|
30
31
|
*/
|
|
31
|
-
export declare function useNotifications(options?:
|
|
32
|
+
export declare function useNotifications(req?: ListNotificationsRequest, options?: Partial<UseInfiniteQueryOptions<ListNotificationsResponse, Error, ListNotificationsResponse, [
|
|
33
|
+
typeof QueryKeys.useNotifications
|
|
34
|
+
]>>): UseInfiniteQueryResult<ListNotificationsResponse, Error>;
|
|
32
35
|
/**
|
|
33
36
|
* Fetches the unread notifications count for the current recipient.
|
|
34
37
|
*
|
package/dist/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.tsx"],"names":[],"mappings":"AACA,OAAO,EACH,qBAAqB,EACrB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.tsx"],"names":[],"mappings":"AACA,OAAO,EACH,qBAAqB,EACrB,kBAAkB,EAElB,uBAAuB,EACvB,sBAAsB,EAItB,cAAc,EACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACH,yBAAyB,EACzB,uBAAuB,EACvB,+BAA+B,EAC/B,gCAAgC,EAChC,oBAAoB,EACpB,qBAAqB,EACrB,2BAA2B,EAC3B,0BAA0B,EAC1B,MAAM,EACN,uBAAuB,EACvB,wBAAwB,EAC3B,MAAM,UAAU,CAAC;AAIlB,KAAK,YAAY,GAAG,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;AACzD,KAAK,eAAe,GAAG,qBAAqB,CAAC;AAE7C,eAAO,MAAM,SAAS;;;;;CAKrB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,WAAW,gCAQ1B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,WAQ7B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC5B,GAAG,GAAE,wBAA6B,EAClC,OAAO,GAAE,OAAO,CACZ,uBAAuB,CACnB,yBAAyB,EACzB,KAAK,EACL,yBAAyB,EACzB;IAAC,OAAO,SAAS,CAAC,gBAAgB;CAAC,CACtC,CACC,GACP,sBAAsB,CAAC,yBAAyB,EAAE,KAAK,CAAC,CA4B1D;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACvC,OAAO,GAAE,YAAiB,GAC3B,cAAc,CAAC;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAU1C;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,eAAoB,0IA6BxE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,eAAoB,gIA0BnE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC1B,OAAO,GAAE,YAAiB,GAC3B,cAAc,CAAC,uBAAuB,CAAC,CASzC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,eAAoB,oHA0BhE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,YAAiB,GAC3B,cAAc,CAAC,uBAAuB,CAAC,CAUzC"}
|
package/dist/hooks.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useContext } from "react";
|
|
2
|
-
import { useMutation, useQuery, useQueryClient, } from "@tanstack/react-query";
|
|
2
|
+
import { useInfiniteQuery, useMutation, useQuery, useQueryClient, } from "@tanstack/react-query";
|
|
3
3
|
import { BodhvedaContext } from "./context";
|
|
4
4
|
export const QueryKeys = {
|
|
5
5
|
useNotifications: ["useNotifications"],
|
|
@@ -34,17 +34,32 @@ export function useRecipientID() {
|
|
|
34
34
|
return context.recipientID;
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
|
-
* Fetches the list of notifications for the current recipient.
|
|
37
|
+
* Fetches the list of notifications for the current recipient with infinite scrolling support.
|
|
38
38
|
*
|
|
39
|
-
* @param
|
|
40
|
-
* @
|
|
39
|
+
* @param req - Optional request parameters for listing notifications.
|
|
40
|
+
* @param options - Optional react-query infinite query options.
|
|
41
|
+
* @returns {UseInfiniteQueryResult<ListNotificationsResponse, Error>} Infinite query result containing notifications and pagination info.
|
|
41
42
|
*/
|
|
42
|
-
export function useNotifications(options = {}) {
|
|
43
|
+
export function useNotifications(req = {}, options = {}) {
|
|
43
44
|
const bodhveda = useBodhveda();
|
|
44
45
|
const recipientID = useRecipientID();
|
|
45
|
-
|
|
46
|
+
const { limit = 10 } = req;
|
|
47
|
+
return useInfiniteQuery({
|
|
46
48
|
queryKey: [QueryKeys.useNotifications],
|
|
47
|
-
queryFn: () =>
|
|
49
|
+
queryFn: ({ pageParam }) => {
|
|
50
|
+
return bodhveda.recipients.notifications.list(recipientID, {
|
|
51
|
+
limit,
|
|
52
|
+
before: pageParam ? String(pageParam) : undefined,
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
initialPageParam: null,
|
|
56
|
+
getNextPageParam: (lastPage) => lastPage.cursor.before,
|
|
57
|
+
select: (data) => {
|
|
58
|
+
return {
|
|
59
|
+
...data.pages[data.pages.length - 1],
|
|
60
|
+
notifications: data.pages.flatMap((page) => page.notifications),
|
|
61
|
+
};
|
|
62
|
+
},
|
|
48
63
|
...options,
|
|
49
64
|
});
|
|
50
65
|
}
|
package/dist/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAGH,WAAW,EACX,QAAQ,EACR,cAAc,GAEjB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bodhveda/react",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "React SDK for Bodhveda",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -50,6 +50,6 @@
|
|
|
50
50
|
"typescript": "^5.9.2"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"bodhveda": "^0.0
|
|
53
|
+
"bodhveda": "^0.1.0"
|
|
54
54
|
}
|
|
55
55
|
}
|