@w3ux/react-connect-kit 1.2.1 → 1.3.0-alpha.2

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.
Files changed (43) hide show
  1. package/ExtensionAccountsProvider/Extensions.js +75 -167
  2. package/ExtensionAccountsProvider/Extensions.js.map +1 -1
  3. package/ExtensionAccountsProvider/defaults.js +7 -5
  4. package/ExtensionAccountsProvider/defaults.js.map +1 -1
  5. package/ExtensionAccountsProvider/index.js +139 -256
  6. package/ExtensionAccountsProvider/index.js.map +1 -1
  7. package/ExtensionAccountsProvider/snap.js +52 -121
  8. package/ExtensionAccountsProvider/snap.js.map +1 -1
  9. package/ExtensionAccountsProvider/types.js +2 -0
  10. package/ExtensionAccountsProvider/types.js.map +1 -1
  11. package/ExtensionAccountsProvider/useImportExtension.js +24 -44
  12. package/ExtensionAccountsProvider/useImportExtension.js.map +1 -1
  13. package/ExtensionAccountsProvider/utils.js +14 -17
  14. package/ExtensionAccountsProvider/utils.js.map +1 -1
  15. package/ExtensionsProvider/defaults.js +8 -6
  16. package/ExtensionsProvider/defaults.js.map +1 -1
  17. package/ExtensionsProvider/index.js +56 -115
  18. package/ExtensionsProvider/index.js.map +1 -1
  19. package/ExtensionsProvider/types.js +2 -0
  20. package/ExtensionsProvider/types.js.map +1 -1
  21. package/ExtensionsProvider/utils.js +21 -73
  22. package/ExtensionsProvider/utils.js.map +1 -1
  23. package/LedgerAccountsProvider/defaults.js +9 -7
  24. package/LedgerAccountsProvider/defaults.js.map +1 -1
  25. package/LedgerAccountsProvider/index.js +39 -68
  26. package/LedgerAccountsProvider/index.js.map +1 -1
  27. package/LedgerAccountsProvider/types.js +2 -0
  28. package/LedgerAccountsProvider/types.js.map +1 -1
  29. package/LedgerAccountsProvider/utils.js +16 -25
  30. package/LedgerAccountsProvider/utils.js.map +1 -1
  31. package/VaultAccountsProvider/defaults.js +9 -7
  32. package/VaultAccountsProvider/defaults.js.map +1 -1
  33. package/VaultAccountsProvider/index.js +40 -66
  34. package/VaultAccountsProvider/index.js.map +1 -1
  35. package/VaultAccountsProvider/types.js +2 -0
  36. package/VaultAccountsProvider/types.js.map +1 -1
  37. package/VaultAccountsProvider/utils.js +6 -4
  38. package/VaultAccountsProvider/utils.js.map +1 -1
  39. package/index.js +2 -0
  40. package/index.js.map +1 -1
  41. package/package.json +5 -5
  42. package/types.js +2 -0
  43. package/types.js.map +1 -1
@@ -1,59 +1,3 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
- return new (P || (P = Promise))(function (resolve, reject) {
15
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
- step((generator = generator.apply(thisArg, _arguments || [])).next());
19
- });
20
- };
21
- var __generator = (this && this.__generator) || function (thisArg, body) {
22
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
- function verb(n) { return function (v) { return step([n, v]); }; }
25
- function step(op) {
26
- if (f) throw new TypeError("Generator is already executing.");
27
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
- if (y = 0, t) op = [op[0] & 2, t.value];
30
- switch (op[0]) {
31
- case 0: case 1: t = op; break;
32
- case 4: _.label++; return { value: op[1], done: false };
33
- case 5: _.label++; y = op[1]; op = [0]; continue;
34
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
- default:
36
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
- if (t[2]) _.ops.pop();
41
- _.trys.pop(); continue;
42
- }
43
- op = body.call(thisArg, _);
44
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
- }
47
- };
48
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
49
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
50
- if (ar || !(i in from)) {
51
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
52
- ar[i] = from[i];
53
- }
54
- }
55
- return to.concat(ar || Array.prototype.slice.call(from));
56
- };
57
1
  import { jsx as _jsx } from "react/jsx-runtime";
58
2
  import { createContext, useContext, useEffect, useRef, useState } from "react";
59
3
  import { localStorageOrDefault, setStateWithRef } from "@w3ux/utils";
@@ -65,121 +9,84 @@ import { connectActiveExtensionAccount, getActiveAccountLocal, getActiveExtensio
65
9
  import { useExtensions } from "../ExtensionsProvider";
66
10
  import { useEffectIgnoreInitial } from "@w3ux/hooks";
67
11
  import Keyring from "@polkadot/keyring";
68
- export var ExtensionAccountsContext = createContext(defaultExtensionAccountsContext);
69
- export var useExtensionAccounts = function () { return useContext(ExtensionAccountsContext); };
70
- export var ExtensionAccountsProvider = function (_a) {
71
- var children = _a.children, network = _a.network, dappName = _a.dappName, activeAccount = _a.activeAccount, setActiveAccount = _a.setActiveAccount, onExtensionEnabled = _a.onExtensionEnabled;
72
- var handleImportExtension = useImportExtension().handleImportExtension;
73
- var _b = useExtensions(), extensionsStatus = _b.extensionsStatus, setExtensionStatus = _b.setExtensionStatus, removeExtensionStatus = _b.removeExtensionStatus, checkingInjectedWeb3 = _b.checkingInjectedWeb3, extensionHasFeature = _b.extensionHasFeature;
74
- var _c = useState([]), extensionAccounts = _c[0], setExtensionAccounts = _c[1];
75
- var extensionAccountsRef = useRef(extensionAccounts);
76
- var _d = useState("unsynced"), extensionAccountsSynced = _d[0], setExtensionAccountsSynced = _d[1];
77
- var _e = useState([]), extensionsInitialised = _e[0], setExtensionsInitialised = _e[1];
78
- var extensionsInitialisedRef = useRef(extensionsInitialised);
79
- var unsubs = useRef({});
80
- var maybeSetActiveAccount = function (address) {
12
+ export const ExtensionAccountsContext = createContext(defaultExtensionAccountsContext);
13
+ export const useExtensionAccounts = () => useContext(ExtensionAccountsContext);
14
+ export const ExtensionAccountsProvider = ({ children, network, dappName, activeAccount, setActiveAccount, onExtensionEnabled, }) => {
15
+ const { handleImportExtension } = useImportExtension();
16
+ const { extensionsStatus, setExtensionStatus, removeExtensionStatus, checkingInjectedWeb3, extensionHasFeature, } = useExtensions();
17
+ const [extensionAccounts, setExtensionAccounts] = useState([]);
18
+ const extensionAccountsRef = useRef(extensionAccounts);
19
+ const [extensionAccountsSynced, setExtensionAccountsSynced] = useState("unsynced");
20
+ const [extensionsInitialised, setExtensionsInitialised] = useState([]);
21
+ const extensionsInitialisedRef = useRef(extensionsInitialised);
22
+ const unsubs = useRef({});
23
+ const maybeSetActiveAccount = (address) => {
81
24
  if (typeof setActiveAccount === "function") {
82
- setActiveAccount(address !== null && address !== void 0 ? address : null);
25
+ setActiveAccount(address ?? null);
83
26
  }
84
27
  };
85
- var maybeOnExtensionEnabled = function (id) {
28
+ const maybeOnExtensionEnabled = (id) => {
86
29
  if (typeof onExtensionEnabled === "function") {
87
30
  onExtensionEnabled(id);
88
31
  }
89
32
  };
90
- var connectToAccount = function (account) {
91
- var _a;
92
- maybeSetActiveAccount((_a = account === null || account === void 0 ? void 0 : account.address) !== null && _a !== void 0 ? _a : null);
33
+ const connectToAccount = (account) => {
34
+ maybeSetActiveAccount(account?.address ?? null);
93
35
  };
94
- var connectActiveExtensions = function () { return __awaiter(void 0, void 0, void 0, function () {
95
- var extensionIds, rawExtensions, enableResults, _a, _b, _c, connectedExtensions, extensionsWithError, initialAccounts, activeAccountInInitial, handleAccounts, _loop_1, _i, _d, _e, id, extension;
96
- return __generator(this, function (_f) {
97
- switch (_f.label) {
98
- case 0:
99
- extensionIds = Object.keys(extensionsStatus);
100
- if (!extensionIds.length) {
101
- return [2 ];
102
- }
103
- return [4 , handleExtensionAdapters(extensionIds)];
104
- case 1:
105
- _f.sent();
106
- rawExtensions = Extensions.getFromIds(extensionIds);
107
- _b = (_a = Extensions).formatEnabled;
108
- _c = [rawExtensions];
109
- return [4 , Extensions.enable(rawExtensions, dappName)];
110
- case 2:
111
- enableResults = _b.apply(_a, _c.concat([_f.sent()]));
112
- connectedExtensions = Extensions.connected(enableResults);
113
- extensionsWithError = Extensions.withError(enableResults);
114
- Array.from(connectedExtensions.keys()).forEach(function (id) {
115
- return Extensions.addToLocal(id);
116
- });
117
- return [4 , Extensions.getAllAccounts(connectedExtensions)];
118
- case 3:
119
- initialAccounts = _f.sent();
120
- activeAccountInInitial = initialAccounts.find(function (_a) {
121
- var address = _a.address;
122
- return address === getActiveAccountLocal(network);
123
- });
124
- Array.from(extensionsWithError.entries()).forEach(function (_a) {
125
- var id = _a[0], state = _a[1];
126
- handleExtensionError(id, state.error);
127
- });
128
- Array.from(connectedExtensions.keys()).forEach(function (id) {
129
- setExtensionStatus(id, "connected");
130
- updateInitialisedExtensions(id);
131
- });
132
- updateExtensionAccounts({ add: initialAccounts, remove: [] });
133
- if (activeAccountInInitial) {
134
- connectActiveExtensionAccount(activeAccountInInitial, connectToAccount);
135
- }
136
- handleAccounts = function (extensionId, accounts, signer) {
137
- var _a = handleImportExtension(extensionId, extensionAccountsRef.current, signer, accounts, network), newAccounts = _a.newAccounts, accountsToRemove = _a.meta.accountsToRemove;
138
- updateExtensionAccounts({ add: newAccounts, remove: accountsToRemove });
139
- };
140
- _loop_1 = function (id, extension) {
141
- if (extensionHasFeature(id, "subscribeAccounts")) {
142
- var unsub = extension.accounts.subscribe(function (accounts) {
143
- handleAccounts(id, accounts || [], extension.signer);
144
- });
145
- addToUnsubscribe(id, unsub);
146
- }
147
- };
148
- for (_i = 0, _d = Array.from(connectedExtensions.entries()); _i < _d.length; _i++) {
149
- _e = _d[_i], id = _e[0], extension = _e[1].extension;
150
- _loop_1(id, extension);
151
- }
152
- return [2 ];
153
- }
36
+ const connectActiveExtensions = async () => {
37
+ const extensionIds = Object.keys(extensionsStatus);
38
+ if (!extensionIds.length) {
39
+ return;
40
+ }
41
+ await handleExtensionAdapters(extensionIds);
42
+ const rawExtensions = Extensions.getFromIds(extensionIds);
43
+ const enableResults = Extensions.formatEnabled(rawExtensions, await Extensions.enable(rawExtensions, dappName));
44
+ const connectedExtensions = Extensions.connected(enableResults);
45
+ const extensionsWithError = Extensions.withError(enableResults);
46
+ Array.from(connectedExtensions.keys()).forEach((id) => Extensions.addToLocal(id));
47
+ const initialAccounts = await Extensions.getAllAccounts(connectedExtensions);
48
+ const activeAccountInInitial = initialAccounts.find(({ address }) => address === getActiveAccountLocal(network));
49
+ Array.from(extensionsWithError.entries()).forEach(([id, state]) => {
50
+ handleExtensionError(id, state.error);
51
+ });
52
+ Array.from(connectedExtensions.keys()).forEach((id) => {
53
+ setExtensionStatus(id, "connected");
54
+ updateInitialisedExtensions(id);
154
55
  });
155
- }); };
156
- var connectExtensionAccounts = function (id) { return __awaiter(void 0, void 0, void 0, function () {
157
- var extensionIds, exists, enable, extension_1, handleAccounts_1, accounts, unsub, err_1;
158
- return __generator(this, function (_a) {
159
- switch (_a.label) {
160
- case 0:
161
- extensionIds = Object.keys(extensionsStatus);
162
- exists = extensionIds.find(function (key) { return key === id; }) || undefined;
163
- if (!!exists) return [3 , 1];
164
- updateInitialisedExtensions("unknown_extension_".concat(extensionsInitialisedRef.current.length + 1));
165
- return [3 , 10];
166
- case 1:
167
- return [4 , handleExtensionAdapters([id])];
168
- case 2:
169
- _a.sent();
170
- _a.label = 3;
171
- case 3:
172
- _a.trys.push([3, 9, , 10]);
173
- enable = window.injectedWeb3[id].enable;
174
- return [4 , enable(dappName)];
175
- case 4:
176
- extension_1 = _a.sent();
177
- if (!(extension_1 !== undefined)) return [3 , 8];
178
- handleAccounts_1 = function (accounts) {
179
- var _a = handleImportExtension(id, extensionAccountsRef.current, extension_1.signer, accounts, network), newAccounts = _a.newAccounts, _b = _a.meta, removedActiveAccount = _b.removedActiveAccount, accountsToRemove = _b.accountsToRemove;
56
+ updateExtensionAccounts({ add: initialAccounts, remove: [] });
57
+ if (activeAccountInInitial) {
58
+ connectActiveExtensionAccount(activeAccountInInitial, connectToAccount);
59
+ }
60
+ const handleAccounts = (extensionId, accounts, signer) => {
61
+ const { newAccounts, meta: { accountsToRemove }, } = handleImportExtension(extensionId, extensionAccountsRef.current, signer, accounts, network);
62
+ updateExtensionAccounts({ add: newAccounts, remove: accountsToRemove });
63
+ };
64
+ for (const [id, { extension }] of Array.from(connectedExtensions.entries())) {
65
+ if (extensionHasFeature(id, "subscribeAccounts")) {
66
+ const unsub = extension.accounts.subscribe((accounts) => {
67
+ handleAccounts(id, accounts || [], extension.signer);
68
+ });
69
+ addToUnsubscribe(id, unsub);
70
+ }
71
+ }
72
+ };
73
+ const connectExtensionAccounts = async (id) => {
74
+ const extensionIds = Object.keys(extensionsStatus);
75
+ const exists = extensionIds.find((key) => key === id) || undefined;
76
+ if (!exists) {
77
+ updateInitialisedExtensions(`unknown_extension_${extensionsInitialisedRef.current.length + 1}`);
78
+ }
79
+ else {
80
+ await handleExtensionAdapters([id]);
81
+ try {
82
+ const { enable } = window.injectedWeb3[id];
83
+ const extension = await enable(dappName);
84
+ if (extension !== undefined) {
85
+ const handleAccounts = (accounts) => {
86
+ const { newAccounts, meta: { removedActiveAccount, accountsToRemove }, } = handleImportExtension(id, extensionAccountsRef.current, extension.signer, accounts, network);
180
87
  if (!activeAccount) {
181
- var activeExtensionAccount = getActiveExtensionAccount(network, newAccounts);
182
- if ((activeExtensionAccount === null || activeExtensionAccount === void 0 ? void 0 : activeExtensionAccount.address) !== removedActiveAccount &&
88
+ const activeExtensionAccount = getActiveExtensionAccount(network, newAccounts);
89
+ if (activeExtensionAccount?.address !== removedActiveAccount &&
183
90
  removedActiveAccount !== null) {
184
91
  connectActiveExtensionAccount(activeExtensionAccount, connectToAccount);
185
92
  }
@@ -193,29 +100,26 @@ export var ExtensionAccountsProvider = function (_a) {
193
100
  Extensions.addToLocal(id);
194
101
  maybeOnExtensionEnabled(id);
195
102
  setExtensionStatus(id, "connected");
196
- if (!!extensionHasFeature(id, "subscribeAccounts")) return [3 , 6];
197
- return [4 , extension_1.accounts.get()];
198
- case 5:
199
- accounts = _a.sent();
200
- handleAccounts_1(accounts);
201
- return [3 , 7];
202
- case 6:
203
- unsub = extension_1.accounts.subscribe(function (accounts) {
204
- handleAccounts_1(accounts || []);
205
- });
206
- addToUnsubscribe(id, unsub);
207
- _a.label = 7;
208
- case 7: return [2 , true];
209
- case 8: return [3 , 10];
210
- case 9:
211
- err_1 = _a.sent();
212
- handleExtensionError(id, String(err_1));
213
- return [3 , 10];
214
- case 10: return [2 , false];
103
+ if (!extensionHasFeature(id, "subscribeAccounts")) {
104
+ const accounts = await extension.accounts.get();
105
+ handleAccounts(accounts);
106
+ }
107
+ else {
108
+ const unsub = extension.accounts.subscribe((accounts) => {
109
+ handleAccounts(accounts || []);
110
+ });
111
+ addToUnsubscribe(id, unsub);
112
+ }
113
+ return true;
114
+ }
215
115
  }
216
- });
217
- }); };
218
- var handleExtensionError = function (id, err) {
116
+ catch (err) {
117
+ handleExtensionError(id, String(err));
118
+ }
119
+ }
120
+ return false;
121
+ };
122
+ const handleExtensionError = (id, err) => {
219
123
  if (err.startsWith("Error")) {
220
124
  Extensions.removeFromLocal(id);
221
125
  if (err.substring(0, 17) === "NotInstalledError") {
@@ -227,118 +131,97 @@ export var ExtensionAccountsProvider = function (_a) {
227
131
  }
228
132
  updateInitialisedExtensions(id);
229
133
  };
230
- var handleExtensionAdapters = function (extensionIds) { return __awaiter(void 0, void 0, void 0, function () {
231
- var e_1;
232
- return __generator(this, function (_a) {
233
- switch (_a.label) {
234
- case 0:
235
- _a.trys.push([0, 3, , 4]);
236
- if (!extensionIds.find(function (id) { return id === "metamask-polkadot-snap"; })) return [3 , 2];
237
- return [4 , initPolkadotSnap({
238
- networkName: network,
239
- addressPrefix: DEFAULT_SS58,
240
- })];
241
- case 1:
242
- _a.sent();
243
- _a.label = 2;
244
- case 2: return [3 , 4];
245
- case 3:
246
- e_1 = _a.sent();
247
- return [3 , 4];
248
- case 4: return [2 ];
134
+ const handleExtensionAdapters = async (extensionIds) => {
135
+ try {
136
+ if (extensionIds.find((id) => id === "metamask-polkadot-snap")) {
137
+ await initPolkadotSnap({
138
+ networkName: network,
139
+ addressPrefix: DEFAULT_SS58,
140
+ });
249
141
  }
250
- });
251
- }); };
252
- var updateInitialisedExtensions = function (id) {
142
+ }
143
+ catch (e) {
144
+ }
145
+ };
146
+ const updateInitialisedExtensions = (id) => {
253
147
  if (!extensionsInitialisedRef.current.includes(id)) {
254
- setStateWithRef(__spreadArray([], extensionsInitialisedRef.current, true).concat(id), setExtensionsInitialised, extensionsInitialisedRef);
148
+ setStateWithRef([...extensionsInitialisedRef.current].concat(id), setExtensionsInitialised, extensionsInitialisedRef);
255
149
  }
256
150
  };
257
- var updateExtensionAccounts = function (_a) {
258
- var add = _a.add, remove = _a.remove;
259
- var newAccounts = __spreadArray([], extensionAccountsRef.current, true).concat(add)
260
- .filter(function (a) { return remove.find(function (s) { return s.address === a.address; }) === undefined; });
151
+ const updateExtensionAccounts = ({ add, remove, }) => {
152
+ const newAccounts = [...extensionAccountsRef.current]
153
+ .concat(add)
154
+ .filter((a) => remove.find((s) => s.address === a.address) === undefined);
261
155
  if (remove.length) {
262
156
  unsubAccounts(remove);
263
157
  if (activeAccount &&
264
- remove.find(function (_a) {
265
- var address = _a.address;
266
- return address === activeAccount;
267
- }) !== undefined) {
158
+ remove.find(({ address }) => address === activeAccount) !== undefined) {
268
159
  maybeSetActiveAccount(null);
269
160
  }
270
161
  }
271
162
  setStateWithRef(newAccounts, setExtensionAccounts, extensionAccountsRef);
272
163
  };
273
- var addToUnsubscribe = function (id, unsub) {
164
+ const addToUnsubscribe = (id, unsub) => {
274
165
  unsubs.current[id] = unsub;
275
166
  };
276
- var unsubAccounts = function (accounts) {
167
+ const unsubAccounts = (accounts) => {
277
168
  if (accounts.length) {
278
- var _loop_2 = function (address) {
279
- if (extensionAccountsRef.current.find(function (a) { return a.address === address; })) {
280
- var unsub = unsubs.current[address];
169
+ for (const { address } of accounts) {
170
+ if (extensionAccountsRef.current.find((a) => a.address === address)) {
171
+ const unsub = unsubs.current[address];
281
172
  if (unsub) {
282
173
  unsub();
283
174
  delete unsubs.current[address];
284
175
  }
285
176
  }
286
- };
287
- for (var _i = 0, accounts_1 = accounts; _i < accounts_1.length; _i++) {
288
- var address = accounts_1[_i].address;
289
- _loop_2(address);
290
177
  }
291
178
  }
292
179
  };
293
- var unsubscribe = function () {
294
- Object.values(unsubs.current).forEach(function (unsub) {
180
+ const unsubscribe = () => {
181
+ Object.values(unsubs.current).forEach((unsub) => {
295
182
  unsub();
296
183
  });
297
184
  };
298
- var handleSyncExtensionAccounts = function () { return __awaiter(void 0, void 0, void 0, function () {
299
- var localExtensions;
300
- return __generator(this, function (_a) {
301
- switch (_a.label) {
302
- case 0:
303
- if (!(!checkingInjectedWeb3 && extensionAccountsSynced === "unsynced")) return [3 , 3];
304
- unsubscribe();
305
- setStateWithRef([], setExtensionAccounts, extensionAccountsRef);
306
- setStateWithRef([], setExtensionsInitialised, extensionsInitialisedRef);
307
- if (!Object.keys(extensionsStatus).length) return [3 , 2];
308
- localExtensions = localStorageOrDefault("active_extensions", [], true);
309
- if (!(Object.keys(extensionsStatus).length && localExtensions.length)) return [3 , 2];
185
+ const handleSyncExtensionAccounts = async () => {
186
+ if (!checkingInjectedWeb3 && extensionAccountsSynced === "unsynced") {
187
+ unsubscribe();
188
+ setStateWithRef([], setExtensionAccounts, extensionAccountsRef);
189
+ setStateWithRef([], setExtensionsInitialised, extensionsInitialisedRef);
190
+ if (Object.keys(extensionsStatus).length) {
191
+ const localExtensions = localStorageOrDefault(`active_extensions`, [], true);
192
+ if (Object.keys(extensionsStatus).length && localExtensions.length) {
310
193
  setExtensionAccountsSynced("syncing");
311
- return [4 , connectActiveExtensions()];
312
- case 1:
313
- _a.sent();
314
- _a.label = 2;
315
- case 2:
316
- setExtensionAccountsSynced("synced");
317
- _a.label = 3;
318
- case 3: return [2 ];
194
+ await connectActiveExtensions();
195
+ }
319
196
  }
320
- });
321
- }); };
322
- var getExtensionAccounts = function (ss58) {
323
- var keyring = new Keyring();
197
+ setExtensionAccountsSynced("synced");
198
+ }
199
+ };
200
+ const getExtensionAccounts = (ss58) => {
201
+ const keyring = new Keyring();
324
202
  keyring.setSS58Format(ss58);
325
- return extensionAccounts.map(function (account) { return (__assign(__assign({}, account), { address: keyring.addFromAddress(account.address).address })); });
203
+ return extensionAccounts.map((account) => ({
204
+ ...account,
205
+ address: keyring.addFromAddress(account.address).address,
206
+ }));
326
207
  };
327
- useEffect(function () {
208
+ useEffect(() => {
328
209
  handleSyncExtensionAccounts();
329
- return function () { return unsubscribe(); };
210
+ return () => unsubscribe();
330
211
  }, [extensionsStatus, checkingInjectedWeb3, extensionAccountsSynced]);
331
- useEffectIgnoreInitial(function () {
212
+ useEffectIgnoreInitial(() => {
332
213
  if (!checkingInjectedWeb3 &&
333
214
  extensionsInitialised.length === Object.keys(extensionsStatus).length) {
334
215
  setExtensionAccountsSynced("synced");
335
216
  }
336
217
  }, [checkingInjectedWeb3, extensionsInitialised]);
337
218
  return (_jsx(ExtensionAccountsContext.Provider, { value: {
338
- connectExtensionAccounts: connectExtensionAccounts,
339
- extensionAccountsSynced: extensionAccountsSynced,
340
- getExtensionAccounts: getExtensionAccounts,
219
+ connectExtensionAccounts,
220
+ extensionAccountsSynced,
221
+ getExtensionAccounts,
341
222
  }, children: children }));
342
223
  };
343
224
 
225
+ //# sourceMappingURL=index.js.map
344
226
 
227
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ExtensionAccountsProvider/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { createContext, useContext, useEffect, useRef, useState } from \"react\";\nimport { localStorageOrDefault, setStateWithRef } from \"@w3ux/utils\";\nimport { DEFAULT_SS58, defaultExtensionAccountsContext } from \"./defaults\";\nimport { ImportedAccount } from \"../types\";\nimport {\n ExtensionAccount,\n ExtensionInterface,\n} from \"../ExtensionsProvider/types\";\nimport {\n ExtensionAccountsContextInterface,\n ExtensionAccountsProviderProps,\n} from \"./types\";\nimport { useImportExtension } from \"./useImportExtension\";\nimport { initPolkadotSnap } from \"./snap\";\nimport { SnapNetworks } from \"@chainsafe/metamask-polkadot-types\";\nimport { Extensions } from \"./Extensions\";\nimport {\n connectActiveExtensionAccount,\n getActiveAccountLocal,\n getActiveExtensionAccount,\n} from \"./utils\";\nimport { useExtensions } from \"../ExtensionsProvider\";\nimport { useEffectIgnoreInitial } from \"@w3ux/hooks\";\nimport Keyring from \"@polkadot/keyring\";\nimport { AnyFunction, Sync, VoidFn } from \"@w3ux/types\";\n\nexport const ExtensionAccountsContext =\n createContext<ExtensionAccountsContextInterface>(\n defaultExtensionAccountsContext\n );\n\nexport const useExtensionAccounts = () => useContext(ExtensionAccountsContext);\n\nexport const ExtensionAccountsProvider = ({\n children,\n network,\n dappName,\n activeAccount,\n setActiveAccount,\n onExtensionEnabled,\n}: ExtensionAccountsProviderProps) => {\n const { handleImportExtension } = useImportExtension();\n\n const {\n extensionsStatus,\n setExtensionStatus,\n removeExtensionStatus,\n checkingInjectedWeb3,\n extensionHasFeature,\n } = useExtensions();\n\n // Store connected extension accounts.\n const [extensionAccounts, setExtensionAccounts] = useState<ImportedAccount[]>(\n []\n );\n const extensionAccountsRef = useRef(extensionAccounts);\n\n // Store whether extension accounts have been synced.\n const [extensionAccountsSynced, setExtensionAccountsSynced] =\n useState<Sync>(\"unsynced\");\n\n // Store extensions whose account subscriptions have been initialised.\n const [extensionsInitialised, setExtensionsInitialised] = useState<string[]>(\n []\n );\n const extensionsInitialisedRef = useRef(extensionsInitialised);\n\n // Store unsubscribe handlers for connected extensions.\n const unsubs = useRef<Record<string, VoidFn>>({});\n\n // Helper for setting active account. Ignores if not a valid function.\n const maybeSetActiveAccount = (address: string) => {\n if (typeof setActiveAccount === \"function\") {\n setActiveAccount(address ?? null);\n }\n };\n\n // Helper for calling extension enabled callback. Ignores if not a valid function.\n const maybeOnExtensionEnabled = (id: string) => {\n if (typeof onExtensionEnabled === \"function\") {\n onExtensionEnabled(id);\n }\n };\n\n const connectToAccount = (account: ImportedAccount | null) => {\n maybeSetActiveAccount(account?.address ?? null);\n };\n\n // connectActiveExtensions\n //\n // Connects to extensions that already have been connected to and stored in localStorage. Loop\n // through extensions and connect to accounts. If `activeAccount` exists locally, we wait until\n // all extensions are looped before connecting to it; there is no guarantee it still exists - must\n // explicitly find it.\n const connectActiveExtensions = async () => {\n const extensionIds = Object.keys(extensionsStatus);\n if (!extensionIds.length) {\n return;\n }\n\n // Pre-connect: Inject extensions into `injectedWeb3` if not already injected.\n await handleExtensionAdapters(extensionIds);\n\n // Iterate previously connected extensions and retreive valid `enable` functions.\n // ------------------------------------------------------------------------------\n const rawExtensions = Extensions.getFromIds(extensionIds);\n\n // Attempt to connect to extensions via `enable` and format the results.\n const enableResults = Extensions.formatEnabled(\n rawExtensions,\n await Extensions.enable(rawExtensions, dappName)\n );\n\n // Retrieve the resulting connected extensions only.\n const connectedExtensions = Extensions.connected(enableResults);\n\n // Retrieve extensions that failed to connect.\n const extensionsWithError = Extensions.withError(enableResults);\n\n // Add connected extensions to local storage.\n Array.from(connectedExtensions.keys()).forEach((id) =>\n Extensions.addToLocal(id)\n );\n\n // Initial fetch of extension accounts to populate accounts & extensions state.\n // ----------------------------------------------------------------------------\n\n // Get full list of imported accounts.\n const initialAccounts =\n await Extensions.getAllAccounts(connectedExtensions);\n\n // Connect to the active account if found in initial accounts.\n const activeAccountInInitial = initialAccounts.find(\n ({ address }) => address === getActiveAccountLocal(network)\n );\n\n // Perform all initial state updates.\n // ----------------------------------\n\n Array.from(extensionsWithError.entries()).forEach(([id, state]) => {\n handleExtensionError(id, state.error);\n });\n\n Array.from(connectedExtensions.keys()).forEach((id) => {\n setExtensionStatus(id, \"connected\");\n updateInitialisedExtensions(id);\n });\n\n updateExtensionAccounts({ add: initialAccounts, remove: [] });\n\n if (activeAccountInInitial) {\n connectActiveExtensionAccount(activeAccountInInitial, connectToAccount);\n }\n\n // Initiate account subscriptions for connected extensions.\n // --------------------------------------------------------\n\n // Handler function for each extension accounts subscription.\n const handleAccounts = (\n extensionId: string,\n accounts: ExtensionAccount[],\n signer: AnyFunction\n ) => {\n const {\n newAccounts,\n meta: { accountsToRemove },\n } = handleImportExtension(\n extensionId,\n extensionAccountsRef.current,\n signer,\n accounts,\n network\n );\n\n // Update added and removed accounts.\n updateExtensionAccounts({ add: newAccounts, remove: accountsToRemove });\n };\n\n // Try to subscribe to accounts for each connected extension.\n for (const [id, { extension }] of Array.from(\n connectedExtensions.entries()\n )) {\n // If enabled, subscribe to accounts.\n if (extensionHasFeature(id, \"subscribeAccounts\")) {\n const unsub = extension.accounts.subscribe((accounts) => {\n handleAccounts(id, accounts || [], extension.signer);\n });\n\n // Add unsub to context ref.\n addToUnsubscribe(id, unsub);\n }\n }\n };\n\n // connectExtensionAccounts\n //\n // Similar to the above but only connects to a single extension. This is invoked by the user by\n // clicking on an extension. If activeAccount is not found here, it is simply ignored.\n const connectExtensionAccounts = async (id: string): Promise<boolean> => {\n const extensionIds = Object.keys(extensionsStatus);\n const exists = extensionIds.find((key) => key === id) || undefined;\n\n if (!exists) {\n updateInitialisedExtensions(\n `unknown_extension_${extensionsInitialisedRef.current.length + 1}`\n );\n } else {\n // Pre-connect: Inject into `injectedWeb3` if the provided extension is not already injected.\n await handleExtensionAdapters([id]);\n\n try {\n // Attempt to get extension `enable` property.\n const { enable } = window.injectedWeb3[id];\n\n // Summons extension popup.\n const extension: ExtensionInterface = await enable(dappName);\n\n // Continue if `enable` succeeded, and if the current network is supported.\n if (extension !== undefined) {\n // Handler for new accounts.\n const handleAccounts = (accounts: ExtensionAccount[]) => {\n const {\n newAccounts,\n meta: { removedActiveAccount, accountsToRemove },\n } = handleImportExtension(\n id,\n extensionAccountsRef.current,\n extension.signer,\n accounts,\n network\n );\n // Set active account for network if not yet set.\n if (!activeAccount) {\n const activeExtensionAccount = getActiveExtensionAccount(\n network,\n newAccounts\n );\n if (\n activeExtensionAccount?.address !== removedActiveAccount &&\n removedActiveAccount !== null\n ) {\n connectActiveExtensionAccount(\n activeExtensionAccount,\n connectToAccount\n );\n }\n }\n\n // Update extension accounts state.\n updateExtensionAccounts({\n add: newAccounts,\n remove: accountsToRemove,\n });\n\n // Update initialised extensions.\n updateInitialisedExtensions(id);\n };\n\n // Call optional `onExtensionEnabled` callback.\n Extensions.addToLocal(id);\n\n maybeOnExtensionEnabled(id);\n setExtensionStatus(id, \"connected\");\n\n // If account subscriptions are not supported, simply get the account(s) from the extension. Otherwise, subscribe to accounts.\n if (!extensionHasFeature(id, \"subscribeAccounts\")) {\n const accounts = await extension.accounts.get();\n handleAccounts(accounts);\n } else {\n const unsub = extension.accounts.subscribe((accounts) => {\n handleAccounts(accounts || []);\n });\n addToUnsubscribe(id, unsub);\n }\n return true;\n }\n } catch (err) {\n handleExtensionError(id, String(err));\n }\n }\n return false;\n };\n\n // Handle errors when communiating with extensions.\n const handleExtensionError = (id: string, err: string) => {\n // if not general error (maybe enabled but no accounts trust app).\n if (err.startsWith(\"Error\")) {\n // remove extension from local `active_extensions`.\n Extensions.removeFromLocal(id);\n\n // extension not found (does not exist).\n if (err.substring(0, 17) === \"NotInstalledError\") {\n removeExtensionStatus(id);\n } else {\n // declare extension as no imported accounts authenticated.\n setExtensionStatus(id, \"not_authenticated\");\n }\n }\n // mark extension as initialised.\n updateInitialisedExtensions(id);\n };\n\n // Handle adaptors for extensions that are not supported by `injectedWeb3`.\n const handleExtensionAdapters = async (extensionIds: string[]) => {\n try {\n // Connect to Metamask Polkadot Snap and inject into `injectedWeb3` if avaialble.\n if (extensionIds.find((id) => id === \"metamask-polkadot-snap\")) {\n await initPolkadotSnap({\n networkName: network as SnapNetworks,\n addressPrefix: DEFAULT_SS58,\n });\n }\n } catch (e) {\n // Provided network is not supported, or something else went wrong with initialisation.\n // Silently fail.\n }\n };\n\n // Update initialised extensions.\n const updateInitialisedExtensions = (id: string) => {\n if (!extensionsInitialisedRef.current.includes(id)) {\n setStateWithRef(\n [...extensionsInitialisedRef.current].concat(id),\n setExtensionsInitialised,\n extensionsInitialisedRef\n );\n }\n };\n\n // Add an extension account to context state.\n const updateExtensionAccounts = ({\n add,\n remove,\n }: {\n add: ExtensionAccount[];\n remove: ExtensionAccount[];\n }) => {\n // Add new accounts and remove any removed accounts.\n const newAccounts = [...extensionAccountsRef.current]\n .concat(add)\n .filter((a) => remove.find((s) => s.address === a.address) === undefined);\n\n if (remove.length) {\n // Unsubscribe from removed accounts.\n unsubAccounts(remove);\n\n // Remove active account if it is being forgotten.\n if (\n activeAccount &&\n remove.find(({ address }) => address === activeAccount) !== undefined\n ) {\n maybeSetActiveAccount(null);\n }\n }\n\n setStateWithRef(newAccounts, setExtensionAccounts, extensionAccountsRef);\n };\n\n // Add an extension id to unsubscribe state.\n const addToUnsubscribe = (id: string, unsub: VoidFn) => {\n unsubs.current[id] = unsub;\n };\n\n // Handle unsubscribing of an removed extension accounts.\n const unsubAccounts = (accounts: ImportedAccount[]) => {\n // Unsubscribe and remove unsub from context ref.\n if (accounts.length) {\n for (const { address } of accounts) {\n if (extensionAccountsRef.current.find((a) => a.address === address)) {\n const unsub = unsubs.current[address];\n if (unsub) {\n unsub();\n delete unsubs.current[address];\n }\n }\n }\n }\n };\n\n // Unsubscrbe all account subscriptions.\n const unsubscribe = () => {\n Object.values(unsubs.current).forEach((unsub) => {\n unsub();\n });\n };\n\n const handleSyncExtensionAccounts = async () => {\n // Wait for injectedWeb3 check to finish before starting account import process.\n if (!checkingInjectedWeb3 && extensionAccountsSynced === \"unsynced\") {\n // Unsubscribe from all accounts and reset state\n unsubscribe();\n setStateWithRef([], setExtensionAccounts, extensionAccountsRef);\n setStateWithRef([], setExtensionsInitialised, extensionsInitialisedRef);\n // If extensions have been fetched, get accounts if extensions exist and local extensions\n // exist (previously connected).\n if (Object.keys(extensionsStatus).length) {\n // get active extensions\n const localExtensions = localStorageOrDefault(\n `active_extensions`,\n [],\n true\n );\n if (Object.keys(extensionsStatus).length && localExtensions.length) {\n setExtensionAccountsSynced(\"syncing\");\n await connectActiveExtensions();\n }\n }\n\n // Syncing is complete. Also covers case where no extensions were found.\n setExtensionAccountsSynced(\"synced\");\n }\n };\n\n // Get extension accounts based on the provided ss58 prefix.\n const getExtensionAccounts = (ss58: number) => {\n // NOTE: This is a temporary solution until we have a light weight solution to reformat\n // addresses.\n const keyring = new Keyring();\n keyring.setSS58Format(ss58);\n\n return extensionAccounts.map((account) => ({\n ...account,\n address: keyring.addFromAddress(account.address).address,\n }));\n };\n\n // Re-sync extensions accounts on `unsynced`.\n useEffect(() => {\n handleSyncExtensionAccounts();\n\n return () => unsubscribe();\n }, [extensionsStatus, checkingInjectedWeb3, extensionAccountsSynced]);\n\n // Once initialised extensions equal total extensions present in `injectedWeb3`, mark extensions\n // as fetched.\n useEffectIgnoreInitial(() => {\n if (\n !checkingInjectedWeb3 &&\n extensionsInitialised.length === Object.keys(extensionsStatus).length\n ) {\n setExtensionAccountsSynced(\"synced\");\n }\n }, [checkingInjectedWeb3, extensionsInitialised]);\n\n return (\n <ExtensionAccountsContext.Provider\n value={{\n connectExtensionAccounts,\n extensionAccountsSynced,\n getExtensionAccounts,\n }}\n >\n {children}\n </ExtensionAccountsContext.Provider>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/ExtensionAccountsProvider/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { createContext, useContext, useEffect, useRef, useState } from \"react\";\nimport { localStorageOrDefault, setStateWithRef } from \"@w3ux/utils\";\nimport { DEFAULT_SS58, defaultExtensionAccountsContext } from \"./defaults\";\nimport { ImportedAccount } from \"../types\";\nimport {\n ExtensionAccount,\n ExtensionInterface,\n} from \"../ExtensionsProvider/types\";\nimport {\n ExtensionAccountsContextInterface,\n ExtensionAccountsProviderProps,\n} from \"./types\";\nimport { useImportExtension } from \"./useImportExtension\";\nimport { initPolkadotSnap } from \"./snap\";\nimport { SnapNetworks } from \"@chainsafe/metamask-polkadot-types\";\nimport { Extensions } from \"./Extensions\";\nimport {\n connectActiveExtensionAccount,\n getActiveAccountLocal,\n getActiveExtensionAccount,\n} from \"./utils\";\nimport { useExtensions } from \"../ExtensionsProvider\";\nimport { useEffectIgnoreInitial } from \"@w3ux/hooks\";\nimport Keyring from \"@polkadot/keyring\";\nimport { AnyFunction, Sync, VoidFn } from \"@w3ux/types\";\n\nexport const ExtensionAccountsContext =\n createContext<ExtensionAccountsContextInterface>(\n defaultExtensionAccountsContext\n );\n\nexport const useExtensionAccounts = () => useContext(ExtensionAccountsContext);\n\nexport const ExtensionAccountsProvider = ({\n children,\n network,\n dappName,\n activeAccount,\n setActiveAccount,\n onExtensionEnabled,\n}: ExtensionAccountsProviderProps) => {\n const { handleImportExtension } = useImportExtension();\n\n const {\n extensionsStatus,\n setExtensionStatus,\n removeExtensionStatus,\n checkingInjectedWeb3,\n extensionHasFeature,\n } = useExtensions();\n\n // Store connected extension accounts.\n const [extensionAccounts, setExtensionAccounts] = useState<ImportedAccount[]>(\n []\n );\n const extensionAccountsRef = useRef(extensionAccounts);\n\n // Store whether extension accounts have been synced.\n const [extensionAccountsSynced, setExtensionAccountsSynced] =\n useState<Sync>(\"unsynced\");\n\n // Store extensions whose account subscriptions have been initialised.\n const [extensionsInitialised, setExtensionsInitialised] = useState<string[]>(\n []\n );\n const extensionsInitialisedRef = useRef(extensionsInitialised);\n\n // Store unsubscribe handlers for connected extensions.\n const unsubs = useRef<Record<string, VoidFn>>({});\n\n // Helper for setting active account. Ignores if not a valid function.\n const maybeSetActiveAccount = (address: string) => {\n if (typeof setActiveAccount === \"function\") {\n setActiveAccount(address ?? null);\n }\n };\n\n // Helper for calling extension enabled callback. Ignores if not a valid function.\n const maybeOnExtensionEnabled = (id: string) => {\n if (typeof onExtensionEnabled === \"function\") {\n onExtensionEnabled(id);\n }\n };\n\n const connectToAccount = (account: ImportedAccount | null) => {\n maybeSetActiveAccount(account?.address ?? null);\n };\n\n // connectActiveExtensions\n //\n // Connects to extensions that already have been connected to and stored in localStorage. Loop\n // through extensions and connect to accounts. If `activeAccount` exists locally, we wait until\n // all extensions are looped before connecting to it; there is no guarantee it still exists - must\n // explicitly find it.\n const connectActiveExtensions = async () => {\n const extensionIds = Object.keys(extensionsStatus);\n if (!extensionIds.length) {\n return;\n }\n\n // Pre-connect: Inject extensions into `injectedWeb3` if not already injected.\n await handleExtensionAdapters(extensionIds);\n\n // Iterate previously connected extensions and retreive valid `enable` functions.\n // ------------------------------------------------------------------------------\n const rawExtensions = Extensions.getFromIds(extensionIds);\n\n // Attempt to connect to extensions via `enable` and format the results.\n const enableResults = Extensions.formatEnabled(\n rawExtensions,\n await Extensions.enable(rawExtensions, dappName)\n );\n\n // Retrieve the resulting connected extensions only.\n const connectedExtensions = Extensions.connected(enableResults);\n\n // Retrieve extensions that failed to connect.\n const extensionsWithError = Extensions.withError(enableResults);\n\n // Add connected extensions to local storage.\n Array.from(connectedExtensions.keys()).forEach((id) =>\n Extensions.addToLocal(id)\n );\n\n // Initial fetch of extension accounts to populate accounts & extensions state.\n // ----------------------------------------------------------------------------\n\n // Get full list of imported accounts.\n const initialAccounts =\n await Extensions.getAllAccounts(connectedExtensions);\n\n // Connect to the active account if found in initial accounts.\n const activeAccountInInitial = initialAccounts.find(\n ({ address }) => address === getActiveAccountLocal(network)\n );\n\n // Perform all initial state updates.\n // ----------------------------------\n\n Array.from(extensionsWithError.entries()).forEach(([id, state]) => {\n handleExtensionError(id, state.error);\n });\n\n Array.from(connectedExtensions.keys()).forEach((id) => {\n setExtensionStatus(id, \"connected\");\n updateInitialisedExtensions(id);\n });\n\n updateExtensionAccounts({ add: initialAccounts, remove: [] });\n\n if (activeAccountInInitial) {\n connectActiveExtensionAccount(activeAccountInInitial, connectToAccount);\n }\n\n // Initiate account subscriptions for connected extensions.\n // --------------------------------------------------------\n\n // Handler function for each extension accounts subscription.\n const handleAccounts = (\n extensionId: string,\n accounts: ExtensionAccount[],\n signer: AnyFunction\n ) => {\n const {\n newAccounts,\n meta: { accountsToRemove },\n } = handleImportExtension(\n extensionId,\n extensionAccountsRef.current,\n signer,\n accounts,\n network\n );\n\n // Update added and removed accounts.\n updateExtensionAccounts({ add: newAccounts, remove: accountsToRemove });\n };\n\n // Try to subscribe to accounts for each connected extension.\n for (const [id, { extension }] of Array.from(\n connectedExtensions.entries()\n )) {\n // If enabled, subscribe to accounts.\n if (extensionHasFeature(id, \"subscribeAccounts\")) {\n const unsub = extension.accounts.subscribe((accounts) => {\n handleAccounts(id, accounts || [], extension.signer);\n });\n\n // Add unsub to context ref.\n addToUnsubscribe(id, unsub);\n }\n }\n };\n\n // connectExtensionAccounts\n //\n // Similar to the above but only connects to a single extension. This is invoked by the user by\n // clicking on an extension. If activeAccount is not found here, it is simply ignored.\n const connectExtensionAccounts = async (id: string): Promise<boolean> => {\n const extensionIds = Object.keys(extensionsStatus);\n const exists = extensionIds.find((key) => key === id) || undefined;\n\n if (!exists) {\n updateInitialisedExtensions(\n `unknown_extension_${extensionsInitialisedRef.current.length + 1}`\n );\n } else {\n // Pre-connect: Inject into `injectedWeb3` if the provided extension is not already injected.\n await handleExtensionAdapters([id]);\n\n try {\n // Attempt to get extension `enable` property.\n const { enable } = window.injectedWeb3[id];\n\n // Summons extension popup.\n const extension: ExtensionInterface = await enable(dappName);\n\n // Continue if `enable` succeeded, and if the current network is supported.\n if (extension !== undefined) {\n // Handler for new accounts.\n const handleAccounts = (accounts: ExtensionAccount[]) => {\n const {\n newAccounts,\n meta: { removedActiveAccount, accountsToRemove },\n } = handleImportExtension(\n id,\n extensionAccountsRef.current,\n extension.signer,\n accounts,\n network\n );\n // Set active account for network if not yet set.\n if (!activeAccount) {\n const activeExtensionAccount = getActiveExtensionAccount(\n network,\n newAccounts\n );\n if (\n activeExtensionAccount?.address !== removedActiveAccount &&\n removedActiveAccount !== null\n ) {\n connectActiveExtensionAccount(\n activeExtensionAccount,\n connectToAccount\n );\n }\n }\n\n // Update extension accounts state.\n updateExtensionAccounts({\n add: newAccounts,\n remove: accountsToRemove,\n });\n\n // Update initialised extensions.\n updateInitialisedExtensions(id);\n };\n\n // Call optional `onExtensionEnabled` callback.\n Extensions.addToLocal(id);\n\n maybeOnExtensionEnabled(id);\n setExtensionStatus(id, \"connected\");\n\n // If account subscriptions are not supported, simply get the account(s) from the extension. Otherwise, subscribe to accounts.\n if (!extensionHasFeature(id, \"subscribeAccounts\")) {\n const accounts = await extension.accounts.get();\n handleAccounts(accounts);\n } else {\n const unsub = extension.accounts.subscribe((accounts) => {\n handleAccounts(accounts || []);\n });\n addToUnsubscribe(id, unsub);\n }\n return true;\n }\n } catch (err) {\n handleExtensionError(id, String(err));\n }\n }\n return false;\n };\n\n // Handle errors when communiating with extensions.\n const handleExtensionError = (id: string, err: string) => {\n // if not general error (maybe enabled but no accounts trust app).\n if (err.startsWith(\"Error\")) {\n // remove extension from local `active_extensions`.\n Extensions.removeFromLocal(id);\n\n // extension not found (does not exist).\n if (err.substring(0, 17) === \"NotInstalledError\") {\n removeExtensionStatus(id);\n } else {\n // declare extension as no imported accounts authenticated.\n setExtensionStatus(id, \"not_authenticated\");\n }\n }\n // mark extension as initialised.\n updateInitialisedExtensions(id);\n };\n\n // Handle adaptors for extensions that are not supported by `injectedWeb3`.\n const handleExtensionAdapters = async (extensionIds: string[]) => {\n try {\n // Connect to Metamask Polkadot Snap and inject into `injectedWeb3` if avaialble.\n if (extensionIds.find((id) => id === \"metamask-polkadot-snap\")) {\n await initPolkadotSnap({\n networkName: network as SnapNetworks,\n addressPrefix: DEFAULT_SS58,\n });\n }\n } catch (e) {\n // Provided network is not supported, or something else went wrong with initialisation.\n // Silently fail.\n }\n };\n\n // Update initialised extensions.\n const updateInitialisedExtensions = (id: string) => {\n if (!extensionsInitialisedRef.current.includes(id)) {\n setStateWithRef(\n [...extensionsInitialisedRef.current].concat(id),\n setExtensionsInitialised,\n extensionsInitialisedRef\n );\n }\n };\n\n // Add an extension account to context state.\n const updateExtensionAccounts = ({\n add,\n remove,\n }: {\n add: ExtensionAccount[];\n remove: ExtensionAccount[];\n }) => {\n // Add new accounts and remove any removed accounts.\n const newAccounts = [...extensionAccountsRef.current]\n .concat(add)\n .filter((a) => remove.find((s) => s.address === a.address) === undefined);\n\n if (remove.length) {\n // Unsubscribe from removed accounts.\n unsubAccounts(remove);\n\n // Remove active account if it is being forgotten.\n if (\n activeAccount &&\n remove.find(({ address }) => address === activeAccount) !== undefined\n ) {\n maybeSetActiveAccount(null);\n }\n }\n\n setStateWithRef(newAccounts, setExtensionAccounts, extensionAccountsRef);\n };\n\n // Add an extension id to unsubscribe state.\n const addToUnsubscribe = (id: string, unsub: VoidFn) => {\n unsubs.current[id] = unsub;\n };\n\n // Handle unsubscribing of an removed extension accounts.\n const unsubAccounts = (accounts: ImportedAccount[]) => {\n // Unsubscribe and remove unsub from context ref.\n if (accounts.length) {\n for (const { address } of accounts) {\n if (extensionAccountsRef.current.find((a) => a.address === address)) {\n const unsub = unsubs.current[address];\n if (unsub) {\n unsub();\n delete unsubs.current[address];\n }\n }\n }\n }\n };\n\n // Unsubscrbe all account subscriptions.\n const unsubscribe = () => {\n Object.values(unsubs.current).forEach((unsub) => {\n unsub();\n });\n };\n\n const handleSyncExtensionAccounts = async () => {\n // Wait for injectedWeb3 check to finish before starting account import process.\n if (!checkingInjectedWeb3 && extensionAccountsSynced === \"unsynced\") {\n // Unsubscribe from all accounts and reset state\n unsubscribe();\n setStateWithRef([], setExtensionAccounts, extensionAccountsRef);\n setStateWithRef([], setExtensionsInitialised, extensionsInitialisedRef);\n // If extensions have been fetched, get accounts if extensions exist and local extensions\n // exist (previously connected).\n if (Object.keys(extensionsStatus).length) {\n // get active extensions\n const localExtensions = localStorageOrDefault(\n `active_extensions`,\n [],\n true\n );\n if (Object.keys(extensionsStatus).length && localExtensions.length) {\n setExtensionAccountsSynced(\"syncing\");\n await connectActiveExtensions();\n }\n }\n\n // Syncing is complete. Also covers case where no extensions were found.\n setExtensionAccountsSynced(\"synced\");\n }\n };\n\n // Get extension accounts based on the provided ss58 prefix.\n const getExtensionAccounts = (ss58: number) => {\n // NOTE: This is a temporary solution until we have a light weight solution to reformat\n // addresses.\n const keyring = new Keyring();\n keyring.setSS58Format(ss58);\n\n return extensionAccounts.map((account) => ({\n ...account,\n address: keyring.addFromAddress(account.address).address,\n }));\n };\n\n // Re-sync extensions accounts on `unsynced`.\n useEffect(() => {\n handleSyncExtensionAccounts();\n\n return () => unsubscribe();\n }, [extensionsStatus, checkingInjectedWeb3, extensionAccountsSynced]);\n\n // Once initialised extensions equal total extensions present in `injectedWeb3`, mark extensions\n // as fetched.\n useEffectIgnoreInitial(() => {\n if (\n !checkingInjectedWeb3 &&\n extensionsInitialised.length === Object.keys(extensionsStatus).length\n ) {\n setExtensionAccountsSynced(\"synced\");\n }\n }, [checkingInjectedWeb3, extensionsInitialised]);\n\n return (\n <ExtensionAccountsContext.Provider\n value={{\n connectExtensionAccounts,\n extensionAccountsSynced,\n getExtensionAccounts,\n }}\n >\n {children}\n </ExtensionAccountsContext.Provider>\n );\n};\n"]}