@manahippo/aptos-wallet-adapter 0.3.5 → 0.3.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/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
|
+
}
|