@spacesops/wdk-react-native-core 1.0.0-beta.40
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 +551 -0
- package/dist/__mocks__/react.d.ts +40 -0
- package/dist/__mocks__/react.js +33 -0
- package/dist/__mocks__/react.js.map +1 -0
- package/dist/__mocks__/secureStorage.d.ts +26 -0
- package/dist/__mocks__/secureStorage.js +80 -0
- package/dist/__mocks__/secureStorage.js.map +1 -0
- package/dist/__tests__/hooks/useBalance.test.d.ts +6 -0
- package/dist/__tests__/hooks/useBalance.test.js +217 -0
- package/dist/__tests__/hooks/useBalance.test.js.map +1 -0
- package/dist/__tests__/hooks/useWallet.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWallet.test.js +105 -0
- package/dist/__tests__/hooks/useWallet.test.js.map +1 -0
- package/dist/__tests__/hooks/useWalletManager.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWalletManager.test.js +193 -0
- package/dist/__tests__/hooks/useWalletManager.test.js.map +1 -0
- package/dist/__tests__/hooks/useWdkApp.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWdkApp.test.js +55 -0
- package/dist/__tests__/hooks/useWdkApp.test.js.map +1 -0
- package/dist/__tests__/hooks/useWorklet.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWorklet.test.js +168 -0
- package/dist/__tests__/hooks/useWorklet.test.js.map +1 -0
- package/dist/__tests__/provider/WdkAppProvider.test.d.ts +6 -0
- package/dist/__tests__/provider/WdkAppProvider.test.js +57 -0
- package/dist/__tests__/provider/WdkAppProvider.test.js.map +1 -0
- package/dist/__tests__/services/accountService.test.d.ts +6 -0
- package/dist/__tests__/services/accountService.test.js +216 -0
- package/dist/__tests__/services/accountService.test.js.map +1 -0
- package/dist/__tests__/services/addressService.test.d.ts +6 -0
- package/dist/__tests__/services/addressService.test.js +246 -0
- package/dist/__tests__/services/addressService.test.js.map +1 -0
- package/dist/__tests__/services/balanceService.test.d.ts +6 -0
- package/dist/__tests__/services/balanceService.test.js +333 -0
- package/dist/__tests__/services/balanceService.test.js.map +1 -0
- package/dist/__tests__/services/walletSetupService.test.d.ts +6 -0
- package/dist/__tests__/services/walletSetupService.test.js +304 -0
- package/dist/__tests__/services/walletSetupService.test.js.map +1 -0
- package/dist/__tests__/services/walletSwitchingService.test.d.ts +6 -0
- package/dist/__tests__/services/walletSwitchingService.test.js +209 -0
- package/dist/__tests__/services/walletSwitchingService.test.js.map +1 -0
- package/dist/__tests__/services/workletLifecycleService.test.d.ts +6 -0
- package/dist/__tests__/services/workletLifecycleService.test.js +451 -0
- package/dist/__tests__/services/workletLifecycleService.test.js.map +1 -0
- package/dist/__tests__/setup.d.ts +7 -0
- package/dist/__tests__/setup.js +49 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/storage/mmkvStorage.test.d.ts +6 -0
- package/dist/__tests__/storage/mmkvStorage.test.js +213 -0
- package/dist/__tests__/storage/mmkvStorage.test.js.map +1 -0
- package/dist/__tests__/store/walletStore.test.d.ts +4 -0
- package/dist/__tests__/store/walletStore.test.js +86 -0
- package/dist/__tests__/store/walletStore.test.js.map +1 -0
- package/dist/__tests__/store/workletStore.test.d.ts +4 -0
- package/dist/__tests__/store/workletStore.test.js +255 -0
- package/dist/__tests__/store/workletStore.test.js.map +1 -0
- package/dist/__tests__/types/hrpc.test.d.ts +4 -0
- package/dist/__tests__/types/hrpc.test.js +99 -0
- package/dist/__tests__/types/hrpc.test.js.map +1 -0
- package/dist/__tests__/utils/balanceUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/balanceUtils.test.js +133 -0
- package/dist/__tests__/utils/balanceUtils.test.js.map +1 -0
- package/dist/__tests__/utils/errorHandling.test.d.ts +6 -0
- package/dist/__tests__/utils/errorHandling.test.js +119 -0
- package/dist/__tests__/utils/errorHandling.test.js.map +1 -0
- package/dist/__tests__/utils/errorUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/errorUtils.test.js +133 -0
- package/dist/__tests__/utils/errorUtils.test.js.map +1 -0
- package/dist/__tests__/utils/initializationState.test.d.ts +6 -0
- package/dist/__tests__/utils/initializationState.test.js +243 -0
- package/dist/__tests__/utils/initializationState.test.js.map +1 -0
- package/dist/__tests__/utils/jsonUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/jsonUtils.test.js +118 -0
- package/dist/__tests__/utils/jsonUtils.test.js.map +1 -0
- package/dist/__tests__/utils/mmkvKeyManager.test.d.ts +6 -0
- package/dist/__tests__/utils/mmkvKeyManager.test.js +158 -0
- package/dist/__tests__/utils/mmkvKeyManager.test.js.map +1 -0
- package/dist/__tests__/utils/mnemonicUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/mnemonicUtils.test.js +40 -0
- package/dist/__tests__/utils/mnemonicUtils.test.js.map +1 -0
- package/dist/__tests__/utils/raceConditions.test.d.ts +6 -0
- package/dist/__tests__/utils/raceConditions.test.js +239 -0
- package/dist/__tests__/utils/raceConditions.test.js.map +1 -0
- package/dist/__tests__/utils/result.test.d.ts +4 -0
- package/dist/__tests__/utils/result.test.js +66 -0
- package/dist/__tests__/utils/result.test.js.map +1 -0
- package/dist/__tests__/utils/schemas.test.d.ts +4 -0
- package/dist/__tests__/utils/schemas.test.js +66 -0
- package/dist/__tests__/utils/schemas.test.js.map +1 -0
- package/dist/__tests__/utils/storeHelpers.test.d.ts +4 -0
- package/dist/__tests__/utils/storeHelpers.test.js +227 -0
- package/dist/__tests__/utils/storeHelpers.test.js.map +1 -0
- package/dist/__tests__/utils/typeGuards.test.d.ts +4 -0
- package/dist/__tests__/utils/typeGuards.test.js +175 -0
- package/dist/__tests__/utils/typeGuards.test.js.map +1 -0
- package/dist/__tests__/utils/validation.test.d.ts +4 -0
- package/dist/__tests__/utils/validation.test.js +126 -0
- package/dist/__tests__/utils/validation.test.js.map +1 -0
- package/dist/__tests__/utils/walletUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/walletUtils.test.js +156 -0
- package/dist/__tests__/utils/walletUtils.test.js.map +1 -0
- package/dist/hooks/useBalance.d.ts +170 -0
- package/dist/hooks/useBalance.js +442 -0
- package/dist/hooks/useBalance.js.map +1 -0
- package/dist/hooks/useWallet.d.ts +43 -0
- package/dist/hooks/useWallet.js +193 -0
- package/dist/hooks/useWallet.js.map +1 -0
- package/dist/hooks/useWalletManager.d.ts +100 -0
- package/dist/hooks/useWalletManager.js +526 -0
- package/dist/hooks/useWalletManager.js.map +1 -0
- package/dist/hooks/useWdkApp.d.ts +66 -0
- package/dist/hooks/useWdkApp.js +74 -0
- package/dist/hooks/useWdkApp.js.map +1 -0
- package/dist/hooks/useWorklet.d.ts +66 -0
- package/dist/hooks/useWorklet.js +42 -0
- package/dist/hooks/useWorklet.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/provider/WdkAppProvider.d.ts +112 -0
- package/dist/provider/WdkAppProvider.js +558 -0
- package/dist/provider/WdkAppProvider.js.map +1 -0
- package/dist/services/accountService.d.ts +52 -0
- package/dist/services/accountService.js +119 -0
- package/dist/services/accountService.js.map +1 -0
- package/dist/services/addressService.d.ts +22 -0
- package/dist/services/addressService.js +110 -0
- package/dist/services/addressService.js.map +1 -0
- package/dist/services/balanceService.d.ts +114 -0
- package/dist/services/balanceService.js +208 -0
- package/dist/services/balanceService.js.map +1 -0
- package/dist/services/walletSetupService.d.ts +217 -0
- package/dist/services/walletSetupService.js +535 -0
- package/dist/services/walletSetupService.js.map +1 -0
- package/dist/services/walletSwitchingService.d.ts +48 -0
- package/dist/services/walletSwitchingService.js +143 -0
- package/dist/services/walletSwitchingService.js.map +1 -0
- package/dist/services/workletLifecycleService.d.ts +117 -0
- package/dist/services/workletLifecycleService.js +433 -0
- package/dist/services/workletLifecycleService.js.map +1 -0
- package/dist/storage/mmkvStorage.d.ts +44 -0
- package/dist/storage/mmkvStorage.js +348 -0
- package/dist/storage/mmkvStorage.js.map +1 -0
- package/dist/store/walletStore.d.ts +130 -0
- package/dist/store/walletStore.js +204 -0
- package/dist/store/walletStore.js.map +1 -0
- package/dist/store/workletStore.d.ts +121 -0
- package/dist/store/workletStore.js +256 -0
- package/dist/store/workletStore.js.map +1 -0
- package/dist/types/hrpc.d.ts +60 -0
- package/dist/types/hrpc.js +26 -0
- package/dist/types/hrpc.js.map +1 -0
- package/dist/types.d.ts +168 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/balanceUtils.d.ts +30 -0
- package/dist/utils/balanceUtils.js +86 -0
- package/dist/utils/balanceUtils.js.map +1 -0
- package/dist/utils/constants.d.ts +66 -0
- package/dist/utils/constants.js +73 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/errorHandling.d.ts +47 -0
- package/dist/utils/errorHandling.js +54 -0
- package/dist/utils/errorHandling.js.map +1 -0
- package/dist/utils/errorUtils.d.ts +89 -0
- package/dist/utils/errorUtils.js +264 -0
- package/dist/utils/errorUtils.js.map +1 -0
- package/dist/utils/initializationState.d.ts +129 -0
- package/dist/utils/initializationState.js +220 -0
- package/dist/utils/initializationState.js.map +1 -0
- package/dist/utils/jsonUtils.d.ts +21 -0
- package/dist/utils/jsonUtils.js +67 -0
- package/dist/utils/jsonUtils.js.map +1 -0
- package/dist/utils/logger.d.ts +27 -0
- package/dist/utils/logger.js +50 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mmkvKeyManager.d.ts +57 -0
- package/dist/utils/mmkvKeyManager.js +214 -0
- package/dist/utils/mmkvKeyManager.js.map +1 -0
- package/dist/utils/mnemonicUtils.d.ts +17 -0
- package/dist/utils/mnemonicUtils.js +28 -0
- package/dist/utils/mnemonicUtils.js.map +1 -0
- package/dist/utils/operationMutex.d.ts +69 -0
- package/dist/utils/operationMutex.js +150 -0
- package/dist/utils/operationMutex.js.map +1 -0
- package/dist/utils/result.d.ts +34 -0
- package/dist/utils/result.js +43 -0
- package/dist/utils/result.js.map +1 -0
- package/dist/utils/schemas.d.ts +365 -0
- package/dist/utils/schemas.js +152 -0
- package/dist/utils/schemas.js.map +1 -0
- package/dist/utils/storeHelpers.d.ts +112 -0
- package/dist/utils/storeHelpers.js +198 -0
- package/dist/utils/storeHelpers.js.map +1 -0
- package/dist/utils/typeGuards.d.ts +70 -0
- package/dist/utils/typeGuards.js +95 -0
- package/dist/utils/typeGuards.js.map +1 -0
- package/dist/utils/validation.d.ts +53 -0
- package/dist/utils/validation.js +152 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/walletStateHelpers.d.ts +62 -0
- package/dist/utils/walletStateHelpers.js +81 -0
- package/dist/utils/walletStateHelpers.js.map +1 -0
- package/dist/utils/walletUtils.d.ts +38 -0
- package/dist/utils/walletUtils.js +87 -0
- package/dist/utils/walletUtils.js.map +1 -0
- package/package.json +79 -0
- package/src/__mocks__/react.ts +34 -0
- package/src/__mocks__/secureStorage.ts +87 -0
- package/src/__tests__/hooks/useBalance.test.ts +286 -0
- package/src/__tests__/hooks/useWallet.test.ts +122 -0
- package/src/__tests__/hooks/useWalletManager.test.ts +271 -0
- package/src/__tests__/hooks/useWdkApp.test.tsx +59 -0
- package/src/__tests__/hooks/useWorklet.test.ts +195 -0
- package/src/__tests__/provider/WdkAppProvider.test.tsx +67 -0
- package/src/__tests__/services/accountService.test.ts +337 -0
- package/src/__tests__/services/addressService.test.ts +312 -0
- package/src/__tests__/services/balanceService.test.ts +411 -0
- package/src/__tests__/services/walletSetupService.test.ts +463 -0
- package/src/__tests__/services/walletSwitchingService.test.ts +258 -0
- package/src/__tests__/services/workletLifecycleService.test.ts +514 -0
- package/src/__tests__/setup.ts +54 -0
- package/src/__tests__/storage/mmkvStorage.test.ts +325 -0
- package/src/__tests__/store/walletStore.test.ts +101 -0
- package/src/__tests__/store/workletStore.test.ts +329 -0
- package/src/__tests__/types/hrpc.test.ts +125 -0
- package/src/__tests__/utils/balanceUtils.test.ts +151 -0
- package/src/__tests__/utils/errorHandling.test.ts +147 -0
- package/src/__tests__/utils/errorUtils.test.ts +170 -0
- package/src/__tests__/utils/initializationState.test.ts +337 -0
- package/src/__tests__/utils/jsonUtils.test.ts +131 -0
- package/src/__tests__/utils/mmkvKeyManager.test.ts +205 -0
- package/src/__tests__/utils/mnemonicUtils.test.ts +48 -0
- package/src/__tests__/utils/raceConditions.test.ts +292 -0
- package/src/__tests__/utils/result.test.ts +73 -0
- package/src/__tests__/utils/schemas.test.ts +82 -0
- package/src/__tests__/utils/storeHelpers.test.ts +323 -0
- package/src/__tests__/utils/typeGuards.test.ts +209 -0
- package/src/__tests__/utils/validation.test.ts +152 -0
- package/src/__tests__/utils/walletUtils.test.ts +195 -0
- package/src/hooks/useBalance.ts +597 -0
- package/src/hooks/useWallet.ts +288 -0
- package/src/hooks/useWalletManager.ts +654 -0
- package/src/hooks/useWdkApp.ts +78 -0
- package/src/hooks/useWorklet.ts +109 -0
- package/src/index.ts +112 -0
- package/src/provider/WdkAppProvider.tsx +764 -0
- package/src/services/accountService.ts +134 -0
- package/src/services/addressService.ts +125 -0
- package/src/services/balanceService.ts +291 -0
- package/src/services/walletSetupService.ts +695 -0
- package/src/services/walletSwitchingService.ts +157 -0
- package/src/services/workletLifecycleService.ts +561 -0
- package/src/storage/mmkvStorage.ts +417 -0
- package/src/store/walletStore.ts +301 -0
- package/src/store/workletStore.ts +340 -0
- package/src/types/hrpc.ts +78 -0
- package/src/types.ts +188 -0
- package/src/utils/balanceUtils.ts +96 -0
- package/src/utils/constants.ts +84 -0
- package/src/utils/errorHandling.md +163 -0
- package/src/utils/errorHandling.ts +61 -0
- package/src/utils/errorUtils.ts +300 -0
- package/src/utils/initializationState.ts +242 -0
- package/src/utils/jsonUtils.ts +75 -0
- package/src/utils/logger.ts +54 -0
- package/src/utils/mmkvKeyManager.ts +256 -0
- package/src/utils/mnemonicUtils.ts +35 -0
- package/src/utils/operationMutex.ts +181 -0
- package/src/utils/result.ts +57 -0
- package/src/utils/schemas.ts +190 -0
- package/src/utils/storeHelpers.ts +236 -0
- package/src/utils/typeGuards.ts +129 -0
- package/src/utils/validation.ts +174 -0
- package/src/utils/walletStateHelpers.ts +104 -0
- package/src/utils/walletUtils.ts +107 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState, useMemo } from 'react';
|
|
2
|
+
import { useShallow } from 'zustand/react/shallow';
|
|
3
|
+
import { AccountService } from '../services/accountService';
|
|
4
|
+
import { AddressService } from '../services/addressService';
|
|
5
|
+
import { WalletSetupService } from '../services/walletSetupService';
|
|
6
|
+
import { WalletSwitchingService } from '../services/walletSwitchingService';
|
|
7
|
+
import { getWalletStore } from '../store/walletStore';
|
|
8
|
+
import { getWorkletStore } from '../store/workletStore';
|
|
9
|
+
import { isOperationInProgress } from '../utils/operationMutex';
|
|
10
|
+
import { log, logError } from '../utils/logger';
|
|
11
|
+
// Stable empty objects to prevent creating new objects on every render
|
|
12
|
+
const EMPTY_ADDRESSES = {};
|
|
13
|
+
const EMPTY_WALLET_LOADING = {};
|
|
14
|
+
/**
|
|
15
|
+
* Check if wallet switching should be skipped
|
|
16
|
+
*/
|
|
17
|
+
function shouldSkipWalletSwitch(requestedWalletId, activeWalletId, isSwitchingWallet, switchingToWalletId) {
|
|
18
|
+
// Skip if no walletId provided or walletId matches activeWalletId
|
|
19
|
+
if (!requestedWalletId || requestedWalletId === activeWalletId) {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
// Skip if already switching to this wallet
|
|
23
|
+
if (isSwitchingWallet && switchingToWalletId === requestedWalletId) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
// Skip if switching to a different wallet (wait for current switch to complete)
|
|
27
|
+
if (isSwitchingWallet && switchingToWalletId !== requestedWalletId) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if the requested wallet is a temporary wallet
|
|
34
|
+
*/
|
|
35
|
+
function isTemporaryWalletId(walletId) {
|
|
36
|
+
return walletId === '__temporary__';
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Normalize error to Error instance
|
|
40
|
+
*/
|
|
41
|
+
function normalizeErrorToError(error) {
|
|
42
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
43
|
+
}
|
|
44
|
+
export function useWallet(options) {
|
|
45
|
+
const workletStore = getWorkletStore();
|
|
46
|
+
const walletStore = getWalletStore();
|
|
47
|
+
// Switching state
|
|
48
|
+
const [isSwitchingWallet, setIsSwitchingWallet] = useState(false);
|
|
49
|
+
const [switchingToWalletId, setSwitchingToWalletId] = useState(null);
|
|
50
|
+
const [switchWalletError, setSwitchWalletError] = useState(null);
|
|
51
|
+
const [isTemporaryWallet, setIsTemporaryWallet] = useState(false);
|
|
52
|
+
// Get activeWalletId from stores
|
|
53
|
+
const activeWalletId = walletStore((state) => state.activeWalletId);
|
|
54
|
+
// Determine target walletId
|
|
55
|
+
const targetWalletId = options?.walletId || activeWalletId;
|
|
56
|
+
// Subscribe to wallet state for target wallet
|
|
57
|
+
// useShallow ensures stable references when content doesn't change
|
|
58
|
+
// We select the specific wallet's data directly from the store
|
|
59
|
+
// Use stable empty objects to prevent new object creation on every render
|
|
60
|
+
const walletState = walletStore(useShallow((state) => {
|
|
61
|
+
const walletId = options?.walletId || state.activeWalletId;
|
|
62
|
+
if (!walletId) {
|
|
63
|
+
return {
|
|
64
|
+
addresses: EMPTY_ADDRESSES,
|
|
65
|
+
walletLoading: EMPTY_WALLET_LOADING,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const addresses = state.addresses[walletId];
|
|
69
|
+
const walletLoading = state.walletLoading[walletId];
|
|
70
|
+
return {
|
|
71
|
+
addresses: addresses || EMPTY_ADDRESSES,
|
|
72
|
+
walletLoading: walletLoading || EMPTY_WALLET_LOADING,
|
|
73
|
+
};
|
|
74
|
+
}));
|
|
75
|
+
const isInitialized = workletStore((state) => state.isInitialized);
|
|
76
|
+
// Automatic wallet switching logic
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
const requestedWalletId = options?.walletId;
|
|
79
|
+
// Skip if switching should be skipped
|
|
80
|
+
if (shouldSkipWalletSwitch(requestedWalletId, activeWalletId, isSwitchingWallet, switchingToWalletId)) {
|
|
81
|
+
setIsTemporaryWallet(false);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// Skip until WdkAppProvider has registered SecureStorage (runs synchronously on mount)
|
|
85
|
+
if (!WalletSetupService.isSecureStorageInitialized()) {
|
|
86
|
+
log('[useWallet] SecureStorage not initialized yet, skipping wallet switch');
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Check if another operation is in progress (via mutex)
|
|
90
|
+
if (isOperationInProgress()) {
|
|
91
|
+
log('[useWallet] Operation in progress, skipping wallet switch');
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
// Handle temporary wallet identifier
|
|
95
|
+
if (isTemporaryWalletId(requestedWalletId)) {
|
|
96
|
+
setIsTemporaryWallet(true);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
let cancelled = false;
|
|
100
|
+
const switchWallet = async () => {
|
|
101
|
+
setIsSwitchingWallet(true);
|
|
102
|
+
setSwitchingToWalletId(requestedWalletId);
|
|
103
|
+
setSwitchWalletError(null);
|
|
104
|
+
try {
|
|
105
|
+
// Use WalletSwitchingService for wallet switching logic (has mutex protection)
|
|
106
|
+
await WalletSwitchingService.switchToWallet(requestedWalletId, {
|
|
107
|
+
autoStartWorklet: false,
|
|
108
|
+
});
|
|
109
|
+
if (!cancelled) {
|
|
110
|
+
setIsTemporaryWallet(false);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (!cancelled) {
|
|
115
|
+
const err = normalizeErrorToError(error);
|
|
116
|
+
logError('[useWallet] Failed to switch wallet:', error);
|
|
117
|
+
setSwitchWalletError(err);
|
|
118
|
+
// Don't update activeWalletId if switch failed
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
if (!cancelled) {
|
|
123
|
+
setIsSwitchingWallet(false);
|
|
124
|
+
setSwitchingToWalletId(null);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
switchWallet();
|
|
129
|
+
// Cleanup function to cancel in-flight operations
|
|
130
|
+
return () => {
|
|
131
|
+
cancelled = true;
|
|
132
|
+
};
|
|
133
|
+
}, [options?.walletId, activeWalletId, isSwitchingWallet, switchingToWalletId]);
|
|
134
|
+
// useShallow already provides stable references when content doesn't change
|
|
135
|
+
// We can use walletState.addresses and walletState.walletLoading directly
|
|
136
|
+
// No need to create new objects - useShallow handles reference stability
|
|
137
|
+
const addresses = walletState.addresses;
|
|
138
|
+
const walletLoading = walletState.walletLoading;
|
|
139
|
+
// Get all addresses for a specific network
|
|
140
|
+
// Use addresses directly from walletState (stable reference from useShallow)
|
|
141
|
+
const getNetworkAddresses = useCallback((network) => {
|
|
142
|
+
return addresses[network] || {};
|
|
143
|
+
}, [addresses]);
|
|
144
|
+
// Check if an address is loading
|
|
145
|
+
// Use walletLoading directly from walletState (stable reference from useShallow)
|
|
146
|
+
const isLoadingAddress = useCallback((network, accountIndex = 0) => {
|
|
147
|
+
return walletLoading[`${network}-${accountIndex}`] || false;
|
|
148
|
+
}, [walletLoading]);
|
|
149
|
+
// Get a specific address (from cache or fetch)
|
|
150
|
+
const getAddress = useCallback(async (network, accountIndex = 0) => {
|
|
151
|
+
const walletId = targetWalletId || '__temporary__';
|
|
152
|
+
return AddressService.getAddress(network, accountIndex, walletId);
|
|
153
|
+
}, [targetWalletId]);
|
|
154
|
+
// Call a method on a wallet account
|
|
155
|
+
const callAccountMethod = useCallback(async (network, accountIndex, methodName, args) => {
|
|
156
|
+
const walletId = targetWalletId || '__temporary__';
|
|
157
|
+
return AccountService.callAccountMethod(network, accountIndex, methodName, args, walletId);
|
|
158
|
+
}, [targetWalletId]);
|
|
159
|
+
// Memoize the entire result object to ensure stable reference
|
|
160
|
+
// useShallow already provides stable references for addresses and walletLoading
|
|
161
|
+
// We memoize the result object to prevent creating new objects on every render
|
|
162
|
+
const result = useMemo(() => ({
|
|
163
|
+
// State (reactive) - useShallow ensures stable references
|
|
164
|
+
addresses,
|
|
165
|
+
walletLoading,
|
|
166
|
+
isInitialized,
|
|
167
|
+
// Switching state
|
|
168
|
+
isSwitchingWallet,
|
|
169
|
+
switchingToWalletId,
|
|
170
|
+
switchWalletError,
|
|
171
|
+
isTemporaryWallet,
|
|
172
|
+
// Computed helpers
|
|
173
|
+
getNetworkAddresses,
|
|
174
|
+
isLoadingAddress,
|
|
175
|
+
// Actions
|
|
176
|
+
getAddress,
|
|
177
|
+
callAccountMethod,
|
|
178
|
+
}), [
|
|
179
|
+
addresses,
|
|
180
|
+
walletLoading,
|
|
181
|
+
isInitialized,
|
|
182
|
+
isSwitchingWallet,
|
|
183
|
+
switchingToWalletId,
|
|
184
|
+
switchWalletError,
|
|
185
|
+
isTemporaryWallet,
|
|
186
|
+
getNetworkAddresses,
|
|
187
|
+
isLoadingAddress,
|
|
188
|
+
getAddress,
|
|
189
|
+
callAccountMethod,
|
|
190
|
+
]);
|
|
191
|
+
return result;
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=useWallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useWallet.js","sourceRoot":"","sources":["../../src/hooks/useWallet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wallet Manager Hook
|
|
3
|
+
*
|
|
4
|
+
* Consolidated hook for wallet setup, initialization, and lifecycle management.
|
|
5
|
+
* This is the ONLY hook for wallet lifecycle operations.
|
|
6
|
+
*
|
|
7
|
+
* PURPOSE: Use this hook for wallet setup/auth flows (creating new wallets,
|
|
8
|
+
* loading existing wallets, checking if wallet exists, deleting wallets, getting mnemonic).
|
|
9
|
+
*
|
|
10
|
+
* When to use which hook:
|
|
11
|
+
* - **App initialization state**: Use `useWdkApp()` to check if app is ready
|
|
12
|
+
* - **Wallet lifecycle** (create, load, import, delete): Use this hook (`useWalletManager()`)
|
|
13
|
+
* - **Wallet operations** (addresses, account methods): Use `useWallet()` AFTER initialization
|
|
14
|
+
* - **Balance fetching**: Use `useBalance()` hook with TanStack Query
|
|
15
|
+
*
|
|
16
|
+
* **Wallet Switching**: Use `useWallet({ walletId })` to switch wallets.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* // Check if app is ready first
|
|
21
|
+
* const { isReady } = useWdkApp()
|
|
22
|
+
*
|
|
23
|
+
* // Then use wallet manager for lifecycle operations
|
|
24
|
+
* // networkConfigs is optional - it will be retrieved from workletStore if not provided
|
|
25
|
+
* const {
|
|
26
|
+
* createWallet,
|
|
27
|
+
* initializeWallet,
|
|
28
|
+
* initializeFromMnemonic,
|
|
29
|
+
* hasWallet,
|
|
30
|
+
* deleteWallet,
|
|
31
|
+
* getMnemonic,
|
|
32
|
+
* createTemporaryWallet,
|
|
33
|
+
* isInitializing,
|
|
34
|
+
* error
|
|
35
|
+
* } = useWalletManager('user@example.com')
|
|
36
|
+
*
|
|
37
|
+
* // Create new wallet (persistent, requires biometrics)
|
|
38
|
+
* // networkConfigs can be passed here or retrieved from store
|
|
39
|
+
* await createWallet('user@example.com', networkConfigs)
|
|
40
|
+
*
|
|
41
|
+
* // Initialize wallet (create new or load existing)
|
|
42
|
+
* await initializeWallet({ createNew: true })
|
|
43
|
+
*
|
|
44
|
+
* // Load existing wallet (requires biometric authentication)
|
|
45
|
+
* await initializeWallet({ createNew: false })
|
|
46
|
+
*
|
|
47
|
+
* // Import from mnemonic
|
|
48
|
+
* await initializeFromMnemonic('word1 word2 ... word12')
|
|
49
|
+
*
|
|
50
|
+
* // Create temporary wallet for previewing addresses (no biometrics, not saved)
|
|
51
|
+
* await createTemporaryWallet()
|
|
52
|
+
*
|
|
53
|
+
* // Get mnemonic (requires biometric authentication if not cached)
|
|
54
|
+
* const mnemonic = await getMnemonic()
|
|
55
|
+
*
|
|
56
|
+
* // Delete wallet
|
|
57
|
+
* await deleteWallet()
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
import type { NetworkConfigs } from '../types';
|
|
61
|
+
import type { WalletInfo } from '../store/walletStore';
|
|
62
|
+
export type { WalletInfo };
|
|
63
|
+
export interface UseWalletManagerResult {
|
|
64
|
+
/** Initialize wallet - either create new or load existing */
|
|
65
|
+
initializeWallet: (options?: {
|
|
66
|
+
createNew?: boolean;
|
|
67
|
+
walletId?: string;
|
|
68
|
+
}) => Promise<void>;
|
|
69
|
+
/** Initialize wallet from mnemonic seedphrase */
|
|
70
|
+
initializeFromMnemonic: (mnemonic: string, walletId?: string) => Promise<void>;
|
|
71
|
+
/** Check if wallet exists */
|
|
72
|
+
hasWallet: (walletId?: string) => Promise<boolean>;
|
|
73
|
+
/** Delete wallet */
|
|
74
|
+
deleteWallet: (walletId?: string) => Promise<void>;
|
|
75
|
+
/** Get mnemonic phrase (requires biometric authentication if not cached) */
|
|
76
|
+
getMnemonic: (walletId?: string) => Promise<string | null>;
|
|
77
|
+
/** Create a temporary wallet for previewing addresses (no biometrics, not saved) */
|
|
78
|
+
createTemporaryWallet: () => Promise<void>;
|
|
79
|
+
/** Whether initialization is in progress */
|
|
80
|
+
isInitializing: boolean;
|
|
81
|
+
/** Error message if any */
|
|
82
|
+
error: string | null;
|
|
83
|
+
/** Clear error state */
|
|
84
|
+
clearError: () => void;
|
|
85
|
+
/** Clear active wallet ID (useful when switching users or logging out) */
|
|
86
|
+
clearActiveWallet: () => void;
|
|
87
|
+
/** List of all known wallets */
|
|
88
|
+
wallets: WalletInfo[];
|
|
89
|
+
/** Currently active wallet identifier */
|
|
90
|
+
activeWalletId: string | null;
|
|
91
|
+
/** Create a new wallet with the given walletId (adds to list) */
|
|
92
|
+
createWallet: (walletId: string, networkConfigs?: NetworkConfigs) => Promise<void>;
|
|
93
|
+
/** Refresh the wallet list */
|
|
94
|
+
refreshWalletList: (knownIdentifiers?: string[]) => Promise<void>;
|
|
95
|
+
/** Whether wallet list operation is in progress */
|
|
96
|
+
isWalletListLoading: boolean;
|
|
97
|
+
/** Wallet list error message if any */
|
|
98
|
+
walletListError: string | null;
|
|
99
|
+
}
|
|
100
|
+
export declare function useWalletManager(walletId?: string, networkConfigs?: NetworkConfigs): UseWalletManagerResult;
|