@manahippo/aptos-wallet-adapter 0.3.5 → 0.3.6
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/WalletProviders/WalletProvider.d.ts +1 -0
- package/dist/WalletProviders/WalletProvider.d.ts.map +1 -1
- package/dist/WalletProviders/WalletProvider.js +106 -70
- package/dist/WalletProviders/WalletProvider.js.map +1 -1
- package/dist/WalletProviders/useWallet.d.ts +1 -0
- package/dist/WalletProviders/useWallet.d.ts.map +1 -1
- package/dist/WalletProviders/useWallet.js +1 -1
- package/dist/WalletProviders/useWallet.js.map +1 -1
- package/dist/hooks/useLocalStorage.d.ts +2 -3
- package/dist/hooks/useLocalStorage.d.ts.map +1 -1
- package/dist/hooks/useLocalStorage.js +32 -30
- package/dist/hooks/useLocalStorage.js.map +1 -1
- package/package.json +1 -1
- package/src/WalletProviders/WalletProvider.tsx +113 -71
- package/src/WalletProviders/useWallet.ts +2 -2
- package/src/hooks/useLocalStorage.ts +34 -40
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"WalletProvider.d.ts","sourceRoot":"","sources":["../../src/WalletProviders/WalletProvider.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,SAAS,EAA4C,MAAM,OAAO,CAAC;AAEhF,OAAO,EACL,WAAW,EAIZ,MAAM,UAAU,CAAC;AAClB,OAAO,EAEL,aAAa,EAGd,MAAM,+BAA+B,CAAC;AAGvC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAcD,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,
|
1
|
+
{"version":3,"file":"WalletProvider.d.ts","sourceRoot":"","sources":["../../src/WalletProviders/WalletProvider.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,SAAS,EAA4C,MAAM,OAAO,CAAC;AAEhF,OAAO,EACL,WAAW,EAIZ,MAAM,UAAU,CAAC;AAClB,OAAO,EAEL,aAAa,EAGd,MAAM,+BAA+B,CAAC;AAGvC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAcD,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAgRlD,CAAC"}
|
@@ -22,9 +22,8 @@ const initialState = {
|
|
22
22
|
account: null,
|
23
23
|
connected: false
|
24
24
|
};
|
25
|
-
const WalletProvider = ({ children, wallets: adapters, onError, localStorageKey = 'walletName' }) => {
|
26
|
-
const
|
27
|
-
const [, setName] = useLocalStorageState(localStorageKey, null);
|
25
|
+
const WalletProvider = ({ children, wallets: adapters, autoConnect = false, onError, localStorageKey = 'walletName' }) => {
|
26
|
+
const [name, setName] = (0, useLocalStorage_1.useLocalStorage)(localStorageKey, null);
|
28
27
|
const [{ wallet, adapter, account, connected }, setState] = (0, react_1.useState)(initialState);
|
29
28
|
const readyState = (adapter === null || adapter === void 0 ? void 0 : adapter.readyState) || BaseAdapter_1.WalletReadyState.Unsupported;
|
30
29
|
const [connecting, setConnecting] = (0, react_1.useState)(false);
|
@@ -39,41 +38,58 @@ const WalletProvider = ({ children, wallets: adapters, onError, localStorageKey
|
|
39
38
|
})));
|
40
39
|
// When the wallets change, start to listen for changes to their `readyState`
|
41
40
|
(0, react_1.useEffect)(() => {
|
42
|
-
|
41
|
+
// When the adapters change, wrap them to conform to the `Wallet` interface
|
42
|
+
setWallets((currentWallets) => adapters.map((wAdapter, index) => {
|
43
|
+
const currentWallet = currentWallets[index];
|
44
|
+
// If the wallet hasn't changed, return the same instance
|
45
|
+
return currentWallet &&
|
46
|
+
currentWallet.adapter === wAdapter &&
|
47
|
+
currentWallet.readyState === wAdapter.readyState
|
48
|
+
? currentWallet
|
49
|
+
: {
|
50
|
+
adapter: wAdapter,
|
51
|
+
readyState: wAdapter.readyState
|
52
|
+
};
|
53
|
+
}));
|
54
|
+
function handleReadyStateChange(wReadyState) {
|
43
55
|
setWallets((prevWallets) => {
|
44
|
-
const
|
45
|
-
if (
|
56
|
+
const index = prevWallets.findIndex(({ adapter: wAdapter }) => wAdapter === this);
|
57
|
+
if (index === -1)
|
46
58
|
return prevWallets;
|
59
|
+
const { adapter: wAdapter } = prevWallets[index];
|
47
60
|
return [
|
48
|
-
...prevWallets.slice(0,
|
49
|
-
|
50
|
-
...prevWallets.slice(
|
61
|
+
...prevWallets.slice(0, index),
|
62
|
+
{ adapter: wAdapter, readyState: wReadyState },
|
63
|
+
...prevWallets.slice(index + 1)
|
51
64
|
];
|
52
65
|
});
|
53
66
|
}
|
54
|
-
|
55
|
-
|
56
|
-
}
|
57
|
-
return () => {
|
58
|
-
for (const wAdapter of adapters) {
|
59
|
-
wAdapter.off('readyStateChange', handleReadyStateChange, wAdapter);
|
60
|
-
}
|
61
|
-
};
|
67
|
+
adapters.forEach((wAdapter) => wAdapter.on('readyStateChange', handleReadyStateChange, wAdapter));
|
68
|
+
return () => adapters.forEach((wAdapter) => wAdapter.off('readyStateChange', handleReadyStateChange, wAdapter));
|
62
69
|
}, [adapters]);
|
63
70
|
// When the selected wallet changes, initialize the state
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
71
|
+
(0, react_1.useEffect)(() => {
|
72
|
+
const selectedWallet = wallets.find((wAdapter) => wAdapter.adapter.name === name);
|
73
|
+
if (selectedWallet) {
|
74
|
+
setState({
|
75
|
+
wallet: selectedWallet,
|
76
|
+
adapter: selectedWallet.adapter,
|
77
|
+
connected: selectedWallet.adapter.connected,
|
78
|
+
account: selectedWallet.adapter.publicAccount
|
79
|
+
});
|
80
|
+
}
|
81
|
+
else {
|
82
|
+
setState(initialState);
|
83
|
+
}
|
84
|
+
}, [name, wallets]);
|
85
|
+
// If the window is closing or reloading, ignore disconnect and error events from the adapter
|
86
|
+
(0, react_1.useEffect)(() => {
|
87
|
+
function listener() {
|
88
|
+
isUnloading.current = true;
|
89
|
+
}
|
90
|
+
window.addEventListener('beforeunload', listener);
|
91
|
+
return () => window.removeEventListener('beforeunload', listener);
|
92
|
+
}, [isUnloading]);
|
77
93
|
// Handle the adapter's connect event
|
78
94
|
const handleConnect = (0, react_1.useCallback)(() => {
|
79
95
|
if (!adapter)
|
@@ -85,8 +101,7 @@ const WalletProvider = ({ children, wallets: adapters, onError, localStorageKey
|
|
85
101
|
// Clear the selected wallet unless the window is unloading
|
86
102
|
if (!isUnloading.current)
|
87
103
|
setName(null);
|
88
|
-
|
89
|
-
}, [isUnloading]);
|
104
|
+
}, [isUnloading, setName]);
|
90
105
|
// Handle the adapter's error event, and local errors
|
91
106
|
const handleError = (0, react_1.useCallback)((error) => {
|
92
107
|
// Call onError unless the window is unloading
|
@@ -113,51 +128,71 @@ const WalletProvider = ({ children, wallets: adapters, onError, localStorageKey
|
|
113
128
|
adapter === null || adapter === void 0 ? void 0 : adapter.disconnect();
|
114
129
|
};
|
115
130
|
}, [adapter]);
|
131
|
+
// If autoConnect is enabled, try to connect when the adapter changes and is ready
|
132
|
+
(0, react_1.useEffect)(() => {
|
133
|
+
if (isConnecting.current ||
|
134
|
+
connected ||
|
135
|
+
!autoConnect ||
|
136
|
+
!adapter ||
|
137
|
+
!(readyState === BaseAdapter_1.WalletReadyState.Installed || readyState === BaseAdapter_1.WalletReadyState.Loadable))
|
138
|
+
return;
|
139
|
+
(function () {
|
140
|
+
return __awaiter(this, void 0, void 0, function* () {
|
141
|
+
isConnecting.current = true;
|
142
|
+
setConnecting(true);
|
143
|
+
try {
|
144
|
+
yield adapter.connect();
|
145
|
+
}
|
146
|
+
catch (error) {
|
147
|
+
// Clear the selected wallet
|
148
|
+
setName(null);
|
149
|
+
// Don't throw error, but handleError will still be called
|
150
|
+
}
|
151
|
+
finally {
|
152
|
+
setConnecting(false);
|
153
|
+
isConnecting.current = false;
|
154
|
+
}
|
155
|
+
});
|
156
|
+
})();
|
157
|
+
}, [isConnecting, connected, autoConnect, adapter, readyState, setName]);
|
116
158
|
// Connect the adapter to the wallet
|
117
159
|
const connect = (0, react_1.useCallback)((walletName) => __awaiter(void 0, void 0, void 0, function* () {
|
118
|
-
if (isConnecting.current ||
|
160
|
+
if (isConnecting.current || isDisconnecting.current || connected)
|
119
161
|
return;
|
120
|
-
|
121
|
-
|
122
|
-
if (selectedWallet) {
|
123
|
-
walletToConnect = {
|
124
|
-
wallet: selectedWallet,
|
125
|
-
adapter: selectedWallet.adapter,
|
126
|
-
connected: selectedWallet.adapter.connected,
|
127
|
-
account: selectedWallet.adapter.publicAccount
|
128
|
-
};
|
162
|
+
if (!name) {
|
163
|
+
setName(walletName);
|
129
164
|
}
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
165
|
+
else {
|
166
|
+
if (!adapter)
|
167
|
+
throw handleError(new errors_1.WalletNotSelectedError());
|
168
|
+
if (!(readyState === BaseAdapter_1.WalletReadyState.Installed || readyState === BaseAdapter_1.WalletReadyState.Loadable)) {
|
169
|
+
// Clear the selected wallet
|
170
|
+
setName(null);
|
171
|
+
if (typeof window !== 'undefined') {
|
172
|
+
window.open(adapter.url, '_blank');
|
173
|
+
}
|
174
|
+
throw handleError(new errors_1.WalletNotReadyError());
|
175
|
+
}
|
176
|
+
isConnecting.current = true;
|
177
|
+
setConnecting(true);
|
178
|
+
try {
|
179
|
+
yield adapter.connect();
|
180
|
+
}
|
181
|
+
catch (error) {
|
182
|
+
// Clear the selected wallet
|
183
|
+
setName(null);
|
184
|
+
// Rethrow the error, and handleError will also be called
|
185
|
+
throw error;
|
186
|
+
}
|
187
|
+
finally {
|
188
|
+
setConnecting(false);
|
189
|
+
isConnecting.current = false;
|
139
190
|
}
|
140
|
-
throw handleError(new errors_1.WalletNotReadyError());
|
141
|
-
}
|
142
|
-
isConnecting.current = true;
|
143
|
-
setConnecting(true);
|
144
|
-
try {
|
145
|
-
yield walletToConnect.adapter.connect();
|
146
|
-
}
|
147
|
-
catch (error) {
|
148
|
-
// Clear the selected wallet
|
149
|
-
setName(null);
|
150
|
-
// Rethrow the error, and handleError will also be called
|
151
|
-
throw error;
|
152
|
-
}
|
153
|
-
finally {
|
154
|
-
setConnecting(false);
|
155
|
-
isConnecting.current = false;
|
156
191
|
}
|
157
|
-
}), [isConnecting,
|
192
|
+
}), [isConnecting, isDisconnecting, connected, adapter, readyState, handleError, setName, name]);
|
158
193
|
// Disconnect the adapter from the wallet
|
159
194
|
const disconnect = (0, react_1.useCallback)(() => __awaiter(void 0, void 0, void 0, function* () {
|
160
|
-
if (isDisconnecting.current
|
195
|
+
if (isDisconnecting.current)
|
161
196
|
return;
|
162
197
|
if (!adapter)
|
163
198
|
return setName(null);
|
@@ -176,7 +211,7 @@ const WalletProvider = ({ children, wallets: adapters, onError, localStorageKey
|
|
176
211
|
setDisconnecting(false);
|
177
212
|
isDisconnecting.current = false;
|
178
213
|
}
|
179
|
-
}), [isDisconnecting,
|
214
|
+
}), [isDisconnecting, setName, adapter]);
|
180
215
|
// Send a transaction using the provided connection
|
181
216
|
const signAndSubmitTransaction = (0, react_1.useCallback)((transaction, option) => __awaiter(void 0, void 0, void 0, function* () {
|
182
217
|
if (!adapter)
|
@@ -207,6 +242,7 @@ const WalletProvider = ({ children, wallets: adapters, onError, localStorageKey
|
|
207
242
|
connected,
|
208
243
|
connecting,
|
209
244
|
disconnecting,
|
245
|
+
autoConnect,
|
210
246
|
select: setName,
|
211
247
|
connect,
|
212
248
|
disconnect,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"WalletProvider.js","sourceRoot":"","sources":["../../src/WalletProviders/WalletProvider.tsx"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,8DAA2D;AAC3D,iCAAgF;AAEhF,qCAKkB;AAClB,+DAKuC;AACvC,2CAAoD;
|
1
|
+
{"version":3,"file":"WalletProvider.js","sourceRoot":"","sources":["../../src/WalletProviders/WalletProvider.tsx"],"names":[],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useWallet.d.ts","sourceRoot":"","sources":["../../src/WalletProviders/useWallet.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE3E,OAAO,EACL,WAAW,EACX,aAAa,EACb,UAAU,EACV,gBAAgB,EACjB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,gBAAgB,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;
|
1
|
+
{"version":3,"file":"useWallet.d.ts","sourceRoot":"","sources":["../../src/WalletProviders/useWallet.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE3E,OAAO,EACL,WAAW,EACX,aAAa,EACb,UAAU,EACV,gBAAgB,EACjB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,gBAAgB,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IACrC,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,wBAAwB,CACtB,WAAW,EAAE,kBAAkB,EAC/B,OAAO,CAAC,EAAE,GAAG,GACZ,OAAO,CAAC;QAAE,IAAI,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC;IACtC,eAAe,CAAC,WAAW,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrF,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/C;AASD,eAAO,MAAM,aAAa,6CAEzB,CAAC;AAEF,wBAAgB,SAAS,IAAI,kBAAkB,CAE9C"}
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.useWallet = exports.WalletContext = void 0;
|
4
4
|
const react_1 = require("react");
|
5
5
|
const DEFAULT_CONTEXT = {
|
6
|
-
|
6
|
+
autoConnect: false,
|
7
7
|
connecting: false,
|
8
8
|
connected: false,
|
9
9
|
disconnecting: false
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useWallet.js","sourceRoot":"","sources":["../../src/WalletProviders/useWallet.ts"],"names":[],"mappings":";;;AACA,iCAAkD;AAgClD,MAAM,eAAe,GAAG;IACtB,
|
1
|
+
{"version":3,"file":"useWallet.js","sourceRoot":"","sources":["../../src/WalletProviders/useWallet.ts"],"names":[],"mappings":";;;AACA,iCAAkD;AAgClD,MAAM,eAAe,GAAG;IACtB,WAAW,EAAE,KAAK;IAClB,UAAU,EAAE,KAAK;IACjB,SAAS,EAAE,KAAK;IAChB,aAAa,EAAE,KAAK;CACC,CAAC;AAEX,QAAA,aAAa,GAAG,IAAA,qBAAa,EACxC,eAAqC,CACtC,CAAC;AAEF,SAAgB,SAAS;IACvB,OAAO,IAAA,kBAAU,EAAC,qBAAa,CAAC,CAAC;AACnC,CAAC;AAFD,8BAEC"}
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
};
|
1
|
+
import type { Dispatch, SetStateAction } from 'react';
|
2
|
+
export declare function useLocalStorage<T>(key: string, defaultState: T): [T, Dispatch<SetStateAction<T>>];
|
4
3
|
//# sourceMappingURL=useLocalStorage.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useLocalStorage.d.ts","sourceRoot":"","sources":["../../src/hooks/useLocalStorage.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"useLocalStorage.d.ts","sourceRoot":"","sources":["../../src/hooks/useLocalStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAGtD,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAmCjG"}
|
@@ -2,40 +2,42 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.useLocalStorage = void 0;
|
4
4
|
const react_1 = require("react");
|
5
|
-
|
6
|
-
const
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
storage = session ? sessionStorage : localStorage;
|
5
|
+
function useLocalStorage(key, defaultState) {
|
6
|
+
const state = (0, react_1.useState)(() => {
|
7
|
+
try {
|
8
|
+
const value = localStorage.getItem(key);
|
9
|
+
if (value)
|
10
|
+
return JSON.parse(value);
|
12
11
|
}
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
if (storedState) {
|
17
|
-
return JSON.parse(storedState || '');
|
18
|
-
}
|
12
|
+
catch (error) {
|
13
|
+
if (typeof window !== 'undefined') {
|
14
|
+
console.error(error);
|
19
15
|
}
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
16
|
+
}
|
17
|
+
return defaultState;
|
18
|
+
});
|
19
|
+
const value = state[0];
|
20
|
+
const isFirstRender = (0, react_1.useRef)(true);
|
21
|
+
(0, react_1.useEffect)(() => {
|
22
|
+
if (isFirstRender.current) {
|
23
|
+
isFirstRender.current = false;
|
24
|
+
return;
|
25
|
+
}
|
26
|
+
try {
|
27
|
+
if (value === null) {
|
28
|
+
localStorage.removeItem(key);
|
31
29
|
}
|
32
30
|
else {
|
33
|
-
|
31
|
+
localStorage.setItem(key, JSON.stringify(value));
|
34
32
|
}
|
35
|
-
}
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
}
|
33
|
+
}
|
34
|
+
catch (error) {
|
35
|
+
if (typeof window !== 'undefined') {
|
36
|
+
console.error(error);
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}, [value, key]);
|
40
|
+
return state;
|
41
|
+
}
|
40
42
|
exports.useLocalStorage = useLocalStorage;
|
41
43
|
//# sourceMappingURL=useLocalStorage.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useLocalStorage.js","sourceRoot":"","sources":["../../src/hooks/useLocalStorage.ts"],"names":[],"mappings":";;;
|
1
|
+
{"version":3,"file":"useLocalStorage.js","sourceRoot":"","sources":["../../src/hooks/useLocalStorage.ts"],"names":[],"mappings":";;;AACA,iCAAoD;AAEpD,SAAgB,eAAe,CAAI,GAAW,EAAE,YAAe;IAC7D,MAAM,KAAK,GAAG,IAAA,gBAAQ,EAAI,GAAG,EAAE;QAC7B,IAAI;YACF,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,KAAK;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAM,CAAC;SAC1C;QAAC,OAAO,KAAU,EAAE;YACnB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;gBACjC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;aACtB;SACF;QAED,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEvB,MAAM,aAAa,GAAG,IAAA,cAAM,EAAC,IAAI,CAAC,CAAC;IACnC,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,aAAa,CAAC,OAAO,EAAE;YACzB,aAAa,CAAC,OAAO,GAAG,KAAK,CAAC;YAC9B,OAAO;SACR;QACD,IAAI;YACF,IAAI,KAAK,KAAK,IAAI,EAAE;gBAClB,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aAC9B;iBAAM;gBACL,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;aAClD;SACF;QAAC,OAAO,KAAU,EAAE;YACnB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;gBACjC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;aACtB;SACF;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAEjB,OAAO,KAAK,CAAC;AACf,CAAC;AAnCD,0CAmCC"}
|
package/package.json
CHANGED
@@ -18,6 +18,7 @@ import { Wallet, WalletContext } from './useWallet';
|
|
18
18
|
export interface WalletProviderProps {
|
19
19
|
children: ReactNode;
|
20
20
|
wallets: WalletAdapter[];
|
21
|
+
autoConnect?: boolean;
|
21
22
|
onError?: (error: WalletError) => void;
|
22
23
|
localStorageKey?: string;
|
23
24
|
}
|
@@ -37,11 +38,11 @@ const initialState: {
|
|
37
38
|
export const WalletProvider: FC<WalletProviderProps> = ({
|
38
39
|
children,
|
39
40
|
wallets: adapters,
|
41
|
+
autoConnect = false,
|
40
42
|
onError,
|
41
43
|
localStorageKey = 'walletName'
|
42
44
|
}) => {
|
43
|
-
const
|
44
|
-
const [, setName] = useLocalStorageState<WalletName | null>(localStorageKey, null);
|
45
|
+
const [name, setName] = useLocalStorage<WalletName | null>(localStorageKey, null);
|
45
46
|
const [{ wallet, adapter, account, connected }, setState] = useState(initialState);
|
46
47
|
const readyState = adapter?.readyState || WalletReadyState.Unsupported;
|
47
48
|
const [connecting, setConnecting] = useState(false);
|
@@ -60,44 +61,69 @@ export const WalletProvider: FC<WalletProviderProps> = ({
|
|
60
61
|
|
61
62
|
// When the wallets change, start to listen for changes to their `readyState`
|
62
63
|
useEffect(() => {
|
63
|
-
|
64
|
+
// When the adapters change, wrap them to conform to the `Wallet` interface
|
65
|
+
setWallets((currentWallets) =>
|
66
|
+
adapters.map((wAdapter, index) => {
|
67
|
+
const currentWallet = currentWallets[index];
|
68
|
+
// If the wallet hasn't changed, return the same instance
|
69
|
+
return currentWallet &&
|
70
|
+
currentWallet.adapter === wAdapter &&
|
71
|
+
currentWallet.readyState === wAdapter.readyState
|
72
|
+
? currentWallet
|
73
|
+
: {
|
74
|
+
adapter: wAdapter,
|
75
|
+
readyState: wAdapter.readyState
|
76
|
+
};
|
77
|
+
})
|
78
|
+
);
|
79
|
+
|
80
|
+
function handleReadyStateChange(this: any, wReadyState: WalletReadyState) {
|
64
81
|
setWallets((prevWallets) => {
|
65
|
-
const
|
66
|
-
|
67
|
-
);
|
68
|
-
if (walletIndex === -1) return prevWallets;
|
82
|
+
const index = prevWallets.findIndex(({ adapter: wAdapter }) => wAdapter === this);
|
83
|
+
if (index === -1) return prevWallets;
|
69
84
|
|
85
|
+
const { adapter: wAdapter } = prevWallets[index]!;
|
70
86
|
return [
|
71
|
-
...prevWallets.slice(0,
|
72
|
-
{
|
73
|
-
...prevWallets.slice(
|
87
|
+
...prevWallets.slice(0, index),
|
88
|
+
{ adapter: wAdapter, readyState: wReadyState },
|
89
|
+
...prevWallets.slice(index + 1)
|
74
90
|
];
|
75
91
|
});
|
76
92
|
}
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
93
|
+
|
94
|
+
adapters.forEach((wAdapter) =>
|
95
|
+
wAdapter.on('readyStateChange', handleReadyStateChange, wAdapter)
|
96
|
+
);
|
97
|
+
return () =>
|
98
|
+
adapters.forEach((wAdapter) =>
|
99
|
+
wAdapter.off('readyStateChange', handleReadyStateChange, wAdapter)
|
100
|
+
);
|
85
101
|
}, [adapters]);
|
86
102
|
|
87
103
|
// When the selected wallet changes, initialize the state
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
104
|
+
useEffect(() => {
|
105
|
+
const selectedWallet = wallets.find((wAdapter) => wAdapter.adapter.name === name);
|
106
|
+
if (selectedWallet) {
|
107
|
+
setState({
|
108
|
+
wallet: selectedWallet,
|
109
|
+
adapter: selectedWallet.adapter,
|
110
|
+
connected: selectedWallet.adapter.connected,
|
111
|
+
account: selectedWallet.adapter.publicAccount
|
112
|
+
});
|
113
|
+
} else {
|
114
|
+
setState(initialState);
|
115
|
+
}
|
116
|
+
}, [name, wallets]);
|
117
|
+
|
118
|
+
// If the window is closing or reloading, ignore disconnect and error events from the adapter
|
119
|
+
useEffect(() => {
|
120
|
+
function listener() {
|
121
|
+
isUnloading.current = true;
|
122
|
+
}
|
123
|
+
|
124
|
+
window.addEventListener('beforeunload', listener);
|
125
|
+
return () => window.removeEventListener('beforeunload', listener);
|
126
|
+
}, [isUnloading]);
|
101
127
|
|
102
128
|
// Handle the adapter's connect event
|
103
129
|
const handleConnect = useCallback(() => {
|
@@ -113,8 +139,7 @@ export const WalletProvider: FC<WalletProviderProps> = ({
|
|
113
139
|
const handleDisconnect = useCallback(() => {
|
114
140
|
// Clear the selected wallet unless the window is unloading
|
115
141
|
if (!isUnloading.current) setName(null);
|
116
|
-
|
117
|
-
}, [isUnloading]);
|
142
|
+
}, [isUnloading, setName]);
|
118
143
|
|
119
144
|
// Handle the adapter's error event, and local errors
|
120
145
|
const handleError = useCallback(
|
@@ -147,59 +172,75 @@ export const WalletProvider: FC<WalletProviderProps> = ({
|
|
147
172
|
};
|
148
173
|
}, [adapter]);
|
149
174
|
|
150
|
-
//
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
connected: selectedWallet.adapter.connected,
|
161
|
-
account: selectedWallet.adapter.publicAccount
|
162
|
-
};
|
163
|
-
}
|
164
|
-
setState(walletToConnect);
|
165
|
-
if (!walletToConnect.adapter) throw handleError(new WalletNotSelectedError());
|
166
|
-
|
167
|
-
if (
|
168
|
-
!(
|
169
|
-
walletToConnect.adapter.readyState === WalletReadyState.Installed ||
|
170
|
-
walletToConnect.adapter.readyState === WalletReadyState.Loadable
|
171
|
-
)
|
172
|
-
) {
|
173
|
-
// Clear the selected wallet
|
174
|
-
setName(null);
|
175
|
-
|
176
|
-
if (typeof window !== 'undefined' && walletToConnect.adapter.url) {
|
177
|
-
window.open(walletToConnect.adapter.url, '_blank');
|
178
|
-
}
|
179
|
-
|
180
|
-
throw handleError(new WalletNotReadyError());
|
181
|
-
}
|
175
|
+
// If autoConnect is enabled, try to connect when the adapter changes and is ready
|
176
|
+
useEffect(() => {
|
177
|
+
if (
|
178
|
+
isConnecting.current ||
|
179
|
+
connected ||
|
180
|
+
!autoConnect ||
|
181
|
+
!adapter ||
|
182
|
+
!(readyState === WalletReadyState.Installed || readyState === WalletReadyState.Loadable)
|
183
|
+
)
|
184
|
+
return;
|
182
185
|
|
186
|
+
(async function () {
|
183
187
|
isConnecting.current = true;
|
184
188
|
setConnecting(true);
|
185
189
|
try {
|
186
|
-
await
|
190
|
+
await adapter.connect();
|
187
191
|
} catch (error: any) {
|
188
192
|
// Clear the selected wallet
|
189
193
|
setName(null);
|
190
|
-
//
|
191
|
-
throw error;
|
194
|
+
// Don't throw error, but handleError will still be called
|
192
195
|
} finally {
|
193
196
|
setConnecting(false);
|
194
197
|
isConnecting.current = false;
|
195
198
|
}
|
199
|
+
})();
|
200
|
+
}, [isConnecting, connected, autoConnect, adapter, readyState, setName]);
|
201
|
+
|
202
|
+
// Connect the adapter to the wallet
|
203
|
+
const connect = useCallback(
|
204
|
+
async (walletName: WalletName) => {
|
205
|
+
if (isConnecting.current || isDisconnecting.current || connected) return;
|
206
|
+
if (!name) {
|
207
|
+
setName(walletName);
|
208
|
+
} else {
|
209
|
+
if (!adapter) throw handleError(new WalletNotSelectedError());
|
210
|
+
|
211
|
+
if (
|
212
|
+
!(readyState === WalletReadyState.Installed || readyState === WalletReadyState.Loadable)
|
213
|
+
) {
|
214
|
+
// Clear the selected wallet
|
215
|
+
setName(null);
|
216
|
+
|
217
|
+
if (typeof window !== 'undefined') {
|
218
|
+
window.open(adapter.url, '_blank');
|
219
|
+
}
|
220
|
+
|
221
|
+
throw handleError(new WalletNotReadyError());
|
222
|
+
}
|
223
|
+
isConnecting.current = true;
|
224
|
+
setConnecting(true);
|
225
|
+
try {
|
226
|
+
await adapter.connect();
|
227
|
+
} catch (error: any) {
|
228
|
+
// Clear the selected wallet
|
229
|
+
setName(null);
|
230
|
+
// Rethrow the error, and handleError will also be called
|
231
|
+
throw error;
|
232
|
+
} finally {
|
233
|
+
setConnecting(false);
|
234
|
+
isConnecting.current = false;
|
235
|
+
}
|
236
|
+
}
|
196
237
|
},
|
197
|
-
[isConnecting,
|
238
|
+
[isConnecting, isDisconnecting, connected, adapter, readyState, handleError, setName, name]
|
198
239
|
);
|
199
240
|
|
200
241
|
// Disconnect the adapter from the wallet
|
201
242
|
const disconnect = useCallback(async () => {
|
202
|
-
if (isDisconnecting.current
|
243
|
+
if (isDisconnecting.current) return;
|
203
244
|
if (!adapter) return setName(null);
|
204
245
|
|
205
246
|
isDisconnecting.current = true;
|
@@ -215,7 +256,7 @@ export const WalletProvider: FC<WalletProviderProps> = ({
|
|
215
256
|
setDisconnecting(false);
|
216
257
|
isDisconnecting.current = false;
|
217
258
|
}
|
218
|
-
}, [isDisconnecting,
|
259
|
+
}, [isDisconnecting, setName, adapter]);
|
219
260
|
|
220
261
|
// Send a transaction using the provided connection
|
221
262
|
const signAndSubmitTransaction = useCallback(
|
@@ -255,6 +296,7 @@ export const WalletProvider: FC<WalletProviderProps> = ({
|
|
255
296
|
connected,
|
256
297
|
connecting,
|
257
298
|
disconnecting,
|
299
|
+
autoConnect,
|
258
300
|
select: setName,
|
259
301
|
connect,
|
260
302
|
disconnect,
|
@@ -13,7 +13,7 @@ export interface Wallet {
|
|
13
13
|
}
|
14
14
|
|
15
15
|
export interface WalletContextState {
|
16
|
-
|
16
|
+
autoConnect: boolean;
|
17
17
|
wallets: Wallet[];
|
18
18
|
wallet: Wallet | null;
|
19
19
|
account: AccountKeys | null;
|
@@ -32,7 +32,7 @@ export interface WalletContextState {
|
|
32
32
|
}
|
33
33
|
|
34
34
|
const DEFAULT_CONTEXT = {
|
35
|
-
|
35
|
+
autoConnect: false,
|
36
36
|
connecting: false,
|
37
37
|
connected: false,
|
38
38
|
disconnecting: false
|
@@ -1,45 +1,39 @@
|
|
1
|
-
import {
|
2
|
-
import {
|
1
|
+
import type { Dispatch, SetStateAction } from 'react';
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
3
3
|
|
4
|
-
export
|
5
|
-
const
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
if (isClient) {
|
13
|
-
storage = session ? sessionStorage : localStorage;
|
14
|
-
}
|
15
|
-
const [state, setState] = useState(() => {
|
16
|
-
try {
|
17
|
-
let storedState = storage?.getItem(key);
|
18
|
-
if (storedState) {
|
19
|
-
return JSON.parse(storedState || '');
|
20
|
-
}
|
21
|
-
} catch (error) {
|
22
|
-
if (typeof window !== 'undefined') {
|
23
|
-
console.error(error);
|
24
|
-
}
|
4
|
+
export function useLocalStorage<T>(key: string, defaultState: T): [T, Dispatch<SetStateAction<T>>] {
|
5
|
+
const state = useState<T>(() => {
|
6
|
+
try {
|
7
|
+
const value = localStorage.getItem(key);
|
8
|
+
if (value) return JSON.parse(value) as T;
|
9
|
+
} catch (error: any) {
|
10
|
+
if (typeof window !== 'undefined') {
|
11
|
+
console.error(error);
|
25
12
|
}
|
26
|
-
|
27
|
-
});
|
13
|
+
}
|
28
14
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
if (newState === null) {
|
33
|
-
storage?.removeItem(key);
|
34
|
-
} else {
|
35
|
-
storage?.setItem(key, JSON.stringify(newState));
|
36
|
-
}
|
37
|
-
},
|
38
|
-
[key, storage]
|
39
|
-
);
|
15
|
+
return defaultState;
|
16
|
+
});
|
17
|
+
const value = state[0];
|
40
18
|
|
41
|
-
|
42
|
-
|
19
|
+
const isFirstRender = useRef(true);
|
20
|
+
useEffect(() => {
|
21
|
+
if (isFirstRender.current) {
|
22
|
+
isFirstRender.current = false;
|
23
|
+
return;
|
24
|
+
}
|
25
|
+
try {
|
26
|
+
if (value === null) {
|
27
|
+
localStorage.removeItem(key);
|
28
|
+
} else {
|
29
|
+
localStorage.setItem(key, JSON.stringify(value));
|
30
|
+
}
|
31
|
+
} catch (error: any) {
|
32
|
+
if (typeof window !== 'undefined') {
|
33
|
+
console.error(error);
|
34
|
+
}
|
35
|
+
}
|
36
|
+
}, [value, key]);
|
43
37
|
|
44
|
-
return
|
45
|
-
}
|
38
|
+
return state;
|
39
|
+
}
|