@aksumite/react-providers 1.0.0

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/index.mjs ADDED
@@ -0,0 +1,916 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __async = (__this, __arguments, generator) => {
21
+ return new Promise((resolve, reject) => {
22
+ var fulfilled = (value) => {
23
+ try {
24
+ step(generator.next(value));
25
+ } catch (e) {
26
+ reject(e);
27
+ }
28
+ };
29
+ var rejected = (value) => {
30
+ try {
31
+ step(generator.throw(value));
32
+ } catch (e) {
33
+ reject(e);
34
+ }
35
+ };
36
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
37
+ step((generator = generator.apply(__this, __arguments)).next());
38
+ });
39
+ };
40
+
41
+ // src/ExtensionAccountsProvider/provider.tsx
42
+ import { createContext as createContext2, useCallback as useCallback2, useEffect as useEffect2, useRef as useRef2, useState as useState2 } from "react";
43
+ import {
44
+ setStateWithRef as setStateWithRef2,
45
+ localStorageOrDefault as localStorageOrDefault2
46
+ } from "@aksumite/sdk-utils";
47
+ import { useEffectIgnoreInitial } from "@mitratrade/react-hooks";
48
+
49
+ // src/ExtensionsProvider/provider.tsx
50
+ import {
51
+ createContext,
52
+ useCallback,
53
+ useEffect,
54
+ useRef,
55
+ useState
56
+ } from "react";
57
+ import { setStateWithRef } from "@aksumite/sdk-utils";
58
+ import { Extensions, ExtensionsArray } from "@polkadot-cloud/assets/extensions";
59
+
60
+ // src/ExtensionsProvider/constants.ts
61
+ var defaultExtensionsContext = {
62
+ checkingInjectedWeb3: false,
63
+ extensionsStatus: {},
64
+ setExtensionStatus: (id, status) => {
65
+ },
66
+ removeExtensionStatus: (id) => {
67
+ },
68
+ extensionInstalled: (id) => false,
69
+ extensionCanConnect: (id) => false,
70
+ extensionHasFeature: (id, feature) => false
71
+ };
72
+
73
+ // src/ExtensionsProvider/utils.ts
74
+ import { withTimeout } from "@aksumite/sdk-utils";
75
+ function hasMetaMask() {
76
+ if (!window.ethereum) {
77
+ return false;
78
+ }
79
+ return window.ethereum.isMetaMask;
80
+ }
81
+ var getWalletSnaps = () => __async(void 0, null, function* () {
82
+ var _a;
83
+ const ethRequest = !!((_a = window == null ? void 0 : window.ethereum) == null ? void 0 : _a.request);
84
+ if (ethRequest) {
85
+ const response = yield withTimeout(
86
+ window.ethereum.request,
87
+ [
88
+ {
89
+ method: "wallet_getSnaps"
90
+ }
91
+ ],
92
+ 200
93
+ );
94
+ return response;
95
+ }
96
+ });
97
+ var polkadexSnapAvailable = () => __async(void 0, null, function* () {
98
+ if (!hasMetaMask())
99
+ return false;
100
+ try {
101
+ yield getWalletSnaps();
102
+ return true;
103
+ } catch (e) {
104
+ return false;
105
+ }
106
+ });
107
+
108
+ // src/ExtensionsProvider/provider.tsx
109
+ import { jsx } from "react/jsx-runtime";
110
+ var ExtensionsContext = createContext(
111
+ defaultExtensionsContext
112
+ );
113
+ var ExtensionsProvider = ({ children }) => {
114
+ const [checkingInjectedWeb3, setCheckingInjectedWeb3] = useState(true);
115
+ const checkingInjectedWeb3Ref = useRef(checkingInjectedWeb3);
116
+ const intervalInitialisedRef = useRef(false);
117
+ const [extensionsStatus, setExtensionsStatus] = useState({});
118
+ const extensionsStatusRef = useRef(extensionsStatus);
119
+ const injectCounter = useRef(0);
120
+ const setExtensionStatus = (id, status) => {
121
+ setStateWithRef(
122
+ __spreadProps(__spreadValues({}, extensionsStatusRef.current), {
123
+ [id]: status
124
+ }),
125
+ setExtensionsStatus,
126
+ extensionsStatusRef
127
+ );
128
+ };
129
+ const removeExtensionStatus = (id) => {
130
+ const newExtensionsStatus = __spreadValues({}, extensionsStatusRef.current);
131
+ delete newExtensionsStatus[id];
132
+ setStateWithRef(
133
+ newExtensionsStatus,
134
+ setExtensionsStatus,
135
+ extensionsStatusRef
136
+ );
137
+ };
138
+ const getExtensionsStatus = useCallback(
139
+ (snapAvailable) => {
140
+ const { injectedWeb3 } = window;
141
+ const newExtensionsStatus = __spreadValues({}, extensionsStatus);
142
+ if (snapAvailable)
143
+ newExtensionsStatus["metamask-polkadex-snap"] = "installed";
144
+ ExtensionsArray.forEach((e) => {
145
+ if (injectedWeb3[e.id] !== void 0) {
146
+ newExtensionsStatus[e.id] = "installed";
147
+ }
148
+ });
149
+ return newExtensionsStatus;
150
+ },
151
+ [extensionsStatus]
152
+ );
153
+ const handleSnapInjection = useCallback(
154
+ (hasInjectedWeb3) => __async(void 0, null, function* () {
155
+ const snapAvailable = yield polkadexSnapAvailable();
156
+ if (hasInjectedWeb3 || snapAvailable)
157
+ setStateWithRef(
158
+ getExtensionsStatus(snapAvailable),
159
+ setExtensionsStatus,
160
+ extensionsStatusRef
161
+ );
162
+ setStateWithRef(false, setCheckingInjectedWeb3, checkingInjectedWeb3Ref);
163
+ }),
164
+ [getExtensionsStatus]
165
+ );
166
+ const handleClearInterval = useCallback(
167
+ (interval, hasInjectedWeb3) => {
168
+ clearInterval(interval);
169
+ handleSnapInjection(hasInjectedWeb3);
170
+ },
171
+ [handleSnapInjection]
172
+ );
173
+ const extensionInstalled = (id) => extensionsStatus[id] !== void 0;
174
+ const extensionCanConnect = (id) => extensionInstalled(id) && extensionsStatus[id] !== "connected";
175
+ const extensionHasFeature = (id, feature) => {
176
+ const features = Extensions[id].features;
177
+ if (features === "*" || features.includes(feature))
178
+ return true;
179
+ else
180
+ return false;
181
+ };
182
+ const checkEveryMs = 500;
183
+ const totalChecks = 10;
184
+ useEffect(() => {
185
+ let injectedWeb3Interval;
186
+ if (!intervalInitialisedRef.current) {
187
+ intervalInitialisedRef.current = true;
188
+ injectedWeb3Interval = setInterval(() => {
189
+ injectCounter.current++;
190
+ if (injectCounter.current === totalChecks)
191
+ handleClearInterval(injectedWeb3Interval, false);
192
+ else {
193
+ const injectedWeb3 = (window == null ? void 0 : window.injectedWeb3) || null;
194
+ if (injectedWeb3 !== null)
195
+ handleClearInterval(injectedWeb3Interval, true);
196
+ }
197
+ }, checkEveryMs);
198
+ }
199
+ return () => {
200
+ clearInterval(injectedWeb3Interval);
201
+ };
202
+ }, [handleClearInterval]);
203
+ return /* @__PURE__ */ jsx(
204
+ ExtensionsContext.Provider,
205
+ {
206
+ value: {
207
+ extensionsStatus: extensionsStatusRef.current,
208
+ checkingInjectedWeb3: checkingInjectedWeb3Ref.current,
209
+ setExtensionStatus,
210
+ removeExtensionStatus,
211
+ extensionInstalled,
212
+ extensionCanConnect,
213
+ extensionHasFeature
214
+ },
215
+ children
216
+ }
217
+ );
218
+ };
219
+
220
+ // src/ExtensionsProvider/useExtensions.tsx
221
+ import { useContext } from "react";
222
+ var useExtensions = () => {
223
+ var _a;
224
+ const state = useContext(ExtensionsContext);
225
+ if (!ExtensionsContext) {
226
+ const error = new Error("ExtensionsContext context is undefined");
227
+ error.name = "ContextError";
228
+ (_a = Error == null ? void 0 : Error.captureStackTrace) == null ? void 0 : _a.call(Error, error, useContext);
229
+ throw error;
230
+ }
231
+ return __spreadValues({}, state);
232
+ };
233
+
234
+ // src/ExtensionAccountsProvider/useImportExtension.tsx
235
+ import Keyring2 from "@polkadot/keyring";
236
+ import {
237
+ isValidAddress,
238
+ isValidEvmAddress
239
+ } from "@aksumite/sdk-utils";
240
+
241
+ // src/ExtensionAccountsProvider/constants.ts
242
+ var defaultExtensionAccountsContext = {
243
+ connectExtensionAccounts: () => Promise.resolve(false),
244
+ extensionAccountsSynced: "unsynced",
245
+ extensionAccounts: []
246
+ };
247
+ var defaultHandleImportExtension = {
248
+ newAccounts: [],
249
+ meta: {
250
+ removedActiveAccount: null
251
+ }
252
+ };
253
+
254
+ // src/ExtensionAccountsProvider/utils.ts
255
+ import Keyring from "@polkadot/keyring";
256
+ import { localStorageOrDefault } from "@aksumite/sdk-utils";
257
+ var getActiveAccountLocal = (network, ss58) => {
258
+ const keyring = new Keyring();
259
+ keyring.setSS58Format(ss58);
260
+ let account = localStorageOrDefault(`${network}_active_account`, null);
261
+ if (account !== null) {
262
+ account = keyring.addFromAddress(account).address;
263
+ }
264
+ return account;
265
+ };
266
+ var addToLocalExtensions = (id) => {
267
+ const localExtensions = localStorageOrDefault(
268
+ `active_extensions`,
269
+ [],
270
+ true
271
+ );
272
+ if (Array.isArray(localExtensions)) {
273
+ if (!localExtensions.includes(id)) {
274
+ localExtensions.push(id);
275
+ localStorage.setItem(
276
+ "active_extensions",
277
+ JSON.stringify(localExtensions)
278
+ );
279
+ }
280
+ }
281
+ };
282
+ var extensionIsLocal = (id) => {
283
+ const localExtensions = localStorageOrDefault(
284
+ `active_extensions`,
285
+ [],
286
+ true
287
+ );
288
+ let foundExtensionLocally = false;
289
+ if (Array.isArray(localExtensions)) {
290
+ foundExtensionLocally = localExtensions.find((l) => l === id) !== void 0;
291
+ }
292
+ return foundExtensionLocally;
293
+ };
294
+ var removeFromLocalExtensions = (id) => {
295
+ let localExtensions = localStorageOrDefault(
296
+ `active_extensions`,
297
+ [],
298
+ true
299
+ );
300
+ if (Array.isArray(localExtensions)) {
301
+ localExtensions = localExtensions.filter((l) => l !== id);
302
+ localStorage.setItem("active_extensions", JSON.stringify(localExtensions));
303
+ }
304
+ };
305
+
306
+ // src/ExtensionAccountsProvider/useImportExtension.tsx
307
+ var useImportExtension = () => {
308
+ const { setExtensionStatus } = useExtensions();
309
+ const handleImportExtension = (id, currentAccounts, extension, newAccounts, forget, {
310
+ network,
311
+ ss58
312
+ }) => {
313
+ setExtensionStatus(id, "connected");
314
+ addToLocalExtensions(id);
315
+ if (newAccounts.length) {
316
+ return handleInjectedAccounts(
317
+ id,
318
+ currentAccounts,
319
+ extension,
320
+ newAccounts,
321
+ forget,
322
+ { network, ss58 }
323
+ );
324
+ }
325
+ return defaultHandleImportExtension;
326
+ };
327
+ const handleInjectedAccounts = (id, currentAccounts, extension, newAccounts, forget, {
328
+ ss58,
329
+ network
330
+ }) => {
331
+ var _a;
332
+ const keyring = new Keyring2();
333
+ keyring.setSS58Format(ss58);
334
+ newAccounts = newAccounts.filter(
335
+ ({ address }) => isValidAddress(address) || isValidEvmAddress(address)
336
+ );
337
+ newAccounts.forEach((account) => __async(void 0, null, function* () {
338
+ if (isValidEvmAddress(account.address))
339
+ return account;
340
+ const { address } = keyring.addFromAddress(account.address);
341
+ account.address = address;
342
+ return account;
343
+ }));
344
+ const goneFromExtension = currentAccounts.filter((j) => j.source === id).filter((j) => !newAccounts.find((i) => i.address === j.address));
345
+ const activeGoneFromExtension = goneFromExtension.find(
346
+ ({ address }) => address === getActiveAccountLocal(network, ss58)
347
+ );
348
+ forget(goneFromExtension);
349
+ newAccounts = newAccounts.filter(
350
+ (i) => !currentAccounts.find(
351
+ (j) => j.address === i.address && j.source !== "external"
352
+ )
353
+ );
354
+ newAccounts = newAccounts.map(({ address, name, type }) => ({
355
+ address,
356
+ source: id,
357
+ name,
358
+ signer: extension.signer,
359
+ type
360
+ }));
361
+ return {
362
+ newAccounts,
363
+ meta: {
364
+ removedActiveAccount: (_a = activeGoneFromExtension == null ? void 0 : activeGoneFromExtension.address) != null ? _a : null
365
+ }
366
+ };
367
+ };
368
+ const getActiveExtensionAccount = ({
369
+ network,
370
+ ss58
371
+ }, accounts) => {
372
+ var _a;
373
+ return (_a = accounts.find(
374
+ ({ address }) => address === getActiveAccountLocal(network, ss58)
375
+ )) != null ? _a : null;
376
+ };
377
+ const connectActiveExtensionAccount = (account, callback) => {
378
+ if (account !== null) {
379
+ callback(account);
380
+ }
381
+ };
382
+ return {
383
+ handleImportExtension,
384
+ getActiveExtensionAccount,
385
+ connectActiveExtensionAccount
386
+ };
387
+ };
388
+
389
+ // src/ExtensionAccountsProvider/provider.tsx
390
+ import { jsx as jsx2 } from "react/jsx-runtime";
391
+ var ExtensionAccountsContext = createContext2(
392
+ defaultExtensionAccountsContext
393
+ );
394
+ var ExtensionAccountsProvider = ({
395
+ children,
396
+ network,
397
+ ss58,
398
+ dappName,
399
+ activeAccount,
400
+ setActiveAccount,
401
+ onExtensionEnabled
402
+ }) => {
403
+ const {
404
+ handleImportExtension,
405
+ getActiveExtensionAccount,
406
+ connectActiveExtensionAccount
407
+ } = useImportExtension();
408
+ const {
409
+ extensionsStatus,
410
+ setExtensionStatus,
411
+ removeExtensionStatus,
412
+ checkingInjectedWeb3,
413
+ extensionHasFeature
414
+ } = useExtensions();
415
+ const [extensionAccounts, setExtensionAccounts] = useState2([]);
416
+ const extensionAccountsRef = useRef2(extensionAccounts);
417
+ const [extensionAccountsSynced, setExtensionAccountsSynced] = useState2("unsynced");
418
+ const [extensionsInitialised, setExtensionsInitialised] = useState2(
419
+ []
420
+ );
421
+ const extensionsInitialisedRef = useRef2(extensionsInitialised);
422
+ const unsubs = useRef2({});
423
+ const maybeSetActiveAccount = useCallback2(
424
+ (address) => {
425
+ if (typeof setActiveAccount === "function")
426
+ setActiveAccount(address != null ? address : null);
427
+ },
428
+ [setActiveAccount]
429
+ );
430
+ const maybeOnExtensionEnabled = (id) => {
431
+ if (typeof onExtensionEnabled === "function")
432
+ onExtensionEnabled(id);
433
+ };
434
+ const connectToAccount = useCallback2(
435
+ (account) => {
436
+ var _a;
437
+ maybeSetActiveAccount((_a = account == null ? void 0 : account.address) != null ? _a : null);
438
+ },
439
+ [maybeSetActiveAccount]
440
+ );
441
+ const connectExtensionAccounts = (id) => __async(void 0, null, function* () {
442
+ const extensionKeys = Object.keys(extensionsStatus);
443
+ const exists = extensionKeys.find((key) => key === id) || void 0;
444
+ if (!exists) {
445
+ updateInitialisedExtensions(
446
+ `unknown_extension_${extensionsInitialisedRef.current.length + 1}`
447
+ );
448
+ } else {
449
+ try {
450
+ const { enable } = window.injectedWeb3[id];
451
+ const extension = yield enable(dappName);
452
+ if (extension !== void 0) {
453
+ maybeOnExtensionEnabled(id);
454
+ const handleAccounts = (a) => {
455
+ const { newAccounts, meta } = handleImportExtension(
456
+ id,
457
+ extensionAccountsRef.current,
458
+ extension,
459
+ a,
460
+ forgetAccounts,
461
+ { network, ss58 }
462
+ );
463
+ if (!activeAccount) {
464
+ const activeExtensionAccount = getActiveExtensionAccount(
465
+ { network, ss58 },
466
+ newAccounts
467
+ );
468
+ if ((activeExtensionAccount == null ? void 0 : activeExtensionAccount.address) !== meta.removedActiveAccount && meta.removedActiveAccount !== null)
469
+ connectActiveExtensionAccount(
470
+ activeExtensionAccount,
471
+ connectToAccount
472
+ );
473
+ }
474
+ addExtensionAccount(newAccounts);
475
+ updateInitialisedExtensions(id);
476
+ };
477
+ if (!extensionHasFeature(id, "subscribeAccounts")) {
478
+ const accounts = yield extension.accounts.get();
479
+ handleAccounts(accounts);
480
+ } else {
481
+ const unsub = extension.accounts.subscribe((accounts) => {
482
+ if (accounts)
483
+ handleAccounts(accounts);
484
+ });
485
+ addToUnsubscribe(id, unsub);
486
+ }
487
+ return true;
488
+ }
489
+ } catch (err) {
490
+ handleExtensionError(id, String(err));
491
+ }
492
+ }
493
+ return false;
494
+ });
495
+ const handleExtensionError = useCallback2(
496
+ (id, err) => {
497
+ if (err.startsWith("Error")) {
498
+ removeFromLocalExtensions(id);
499
+ if (err.substring(0, 17) === "NotInstalledError") {
500
+ removeExtensionStatus(id);
501
+ } else {
502
+ setExtensionStatus(id, "not_authenticated");
503
+ }
504
+ }
505
+ updateInitialisedExtensions(id);
506
+ },
507
+ [removeExtensionStatus, setExtensionStatus]
508
+ );
509
+ const forgetAccounts = useCallback2(
510
+ (forget) => {
511
+ if (forget.length) {
512
+ for (const { address } of forget) {
513
+ if (extensionAccountsRef.current.find((a) => a.address === address)) {
514
+ const unsub = unsubs.current[address];
515
+ if (unsub) {
516
+ unsub();
517
+ delete unsubs.current[address];
518
+ }
519
+ }
520
+ }
521
+ setStateWithRef2(
522
+ [...extensionAccountsRef.current].filter(
523
+ (a) => forget.find((s) => s.address === a.address) === void 0
524
+ ),
525
+ setExtensionAccounts,
526
+ extensionAccountsRef
527
+ );
528
+ if (activeAccount) {
529
+ if (forget.find(({ address }) => address === activeAccount) !== void 0)
530
+ maybeSetActiveAccount(null);
531
+ }
532
+ }
533
+ },
534
+ [activeAccount, maybeSetActiveAccount]
535
+ );
536
+ const connectActiveExtensions = useCallback2(() => __async(void 0, null, function* () {
537
+ var _a;
538
+ const extensionKeys = Object.keys(extensionsStatus);
539
+ if (!extensionKeys.length)
540
+ return;
541
+ const total = (_a = extensionKeys == null ? void 0 : extensionKeys.length) != null ? _a : 0;
542
+ let activeWalletAccount = null;
543
+ let i = 0;
544
+ for (const id of extensionKeys) {
545
+ i++;
546
+ const isLocal = extensionIsLocal(id != null ? id : "0");
547
+ if (!id || !isLocal) {
548
+ updateInitialisedExtensions(
549
+ id || `unknown_extension_${extensionsInitialisedRef.current.length + 1}`
550
+ );
551
+ } else {
552
+ try {
553
+ const { enable } = window.injectedWeb3[id];
554
+ const extension = yield enable(dappName);
555
+ if (extension !== void 0) {
556
+ const handleAccounts = (accounts) => {
557
+ const { newAccounts, meta } = handleImportExtension(
558
+ id,
559
+ extensionAccountsRef.current,
560
+ extension,
561
+ accounts,
562
+ forgetAccounts,
563
+ {
564
+ network,
565
+ ss58
566
+ }
567
+ );
568
+ if (newAccounts.length) {
569
+ if (!activeWalletAccount)
570
+ activeWalletAccount = getActiveExtensionAccount(
571
+ { network, ss58 },
572
+ newAccounts
573
+ );
574
+ }
575
+ if (i === total && !activeAccount) {
576
+ const activeAccountRemoved = (activeWalletAccount == null ? void 0 : activeWalletAccount.address) !== meta.removedActiveAccount && meta.removedActiveAccount !== null;
577
+ if (!activeAccountRemoved) {
578
+ connectActiveExtensionAccount(
579
+ activeWalletAccount,
580
+ connectToAccount
581
+ );
582
+ }
583
+ }
584
+ addExtensionAccount(newAccounts);
585
+ updateInitialisedExtensions(id);
586
+ };
587
+ if (!extensionHasFeature(id, "subscribeAccounts")) {
588
+ const accounts = yield extension.accounts.get();
589
+ handleAccounts(accounts);
590
+ } else {
591
+ const unsub = extension.accounts.subscribe((accounts) => {
592
+ if (accounts)
593
+ handleAccounts(accounts);
594
+ });
595
+ addToUnsubscribe(id, unsub);
596
+ }
597
+ }
598
+ } catch (err) {
599
+ handleExtensionError(id, String(err));
600
+ }
601
+ }
602
+ }
603
+ }), [
604
+ activeAccount,
605
+ connectActiveExtensionAccount,
606
+ connectToAccount,
607
+ dappName,
608
+ extensionHasFeature,
609
+ extensionsStatus,
610
+ forgetAccounts,
611
+ getActiveExtensionAccount,
612
+ handleExtensionError,
613
+ handleImportExtension,
614
+ network,
615
+ ss58
616
+ ]);
617
+ const updateInitialisedExtensions = (id) => {
618
+ if (!extensionsInitialisedRef.current.includes(id)) {
619
+ setStateWithRef2(
620
+ [...extensionsInitialisedRef.current].concat(id),
621
+ setExtensionsInitialised,
622
+ extensionsInitialisedRef
623
+ );
624
+ }
625
+ };
626
+ const addExtensionAccount = (a) => {
627
+ setStateWithRef2(
628
+ [...extensionAccountsRef.current].concat(a),
629
+ setExtensionAccounts,
630
+ extensionAccountsRef
631
+ );
632
+ };
633
+ const addToUnsubscribe = (id, unsub) => {
634
+ unsubs.current[id] = unsub;
635
+ };
636
+ const unsubscribe = () => {
637
+ Object.values(unsubs.current).forEach((unsub) => {
638
+ unsub();
639
+ });
640
+ };
641
+ useEffect2(() => {
642
+ if (!checkingInjectedWeb3 && extensionAccountsSynced === "unsynced") {
643
+ unsubscribe();
644
+ setStateWithRef2([], setExtensionAccounts, extensionAccountsRef);
645
+ setStateWithRef2([], setExtensionsInitialised, extensionsInitialisedRef);
646
+ if (Object.keys(extensionsStatus).length) {
647
+ const localExtensions = localStorageOrDefault2(
648
+ `active_extensions`,
649
+ [],
650
+ true
651
+ );
652
+ if (Object.keys(extensionsStatus).length && localExtensions.length) {
653
+ setExtensionAccountsSynced("syncing");
654
+ connectActiveExtensions();
655
+ } else
656
+ setExtensionAccountsSynced("synced");
657
+ }
658
+ }
659
+ return () => unsubscribe();
660
+ }, [
661
+ extensionsStatus,
662
+ checkingInjectedWeb3,
663
+ extensionAccountsSynced,
664
+ connectActiveExtensions
665
+ ]);
666
+ useEffectIgnoreInitial(() => {
667
+ setExtensionAccountsSynced("unsynced");
668
+ }, [ss58]);
669
+ useEffectIgnoreInitial(() => {
670
+ if (!checkingInjectedWeb3 && extensionsInitialised.length === Object.keys(extensionsStatus).length) {
671
+ setExtensionAccountsSynced("synced");
672
+ }
673
+ }, [checkingInjectedWeb3, extensionsInitialised]);
674
+ return /* @__PURE__ */ jsx2(
675
+ ExtensionAccountsContext.Provider,
676
+ {
677
+ value: {
678
+ connectExtensionAccounts,
679
+ extensionAccountsSynced,
680
+ extensionAccounts: extensionAccountsRef.current
681
+ },
682
+ children
683
+ }
684
+ );
685
+ };
686
+
687
+ // src/ExtensionAccountsProvider/useExtensionAccounts.tsx
688
+ import { useContext as useContext2 } from "react";
689
+ var useExtensionAccounts = () => {
690
+ var _a;
691
+ const state = useContext2(ExtensionAccountsContext);
692
+ if (!ExtensionAccountsContext) {
693
+ const error = new Error("ExtensionAccountsContext context is undefined");
694
+ error.name = "ContextError";
695
+ (_a = Error == null ? void 0 : Error.captureStackTrace) == null ? void 0 : _a.call(Error, error, useContext2);
696
+ throw error;
697
+ }
698
+ return __spreadValues({}, state);
699
+ };
700
+
701
+ // src/LocalAccountsProvider/provider.tsx
702
+ import { createContext as createContext3, useEffect as useEffect3, useState as useState3 } from "react";
703
+ import { BrowserWallet } from "@aksumite/local-wallets";
704
+ import { jsx as jsx3 } from "react/jsx-runtime";
705
+ var wallet = new BrowserWallet();
706
+ var LocalAccountsContext = createContext3(
707
+ {
708
+ wallet,
709
+ isReady: false,
710
+ localAddresses: []
711
+ }
712
+ );
713
+ var UserAccountsProvider = ({
714
+ children
715
+ }) => {
716
+ const [localAddresses, setLocalAddresses] = useState3([]);
717
+ useEffect3(() => {
718
+ if (!wallet.isReady()) {
719
+ wallet.init().then(() => {
720
+ wallet.subscribeAddresses((addresses) => {
721
+ setLocalAddresses(addresses);
722
+ });
723
+ });
724
+ }
725
+ });
726
+ return /* @__PURE__ */ jsx3(
727
+ LocalAccountsContext.Provider,
728
+ {
729
+ value: {
730
+ wallet,
731
+ isReady: wallet.isReady(),
732
+ localAddresses
733
+ },
734
+ children
735
+ }
736
+ );
737
+ };
738
+
739
+ // src/LocalAccountsProvider/useLocalAccounts.tsx
740
+ import { useContext as useContext3 } from "react";
741
+ var useUserAccounts = () => {
742
+ var _a;
743
+ const state = useContext3(LocalAccountsContext);
744
+ if (!LocalAccountsContext) {
745
+ const error = new Error("UserAccountsContext context is undefined");
746
+ error.name = "ContextError";
747
+ (_a = Error == null ? void 0 : Error.captureStackTrace) == null ? void 0 : _a.call(Error, error, useContext3);
748
+ throw error;
749
+ }
750
+ return __spreadValues({}, state);
751
+ };
752
+
753
+ // src/TransactionManagerProvider/provider.tsx
754
+ import {
755
+ createContext as createContext4,
756
+ useCallback as useCallback3,
757
+ useEffect as useEffect4,
758
+ useRef as useRef3,
759
+ useState as useState4
760
+ } from "react";
761
+
762
+ // src/TransactionManagerProvider/utils.ts
763
+ var getStatus = (status) => {
764
+ const statusMap = {
765
+ isError: "error",
766
+ isBroadcast: "broadcasted",
767
+ isInBlock: "inblock",
768
+ isFinalized: "finalized"
769
+ };
770
+ for (const key of Object.keys(statusMap).reverse())
771
+ if (status[key])
772
+ return statusMap[key];
773
+ return "ongoing";
774
+ };
775
+
776
+ // src/TransactionManagerProvider/provider.tsx
777
+ import { jsx as jsx4 } from "react/jsx-runtime";
778
+ var TransactionManagerProvider = ({
779
+ children
780
+ }) => {
781
+ const [txQueue, _setTxQueue] = useState4([]);
782
+ const [txStatus, _setTxStatus] = useState4([]);
783
+ const stRef = useRef3(txStatus);
784
+ const txRef = useRef3(txQueue);
785
+ const setStQueue = useCallback3((st) => {
786
+ stRef.current = st;
787
+ _setTxStatus(st);
788
+ }, []);
789
+ const setTxQueue = useCallback3((txs) => {
790
+ txRef.current = txs;
791
+ _setTxQueue(txs);
792
+ }, []);
793
+ const updateTxStatus = useCallback3(
794
+ (extrinsic, hash, result) => {
795
+ const updatedTxStatus = stRef.current.map((e) => {
796
+ if (e.hash === hash) {
797
+ if (e.error)
798
+ return e;
799
+ let error = "";
800
+ const { status, isError, dispatchError } = result;
801
+ const { isFinalized, isInBlock, isBroadcast } = status;
802
+ if (dispatchError) {
803
+ if (dispatchError.isModule) {
804
+ const { docs, name, section } = extrinsic.registry.findMetaError(
805
+ dispatchError.asModule
806
+ );
807
+ error = `${section}.${name}: ${docs.join(" ")}`;
808
+ } else {
809
+ error = dispatchError.toString();
810
+ }
811
+ }
812
+ const statusText = getStatus({
813
+ isError,
814
+ isBroadcast,
815
+ isInBlock,
816
+ isFinalized
817
+ });
818
+ return {
819
+ hash,
820
+ result: [...e.result, result],
821
+ status: statusText,
822
+ error
823
+ };
824
+ }
825
+ return e;
826
+ });
827
+ setStQueue(updatedTxStatus);
828
+ if (!result || result.isError || result.dispatchError || result.status.isFinalized) {
829
+ const validTxs = txRef.current.filter(
830
+ (t) => t.hash.toHex().toString() !== hash
831
+ );
832
+ setTxQueue(validTxs);
833
+ }
834
+ },
835
+ [setStQueue, setTxQueue]
836
+ );
837
+ const sendExtrinsicToChain = useCallback3(
838
+ (ext) => __async(void 0, null, function* () {
839
+ const hash = ext.hash.toHex().toString();
840
+ try {
841
+ yield ext.send((result) => updateTxStatus(ext, hash, result));
842
+ } catch (error) {
843
+ throw new Error(error);
844
+ }
845
+ }),
846
+ [updateTxStatus]
847
+ );
848
+ const addToTxQueue = (tx) => {
849
+ setTxQueue([...txQueue, tx]);
850
+ setStQueue([
851
+ ...txStatus,
852
+ {
853
+ hash: tx.hash.toHex().toString(),
854
+ result: [],
855
+ status: "ongoing"
856
+ }
857
+ ]);
858
+ };
859
+ const getTxStatus = useCallback3(
860
+ (hash) => {
861
+ return txStatus.find((s) => s.hash === hash);
862
+ },
863
+ [txStatus]
864
+ );
865
+ useEffect4(() => {
866
+ if (txQueue.length) {
867
+ const started = txStatus.filter((s) => !s.error).find((s) => s.status === "broadcasted" || s.status === "inblock");
868
+ if (!started)
869
+ sendExtrinsicToChain(txQueue[0]);
870
+ }
871
+ }, [txStatus, txQueue, sendExtrinsicToChain]);
872
+ return /* @__PURE__ */ jsx4(Provider, { value: { addToTxQueue, getTxStatus, txStatus }, children });
873
+ };
874
+ var Context = createContext4({
875
+ addToTxQueue: () => {
876
+ },
877
+ getTxStatus: () => void 0,
878
+ txStatus: []
879
+ });
880
+ var Provider = ({
881
+ value,
882
+ children
883
+ }) => {
884
+ return /* @__PURE__ */ jsx4(Context.Provider, { value, children });
885
+ };
886
+
887
+ // src/TransactionManagerProvider/useTransactionManager.ts
888
+ import { useContext as useContext4 } from "react";
889
+ var useTransactionManager = () => {
890
+ var _a;
891
+ const state = useContext4(Context);
892
+ if (!state) {
893
+ const error = new Error("useTransactionManager context is undefined");
894
+ error.name = "ContextError";
895
+ (_a = Error == null ? void 0 : Error.captureStackTrace) == null ? void 0 : _a.call(Error, error, useContext4);
896
+ throw error;
897
+ }
898
+ return __spreadValues({}, state);
899
+ };
900
+ export {
901
+ Context,
902
+ ExtensionAccountsContext,
903
+ ExtensionAccountsProvider,
904
+ ExtensionsContext,
905
+ ExtensionsProvider,
906
+ LocalAccountsContext,
907
+ TransactionManagerProvider,
908
+ UserAccountsProvider,
909
+ defaultExtensionAccountsContext,
910
+ defaultExtensionsContext,
911
+ defaultHandleImportExtension,
912
+ useExtensionAccounts,
913
+ useExtensions,
914
+ useTransactionManager,
915
+ useUserAccounts
916
+ };