@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.
@@ -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 include a
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, completed, failed)
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwJG;AACH,eAAO,MAAM,SAAS,QAAO,UA2K5B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC"}
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"}
@@ -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 include a
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, completed, failed)
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;CAC1B;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsFG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CA8JzF"}
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,
@@ -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
- toggleUserStatus: (user: UserDTO) => Promise<UserDTO>;
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;AAErE,eAAO,MAAM,QAAQ;0BAG0B,QAAQ,OAAO,CAAC;kCAiBN,oBAAoB,KAAG,QAAQ,OAAO,CAAC;0BAiB/C,MAAM,KAAG,QAAQ,OAAO,CAAC;iCAclB;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;6BAcrD,OAAO,KAAG,QAAQ,OAAO,CAAC;;CAwB7E,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,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"}
@@ -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
- const getCurrentUser = useCallback(async () => {
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
- const getUserById = useCallback(async (userId) => {
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
- const toggleUserStatus = useCallback(async (user) => {
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.toggleUserStatus(user);
134
+ const result = await sdk.users.setUserActiveStatus(userId, isActive);
96
135
  return result;
97
136
  }
98
137
  catch (error) {
99
- console.error('Failed to toggle user status:', error);
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
- toggleUserStatus,
149
+ setUserActiveStatus,
111
150
  isAvailable: isInitialized && !!sdk?.users,
112
151
  };
113
152
  };
@@ -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 { ChainData } from '@explorins/pers-sdk/web3-chain';
3
- import type { TokenDTO } from '@explorins/pers-shared';
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, chainId: number) => Promise<string>;
60
- fetchAndProcessMetadata: (tokenUri: string, chainId: number) => Promise<TokenMetadata | null>;
61
- getChainDataById: (chainId: number) => Promise<ChainData | null>;
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":"AAGA,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,aAAa,EACb,wBAAwB,EACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGvD,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;0BAczD,MAAM,WAAW,MAAM,KAAG,QAAQ,MAAM,CAAC;wCAc3B,MAAM,WAAW,MAAM,KAAG,QAAQ,aAAa,GAAG,IAAI,CAAC;gCAc/D,MAAM,KAAG,QAAQ,SAAS,GAAG,IAAI,CAAC;8BAcpC,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"}
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"}
@@ -142,25 +142,38 @@ export const useWeb3 = () => {
142
142
  throw error;
143
143
  }
144
144
  }, [web3, isInitialized]);
145
- const resolveIPFSUrl = useCallback(async (url, chainId) => {
146
- if (!isInitialized || !web3) {
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 web3.resolveIPFSUrl(url, chainId);
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
- }, [web3, isInitialized]);
158
- const fetchAndProcessMetadata = useCallback(async (tokenUri, chainId) => {
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, chainId);
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: 50)
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 = 50) => {
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: 50)
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 = 50) => {
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
  }