@w3ux/react-connect-kit 3.5.4 → 3.6.1
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/index.cjs +273 -0
- package/index.d.cts +48 -0
- package/index.d.ts +48 -2
- package/index.js +260 -4
- package/package.json +10 -5
- package/Extensions/Accounts.d.ts +0 -3
- package/Extensions/Accounts.js +0 -69
- package/Extensions/Accounts.js.map +0 -1
- package/Extensions/Connect.d.ts +0 -6
- package/Extensions/Connect.js +0 -44
- package/Extensions/Connect.js.map +0 -1
- package/Extensions/Provider.d.ts +0 -2
- package/Extensions/Provider.js +0 -8
- package/Extensions/Provider.js.map +0 -1
- package/Extensions/index.d.ts +0 -3
- package/Extensions/index.js +0 -7
- package/Extensions/index.js.map +0 -1
- package/Extensions/types.d.ts +0 -22
- package/Extensions/types.js +0 -5
- package/Extensions/types.js.map +0 -1
- package/Hardware/index.d.ts +0 -6
- package/Hardware/index.js +0 -74
- package/Hardware/index.js.map +0 -1
- package/Hardware/types.d.ts +0 -9
- package/Hardware/types.js +0 -5
- package/Hardware/types.js.map +0 -1
- package/index.js.map +0 -1
package/index.cjs
ADDED
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.tsx
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
ExtensionsProvider: () => ExtensionsProvider,
|
|
24
|
+
HardwareAccountsContext: () => HardwareAccountsContext,
|
|
25
|
+
HardwareAccountsProvider: () => HardwareAccountsProvider,
|
|
26
|
+
useExtensionAccounts: () => useExtensionAccounts,
|
|
27
|
+
useExtensions: () => useExtensions,
|
|
28
|
+
useHardwareAccounts: () => useHardwareAccounts
|
|
29
|
+
});
|
|
30
|
+
module.exports = __toCommonJS(index_exports);
|
|
31
|
+
|
|
32
|
+
// src/Extensions/Accounts.tsx
|
|
33
|
+
var import_hooks2 = require("@w3ux/hooks");
|
|
34
|
+
var import_observables_connect2 = require("@w3ux/observables-connect");
|
|
35
|
+
var import_accounts = require("@w3ux/observables-connect/accounts");
|
|
36
|
+
var import_extensions2 = require("@w3ux/observables-connect/extensions");
|
|
37
|
+
var import_utils = require("@w3ux/utils");
|
|
38
|
+
var import_react2 = require("react");
|
|
39
|
+
var import_rxjs2 = require("rxjs");
|
|
40
|
+
|
|
41
|
+
// src/Extensions/Connect.tsx
|
|
42
|
+
var import_hooks = require("@w3ux/hooks");
|
|
43
|
+
var import_observables_connect = require("@w3ux/observables-connect");
|
|
44
|
+
var import_extensions = require("@w3ux/observables-connect/extensions");
|
|
45
|
+
var import_react = require("react");
|
|
46
|
+
var import_rxjs = require("rxjs");
|
|
47
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
48
|
+
var [ExtensionsConnectContext, useExtensions] = (0, import_hooks.createSafeContext)();
|
|
49
|
+
var ExtensionsConnectProvider = ({
|
|
50
|
+
children
|
|
51
|
+
}) => {
|
|
52
|
+
const [gettingExtensions, setGettingExtensions] = (0, import_react.useState)(true);
|
|
53
|
+
const [extensionsStatus, setExtensionsStatus] = (0, import_react.useState)({});
|
|
54
|
+
const setExtensionStatus = (id, status) => {
|
|
55
|
+
(0, import_observables_connect.setStatus)(id, status);
|
|
56
|
+
};
|
|
57
|
+
const removeExtensionStatus = (id) => {
|
|
58
|
+
(0, import_observables_connect.removeStatus)(id);
|
|
59
|
+
};
|
|
60
|
+
const extensionInstalled = (id) => (0, import_observables_connect.getStatus)(id) !== void 0;
|
|
61
|
+
const extensionCanConnect = (id) => (0, import_observables_connect.canConnect)(id);
|
|
62
|
+
(0, import_react.useEffect)(() => {
|
|
63
|
+
(0, import_extensions.getExtensions)();
|
|
64
|
+
const sub = (0, import_rxjs.combineLatest)([
|
|
65
|
+
import_observables_connect.gettingExtensions$,
|
|
66
|
+
import_observables_connect.extensionsStatus$
|
|
67
|
+
]).subscribe(([getting, status]) => {
|
|
68
|
+
setGettingExtensions(getting);
|
|
69
|
+
setExtensionsStatus(status);
|
|
70
|
+
});
|
|
71
|
+
return () => {
|
|
72
|
+
sub.unsubscribe();
|
|
73
|
+
};
|
|
74
|
+
}, []);
|
|
75
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
76
|
+
ExtensionsConnectContext.Provider,
|
|
77
|
+
{
|
|
78
|
+
value: {
|
|
79
|
+
extensionsStatus,
|
|
80
|
+
gettingExtensions,
|
|
81
|
+
setExtensionStatus,
|
|
82
|
+
removeExtensionStatus,
|
|
83
|
+
extensionInstalled,
|
|
84
|
+
extensionCanConnect
|
|
85
|
+
},
|
|
86
|
+
children
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// src/Extensions/Accounts.tsx
|
|
92
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
93
|
+
var [ExtensionAccountsContext, useExtensionAccounts] = (0, import_hooks2.createSafeContext)();
|
|
94
|
+
var ExtensionAccountsProvider = ({
|
|
95
|
+
children,
|
|
96
|
+
ss58,
|
|
97
|
+
dappName
|
|
98
|
+
}) => {
|
|
99
|
+
const { gettingExtensions } = useExtensions();
|
|
100
|
+
const [extensionAccounts, setExtensionAccounts] = (0, import_react2.useState)([]);
|
|
101
|
+
const [extensionsInitialised, setExtensionsInitialised] = (0, import_react2.useState)(
|
|
102
|
+
[]
|
|
103
|
+
);
|
|
104
|
+
const [extensionsSynced, setExtensionsSynced] = (0, import_react2.useState)((0, import_observables_connect2.getReconnectSync)());
|
|
105
|
+
const handleInitialConnect = async () => {
|
|
106
|
+
if (!gettingExtensions && extensionsSynced === "unsynced") {
|
|
107
|
+
(0, import_accounts.unsubAll)();
|
|
108
|
+
(0, import_observables_connect2.resetAccounts)();
|
|
109
|
+
await (0, import_extensions2.reconnectExtensions)(dappName, ss58);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
const connectExtension = async (id) => await (0, import_extensions2.connectExtension)(dappName, ss58, id);
|
|
113
|
+
const getExtensionAccounts = (ss58Prefix) => extensionAccounts.map((account) => {
|
|
114
|
+
const formattedAddress = (0, import_utils.formatAccountSs58)(account.address, ss58Prefix);
|
|
115
|
+
if (!formattedAddress) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
...account,
|
|
120
|
+
address: formattedAddress
|
|
121
|
+
};
|
|
122
|
+
}).filter((account) => account !== null);
|
|
123
|
+
const getExtensionAccount = (address) => {
|
|
124
|
+
const account = extensionAccounts.find(
|
|
125
|
+
(item) => (0, import_utils.formatAccountSs58)(item.address, 0) === (0, import_utils.formatAccountSs58)(address, 0)
|
|
126
|
+
);
|
|
127
|
+
return account ? { ...account, address } : void 0;
|
|
128
|
+
};
|
|
129
|
+
(0, import_react2.useEffect)(() => {
|
|
130
|
+
handleInitialConnect();
|
|
131
|
+
return () => (0, import_accounts.unsubAll)();
|
|
132
|
+
}, [gettingExtensions]);
|
|
133
|
+
(0, import_react2.useEffect)(() => {
|
|
134
|
+
const sub = (0, import_rxjs2.combineLatest)([
|
|
135
|
+
import_observables_connect2.initialisedExtensions$,
|
|
136
|
+
import_observables_connect2.extensionAccounts$,
|
|
137
|
+
import_observables_connect2.reconnectSync$
|
|
138
|
+
]).subscribe(([initialised, accounts, sync]) => {
|
|
139
|
+
setExtensionsInitialised(initialised);
|
|
140
|
+
setExtensionAccounts(accounts);
|
|
141
|
+
setExtensionsSynced(sync);
|
|
142
|
+
});
|
|
143
|
+
return () => {
|
|
144
|
+
sub.unsubscribe();
|
|
145
|
+
};
|
|
146
|
+
}, []);
|
|
147
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
148
|
+
ExtensionAccountsContext.Provider,
|
|
149
|
+
{
|
|
150
|
+
value: {
|
|
151
|
+
extensionsInitialised,
|
|
152
|
+
connectExtension,
|
|
153
|
+
extensionsSynced,
|
|
154
|
+
getExtensionAccount,
|
|
155
|
+
getExtensionAccounts
|
|
156
|
+
},
|
|
157
|
+
children
|
|
158
|
+
}
|
|
159
|
+
);
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
// src/Extensions/Provider.tsx
|
|
163
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
164
|
+
var ExtensionsProvider = ({
|
|
165
|
+
ss58,
|
|
166
|
+
dappName,
|
|
167
|
+
children
|
|
168
|
+
}) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ExtensionsConnectProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ExtensionAccountsProvider, { ss58, dappName, children }) });
|
|
169
|
+
|
|
170
|
+
// src/Hardware/index.tsx
|
|
171
|
+
var import_hooks3 = require("@w3ux/hooks");
|
|
172
|
+
var import_observables_connect3 = require("@w3ux/observables-connect");
|
|
173
|
+
var import_utils2 = require("@w3ux/utils");
|
|
174
|
+
var import_react3 = require("react");
|
|
175
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
176
|
+
var [HardwareAccountsContext, useHardwareAccounts] = (0, import_hooks3.createSafeContext)();
|
|
177
|
+
var HardwareAccountsProvider = ({
|
|
178
|
+
children
|
|
179
|
+
}) => {
|
|
180
|
+
const [hardwareAccounts, setHardwareAccountsState] = (0, import_react3.useState)((0, import_observables_connect3.getHardwareAccountsLocal)());
|
|
181
|
+
const hardwareAccountExists = (source, network, address) => !!hardwareAccounts.find(
|
|
182
|
+
(a) => a.source === source && a.address === address && a.network === network
|
|
183
|
+
);
|
|
184
|
+
const addHardwareAccount = (source, network, address, index, callback) => {
|
|
185
|
+
if (!hardwareAccountExists(source, network, address)) {
|
|
186
|
+
const newAccount = {
|
|
187
|
+
address,
|
|
188
|
+
network,
|
|
189
|
+
name: (0, import_utils2.ellipsisFn)(address),
|
|
190
|
+
source,
|
|
191
|
+
index
|
|
192
|
+
};
|
|
193
|
+
const newHardwareAccounts = [...hardwareAccounts].concat(newAccount);
|
|
194
|
+
localStorage.setItem(
|
|
195
|
+
import_observables_connect3.HardwareAccountsKey,
|
|
196
|
+
JSON.stringify(newHardwareAccounts)
|
|
197
|
+
);
|
|
198
|
+
(0, import_observables_connect3.setHardwareAccounts)(newHardwareAccounts);
|
|
199
|
+
if (typeof callback === "function") {
|
|
200
|
+
callback();
|
|
201
|
+
}
|
|
202
|
+
return newAccount;
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
205
|
+
};
|
|
206
|
+
const removeHardwareAccount = (source, network, address, callback) => {
|
|
207
|
+
const newHardwareAccounts = [...hardwareAccounts].filter(
|
|
208
|
+
(a) => !(a.source === source && a.address === address && a.network === network)
|
|
209
|
+
);
|
|
210
|
+
if (!newHardwareAccounts.length) {
|
|
211
|
+
localStorage.removeItem(import_observables_connect3.HardwareAccountsKey);
|
|
212
|
+
} else {
|
|
213
|
+
localStorage.setItem(
|
|
214
|
+
import_observables_connect3.HardwareAccountsKey,
|
|
215
|
+
JSON.stringify(newHardwareAccounts)
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
(0, import_observables_connect3.setHardwareAccounts)(newHardwareAccounts);
|
|
219
|
+
if (typeof callback === "function") {
|
|
220
|
+
callback();
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
const renameHardwareAccount = (source, network, address, newName) => {
|
|
224
|
+
const newHardwareAccounts = [...hardwareAccounts].map(
|
|
225
|
+
(a) => a.source === source && a.network === network && a.address === address ? {
|
|
226
|
+
...a,
|
|
227
|
+
name: newName
|
|
228
|
+
} : a
|
|
229
|
+
);
|
|
230
|
+
localStorage.setItem(
|
|
231
|
+
import_observables_connect3.HardwareAccountsKey,
|
|
232
|
+
JSON.stringify(newHardwareAccounts)
|
|
233
|
+
);
|
|
234
|
+
(0, import_observables_connect3.setHardwareAccounts)(newHardwareAccounts);
|
|
235
|
+
};
|
|
236
|
+
const getHardwareAccount = (source, network, address) => hardwareAccounts.find(
|
|
237
|
+
(a) => a.source === source && a.network === network && a.address === address
|
|
238
|
+
) || null;
|
|
239
|
+
const getHardwareAccounts = (source, network) => hardwareAccounts.filter((a) => a.source === source && a.network === network);
|
|
240
|
+
(0, import_react3.useEffect)(() => {
|
|
241
|
+
const sub = import_observables_connect3.hardwareAccounts$.subscribe((accounts) => {
|
|
242
|
+
setHardwareAccountsState(accounts);
|
|
243
|
+
});
|
|
244
|
+
return () => {
|
|
245
|
+
sub.unsubscribe();
|
|
246
|
+
};
|
|
247
|
+
}, []);
|
|
248
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
249
|
+
HardwareAccountsContext.Provider,
|
|
250
|
+
{
|
|
251
|
+
value: {
|
|
252
|
+
hardwareAccountExists,
|
|
253
|
+
getHardwareAccount,
|
|
254
|
+
addHardwareAccount,
|
|
255
|
+
removeHardwareAccount,
|
|
256
|
+
renameHardwareAccount,
|
|
257
|
+
getHardwareAccounts
|
|
258
|
+
},
|
|
259
|
+
children
|
|
260
|
+
}
|
|
261
|
+
);
|
|
262
|
+
};
|
|
263
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
264
|
+
0 && (module.exports = {
|
|
265
|
+
ExtensionsProvider,
|
|
266
|
+
HardwareAccountsContext,
|
|
267
|
+
HardwareAccountsProvider,
|
|
268
|
+
useExtensionAccounts,
|
|
269
|
+
useExtensions,
|
|
270
|
+
useHardwareAccounts
|
|
271
|
+
});
|
|
272
|
+
/* @license Copyright 2024 w3ux authors & contributors
|
|
273
|
+
SPDX-License-Identifier: GPL-3.0-only */
|
package/index.d.cts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { Sync, ExtensionAccount, Account, ExtensionStatus, HardwareAccountSource, HardwareAccount } from '@w3ux/types';
|
|
3
|
+
import * as react from 'react';
|
|
4
|
+
import { ReactNode } from 'react';
|
|
5
|
+
|
|
6
|
+
interface ExtensionsConnectContextInterface {
|
|
7
|
+
gettingExtensions: boolean;
|
|
8
|
+
extensionsStatus: Record<string, ExtensionStatus>;
|
|
9
|
+
setExtensionStatus: (id: string, status: ExtensionStatus) => void;
|
|
10
|
+
removeExtensionStatus: (id: string) => void;
|
|
11
|
+
extensionInstalled: (id: string) => boolean;
|
|
12
|
+
extensionCanConnect: (id: string) => boolean;
|
|
13
|
+
}
|
|
14
|
+
interface ExtensionAccountsContextInterface {
|
|
15
|
+
extensionsInitialised: string[];
|
|
16
|
+
connectExtension: (id: string) => Promise<boolean>;
|
|
17
|
+
extensionsSynced: Sync;
|
|
18
|
+
getExtensionAccount: (address: string) => ExtensionAccount | undefined;
|
|
19
|
+
getExtensionAccounts: (ss58: number) => Account[];
|
|
20
|
+
}
|
|
21
|
+
interface ExtensionsProviderProps {
|
|
22
|
+
children: ReactNode;
|
|
23
|
+
ss58: number;
|
|
24
|
+
dappName: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
declare const ExtensionsProvider: ({ ss58, dappName, children, }: ExtensionsProviderProps) => react_jsx_runtime.JSX.Element;
|
|
28
|
+
|
|
29
|
+
declare const useExtensionAccounts: () => ExtensionAccountsContextInterface;
|
|
30
|
+
|
|
31
|
+
declare const useExtensions: () => ExtensionsConnectContextInterface;
|
|
32
|
+
|
|
33
|
+
interface HardwareAccountsContextInterface {
|
|
34
|
+
hardwareAccountExists: (source: HardwareAccountSource, network: string, a: string) => boolean;
|
|
35
|
+
addHardwareAccount: (source: HardwareAccountSource, network: string, address: string, index: number, callback?: () => void) => HardwareAccount | null;
|
|
36
|
+
removeHardwareAccount: (source: HardwareAccountSource, network: string, address: string, callback?: () => void) => void;
|
|
37
|
+
renameHardwareAccount: (source: HardwareAccountSource, network: string, address: string, name: string) => void;
|
|
38
|
+
getHardwareAccount: (source: HardwareAccountSource, network: string, address: string) => HardwareAccount | null;
|
|
39
|
+
getHardwareAccounts: (source: HardwareAccountSource, network: string) => HardwareAccount[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
declare const HardwareAccountsContext: react.Context<HardwareAccountsContextInterface | null>;
|
|
43
|
+
declare const useHardwareAccounts: () => HardwareAccountsContextInterface;
|
|
44
|
+
declare const HardwareAccountsProvider: ({ children, }: {
|
|
45
|
+
children: ReactNode;
|
|
46
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
47
|
+
|
|
48
|
+
export { ExtensionsProvider, HardwareAccountsContext, HardwareAccountsProvider, useExtensionAccounts, useExtensions, useHardwareAccounts };
|
package/index.d.ts
CHANGED
|
@@ -1,2 +1,48 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { Sync, ExtensionAccount, Account, ExtensionStatus, HardwareAccountSource, HardwareAccount } from '@w3ux/types';
|
|
3
|
+
import * as react from 'react';
|
|
4
|
+
import { ReactNode } from 'react';
|
|
5
|
+
|
|
6
|
+
interface ExtensionsConnectContextInterface {
|
|
7
|
+
gettingExtensions: boolean;
|
|
8
|
+
extensionsStatus: Record<string, ExtensionStatus>;
|
|
9
|
+
setExtensionStatus: (id: string, status: ExtensionStatus) => void;
|
|
10
|
+
removeExtensionStatus: (id: string) => void;
|
|
11
|
+
extensionInstalled: (id: string) => boolean;
|
|
12
|
+
extensionCanConnect: (id: string) => boolean;
|
|
13
|
+
}
|
|
14
|
+
interface ExtensionAccountsContextInterface {
|
|
15
|
+
extensionsInitialised: string[];
|
|
16
|
+
connectExtension: (id: string) => Promise<boolean>;
|
|
17
|
+
extensionsSynced: Sync;
|
|
18
|
+
getExtensionAccount: (address: string) => ExtensionAccount | undefined;
|
|
19
|
+
getExtensionAccounts: (ss58: number) => Account[];
|
|
20
|
+
}
|
|
21
|
+
interface ExtensionsProviderProps {
|
|
22
|
+
children: ReactNode;
|
|
23
|
+
ss58: number;
|
|
24
|
+
dappName: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
declare const ExtensionsProvider: ({ ss58, dappName, children, }: ExtensionsProviderProps) => react_jsx_runtime.JSX.Element;
|
|
28
|
+
|
|
29
|
+
declare const useExtensionAccounts: () => ExtensionAccountsContextInterface;
|
|
30
|
+
|
|
31
|
+
declare const useExtensions: () => ExtensionsConnectContextInterface;
|
|
32
|
+
|
|
33
|
+
interface HardwareAccountsContextInterface {
|
|
34
|
+
hardwareAccountExists: (source: HardwareAccountSource, network: string, a: string) => boolean;
|
|
35
|
+
addHardwareAccount: (source: HardwareAccountSource, network: string, address: string, index: number, callback?: () => void) => HardwareAccount | null;
|
|
36
|
+
removeHardwareAccount: (source: HardwareAccountSource, network: string, address: string, callback?: () => void) => void;
|
|
37
|
+
renameHardwareAccount: (source: HardwareAccountSource, network: string, address: string, name: string) => void;
|
|
38
|
+
getHardwareAccount: (source: HardwareAccountSource, network: string, address: string) => HardwareAccount | null;
|
|
39
|
+
getHardwareAccounts: (source: HardwareAccountSource, network: string) => HardwareAccount[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
declare const HardwareAccountsContext: react.Context<HardwareAccountsContextInterface | null>;
|
|
43
|
+
declare const useHardwareAccounts: () => HardwareAccountsContextInterface;
|
|
44
|
+
declare const HardwareAccountsProvider: ({ children, }: {
|
|
45
|
+
children: ReactNode;
|
|
46
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
47
|
+
|
|
48
|
+
export { ExtensionsProvider, HardwareAccountsContext, HardwareAccountsProvider, useExtensionAccounts, useExtensions, useHardwareAccounts };
|
package/index.js
CHANGED
|
@@ -1,6 +1,262 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
// src/Extensions/Accounts.tsx
|
|
2
|
+
import { createSafeContext as createSafeContext2 } from "@w3ux/hooks";
|
|
3
|
+
import {
|
|
4
|
+
extensionAccounts$,
|
|
5
|
+
getReconnectSync,
|
|
6
|
+
initialisedExtensions$,
|
|
7
|
+
reconnectSync$,
|
|
8
|
+
resetAccounts
|
|
9
|
+
} from "@w3ux/observables-connect";
|
|
10
|
+
import { unsubAll } from "@w3ux/observables-connect/accounts";
|
|
11
|
+
import {
|
|
12
|
+
connectExtension as doConnectExtension,
|
|
13
|
+
reconnectExtensions
|
|
14
|
+
} from "@w3ux/observables-connect/extensions";
|
|
15
|
+
import { formatAccountSs58 } from "@w3ux/utils";
|
|
16
|
+
import { useEffect as useEffect2, useState as useState2 } from "react";
|
|
17
|
+
import { combineLatest as combineLatest2 } from "rxjs";
|
|
3
18
|
|
|
4
|
-
|
|
19
|
+
// src/Extensions/Connect.tsx
|
|
20
|
+
import { createSafeContext } from "@w3ux/hooks";
|
|
21
|
+
import {
|
|
22
|
+
canConnect,
|
|
23
|
+
extensionsStatus$,
|
|
24
|
+
getStatus,
|
|
25
|
+
gettingExtensions$,
|
|
26
|
+
removeStatus,
|
|
27
|
+
setStatus
|
|
28
|
+
} from "@w3ux/observables-connect";
|
|
29
|
+
import { getExtensions } from "@w3ux/observables-connect/extensions";
|
|
30
|
+
import { useEffect, useState } from "react";
|
|
31
|
+
import { combineLatest } from "rxjs";
|
|
32
|
+
import { jsx } from "react/jsx-runtime";
|
|
33
|
+
var [ExtensionsConnectContext, useExtensions] = createSafeContext();
|
|
34
|
+
var ExtensionsConnectProvider = ({
|
|
35
|
+
children
|
|
36
|
+
}) => {
|
|
37
|
+
const [gettingExtensions, setGettingExtensions] = useState(true);
|
|
38
|
+
const [extensionsStatus, setExtensionsStatus] = useState({});
|
|
39
|
+
const setExtensionStatus = (id, status) => {
|
|
40
|
+
setStatus(id, status);
|
|
41
|
+
};
|
|
42
|
+
const removeExtensionStatus = (id) => {
|
|
43
|
+
removeStatus(id);
|
|
44
|
+
};
|
|
45
|
+
const extensionInstalled = (id) => getStatus(id) !== void 0;
|
|
46
|
+
const extensionCanConnect = (id) => canConnect(id);
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
getExtensions();
|
|
49
|
+
const sub = combineLatest([
|
|
50
|
+
gettingExtensions$,
|
|
51
|
+
extensionsStatus$
|
|
52
|
+
]).subscribe(([getting, status]) => {
|
|
53
|
+
setGettingExtensions(getting);
|
|
54
|
+
setExtensionsStatus(status);
|
|
55
|
+
});
|
|
56
|
+
return () => {
|
|
57
|
+
sub.unsubscribe();
|
|
58
|
+
};
|
|
59
|
+
}, []);
|
|
60
|
+
return /* @__PURE__ */ jsx(
|
|
61
|
+
ExtensionsConnectContext.Provider,
|
|
62
|
+
{
|
|
63
|
+
value: {
|
|
64
|
+
extensionsStatus,
|
|
65
|
+
gettingExtensions,
|
|
66
|
+
setExtensionStatus,
|
|
67
|
+
removeExtensionStatus,
|
|
68
|
+
extensionInstalled,
|
|
69
|
+
extensionCanConnect
|
|
70
|
+
},
|
|
71
|
+
children
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
};
|
|
5
75
|
|
|
6
|
-
|
|
76
|
+
// src/Extensions/Accounts.tsx
|
|
77
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
78
|
+
var [ExtensionAccountsContext, useExtensionAccounts] = createSafeContext2();
|
|
79
|
+
var ExtensionAccountsProvider = ({
|
|
80
|
+
children,
|
|
81
|
+
ss58,
|
|
82
|
+
dappName
|
|
83
|
+
}) => {
|
|
84
|
+
const { gettingExtensions } = useExtensions();
|
|
85
|
+
const [extensionAccounts, setExtensionAccounts] = useState2([]);
|
|
86
|
+
const [extensionsInitialised, setExtensionsInitialised] = useState2(
|
|
87
|
+
[]
|
|
88
|
+
);
|
|
89
|
+
const [extensionsSynced, setExtensionsSynced] = useState2(getReconnectSync());
|
|
90
|
+
const handleInitialConnect = async () => {
|
|
91
|
+
if (!gettingExtensions && extensionsSynced === "unsynced") {
|
|
92
|
+
unsubAll();
|
|
93
|
+
resetAccounts();
|
|
94
|
+
await reconnectExtensions(dappName, ss58);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const connectExtension = async (id) => await doConnectExtension(dappName, ss58, id);
|
|
98
|
+
const getExtensionAccounts = (ss58Prefix) => extensionAccounts.map((account) => {
|
|
99
|
+
const formattedAddress = formatAccountSs58(account.address, ss58Prefix);
|
|
100
|
+
if (!formattedAddress) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
...account,
|
|
105
|
+
address: formattedAddress
|
|
106
|
+
};
|
|
107
|
+
}).filter((account) => account !== null);
|
|
108
|
+
const getExtensionAccount = (address) => {
|
|
109
|
+
const account = extensionAccounts.find(
|
|
110
|
+
(item) => formatAccountSs58(item.address, 0) === formatAccountSs58(address, 0)
|
|
111
|
+
);
|
|
112
|
+
return account ? { ...account, address } : void 0;
|
|
113
|
+
};
|
|
114
|
+
useEffect2(() => {
|
|
115
|
+
handleInitialConnect();
|
|
116
|
+
return () => unsubAll();
|
|
117
|
+
}, [gettingExtensions]);
|
|
118
|
+
useEffect2(() => {
|
|
119
|
+
const sub = combineLatest2([
|
|
120
|
+
initialisedExtensions$,
|
|
121
|
+
extensionAccounts$,
|
|
122
|
+
reconnectSync$
|
|
123
|
+
]).subscribe(([initialised, accounts, sync]) => {
|
|
124
|
+
setExtensionsInitialised(initialised);
|
|
125
|
+
setExtensionAccounts(accounts);
|
|
126
|
+
setExtensionsSynced(sync);
|
|
127
|
+
});
|
|
128
|
+
return () => {
|
|
129
|
+
sub.unsubscribe();
|
|
130
|
+
};
|
|
131
|
+
}, []);
|
|
132
|
+
return /* @__PURE__ */ jsx2(
|
|
133
|
+
ExtensionAccountsContext.Provider,
|
|
134
|
+
{
|
|
135
|
+
value: {
|
|
136
|
+
extensionsInitialised,
|
|
137
|
+
connectExtension,
|
|
138
|
+
extensionsSynced,
|
|
139
|
+
getExtensionAccount,
|
|
140
|
+
getExtensionAccounts
|
|
141
|
+
},
|
|
142
|
+
children
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
// src/Extensions/Provider.tsx
|
|
148
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
149
|
+
var ExtensionsProvider = ({
|
|
150
|
+
ss58,
|
|
151
|
+
dappName,
|
|
152
|
+
children
|
|
153
|
+
}) => /* @__PURE__ */ jsx3(ExtensionsConnectProvider, { children: /* @__PURE__ */ jsx3(ExtensionAccountsProvider, { ss58, dappName, children }) });
|
|
154
|
+
|
|
155
|
+
// src/Hardware/index.tsx
|
|
156
|
+
import { createSafeContext as createSafeContext3 } from "@w3ux/hooks";
|
|
157
|
+
import {
|
|
158
|
+
getHardwareAccountsLocal,
|
|
159
|
+
hardwareAccounts$,
|
|
160
|
+
HardwareAccountsKey,
|
|
161
|
+
setHardwareAccounts
|
|
162
|
+
} from "@w3ux/observables-connect";
|
|
163
|
+
import { ellipsisFn } from "@w3ux/utils";
|
|
164
|
+
import { useEffect as useEffect3, useState as useState3 } from "react";
|
|
165
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
166
|
+
var [HardwareAccountsContext, useHardwareAccounts] = createSafeContext3();
|
|
167
|
+
var HardwareAccountsProvider = ({
|
|
168
|
+
children
|
|
169
|
+
}) => {
|
|
170
|
+
const [hardwareAccounts, setHardwareAccountsState] = useState3(getHardwareAccountsLocal());
|
|
171
|
+
const hardwareAccountExists = (source, network, address) => !!hardwareAccounts.find(
|
|
172
|
+
(a) => a.source === source && a.address === address && a.network === network
|
|
173
|
+
);
|
|
174
|
+
const addHardwareAccount = (source, network, address, index, callback) => {
|
|
175
|
+
if (!hardwareAccountExists(source, network, address)) {
|
|
176
|
+
const newAccount = {
|
|
177
|
+
address,
|
|
178
|
+
network,
|
|
179
|
+
name: ellipsisFn(address),
|
|
180
|
+
source,
|
|
181
|
+
index
|
|
182
|
+
};
|
|
183
|
+
const newHardwareAccounts = [...hardwareAccounts].concat(newAccount);
|
|
184
|
+
localStorage.setItem(
|
|
185
|
+
HardwareAccountsKey,
|
|
186
|
+
JSON.stringify(newHardwareAccounts)
|
|
187
|
+
);
|
|
188
|
+
setHardwareAccounts(newHardwareAccounts);
|
|
189
|
+
if (typeof callback === "function") {
|
|
190
|
+
callback();
|
|
191
|
+
}
|
|
192
|
+
return newAccount;
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
195
|
+
};
|
|
196
|
+
const removeHardwareAccount = (source, network, address, callback) => {
|
|
197
|
+
const newHardwareAccounts = [...hardwareAccounts].filter(
|
|
198
|
+
(a) => !(a.source === source && a.address === address && a.network === network)
|
|
199
|
+
);
|
|
200
|
+
if (!newHardwareAccounts.length) {
|
|
201
|
+
localStorage.removeItem(HardwareAccountsKey);
|
|
202
|
+
} else {
|
|
203
|
+
localStorage.setItem(
|
|
204
|
+
HardwareAccountsKey,
|
|
205
|
+
JSON.stringify(newHardwareAccounts)
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
setHardwareAccounts(newHardwareAccounts);
|
|
209
|
+
if (typeof callback === "function") {
|
|
210
|
+
callback();
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
const renameHardwareAccount = (source, network, address, newName) => {
|
|
214
|
+
const newHardwareAccounts = [...hardwareAccounts].map(
|
|
215
|
+
(a) => a.source === source && a.network === network && a.address === address ? {
|
|
216
|
+
...a,
|
|
217
|
+
name: newName
|
|
218
|
+
} : a
|
|
219
|
+
);
|
|
220
|
+
localStorage.setItem(
|
|
221
|
+
HardwareAccountsKey,
|
|
222
|
+
JSON.stringify(newHardwareAccounts)
|
|
223
|
+
);
|
|
224
|
+
setHardwareAccounts(newHardwareAccounts);
|
|
225
|
+
};
|
|
226
|
+
const getHardwareAccount = (source, network, address) => hardwareAccounts.find(
|
|
227
|
+
(a) => a.source === source && a.network === network && a.address === address
|
|
228
|
+
) || null;
|
|
229
|
+
const getHardwareAccounts = (source, network) => hardwareAccounts.filter((a) => a.source === source && a.network === network);
|
|
230
|
+
useEffect3(() => {
|
|
231
|
+
const sub = hardwareAccounts$.subscribe((accounts) => {
|
|
232
|
+
setHardwareAccountsState(accounts);
|
|
233
|
+
});
|
|
234
|
+
return () => {
|
|
235
|
+
sub.unsubscribe();
|
|
236
|
+
};
|
|
237
|
+
}, []);
|
|
238
|
+
return /* @__PURE__ */ jsx4(
|
|
239
|
+
HardwareAccountsContext.Provider,
|
|
240
|
+
{
|
|
241
|
+
value: {
|
|
242
|
+
hardwareAccountExists,
|
|
243
|
+
getHardwareAccount,
|
|
244
|
+
addHardwareAccount,
|
|
245
|
+
removeHardwareAccount,
|
|
246
|
+
renameHardwareAccount,
|
|
247
|
+
getHardwareAccounts
|
|
248
|
+
},
|
|
249
|
+
children
|
|
250
|
+
}
|
|
251
|
+
);
|
|
252
|
+
};
|
|
253
|
+
export {
|
|
254
|
+
ExtensionsProvider,
|
|
255
|
+
HardwareAccountsContext,
|
|
256
|
+
HardwareAccountsProvider,
|
|
257
|
+
useExtensionAccounts,
|
|
258
|
+
useExtensions,
|
|
259
|
+
useHardwareAccounts
|
|
260
|
+
};
|
|
261
|
+
/* @license Copyright 2024 w3ux authors & contributors
|
|
262
|
+
SPDX-License-Identifier: GPL-3.0-only */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@w3ux/react-connect-kit",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.6.1",
|
|
4
4
|
"license": "GPL-3.0-only",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Providers and hooks for connecting to web3 wallets and interacting with accounts",
|
|
@@ -24,14 +24,19 @@
|
|
|
24
24
|
"url": "https://github.com/w3ux/w3ux-library/issues"
|
|
25
25
|
},
|
|
26
26
|
"exports": {
|
|
27
|
-
".":
|
|
27
|
+
".": {
|
|
28
|
+
"import": "./index.js",
|
|
29
|
+
"require": "./index.cjs"
|
|
30
|
+
}
|
|
28
31
|
},
|
|
29
32
|
"dependencies": {
|
|
30
|
-
"@w3ux/hooks": "^2.
|
|
31
|
-
"@w3ux/observables-connect": "^0.
|
|
32
|
-
"@w3ux/utils": "^2.
|
|
33
|
+
"@w3ux/hooks": "^2.3.2",
|
|
34
|
+
"@w3ux/observables-connect": "^0.10.1",
|
|
35
|
+
"@w3ux/utils": "^2.2.0"
|
|
33
36
|
},
|
|
34
37
|
"peerDependencies": {
|
|
38
|
+
"react": "^19.1.0",
|
|
39
|
+
"react-dom": "^19.1.0",
|
|
35
40
|
"rxjs": "^7.8.2"
|
|
36
41
|
}
|
|
37
42
|
}
|
package/Extensions/Accounts.d.ts
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import type { ExtensionAccountsContextInterface, ExtensionsProviderProps } from './types';
|
|
2
|
-
export declare const ExtensionAccountsContext: import("react").Context<ExtensionAccountsContextInterface | null>, useExtensionAccounts: () => ExtensionAccountsContextInterface;
|
|
3
|
-
export declare const ExtensionAccountsProvider: ({ children, ss58, dappName, }: ExtensionsProviderProps) => import("react/jsx-runtime").JSX.Element;
|
package/Extensions/Accounts.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createSafeContext } from '@w3ux/hooks';
|
|
3
|
-
import { extensionAccounts$, getReconnectSync, initialisedExtensions$, reconnectSync$, resetAccounts, } from '@w3ux/observables-connect';
|
|
4
|
-
import { unsubAll } from '@w3ux/observables-connect/accounts';
|
|
5
|
-
import { connectExtension as doConnectExtension, reconnectExtensions, } from '@w3ux/observables-connect/extensions';
|
|
6
|
-
import { formatAccountSs58 } from '@w3ux/utils';
|
|
7
|
-
import { useEffect, useState } from 'react';
|
|
8
|
-
import { combineLatest } from 'rxjs';
|
|
9
|
-
import { useExtensions } from './Connect';
|
|
10
|
-
export const [ExtensionAccountsContext, useExtensionAccounts] = createSafeContext();
|
|
11
|
-
export const ExtensionAccountsProvider = ({ children, ss58, dappName, }) => {
|
|
12
|
-
const { gettingExtensions } = useExtensions();
|
|
13
|
-
const [extensionAccounts, setExtensionAccounts] = useState([]);
|
|
14
|
-
const [extensionsInitialised, setExtensionsInitialised] = useState([]);
|
|
15
|
-
const [extensionsSynced, setExtensionsSynced] = useState(getReconnectSync());
|
|
16
|
-
const handleInitialConnect = async () => {
|
|
17
|
-
if (!gettingExtensions && extensionsSynced === 'unsynced') {
|
|
18
|
-
unsubAll();
|
|
19
|
-
resetAccounts();
|
|
20
|
-
await reconnectExtensions(dappName, ss58);
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
const connectExtension = async (id) => await doConnectExtension(dappName, ss58, id);
|
|
24
|
-
const getExtensionAccounts = (ss58Prefix) => extensionAccounts
|
|
25
|
-
.map((account) => {
|
|
26
|
-
const formattedAddress = formatAccountSs58(account.address, ss58Prefix);
|
|
27
|
-
if (!formattedAddress) {
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
return {
|
|
31
|
-
...account,
|
|
32
|
-
address: formattedAddress,
|
|
33
|
-
};
|
|
34
|
-
})
|
|
35
|
-
.filter((account) => account !== null);
|
|
36
|
-
const getExtensionAccount = (address) => {
|
|
37
|
-
const account = extensionAccounts.find((item) => formatAccountSs58(item.address, 0) === formatAccountSs58(address, 0));
|
|
38
|
-
return account ? { ...account, address } : undefined;
|
|
39
|
-
};
|
|
40
|
-
useEffect(() => {
|
|
41
|
-
handleInitialConnect();
|
|
42
|
-
return () => unsubAll();
|
|
43
|
-
}, [gettingExtensions]);
|
|
44
|
-
useEffect(() => {
|
|
45
|
-
const sub = combineLatest([
|
|
46
|
-
initialisedExtensions$,
|
|
47
|
-
extensionAccounts$,
|
|
48
|
-
reconnectSync$,
|
|
49
|
-
]).subscribe(([initialised, accounts, sync]) => {
|
|
50
|
-
setExtensionsInitialised(initialised);
|
|
51
|
-
setExtensionAccounts(accounts);
|
|
52
|
-
setExtensionsSynced(sync);
|
|
53
|
-
});
|
|
54
|
-
return () => {
|
|
55
|
-
sub.unsubscribe();
|
|
56
|
-
};
|
|
57
|
-
}, []);
|
|
58
|
-
return (_jsx(ExtensionAccountsContext.Provider, { value: {
|
|
59
|
-
extensionsInitialised,
|
|
60
|
-
connectExtension,
|
|
61
|
-
extensionsSynced,
|
|
62
|
-
getExtensionAccount,
|
|
63
|
-
getExtensionAccounts,
|
|
64
|
-
}, children: children }));
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
//# sourceMappingURL=Accounts.js.map
|
|
68
|
-
|
|
69
|
-
//# sourceMappingURL=Accounts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Extensions/Accounts.tsx"],"names":[],"mappings":"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","file":"Accounts.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { createSafeContext } from '@w3ux/hooks'\nimport {\n extensionAccounts$,\n getReconnectSync,\n initialisedExtensions$,\n reconnectSync$,\n resetAccounts,\n} from '@w3ux/observables-connect'\nimport { unsubAll } from '@w3ux/observables-connect/accounts'\nimport {\n connectExtension as doConnectExtension,\n reconnectExtensions,\n} from '@w3ux/observables-connect/extensions'\nimport type { Account, ExtensionAccount, Sync } from '@w3ux/types'\nimport { formatAccountSs58 } from '@w3ux/utils'\nimport { useEffect, useState } from 'react'\nimport { combineLatest } from 'rxjs'\nimport { useExtensions } from './Connect'\nimport type {\n ExtensionAccountsContextInterface,\n ExtensionsProviderProps,\n} from './types'\n\nexport const [ExtensionAccountsContext, useExtensionAccounts] =\n createSafeContext<ExtensionAccountsContextInterface>()\n\nexport const ExtensionAccountsProvider = ({\n children,\n ss58,\n dappName,\n}: ExtensionsProviderProps) => {\n const { gettingExtensions } = useExtensions()\n\n // Store connected extension accounts\n const [extensionAccounts, setExtensionAccounts] = useState<Account[]>([])\n // Stores initialised extensions\n const [extensionsInitialised, setExtensionsInitialised] = useState<string[]>(\n []\n )\n // Store whether previously enabled extensions have been re-connected\n const [extensionsSynced, setExtensionsSynced] =\n useState<Sync>(getReconnectSync())\n\n // Handle initial connection to previously enabled extensions\n const handleInitialConnect = async () => {\n if (!gettingExtensions && extensionsSynced === 'unsynced') {\n // Defensive: unsubscribe from all accounts and reset state\n unsubAll()\n resetAccounts()\n await reconnectExtensions(dappName, ss58)\n }\n }\n\n // Connects to a single extension and processes its accounts\n const connectExtension = async (id: string): Promise<boolean> =>\n await doConnectExtension(dappName, ss58, id)\n\n // Get extension accounts, formatted by a provided ss58 prefix\n const getExtensionAccounts = (ss58Prefix: number) =>\n extensionAccounts\n .map((account) => {\n const formattedAddress = formatAccountSs58(account.address, ss58Prefix)\n if (!formattedAddress) {\n return null\n }\n return {\n ...account,\n address: formattedAddress,\n }\n })\n .filter((account) => account !== null)\n\n // Get an imported extension account\n const getExtensionAccount = (\n address: string\n ): ExtensionAccount | undefined => {\n const account = extensionAccounts.find(\n (item) =>\n formatAccountSs58(item.address, 0) === formatAccountSs58(address, 0)\n )\n return account ? { ...account, address } : undefined\n }\n\n // Initialise extension accounts sync\n useEffect(() => {\n handleInitialConnect()\n return () => unsubAll()\n }, [gettingExtensions])\n\n // Subscribes to observables and updates state\n useEffect(() => {\n const sub = combineLatest([\n initialisedExtensions$,\n extensionAccounts$,\n reconnectSync$,\n ]).subscribe(([initialised, accounts, sync]) => {\n setExtensionsInitialised(initialised)\n setExtensionAccounts(accounts)\n setExtensionsSynced(sync)\n })\n return () => {\n sub.unsubscribe()\n }\n }, [])\n\n return (\n <ExtensionAccountsContext.Provider\n value={{\n extensionsInitialised,\n connectExtension,\n extensionsSynced,\n getExtensionAccount,\n getExtensionAccounts,\n }}\n >\n {children}\n </ExtensionAccountsContext.Provider>\n )\n}\n"]}
|
package/Extensions/Connect.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { type ReactNode } from 'react';
|
|
2
|
-
import type { ExtensionsConnectContextInterface } from './types';
|
|
3
|
-
export declare const ExtensionsConnectContext: import("react").Context<ExtensionsConnectContextInterface | null>, useExtensions: () => ExtensionsConnectContextInterface;
|
|
4
|
-
export declare const ExtensionsConnectProvider: ({ children, }: {
|
|
5
|
-
children: ReactNode;
|
|
6
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
package/Extensions/Connect.js
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createSafeContext } from '@w3ux/hooks';
|
|
3
|
-
import { canConnect, extensionsStatus$, getStatus, gettingExtensions$, removeStatus, setStatus, } from '@w3ux/observables-connect';
|
|
4
|
-
import { getExtensions } from '@w3ux/observables-connect/extensions';
|
|
5
|
-
import { useEffect, useState } from 'react';
|
|
6
|
-
import { combineLatest } from 'rxjs';
|
|
7
|
-
export const [ExtensionsConnectContext, useExtensions] = createSafeContext();
|
|
8
|
-
export const ExtensionsConnectProvider = ({ children, }) => {
|
|
9
|
-
const [gettingExtensions, setGettingExtensions] = useState(true);
|
|
10
|
-
const [extensionsStatus, setExtensionsStatus] = useState({});
|
|
11
|
-
const setExtensionStatus = (id, status) => {
|
|
12
|
-
setStatus(id, status);
|
|
13
|
-
};
|
|
14
|
-
const removeExtensionStatus = (id) => {
|
|
15
|
-
removeStatus(id);
|
|
16
|
-
};
|
|
17
|
-
const extensionInstalled = (id) => getStatus(id) !== undefined;
|
|
18
|
-
const extensionCanConnect = (id) => canConnect(id);
|
|
19
|
-
useEffect(() => {
|
|
20
|
-
getExtensions();
|
|
21
|
-
const sub = combineLatest([
|
|
22
|
-
gettingExtensions$,
|
|
23
|
-
extensionsStatus$,
|
|
24
|
-
]).subscribe(([getting, status]) => {
|
|
25
|
-
setGettingExtensions(getting);
|
|
26
|
-
setExtensionsStatus(status);
|
|
27
|
-
});
|
|
28
|
-
return () => {
|
|
29
|
-
sub.unsubscribe();
|
|
30
|
-
};
|
|
31
|
-
}, []);
|
|
32
|
-
return (_jsx(ExtensionsConnectContext.Provider, { value: {
|
|
33
|
-
extensionsStatus,
|
|
34
|
-
gettingExtensions,
|
|
35
|
-
setExtensionStatus,
|
|
36
|
-
removeExtensionStatus,
|
|
37
|
-
extensionInstalled,
|
|
38
|
-
extensionCanConnect,
|
|
39
|
-
}, children: children }));
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
//# sourceMappingURL=Connect.js.map
|
|
43
|
-
|
|
44
|
-
//# sourceMappingURL=Connect.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Extensions/Connect.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,kBAAkB,EAClB,YAAY,EACZ,SAAS,GACV,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAA;AAEpE,OAAO,EAAkB,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAA;AAGpC,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,aAAa,CAAC,GACpD,iBAAiB,EAAqC,CAAA;AAExD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,EACxC,QAAQ,GAGT,EAAE,EAAE;IAEH,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAU,IAAI,CAAC,CAAA;IAGzE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAmB,EAAE,CAAC,CAAA;IAG9E,MAAM,kBAAkB,GAAG,CAAC,EAAU,EAAE,MAAuB,EAAE,EAAE;QACjE,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IACvB,CAAC,CAAA;IAGD,MAAM,qBAAqB,GAAG,CAAC,EAAU,EAAE,EAAE;QAC3C,YAAY,CAAC,EAAE,CAAC,CAAA;IAClB,CAAC,CAAA;IAGD,MAAM,kBAAkB,GAAG,CAAC,EAAU,EAAW,EAAE,CACjD,SAAS,CAAC,EAAE,CAAC,KAAK,SAAS,CAAA;IAG7B,MAAM,mBAAmB,GAAG,CAAC,EAAU,EAAW,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;IAGnE,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,EAAE,CAAA;QACf,MAAM,GAAG,GAAG,aAAa,CAAC;YACxB,kBAAkB;YAClB,iBAAiB;SAClB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE;YACjC,oBAAoB,CAAC,OAAO,CAAC,CAAA;YAC7B,mBAAmB,CAAC,MAAM,CAAC,CAAA;QAC7B,CAAC,CAAC,CAAA;QACF,OAAO,GAAG,EAAE;YACV,GAAG,CAAC,WAAW,EAAE,CAAA;QACnB,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CACL,KAAC,wBAAwB,CAAC,QAAQ,IAChC,KAAK,EAAE;YACL,gBAAgB;YAChB,iBAAiB;YACjB,kBAAkB;YAClB,qBAAqB;YACrB,kBAAkB;YAClB,mBAAmB;SACpB,YAEA,QAAQ,GACyB,CACrC,CAAA;AACH,CAAC,CAAA","file":"Connect.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { createSafeContext } from '@w3ux/hooks'\nimport {\n canConnect,\n extensionsStatus$,\n getStatus,\n gettingExtensions$,\n removeStatus,\n setStatus,\n} from '@w3ux/observables-connect'\nimport { getExtensions } from '@w3ux/observables-connect/extensions'\nimport type { ExtensionsStatus, ExtensionStatus } from '@w3ux/types'\nimport { type ReactNode, useEffect, useState } from 'react'\nimport { combineLatest } from 'rxjs'\nimport type { ExtensionsConnectContextInterface } from './types'\n\nexport const [ExtensionsConnectContext, useExtensions] =\n createSafeContext<ExtensionsConnectContextInterface>()\n\nexport const ExtensionsConnectProvider = ({\n children,\n}: {\n children: ReactNode\n}) => {\n // Store whether extensions are being fetched\n const [gettingExtensions, setGettingExtensions] = useState<boolean>(true)\n\n // Store discovered extensions along with their status\n const [extensionsStatus, setExtensionsStatus] = useState<ExtensionsStatus>({})\n\n // Setter for an extension status\n const setExtensionStatus = (id: string, status: ExtensionStatus) => {\n setStatus(id, status)\n }\n\n // Removes an extension status\n const removeExtensionStatus = (id: string) => {\n removeStatus(id)\n }\n\n // Checks if an extension has been installed\n const extensionInstalled = (id: string): boolean =>\n getStatus(id) !== undefined\n\n // Checks whether an extension can be connected to\n const extensionCanConnect = (id: string): boolean => canConnect(id)\n\n // Subscribes to observables and updates state\n useEffect(() => {\n getExtensions()\n const sub = combineLatest([\n gettingExtensions$,\n extensionsStatus$,\n ]).subscribe(([getting, status]) => {\n setGettingExtensions(getting)\n setExtensionsStatus(status)\n })\n return () => {\n sub.unsubscribe()\n }\n }, [])\n\n return (\n <ExtensionsConnectContext.Provider\n value={{\n extensionsStatus,\n gettingExtensions,\n setExtensionStatus,\n removeExtensionStatus,\n extensionInstalled,\n extensionCanConnect,\n }}\n >\n {children}\n </ExtensionsConnectContext.Provider>\n )\n}\n"]}
|
package/Extensions/Provider.d.ts
DELETED
package/Extensions/Provider.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { ExtensionAccountsProvider } from './Accounts';
|
|
3
|
-
import { ExtensionsConnectProvider } from './Connect';
|
|
4
|
-
export const ExtensionsProvider = ({ ss58, dappName, children, }) => (_jsx(ExtensionsConnectProvider, { children: _jsx(ExtensionAccountsProvider, { ss58: ss58, dappName: dappName, children: children }) }));
|
|
5
|
-
|
|
6
|
-
//# sourceMappingURL=Provider.js.map
|
|
7
|
-
|
|
8
|
-
//# sourceMappingURL=Provider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Extensions/Provider.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAA;AAGrD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,QAAQ,GACgB,EAAE,EAAE,CAAC,CAC7B,KAAC,yBAAyB,cACxB,KAAC,yBAAyB,IAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,YACtD,QAAQ,GACiB,GACF,CAC7B,CAAA","file":"Provider.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { ExtensionAccountsProvider } from './Accounts'\nimport { ExtensionsConnectProvider } from './Connect'\nimport type { ExtensionsProviderProps } from './types'\n\nexport const ExtensionsProvider = ({\n ss58,\n dappName,\n children,\n}: ExtensionsProviderProps) => (\n <ExtensionsConnectProvider>\n <ExtensionAccountsProvider ss58={ss58} dappName={dappName}>\n {children}\n </ExtensionAccountsProvider>\n </ExtensionsConnectProvider>\n)\n"]}
|
package/Extensions/index.d.ts
DELETED
package/Extensions/index.js
DELETED
package/Extensions/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Extensions/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAE/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport { ExtensionsProvider } from './Provider'\n\nexport { useExtensionAccounts } from './Accounts'\nexport { useExtensions } from './Connect'\n"]}
|
package/Extensions/types.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { Account, ExtensionAccount, ExtensionStatus, Sync } from '@w3ux/types';
|
|
2
|
-
import type { ReactNode } from 'react';
|
|
3
|
-
export interface ExtensionsConnectContextInterface {
|
|
4
|
-
gettingExtensions: boolean;
|
|
5
|
-
extensionsStatus: Record<string, ExtensionStatus>;
|
|
6
|
-
setExtensionStatus: (id: string, status: ExtensionStatus) => void;
|
|
7
|
-
removeExtensionStatus: (id: string) => void;
|
|
8
|
-
extensionInstalled: (id: string) => boolean;
|
|
9
|
-
extensionCanConnect: (id: string) => boolean;
|
|
10
|
-
}
|
|
11
|
-
export interface ExtensionAccountsContextInterface {
|
|
12
|
-
extensionsInitialised: string[];
|
|
13
|
-
connectExtension: (id: string) => Promise<boolean>;
|
|
14
|
-
extensionsSynced: Sync;
|
|
15
|
-
getExtensionAccount: (address: string) => ExtensionAccount | undefined;
|
|
16
|
-
getExtensionAccounts: (ss58: number) => Account[];
|
|
17
|
-
}
|
|
18
|
-
export interface ExtensionsProviderProps {
|
|
19
|
-
children: ReactNode;
|
|
20
|
-
ss58: number;
|
|
21
|
-
dappName: string;
|
|
22
|
-
}
|
package/Extensions/types.js
DELETED
package/Extensions/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Extensions/types.ts"],"names":[],"mappings":"","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n Account,\n ExtensionAccount,\n ExtensionStatus,\n Sync,\n} from '@w3ux/types'\nimport type { ReactNode } from 'react'\n\nexport interface ExtensionsConnectContextInterface {\n gettingExtensions: boolean\n extensionsStatus: Record<string, ExtensionStatus>\n setExtensionStatus: (id: string, status: ExtensionStatus) => void\n removeExtensionStatus: (id: string) => void\n extensionInstalled: (id: string) => boolean\n extensionCanConnect: (id: string) => boolean\n}\n\nexport interface ExtensionAccountsContextInterface {\n extensionsInitialised: string[]\n connectExtension: (id: string) => Promise<boolean>\n extensionsSynced: Sync\n getExtensionAccount: (address: string) => ExtensionAccount | undefined\n getExtensionAccounts: (ss58: number) => Account[]\n}\n\nexport interface ExtensionsProviderProps {\n children: ReactNode\n ss58: number\n dappName: string\n}\n"]}
|
package/Hardware/index.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from 'react';
|
|
2
|
-
import type { HardwareAccountsContextInterface } from './types';
|
|
3
|
-
export declare const HardwareAccountsContext: import("react").Context<HardwareAccountsContextInterface | null>, useHardwareAccounts: () => HardwareAccountsContextInterface;
|
|
4
|
-
export declare const HardwareAccountsProvider: ({ children, }: {
|
|
5
|
-
children: ReactNode;
|
|
6
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
package/Hardware/index.js
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createSafeContext } from '@w3ux/hooks';
|
|
3
|
-
import { getHardwareAccountsLocal, hardwareAccounts$, HardwareAccountsKey, setHardwareAccounts, } from '@w3ux/observables-connect';
|
|
4
|
-
import { ellipsisFn } from '@w3ux/utils';
|
|
5
|
-
import { useEffect, useState } from 'react';
|
|
6
|
-
export const [HardwareAccountsContext, useHardwareAccounts] = createSafeContext();
|
|
7
|
-
export const HardwareAccountsProvider = ({ children, }) => {
|
|
8
|
-
const [hardwareAccounts, setHardwareAccountsState] = useState(getHardwareAccountsLocal());
|
|
9
|
-
const hardwareAccountExists = (source, network, address) => !!hardwareAccounts.find((a) => a.source === source && a.address === address && a.network === network);
|
|
10
|
-
const addHardwareAccount = (source, network, address, index, callback) => {
|
|
11
|
-
if (!hardwareAccountExists(source, network, address)) {
|
|
12
|
-
const newAccount = {
|
|
13
|
-
address,
|
|
14
|
-
network,
|
|
15
|
-
name: ellipsisFn(address),
|
|
16
|
-
source,
|
|
17
|
-
index,
|
|
18
|
-
};
|
|
19
|
-
const newHardwareAccounts = [...hardwareAccounts].concat(newAccount);
|
|
20
|
-
localStorage.setItem(HardwareAccountsKey, JSON.stringify(newHardwareAccounts));
|
|
21
|
-
setHardwareAccounts(newHardwareAccounts);
|
|
22
|
-
if (typeof callback === 'function') {
|
|
23
|
-
callback();
|
|
24
|
-
}
|
|
25
|
-
return newAccount;
|
|
26
|
-
}
|
|
27
|
-
return null;
|
|
28
|
-
};
|
|
29
|
-
const removeHardwareAccount = (source, network, address, callback) => {
|
|
30
|
-
const newHardwareAccounts = [...hardwareAccounts].filter((a) => !(a.source === source && a.address === address && a.network === network));
|
|
31
|
-
if (!newHardwareAccounts.length) {
|
|
32
|
-
localStorage.removeItem(HardwareAccountsKey);
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
localStorage.setItem(HardwareAccountsKey, JSON.stringify(newHardwareAccounts));
|
|
36
|
-
}
|
|
37
|
-
setHardwareAccounts(newHardwareAccounts);
|
|
38
|
-
if (typeof callback === 'function') {
|
|
39
|
-
callback();
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
const renameHardwareAccount = (source, network, address, newName) => {
|
|
43
|
-
const newHardwareAccounts = [...hardwareAccounts].map((a) => a.source === source && a.network === network && a.address === address
|
|
44
|
-
? {
|
|
45
|
-
...a,
|
|
46
|
-
name: newName,
|
|
47
|
-
}
|
|
48
|
-
: a);
|
|
49
|
-
localStorage.setItem(HardwareAccountsKey, JSON.stringify(newHardwareAccounts));
|
|
50
|
-
setHardwareAccounts(newHardwareAccounts);
|
|
51
|
-
};
|
|
52
|
-
const getHardwareAccount = (source, network, address) => hardwareAccounts.find((a) => a.source === source && a.network === network && a.address === address) || null;
|
|
53
|
-
const getHardwareAccounts = (source, network) => hardwareAccounts.filter((a) => a.source === source && a.network === network);
|
|
54
|
-
useEffect(() => {
|
|
55
|
-
const sub = hardwareAccounts$.subscribe((accounts) => {
|
|
56
|
-
setHardwareAccountsState(accounts);
|
|
57
|
-
});
|
|
58
|
-
return () => {
|
|
59
|
-
sub.unsubscribe();
|
|
60
|
-
};
|
|
61
|
-
}, []);
|
|
62
|
-
return (_jsx(HardwareAccountsContext.Provider, { value: {
|
|
63
|
-
hardwareAccountExists,
|
|
64
|
-
getHardwareAccount,
|
|
65
|
-
addHardwareAccount,
|
|
66
|
-
removeHardwareAccount,
|
|
67
|
-
renameHardwareAccount,
|
|
68
|
-
getHardwareAccounts,
|
|
69
|
-
}, children: children }));
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
//# sourceMappingURL=index.js.map
|
|
73
|
-
|
|
74
|
-
//# sourceMappingURL=index.js.map
|
package/Hardware/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Hardware/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 { createSafeContext } from '@w3ux/hooks'\nimport {\n getHardwareAccountsLocal,\n hardwareAccounts$,\n HardwareAccountsKey,\n setHardwareAccounts,\n} from '@w3ux/observables-connect'\nimport type { HardwareAccount, HardwareAccountSource } from '@w3ux/types'\nimport { ellipsisFn } from '@w3ux/utils'\nimport type { ReactNode } from 'react'\nimport { useEffect, useState } from 'react'\nimport type { HardwareAccountsContextInterface } from './types'\n\nexport const [HardwareAccountsContext, useHardwareAccounts] =\n createSafeContext<HardwareAccountsContextInterface>()\n\nexport const HardwareAccountsProvider = ({\n children,\n}: {\n children: ReactNode\n}) => {\n // Store imported hardware accounts\n const [hardwareAccounts, setHardwareAccountsState] = useState<\n HardwareAccount[]\n >(getHardwareAccountsLocal())\n\n // Check if an account exists\n const hardwareAccountExists = (\n source: HardwareAccountSource,\n network: string,\n address: string\n ) =>\n !!hardwareAccounts.find(\n (a) =>\n a.source === source && a.address === address && a.network === network\n )\n\n // Adds an account\n const addHardwareAccount = (\n source: HardwareAccountSource,\n network: string,\n address: string,\n index: number,\n callback?: () => void\n ) => {\n if (!hardwareAccountExists(source, network, address)) {\n const newAccount: HardwareAccount = {\n address,\n network,\n name: ellipsisFn(address),\n source,\n index,\n }\n const newHardwareAccounts = [...hardwareAccounts].concat(newAccount)\n localStorage.setItem(\n HardwareAccountsKey,\n JSON.stringify(newHardwareAccounts)\n )\n setHardwareAccounts(newHardwareAccounts)\n // Handle optional callback function\n if (typeof callback === 'function') {\n callback()\n }\n return newAccount\n }\n return null\n }\n\n // Removes an account\n const removeHardwareAccount = (\n source: HardwareAccountSource,\n network: string,\n address: string,\n callback?: () => void\n ) => {\n const newHardwareAccounts = [...hardwareAccounts].filter(\n (a) =>\n !(a.source === source && a.address === address && a.network === network)\n )\n\n if (!newHardwareAccounts.length) {\n localStorage.removeItem(HardwareAccountsKey)\n } else {\n localStorage.setItem(\n HardwareAccountsKey,\n JSON.stringify(newHardwareAccounts)\n )\n }\n setHardwareAccounts(newHardwareAccounts)\n // Handle optional callback function\n if (typeof callback === 'function') {\n callback()\n }\n }\n\n // Renames an imported account\n const renameHardwareAccount = (\n source: HardwareAccountSource,\n network: string,\n address: string,\n newName: string\n ) => {\n const newHardwareAccounts = [...hardwareAccounts].map((a) =>\n a.source === source && a.network === network && a.address === address\n ? {\n ...a,\n name: newName,\n }\n : a\n )\n localStorage.setItem(\n HardwareAccountsKey,\n JSON.stringify(newHardwareAccounts)\n )\n setHardwareAccounts(newHardwareAccounts)\n }\n\n // Gets an imported account\n const getHardwareAccount = (\n source: HardwareAccountSource,\n network: string,\n address: string\n ) =>\n hardwareAccounts.find(\n (a) =>\n a.source === source && a.network === network && a.address === address\n ) || null\n\n // Gets all accounts for a network and source\n const getHardwareAccounts = (\n source: HardwareAccountSource,\n network: string\n ) =>\n hardwareAccounts.filter((a) => a.source === source && a.network === network)\n\n // Subscribes to observables and updates state\n useEffect(() => {\n const sub = hardwareAccounts$.subscribe((accounts) => {\n setHardwareAccountsState(accounts)\n })\n return () => {\n sub.unsubscribe()\n }\n }, [])\n\n return (\n <HardwareAccountsContext.Provider\n value={{\n hardwareAccountExists,\n getHardwareAccount,\n addHardwareAccount,\n removeHardwareAccount,\n renameHardwareAccount,\n getHardwareAccounts,\n }}\n >\n {children}\n </HardwareAccountsContext.Provider>\n )\n}\n"]}
|
package/Hardware/types.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { HardwareAccount, HardwareAccountSource } from '@w3ux/types';
|
|
2
|
-
export interface HardwareAccountsContextInterface {
|
|
3
|
-
hardwareAccountExists: (source: HardwareAccountSource, network: string, a: string) => boolean;
|
|
4
|
-
addHardwareAccount: (source: HardwareAccountSource, network: string, address: string, index: number, callback?: () => void) => HardwareAccount | null;
|
|
5
|
-
removeHardwareAccount: (source: HardwareAccountSource, network: string, address: string, callback?: () => void) => void;
|
|
6
|
-
renameHardwareAccount: (source: HardwareAccountSource, network: string, address: string, name: string) => void;
|
|
7
|
-
getHardwareAccount: (source: HardwareAccountSource, network: string, address: string) => HardwareAccount | null;
|
|
8
|
-
getHardwareAccounts: (source: HardwareAccountSource, network: string) => HardwareAccount[];
|
|
9
|
-
}
|
package/Hardware/types.js
DELETED
package/Hardware/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Hardware/types.ts"],"names":[],"mappings":"","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { HardwareAccount, HardwareAccountSource } from '@w3ux/types'\n\nexport interface HardwareAccountsContextInterface {\n hardwareAccountExists: (\n source: HardwareAccountSource,\n network: string,\n a: string\n ) => boolean\n addHardwareAccount: (\n source: HardwareAccountSource,\n network: string,\n address: string,\n index: number,\n callback?: () => void\n ) => HardwareAccount | null\n removeHardwareAccount: (\n source: HardwareAccountSource,\n network: string,\n address: string,\n callback?: () => void\n ) => void\n renameHardwareAccount: (\n source: HardwareAccountSource,\n network: string,\n address: string,\n name: string\n ) => void\n getHardwareAccount: (\n source: HardwareAccountSource,\n network: string,\n address: string\n ) => HardwareAccount | null\n getHardwareAccounts: (\n source: HardwareAccountSource,\n network: string\n ) => HardwareAccount[]\n}\n"]}
|
package/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from './Extensions'\nexport * from './Hardware'\n"]}
|