@w3ux/react-connect-kit 3.2.18 → 3.2.19
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.
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { ExtensionAccountsContextInterface, ExtensionAccountsProviderProps } from './types';
|
|
2
2
|
export declare const ExtensionAccountsContext: import("react").Context<ExtensionAccountsContextInterface>, useExtensionAccounts: () => ExtensionAccountsContextInterface;
|
|
3
|
-
export declare const ExtensionAccountsProvider: ({ children, ss58, dappName,
|
|
3
|
+
export declare const ExtensionAccountsProvider: ({ children, ss58, dappName, }: ExtensionAccountsProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,43 +1,17 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createSafeContext
|
|
3
|
-
import { accounts$, addUnsub,
|
|
4
|
-
import { connectExtensions,
|
|
2
|
+
import { createSafeContext } from '@w3ux/hooks';
|
|
3
|
+
import { _reconnectSync, accounts$, addUnsub, processExtensionAccounts, reconnectExtensions, reconnectSync$, resetAccounts, unsubAll, } from '@w3ux/observables-connect/accounts';
|
|
4
|
+
import { connectExtensions, initialisedExtensions$, } from '@w3ux/observables-connect/extensions';
|
|
5
5
|
import { formatAccountSs58 } from '@w3ux/utils';
|
|
6
6
|
import { useEffect, useState } from 'react';
|
|
7
7
|
import { combineLatest } from 'rxjs';
|
|
8
8
|
import { useExtensions } from '../ExtensionsProvider';
|
|
9
9
|
export const [ExtensionAccountsContext, useExtensionAccounts] = createSafeContext();
|
|
10
|
-
export const ExtensionAccountsProvider = ({ children, ss58, dappName,
|
|
10
|
+
export const ExtensionAccountsProvider = ({ children, ss58, dappName, }) => {
|
|
11
11
|
const { extensionsStatus, gettingExtensions, extensionHasFeature, extensionCanConnect, } = useExtensions();
|
|
12
12
|
const [extensionAccounts, setExtensionAccounts] = useState([]);
|
|
13
13
|
const [extensionsInitialised, setExtensionsInitialised] = useState([]);
|
|
14
|
-
const [
|
|
15
|
-
const maybeOnExtensionEnabled = (id) => {
|
|
16
|
-
if (typeof onExtensionEnabled === 'function') {
|
|
17
|
-
onExtensionEnabled(id);
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
const connectEnabledExtensions = async () => {
|
|
21
|
-
const { connected } = await connectExtensions(dappName, getActiveExtensionsLocal());
|
|
22
|
-
if (connected.size === 0) {
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
updateAccounts({
|
|
26
|
-
add: await getAccountsFromExtensions(connected, ss58),
|
|
27
|
-
remove: [],
|
|
28
|
-
});
|
|
29
|
-
for (const [id, { extension }] of Array.from(connected.entries())) {
|
|
30
|
-
if (extensionHasFeature(id, 'subscribeAccounts')) {
|
|
31
|
-
const unsub = extension.accounts.subscribe((accounts) => {
|
|
32
|
-
processExtensionAccounts({
|
|
33
|
-
source: id,
|
|
34
|
-
ss58,
|
|
35
|
-
}, extension.signer, accounts);
|
|
36
|
-
});
|
|
37
|
-
addUnsub(id, unsub);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
};
|
|
14
|
+
const [extensionsSynced, setExtensionsSynced] = useState('unsynced');
|
|
41
15
|
const connectExtension = async (id) => {
|
|
42
16
|
if (extensionCanConnect(id)) {
|
|
43
17
|
const { connected } = await connectExtensions(dappName, [id]);
|
|
@@ -45,7 +19,6 @@ export const ExtensionAccountsProvider = ({ children, ss58, dappName, onExtensio
|
|
|
45
19
|
return;
|
|
46
20
|
}
|
|
47
21
|
const { extension } = connected.get(id);
|
|
48
|
-
maybeOnExtensionEnabled(id);
|
|
49
22
|
if (!extensionHasFeature(id, 'subscribeAccounts')) {
|
|
50
23
|
const accounts = await extension.accounts.get();
|
|
51
24
|
processExtensionAccounts({
|
|
@@ -67,14 +40,10 @@ export const ExtensionAccountsProvider = ({ children, ss58, dappName, onExtensio
|
|
|
67
40
|
return false;
|
|
68
41
|
};
|
|
69
42
|
const handleSyncExtensionAccounts = async () => {
|
|
70
|
-
if (!gettingExtensions &&
|
|
43
|
+
if (!gettingExtensions && _reconnectSync.getValue() === 'unsynced') {
|
|
71
44
|
unsubAll();
|
|
72
45
|
resetAccounts();
|
|
73
|
-
|
|
74
|
-
setExtensionAccountsSynced('syncing');
|
|
75
|
-
await connectEnabledExtensions();
|
|
76
|
-
}
|
|
77
|
-
setExtensionAccountsSynced('synced');
|
|
46
|
+
await reconnectExtensions(dappName, ss58);
|
|
78
47
|
}
|
|
79
48
|
};
|
|
80
49
|
const getExtensionAccounts = (ss58Prefix) => extensionAccounts
|
|
@@ -92,25 +61,25 @@ export const ExtensionAccountsProvider = ({ children, ss58, dappName, onExtensio
|
|
|
92
61
|
useEffect(() => {
|
|
93
62
|
handleSyncExtensionAccounts();
|
|
94
63
|
return () => unsubAll();
|
|
95
|
-
}, [extensionsStatus, gettingExtensions
|
|
96
|
-
useEffectIgnoreInitial(() => {
|
|
97
|
-
if (!gettingExtensions &&
|
|
98
|
-
extensionsInitialised.length === Object.keys(extensionsStatus).length) {
|
|
99
|
-
setExtensionAccountsSynced('synced');
|
|
100
|
-
}
|
|
101
|
-
}, [gettingExtensions, extensionsInitialised]);
|
|
64
|
+
}, [extensionsStatus, gettingExtensions]);
|
|
102
65
|
useEffect(() => {
|
|
103
|
-
const sub = combineLatest([
|
|
66
|
+
const sub = combineLatest([
|
|
67
|
+
initialisedExtensions$,
|
|
68
|
+
accounts$,
|
|
69
|
+
reconnectSync$,
|
|
70
|
+
]).subscribe(([initialised, accounts, sync]) => {
|
|
104
71
|
setExtensionsInitialised(initialised);
|
|
105
72
|
setExtensionAccounts(accounts);
|
|
73
|
+
setExtensionsSynced(sync);
|
|
106
74
|
});
|
|
107
75
|
return () => {
|
|
108
76
|
sub.unsubscribe();
|
|
109
77
|
};
|
|
110
78
|
}, []);
|
|
111
79
|
return (_jsx(ExtensionAccountsContext.Provider, { value: {
|
|
80
|
+
extensionsInitialised,
|
|
112
81
|
connectExtension,
|
|
113
|
-
|
|
82
|
+
extensionsSynced,
|
|
114
83
|
getExtensionAccounts,
|
|
115
84
|
}, children: children }));
|
|
116
85
|
};
|
|
@@ -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 { createSafeContext, useEffectIgnoreInitial } from '@w3ux/hooks'\nimport {\n accounts$,\n addUnsub,\n getAccountsFromExtensions,\n processExtensionAccounts,\n resetAccounts,\n unsubAll,\n updateAccounts,\n} from '@w3ux/observables-connect/accounts'\nimport {\n connectExtensions,\n getActiveExtensionsLocal,\n initialisedExtensions$,\n} from '@w3ux/observables-connect/extensions'\nimport type { ImportedAccount, Sync } from '@w3ux/types'\nimport { formatAccountSs58 } from '@w3ux/utils'\nimport { useEffect, useState } from 'react'\nimport { combineLatest } from 'rxjs'\nimport { useExtensions } from '../ExtensionsProvider'\nimport type {\n ExtensionAccountsContextInterface,\n ExtensionAccountsProviderProps,\n} from './types'\n\nexport const [ExtensionAccountsContext, useExtensionAccounts] =\n createSafeContext<ExtensionAccountsContextInterface>()\n\nexport const ExtensionAccountsProvider = ({\n children,\n ss58,\n dappName,\n onExtensionEnabled,\n}: ExtensionAccountsProviderProps) => {\n const {\n extensionsStatus,\n gettingExtensions,\n extensionHasFeature,\n extensionCanConnect,\n } = useExtensions()\n\n // Store connected extension accounts\n const [extensionAccounts, setExtensionAccounts] = useState<ImportedAccount[]>(\n []\n )\n // Stores initialised extensions\n const [extensionsInitialised, setExtensionsInitialised] = useState<string[]>(\n []\n )\n\n // Store whether extension accounts have been synced\n // TODO: Use observable to update this state\n const [extensionAccountsSynced, setExtensionAccountsSynced] =\n useState<Sync>('unsynced')\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 // Connects to extensions that already have been connected to and stored in localStorage. Loop\n // through extensions and connect to accounts\n const connectEnabledExtensions = async () => {\n const { connected } = await connectExtensions(\n dappName,\n getActiveExtensionsLocal()\n )\n if (connected.size === 0) {\n return\n }\n // Perform initial account state update\n updateAccounts({\n add: await getAccountsFromExtensions(connected, ss58),\n remove: [],\n })\n\n // Try to subscribe to accounts for each connected extension\n for (const [id, { extension }] of Array.from(connected.entries())) {\n // If enabled, subscribe to accounts.\n if (extensionHasFeature(id, 'subscribeAccounts')) {\n const unsub = extension.accounts.subscribe((accounts) => {\n processExtensionAccounts(\n {\n source: id,\n ss58,\n },\n extension.signer,\n accounts\n )\n })\n // Store unsub\n addUnsub(id, unsub)\n }\n }\n }\n\n // Connects to a single extension and processes its accounts\n const connectExtension = async (id: string): Promise<boolean> => {\n if (extensionCanConnect(id)) {\n const { connected } = await connectExtensions(dappName, [id])\n if (connected.size === 0) {\n return\n }\n const { extension } = connected.get(id)\n\n // Call optional `onExtensionEnabled` callback\n maybeOnExtensionEnabled(id)\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 processExtensionAccounts(\n {\n source: id,\n ss58,\n },\n extension.signer,\n accounts\n )\n } else {\n const unsub = extension.accounts.subscribe((accounts) => {\n processExtensionAccounts(\n {\n source: id,\n ss58,\n },\n extension.signer,\n accounts\n )\n })\n addUnsub(id, unsub)\n }\n return true\n }\n return false\n }\n\n const handleSyncExtensionAccounts = async () => {\n if (!gettingExtensions && extensionAccountsSynced === 'unsynced') {\n // Unsubscribe from all accounts and reset state\n unsubAll()\n resetAccounts()\n // Bootstrap any previously connected to extensions\n if (Object.keys(extensionsStatus).length) {\n setExtensionAccountsSynced('syncing')\n await connectEnabledExtensions()\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 = (ss58Prefix: number): ImportedAccount[] =>\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 // Remove null entries resulting from invalid formatted addresses\n .filter((account) => account !== null)\n\n // Initialise extension accounts sync\n useEffect(() => {\n handleSyncExtensionAccounts()\n return () => unsubAll()\n }, [extensionsStatus, gettingExtensions, extensionAccountsSynced])\n\n // Once initialised extensions equal total extensions present in `injectedWeb3`, mark extensions\n // as fetched\n useEffectIgnoreInitial(() => {\n if (\n !gettingExtensions &&\n extensionsInitialised.length === Object.keys(extensionsStatus).length\n ) {\n setExtensionAccountsSynced('synced')\n }\n }, [gettingExtensions, extensionsInitialised])\n\n // Subscribes to observables and updates state\n useEffect(() => {\n const sub = combineLatest([initialisedExtensions$, accounts$]).subscribe(\n ([initialised, accounts]) => {\n setExtensionsInitialised(initialised)\n setExtensionAccounts(accounts)\n }\n )\n return () => {\n sub.unsubscribe()\n }\n }, [])\n\n return (\n <ExtensionAccountsContext.Provider\n value={{\n connectExtension,\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 { createSafeContext } from '@w3ux/hooks'\nimport {\n _reconnectSync,\n accounts$,\n addUnsub,\n processExtensionAccounts,\n reconnectExtensions,\n reconnectSync$,\n resetAccounts,\n unsubAll,\n} from '@w3ux/observables-connect/accounts'\nimport {\n connectExtensions,\n initialisedExtensions$,\n} from '@w3ux/observables-connect/extensions'\nimport type { ImportedAccount, Sync } from '@w3ux/types'\nimport { formatAccountSs58 } from '@w3ux/utils'\nimport { useEffect, useState } from 'react'\nimport { combineLatest } from 'rxjs'\nimport { useExtensions } from '../ExtensionsProvider'\nimport type {\n ExtensionAccountsContextInterface,\n ExtensionAccountsProviderProps,\n} from './types'\n\nexport const [ExtensionAccountsContext, useExtensionAccounts] =\n createSafeContext<ExtensionAccountsContextInterface>()\n\nexport const ExtensionAccountsProvider = ({\n children,\n ss58,\n dappName,\n}: ExtensionAccountsProviderProps) => {\n const {\n extensionsStatus,\n gettingExtensions,\n extensionHasFeature,\n extensionCanConnect,\n } = useExtensions()\n\n // Store connected extension accounts\n const [extensionAccounts, setExtensionAccounts] = useState<ImportedAccount[]>(\n []\n )\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] = useState<Sync>('unsynced')\n\n // Connects to a single extension and processes its accounts\n const connectExtension = async (id: string): Promise<boolean> => {\n if (extensionCanConnect(id)) {\n const { connected } = await connectExtensions(dappName, [id])\n if (connected.size === 0) {\n return\n }\n const { extension } = connected.get(id)\n\n // If account subscriptions are not supported, simply get the account(s) from the extension,\n // otherwise, subscribe to accounts\n if (!extensionHasFeature(id, 'subscribeAccounts')) {\n const accounts = await extension.accounts.get()\n processExtensionAccounts(\n {\n source: id,\n ss58,\n },\n extension.signer,\n accounts\n )\n } else {\n const unsub = extension.accounts.subscribe((accounts) => {\n processExtensionAccounts(\n {\n source: id,\n ss58,\n },\n extension.signer,\n accounts\n )\n })\n addUnsub(id, unsub)\n }\n return true\n }\n return false\n }\n\n const handleSyncExtensionAccounts = async () => {\n if (!gettingExtensions && _reconnectSync.getValue() === 'unsynced') {\n // Unsubscribe from all accounts and reset state\n unsubAll()\n resetAccounts()\n // Bootstrap any previously connected to extensions\n await reconnectExtensions(dappName, ss58)\n }\n }\n\n // Get extension accounts based on the provided ss58 prefix\n const getExtensionAccounts = (ss58Prefix: number): ImportedAccount[] =>\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 // Remove null entries resulting from invalid formatted addresses\n .filter((account) => account !== null)\n\n // Initialise extension accounts sync\n useEffect(() => {\n handleSyncExtensionAccounts()\n return () => unsubAll()\n }, [extensionsStatus, gettingExtensions])\n\n // Subscribes to observables and updates state\n useEffect(() => {\n const sub = combineLatest([\n initialisedExtensions$,\n accounts$,\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 getExtensionAccounts,\n }}\n >\n {children}\n </ExtensionAccountsContext.Provider>\n )\n}\n"]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { ImportedAccount, Sync } from '@w3ux/types';
|
|
2
2
|
import type { ReactNode } from 'react';
|
|
3
3
|
export interface ExtensionAccountsContextInterface {
|
|
4
|
+
extensionsInitialised: string[];
|
|
4
5
|
connectExtension: (id: string) => Promise<boolean>;
|
|
5
|
-
|
|
6
|
+
extensionsSynced: Sync;
|
|
6
7
|
getExtensionAccounts: (ss58: number) => ImportedAccount[];
|
|
7
8
|
}
|
|
8
9
|
export interface ExtensionAccountsProviderProps {
|
|
9
10
|
children: ReactNode;
|
|
10
11
|
ss58: number;
|
|
11
12
|
dappName: string;
|
|
12
|
-
onExtensionEnabled?: (id: string) => void;
|
|
13
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ExtensionAccountsProvider/types.ts"],"names":[],"mappings":"","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ImportedAccount, Sync } from '@w3ux/types'\nimport type { ReactNode } from 'react'\n\nexport interface ExtensionAccountsContextInterface {\n connectExtension: (id: string) => Promise<boolean>\n
|
|
1
|
+
{"version":3,"sources":["../src/ExtensionAccountsProvider/types.ts"],"names":[],"mappings":"","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ImportedAccount, Sync } from '@w3ux/types'\nimport type { ReactNode } from 'react'\n\nexport interface ExtensionAccountsContextInterface {\n extensionsInitialised: string[]\n connectExtension: (id: string) => Promise<boolean>\n extensionsSynced: Sync\n getExtensionAccounts: (ss58: number) => ImportedAccount[]\n}\n\nexport interface ExtensionAccountsProviderProps {\n children: ReactNode\n ss58: number\n dappName: string\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@w3ux/react-connect-kit",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.19",
|
|
4
4
|
"license": "GPL-3.0-only",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@w3ux/extension-assets": "^2.2.0",
|
|
7
7
|
"@w3ux/hooks": "^2.1.0",
|
|
8
|
-
"@w3ux/observables-connect": "0.9.
|
|
8
|
+
"@w3ux/observables-connect": "0.9.26",
|
|
9
9
|
"@w3ux/utils": "^2.0.8"
|
|
10
10
|
},
|
|
11
11
|
"type": "module",
|