@explorins/pers-sdk-react-native 2.1.5 → 2.1.6
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/hooks/useEvents.d.ts +17 -5
- package/dist/hooks/useEvents.d.ts.map +1 -1
- package/dist/hooks/useEvents.js +17 -5
- package/dist/hooks/useTokenBalances.d.ts +24 -0
- package/dist/hooks/useTokenBalances.d.ts.map +1 -1
- package/dist/hooks/useTokenBalances.js +42 -2
- package/dist/hooks/useUsers.d.ts +5 -4
- package/dist/hooks/useUsers.d.ts.map +1 -1
- package/dist/hooks/useUsers.js +47 -8
- package/dist/hooks/useWeb3.d.ts +6 -5
- package/dist/hooks/useWeb3.d.ts.map +1 -1
- package/dist/hooks/useWeb3.js +23 -10
- package/dist/index.js +3041 -500
- package/dist/index.js.map +1 -1
- package/dist/providers/PersSDKProvider.d.ts +38 -0
- package/dist/providers/PersSDKProvider.d.ts.map +1 -1
- package/dist/providers/PersSDKProvider.js +29 -1
- package/package.json +3 -2
- package/src/hooks/useEvents.ts +17 -5
- package/src/hooks/useTokenBalances.ts +60 -2
- package/src/hooks/useUsers.ts +51 -9
- package/src/hooks/useWeb3.ts +28 -13
- package/src/providers/PersSDKProvider.tsx +38 -1
|
@@ -24,23 +24,35 @@ export interface EventsHook {
|
|
|
24
24
|
* React Native hook for PERS SDK event system
|
|
25
25
|
*
|
|
26
26
|
* This hook provides access to the platform-agnostic event system for subscribing to
|
|
27
|
-
* transaction, authentication, campaign, and system events. All events
|
|
28
|
-
* `userMessage` field ready for display to end users.
|
|
27
|
+
* transaction, authentication, campaign, blockchain, and system events. All events
|
|
28
|
+
* include a `userMessage` field ready for display to end users.
|
|
29
29
|
*
|
|
30
30
|
* **Event Domains:**
|
|
31
31
|
* - `auth` - Authentication events (login, logout, token refresh)
|
|
32
32
|
* - `user` - User profile events (update, create)
|
|
33
|
-
* - `transaction` - Transaction events (created,
|
|
33
|
+
* - `transaction` - Transaction events (created, submitted, confirmed)
|
|
34
34
|
* - `campaign` - Campaign events (claimed, activated)
|
|
35
35
|
* - `redemption` - Redemption events (redeemed, expired)
|
|
36
36
|
* - `business` - Business events (created, updated, membership)
|
|
37
|
+
* - `wallet` - Real-time blockchain events (Transfer, Approval, etc.) - Auto-enabled on auth
|
|
37
38
|
* - `api` - API error events (network, validation, server errors)
|
|
38
39
|
*
|
|
40
|
+
* **Blockchain Events (Wallet Domain):**
|
|
41
|
+
* When `sdk.connectWalletEvents()` is called (or auto-enabled via `captureWalletEvents: true`),
|
|
42
|
+
* real-time blockchain events are automatically routed through the same event system:
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const { subscribe } = useEvents();
|
|
45
|
+
*
|
|
46
|
+
* subscribe((event) => {
|
|
47
|
+
* if (event.domain === 'wallet') {
|
|
48
|
+
* console.log('Blockchain event:', event.type); // wallet_transfer, wallet_approval, etc.
|
|
49
|
+
* }
|
|
50
|
+
* });
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
39
53
|
* **Notification Levels:**
|
|
40
54
|
* - `success` - Operation completed successfully
|
|
41
55
|
* - `error` - Operation failed
|
|
42
|
-
* - `warning` - Operation completed with warnings
|
|
43
|
-
* - `info` - Informational event
|
|
44
56
|
*
|
|
45
57
|
* **Cleanup:**
|
|
46
58
|
* All subscriptions created through this hook are automatically cleaned up when
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEvents.d.ts","sourceRoot":"","sources":["../../src/hooks/useEvents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AAElE;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,WAAW,CAAC;IACxE,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,WAAW,CAAC;IACnE,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED
|
|
1
|
+
{"version":3,"file":"useEvents.d.ts","sourceRoot":"","sources":["../../src/hooks/useEvents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AAElE;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,WAAW,CAAC;IACxE,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,WAAW,CAAC;IACnE,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoKG;AACH,eAAO,MAAM,SAAS,QAAO,UA2K5B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC"}
|
package/dist/hooks/useEvents.js
CHANGED
|
@@ -4,23 +4,35 @@ import { usePersSDK } from '../providers/PersSDKProvider';
|
|
|
4
4
|
* React Native hook for PERS SDK event system
|
|
5
5
|
*
|
|
6
6
|
* This hook provides access to the platform-agnostic event system for subscribing to
|
|
7
|
-
* transaction, authentication, campaign, and system events. All events
|
|
8
|
-
* `userMessage` field ready for display to end users.
|
|
7
|
+
* transaction, authentication, campaign, blockchain, and system events. All events
|
|
8
|
+
* include a `userMessage` field ready for display to end users.
|
|
9
9
|
*
|
|
10
10
|
* **Event Domains:**
|
|
11
11
|
* - `auth` - Authentication events (login, logout, token refresh)
|
|
12
12
|
* - `user` - User profile events (update, create)
|
|
13
|
-
* - `transaction` - Transaction events (created,
|
|
13
|
+
* - `transaction` - Transaction events (created, submitted, confirmed)
|
|
14
14
|
* - `campaign` - Campaign events (claimed, activated)
|
|
15
15
|
* - `redemption` - Redemption events (redeemed, expired)
|
|
16
16
|
* - `business` - Business events (created, updated, membership)
|
|
17
|
+
* - `wallet` - Real-time blockchain events (Transfer, Approval, etc.) - Auto-enabled on auth
|
|
17
18
|
* - `api` - API error events (network, validation, server errors)
|
|
18
19
|
*
|
|
20
|
+
* **Blockchain Events (Wallet Domain):**
|
|
21
|
+
* When `sdk.connectWalletEvents()` is called (or auto-enabled via `captureWalletEvents: true`),
|
|
22
|
+
* real-time blockchain events are automatically routed through the same event system:
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const { subscribe } = useEvents();
|
|
25
|
+
*
|
|
26
|
+
* subscribe((event) => {
|
|
27
|
+
* if (event.domain === 'wallet') {
|
|
28
|
+
* console.log('Blockchain event:', event.type); // wallet_transfer, wallet_approval, etc.
|
|
29
|
+
* }
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
19
33
|
* **Notification Levels:**
|
|
20
34
|
* - `success` - Operation completed successfully
|
|
21
35
|
* - `error` - Operation failed
|
|
22
|
-
* - `warning` - Operation completed with warnings
|
|
23
|
-
* - `info` - Informational event
|
|
24
36
|
*
|
|
25
37
|
* **Cleanup:**
|
|
26
38
|
* All subscriptions created through this hook are automatically cleaned up when
|
|
@@ -31,6 +31,18 @@ export interface UseTokenBalancesOptions {
|
|
|
31
31
|
autoLoad?: boolean;
|
|
32
32
|
/** Optional refresh interval in milliseconds (0 = disabled) */
|
|
33
33
|
refreshInterval?: number;
|
|
34
|
+
/**
|
|
35
|
+
* Auto-refresh balances when wallet events are received (Transfer, Approval, etc.)
|
|
36
|
+
* Requires `captureWalletEvents: true` in SDK config (default)
|
|
37
|
+
* @default true
|
|
38
|
+
*/
|
|
39
|
+
refreshOnWalletEvents?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Debounce time for wallet event-triggered refreshes (milliseconds)
|
|
42
|
+
* Prevents rapid refresh calls during batch transfers
|
|
43
|
+
* @default 1000
|
|
44
|
+
*/
|
|
45
|
+
walletEventDebounceMs?: number;
|
|
34
46
|
}
|
|
35
47
|
/**
|
|
36
48
|
* Token balance loading hook return value
|
|
@@ -119,6 +131,18 @@ export interface UseTokenBalancesResult {
|
|
|
119
131
|
* ```
|
|
120
132
|
*
|
|
121
133
|
* @example
|
|
134
|
+
* **With Wallet Events (Real-time):**
|
|
135
|
+
* ```typescript
|
|
136
|
+
* // Auto-refresh on Transfer, Approval, and other blockchain events
|
|
137
|
+
* const { tokenBalances } = useTokenBalances({
|
|
138
|
+
* accountAddress: walletAddress!,
|
|
139
|
+
* availableTokens,
|
|
140
|
+
* refreshOnWalletEvents: true, // Enable real-time refresh (default: true)
|
|
141
|
+
* walletEventDebounceMs: 1000 // Debounce rapid events (default: 1000ms)
|
|
142
|
+
* });
|
|
143
|
+
* ```
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
122
146
|
* **Multi-Wallet Support:**
|
|
123
147
|
* ```typescript
|
|
124
148
|
* function MultiWalletBalances() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTokenBalances.d.ts","sourceRoot":"","sources":["../../src/hooks/useTokenBalances.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,0BAA0B,CAAC;AAElF;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,uCAAuC;IACvC,YAAY,EAAE,YAAY,CAAC;IAC3B,8DAA8D;IAC9D,KAAK,EAAE,QAAQ,CAAC;IAChB,8EAA8E;IAC9E,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"useTokenBalances.d.ts","sourceRoot":"","sources":["../../src/hooks/useTokenBalances.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,0BAA0B,CAAC;AAElF;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,uCAAuC;IACvC,YAAY,EAAE,YAAY,CAAC;IAC3B,8DAA8D;IAC9D,KAAK,EAAE,QAAQ,CAAC;IAChB,8EAA8E;IAC9E,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,0DAA0D;IAC1D,aAAa,EAAE,qBAAqB,EAAE,CAAC;IACvC,6CAA6C;IAC7C,SAAS,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,uCAAuC;IACvC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,sFAAsF;IACtF,WAAW,EAAE,OAAO,CAAC;IACrB,0CAA0C;IAC1C,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CAgMzF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useCallback, useEffect, useState } from 'react';
|
|
1
|
+
import { useCallback, useEffect, useState, useRef } from 'react';
|
|
2
2
|
import { usePersSDK } from '../providers/PersSDKProvider';
|
|
3
3
|
import { useWeb3 } from './useWeb3';
|
|
4
4
|
import { NativeTokenTypes } from '@explorins/pers-shared';
|
|
@@ -72,6 +72,18 @@ import { NativeTokenTypes } from '@explorins/pers-shared';
|
|
|
72
72
|
* ```
|
|
73
73
|
*
|
|
74
74
|
* @example
|
|
75
|
+
* **With Wallet Events (Real-time):**
|
|
76
|
+
* ```typescript
|
|
77
|
+
* // Auto-refresh on Transfer, Approval, and other blockchain events
|
|
78
|
+
* const { tokenBalances } = useTokenBalances({
|
|
79
|
+
* accountAddress: walletAddress!,
|
|
80
|
+
* availableTokens,
|
|
81
|
+
* refreshOnWalletEvents: true, // Enable real-time refresh (default: true)
|
|
82
|
+
* walletEventDebounceMs: 1000 // Debounce rapid events (default: 1000ms)
|
|
83
|
+
* });
|
|
84
|
+
* ```
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
75
87
|
* **Multi-Wallet Support:**
|
|
76
88
|
* ```typescript
|
|
77
89
|
* function MultiWalletBalances() {
|
|
@@ -90,12 +102,14 @@ import { NativeTokenTypes } from '@explorins/pers-shared';
|
|
|
90
102
|
* ```
|
|
91
103
|
*/
|
|
92
104
|
export function useTokenBalances(options) {
|
|
93
|
-
const { accountAddress, availableTokens = [], autoLoad = true, refreshInterval = 0 } = options;
|
|
105
|
+
const { accountAddress, availableTokens = [], autoLoad = true, refreshInterval = 0, refreshOnWalletEvents = true, walletEventDebounceMs = 1000 } = options;
|
|
94
106
|
const { isAuthenticated, sdk } = usePersSDK();
|
|
95
107
|
const web3 = useWeb3();
|
|
96
108
|
const [tokenBalances, setTokenBalances] = useState([]);
|
|
97
109
|
const [isLoading, setIsLoading] = useState(false);
|
|
98
110
|
const [error, setError] = useState(null);
|
|
111
|
+
// Debounce ref for wallet events
|
|
112
|
+
const walletEventDebounceRef = useRef(null);
|
|
99
113
|
// Check if the hook is available for use
|
|
100
114
|
const isAvailable = web3.isAvailable && isAuthenticated && !!accountAddress;
|
|
101
115
|
/**
|
|
@@ -215,6 +229,32 @@ export function useTokenBalances(options) {
|
|
|
215
229
|
clearInterval(intervalId);
|
|
216
230
|
};
|
|
217
231
|
}, [sdk, refreshInterval, isAvailable, loadBalances]);
|
|
232
|
+
// Wallet events refresh: listen for real-time blockchain events
|
|
233
|
+
// Refreshes on ANY wallet domain event (Transfer, TransferSingle, etc.)
|
|
234
|
+
// Debouncing prevents excessive API calls during rapid events
|
|
235
|
+
useEffect(() => {
|
|
236
|
+
if (!sdk || !refreshOnWalletEvents || !isAvailable)
|
|
237
|
+
return;
|
|
238
|
+
const unsubscribe = sdk.events.subscribe((event) => {
|
|
239
|
+
if (event.domain === 'wallet') {
|
|
240
|
+
// Debounce rapid events (batch transfers, etc.)
|
|
241
|
+
if (walletEventDebounceRef.current) {
|
|
242
|
+
clearTimeout(walletEventDebounceRef.current);
|
|
243
|
+
}
|
|
244
|
+
walletEventDebounceRef.current = setTimeout(() => {
|
|
245
|
+
console.log(`[useTokenBalances] Wallet event (${event.type}), refreshing balances...`);
|
|
246
|
+
loadBalances();
|
|
247
|
+
walletEventDebounceRef.current = null;
|
|
248
|
+
}, walletEventDebounceMs);
|
|
249
|
+
}
|
|
250
|
+
}, { domains: ['wallet'] });
|
|
251
|
+
return () => {
|
|
252
|
+
unsubscribe();
|
|
253
|
+
if (walletEventDebounceRef.current) {
|
|
254
|
+
clearTimeout(walletEventDebounceRef.current);
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
}, [sdk, refreshOnWalletEvents, walletEventDebounceMs, isAvailable, loadBalances]);
|
|
218
258
|
return {
|
|
219
259
|
tokenBalances,
|
|
220
260
|
isLoading,
|
package/dist/hooks/useUsers.d.ts
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import type { UserDTO, UserCreateRequestDTO, PaginatedResponseDTO } from '@explorins/pers-shared';
|
|
2
|
-
import type { UserPublicProfileDTO } from '@explorins/pers-sdk/user';
|
|
2
|
+
import type { UserPublicProfileDTO, UserQueryOptions } from '@explorins/pers-sdk/user';
|
|
3
|
+
export type { UserQueryOptions } from '@explorins/pers-sdk/user';
|
|
3
4
|
export declare const useUsers: () => {
|
|
4
|
-
getCurrentUser: () => Promise<UserDTO>;
|
|
5
|
+
getCurrentUser: (options?: UserQueryOptions) => Promise<UserDTO>;
|
|
5
6
|
updateCurrentUser: (userData: UserCreateRequestDTO) => Promise<UserDTO>;
|
|
6
|
-
getUserById: (userId: string) => Promise<UserDTO>;
|
|
7
|
+
getUserById: (userId: string, options?: UserQueryOptions) => Promise<UserDTO>;
|
|
7
8
|
getAllUsersPublic: (filter?: {
|
|
8
9
|
key: string;
|
|
9
10
|
value: string;
|
|
10
11
|
}) => Promise<PaginatedResponseDTO<UserPublicProfileDTO>>;
|
|
11
12
|
getAllUsers: () => Promise<PaginatedResponseDTO<UserDTO>>;
|
|
12
13
|
updateUser: (userId: string, userData: UserCreateRequestDTO) => Promise<UserDTO>;
|
|
13
|
-
|
|
14
|
+
setUserActiveStatus: (userId: string, isActive?: boolean) => Promise<UserDTO>;
|
|
14
15
|
isAvailable: boolean;
|
|
15
16
|
};
|
|
16
17
|
export type UserHook = ReturnType<typeof useUsers>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUsers.d.ts","sourceRoot":"","sources":["../../src/hooks/useUsers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"useUsers.d.ts","sourceRoot":"","sources":["../../src/hooks/useUsers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAGvF,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,eAAO,MAAM,QAAQ;+BAmBiC,gBAAgB,KAAG,QAAQ,OAAO,CAAC;kCAiBhC,oBAAoB,KAAG,QAAQ,OAAO,CAAC;0BAiC/C,MAAM,YAAY,gBAAgB,KAAG,QAAQ,OAAO,CAAC;iCAc9C;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAG,QAAQ,qBAAqB,oBAAoB,CAAC,CAAC;uBAehG,QAAQ,qBAAqB,OAAO,CAAC,CAAC;yBAclC,MAAM,YAAY,oBAAoB,KAAG,QAAQ,OAAO,CAAC;kCAqBhD,MAAM,aAAa,OAAO,KAAG,QAAQ,OAAO,CAAC;;CAwBrG,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC"}
|
package/dist/hooks/useUsers.js
CHANGED
|
@@ -2,7 +2,23 @@ import { useCallback } from 'react';
|
|
|
2
2
|
import { usePersSDK } from '../providers/PersSDKProvider';
|
|
3
3
|
export const useUsers = () => {
|
|
4
4
|
const { sdk, isInitialized, isAuthenticated } = usePersSDK();
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Get the current authenticated user with optional include relations
|
|
7
|
+
*
|
|
8
|
+
* @param options - Query options including include relations
|
|
9
|
+
* @returns Current user data
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* // Basic
|
|
14
|
+
* const user = await getCurrentUser();
|
|
15
|
+
*
|
|
16
|
+
* // With wallets included
|
|
17
|
+
* const userWithWallets = await getCurrentUser({ include: ['wallets'] });
|
|
18
|
+
* console.log('Wallets:', userWithWallets.included?.wallets);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
const getCurrentUser = useCallback(async (options) => {
|
|
6
22
|
if (!isInitialized || !sdk) {
|
|
7
23
|
throw new Error('SDK not initialized. Call initialize() first.');
|
|
8
24
|
}
|
|
@@ -10,7 +26,7 @@ export const useUsers = () => {
|
|
|
10
26
|
throw new Error('SDK not authenticated. getCurrentUser requires authentication.');
|
|
11
27
|
}
|
|
12
28
|
try {
|
|
13
|
-
const result = await sdk.users.getCurrentUser();
|
|
29
|
+
const result = await sdk.users.getCurrentUser(options);
|
|
14
30
|
return result;
|
|
15
31
|
}
|
|
16
32
|
catch (error) {
|
|
@@ -34,12 +50,28 @@ export const useUsers = () => {
|
|
|
34
50
|
throw error;
|
|
35
51
|
}
|
|
36
52
|
}, [sdk, isInitialized, isAuthenticated]);
|
|
37
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Get user by ID with optional include relations
|
|
55
|
+
*
|
|
56
|
+
* @param userId - User identifier (id, email, externalId, etc.)
|
|
57
|
+
* @param options - Query options including include relations
|
|
58
|
+
* @returns User data
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```typescript
|
|
62
|
+
* // Basic
|
|
63
|
+
* const user = await getUserById('user-123');
|
|
64
|
+
*
|
|
65
|
+
* // With wallets included
|
|
66
|
+
* const userWithWallets = await getUserById('user-123', { include: ['wallets'] });
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
const getUserById = useCallback(async (userId, options) => {
|
|
38
70
|
if (!isInitialized || !sdk) {
|
|
39
71
|
throw new Error('SDK not initialized. Call initialize() first.');
|
|
40
72
|
}
|
|
41
73
|
try {
|
|
42
|
-
const result = await sdk.users.getUserById(userId);
|
|
74
|
+
const result = await sdk.users.getUserById(userId, options);
|
|
43
75
|
return result;
|
|
44
76
|
}
|
|
45
77
|
catch (error) {
|
|
@@ -87,16 +119,23 @@ export const useUsers = () => {
|
|
|
87
119
|
throw error;
|
|
88
120
|
}
|
|
89
121
|
}, [sdk, isInitialized]);
|
|
90
|
-
|
|
122
|
+
/**
|
|
123
|
+
* Toggle or set a user's active status (admin only)
|
|
124
|
+
*
|
|
125
|
+
* @param userId - User ID to update
|
|
126
|
+
* @param isActive - Optional explicit status. If omitted, toggles current status.
|
|
127
|
+
* @returns Updated user
|
|
128
|
+
*/
|
|
129
|
+
const setUserActiveStatus = useCallback(async (userId, isActive) => {
|
|
91
130
|
if (!isInitialized || !sdk) {
|
|
92
131
|
throw new Error('SDK not initialized. Call initialize() first.');
|
|
93
132
|
}
|
|
94
133
|
try {
|
|
95
|
-
const result = await sdk.users.
|
|
134
|
+
const result = await sdk.users.setUserActiveStatus(userId, isActive);
|
|
96
135
|
return result;
|
|
97
136
|
}
|
|
98
137
|
catch (error) {
|
|
99
|
-
console.error('Failed to
|
|
138
|
+
console.error('Failed to set user active status:', error);
|
|
100
139
|
throw error;
|
|
101
140
|
}
|
|
102
141
|
}, [sdk, isInitialized]);
|
|
@@ -107,7 +146,7 @@ export const useUsers = () => {
|
|
|
107
146
|
getAllUsersPublic,
|
|
108
147
|
getAllUsers,
|
|
109
148
|
updateUser,
|
|
110
|
-
|
|
149
|
+
setUserActiveStatus,
|
|
111
150
|
isAvailable: isInitialized && !!sdk?.users,
|
|
112
151
|
};
|
|
113
152
|
};
|
package/dist/hooks/useWeb3.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { Web3Manager } from '@explorins/pers-sdk/web3';
|
|
1
2
|
import type { TokenBalance, TokenBalanceRequest, TokenCollectionRequest, TokenCollection, TokenMetadata, AccountOwnedTokensResult } from '@explorins/pers-sdk/web3';
|
|
2
|
-
import type {
|
|
3
|
-
|
|
3
|
+
import type { TokenDTO } from '@explorins/pers-sdk/token';
|
|
4
|
+
type ChainData = Awaited<ReturnType<Web3Manager['getChainDataById']>>;
|
|
4
5
|
export type { AccountOwnedTokensResult } from '@explorins/pers-sdk/web3';
|
|
5
6
|
/**
|
|
6
7
|
* React hook for Web3 operations in the PERS SDK
|
|
@@ -56,9 +57,9 @@ export declare const useWeb3: () => {
|
|
|
56
57
|
getTokenBalance: (request: TokenBalanceRequest) => Promise<TokenBalance>;
|
|
57
58
|
getTokenMetadata: (request: TokenBalanceRequest) => Promise<TokenMetadata | null>;
|
|
58
59
|
getTokenCollection: (request: TokenCollectionRequest) => Promise<TokenCollection>;
|
|
59
|
-
resolveIPFSUrl: (url: string
|
|
60
|
-
fetchAndProcessMetadata: (tokenUri: string
|
|
61
|
-
getChainDataById: (chainId: number) => Promise<ChainData
|
|
60
|
+
resolveIPFSUrl: (url: string) => Promise<string>;
|
|
61
|
+
fetchAndProcessMetadata: (tokenUri: string) => Promise<TokenMetadata | null>;
|
|
62
|
+
getChainDataById: (chainId: number) => Promise<ChainData>;
|
|
62
63
|
getExplorerUrl: (chainId: number, address: string, type: 'address' | 'tx') => Promise<string>;
|
|
63
64
|
extractTokenIds: (token: TokenDTO) => string[] | undefined;
|
|
64
65
|
getAccountOwnedTokensFromContract: (accountAddress: string, token: TokenDTO, maxTokens?: number) => Promise<AccountOwnedTokensResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWeb3.d.ts","sourceRoot":"","sources":["../../src/hooks/useWeb3.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useWeb3.d.ts","sourceRoot":"","sources":["../../src/hooks/useWeb3.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,aAAa,EACb,wBAAwB,EACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG1D,KAAK,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAGtE,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,eAAO,MAAM,OAAO;+BAmCkC,mBAAmB,KAAG,QAAQ,YAAY,CAAC;gCAiC1C,mBAAmB,KAAG,QAAQ,aAAa,GAAG,IAAI,CAAC;kCAcjD,sBAAsB,KAAG,QAAQ,eAAe,CAAC;0BAqBzD,MAAM,KAAG,QAAQ,MAAM,CAAC;wCAoBV,MAAM,KAAG,QAAQ,aAAa,GAAG,IAAI,CAAC;gCAc9C,MAAM,KAAG,QAAQ,SAAS,CAAC;8BAc7B,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG,IAAI,KAAG,QAAQ,MAAM,CAAC;6BAiCxE,QAAQ,KAAG,MAAM,EAAE,GAAG,SAAS;wDAuCzD,MAAM,SACf,QAAQ,cACJ,MAAM,KAChB,QAAQ,wBAAwB,CAAC;6CAqBlB,MAAM,SACf,QAAQ,cACJ,MAAM,KAChB,sBAAsB;;CAqB1B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC"}
|
package/dist/hooks/useWeb3.js
CHANGED
|
@@ -142,25 +142,38 @@ export const useWeb3 = () => {
|
|
|
142
142
|
throw error;
|
|
143
143
|
}
|
|
144
144
|
}, [web3, isInitialized]);
|
|
145
|
-
|
|
146
|
-
|
|
145
|
+
/**
|
|
146
|
+
* Resolve IPFS URL to HTTP gateway URL
|
|
147
|
+
*
|
|
148
|
+
* @deprecated Use `sdk.tenant.resolveIPFSUrl()` directly - IPFS is chain-agnostic
|
|
149
|
+
* @param url - IPFS URL to resolve (ipfs://...)
|
|
150
|
+
* @returns Promise resolving to HTTP gateway URL
|
|
151
|
+
*/
|
|
152
|
+
const resolveIPFSUrl = useCallback(async (url) => {
|
|
153
|
+
if (!isInitialized || !sdk) {
|
|
147
154
|
throw new Error('SDK not initialized. Call initialize() first.');
|
|
148
155
|
}
|
|
149
156
|
try {
|
|
150
|
-
const result = await
|
|
157
|
+
const result = await sdk.tenants.resolveIPFSUrl(url);
|
|
151
158
|
return result;
|
|
152
159
|
}
|
|
153
160
|
catch (error) {
|
|
154
161
|
console.error('Failed to resolve IPFS URL:', error);
|
|
155
162
|
throw error;
|
|
156
163
|
}
|
|
157
|
-
}, [
|
|
158
|
-
|
|
164
|
+
}, [sdk, isInitialized]);
|
|
165
|
+
/**
|
|
166
|
+
* Fetch and process token metadata from a URI
|
|
167
|
+
*
|
|
168
|
+
* @param tokenUri - Token URI to fetch metadata from
|
|
169
|
+
* @returns Promise resolving to processed metadata or null
|
|
170
|
+
*/
|
|
171
|
+
const fetchAndProcessMetadata = useCallback(async (tokenUri) => {
|
|
159
172
|
if (!isInitialized || !web3) {
|
|
160
173
|
throw new Error('SDK not initialized. Call initialize() first.');
|
|
161
174
|
}
|
|
162
175
|
try {
|
|
163
|
-
const result = await web3.fetchAndProcessMetadata(tokenUri
|
|
176
|
+
const result = await web3.fetchAndProcessMetadata(tokenUri);
|
|
164
177
|
return result;
|
|
165
178
|
}
|
|
166
179
|
catch (error) {
|
|
@@ -230,7 +243,7 @@ export const useWeb3 = () => {
|
|
|
230
243
|
*
|
|
231
244
|
* @param accountAddress - Any valid blockchain address (wallet, contract, etc.)
|
|
232
245
|
* @param token - Token definition (from getRewardTokens, getStatusTokens, etc.)
|
|
233
|
-
* @param maxTokens - Maximum tokens to retrieve (default:
|
|
246
|
+
* @param maxTokens - Maximum tokens to retrieve (default: 100, max: 100)
|
|
234
247
|
* @returns Promise resolving to result with owned tokens
|
|
235
248
|
* @throws Error if SDK is not initialized
|
|
236
249
|
*
|
|
@@ -249,7 +262,7 @@ export const useWeb3 = () => {
|
|
|
249
262
|
* @see {@link extractTokenIds} - Low-level helper used internally for ERC-1155
|
|
250
263
|
* @see {@link buildCollectionRequest} - For manual request building
|
|
251
264
|
*/
|
|
252
|
-
const getAccountOwnedTokensFromContract = useCallback(async (accountAddress, token, maxTokens =
|
|
265
|
+
const getAccountOwnedTokensFromContract = useCallback(async (accountAddress, token, maxTokens = 100) => {
|
|
253
266
|
if (!isInitialized || !web3) {
|
|
254
267
|
throw new Error('SDK not initialized. Call initialize() first.');
|
|
255
268
|
}
|
|
@@ -264,10 +277,10 @@ export const useWeb3 = () => {
|
|
|
264
277
|
*
|
|
265
278
|
* @param accountAddress - Any valid blockchain address (wallet, contract, etc.)
|
|
266
279
|
* @param token - Token definition
|
|
267
|
-
* @param maxTokens - Maximum tokens to retrieve (default:
|
|
280
|
+
* @param maxTokens - Maximum tokens to retrieve (default: 100, max: 100)
|
|
268
281
|
* @returns TokenCollectionRequest ready for getTokenCollection()
|
|
269
282
|
*/
|
|
270
|
-
const buildCollectionRequest = useCallback((accountAddress, token, maxTokens =
|
|
283
|
+
const buildCollectionRequest = useCallback((accountAddress, token, maxTokens = 100) => {
|
|
271
284
|
if (!web3) {
|
|
272
285
|
throw new Error('SDK not initialized. Call initialize() first.');
|
|
273
286
|
}
|