@w3ux/react-connect-kit 3.6.10 → 3.7.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 CHANGED
@@ -59,8 +59,12 @@ var ExtensionsConnectProvider = ({
59
59
  };
60
60
  const extensionInstalled = (id) => (0, import_observables_connect.getStatus)(id) !== void 0;
61
61
  const extensionCanConnect = (id) => (0, import_observables_connect.canConnect)(id);
62
- (0, import_react.useEffect)(() => {
62
+ const discoverExtensions = async () => {
63
+ await (0, import_extensions.injectMimir)();
63
64
  (0, import_extensions.getExtensions)();
65
+ };
66
+ (0, import_react.useEffect)(() => {
67
+ discoverExtensions();
64
68
  const sub = (0, import_rxjs.combineLatest)([
65
69
  import_observables_connect.gettingExtensions$,
66
70
  import_observables_connect.extensionsStatus$
@@ -101,7 +105,9 @@ var ExtensionAccountsProvider = ({
101
105
  const [extensionsInitialised, setExtensionsInitialised] = (0, import_react2.useState)(
102
106
  []
103
107
  );
104
- const [extensionsSynced, setExtensionsSynced] = (0, import_react2.useState)((0, import_observables_connect2.getReconnectSync)());
108
+ const [extensionsSynced, setExtensionsSynced] = (0, import_react2.useState)(
109
+ (0, import_observables_connect2.getReconnectSync)()
110
+ );
105
111
  const handleInitialConnect = async () => {
106
112
  if (!gettingExtensions && extensionsSynced === "unsynced") {
107
113
  (0, import_accounts.unsubAll)();
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx","../src/Extensions/Accounts.tsx","../src/Extensions/Connect.tsx","../src/Extensions/Provider.tsx","../src/Hardware/index.tsx"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from './Extensions'\nexport * from './Hardware'\n","/* @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","/* @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","/* @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","/* @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"],"mappings":"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","names":["import_hooks","import_observables_connect","import_extensions","import_react","import_rxjs","import_jsx_runtime","doConnectExtension","import_jsx_runtime","import_hooks","import_observables_connect","import_utils","import_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.tsx","../src/Extensions/Accounts.tsx","../src/Extensions/Connect.tsx","../src/Extensions/Provider.tsx","../src/Hardware/index.tsx"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nexport * from './Extensions'\nexport * from './Hardware'\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { createSafeContext } from '@w3ux/hooks'\nimport {\n\textensionAccounts$,\n\tgetReconnectSync,\n\tinitialisedExtensions$,\n\treconnectSync$,\n\tresetAccounts,\n} from '@w3ux/observables-connect'\nimport { unsubAll } from '@w3ux/observables-connect/accounts'\nimport {\n\tconnectExtension as doConnectExtension,\n\treconnectExtensions,\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\tExtensionAccountsContextInterface,\n\tExtensionsProviderProps,\n} from './types'\n\nexport const [ExtensionAccountsContext, useExtensionAccounts] =\n\tcreateSafeContext<ExtensionAccountsContextInterface>()\n\nexport const ExtensionAccountsProvider = ({\n\tchildren,\n\tss58,\n\tdappName,\n}: ExtensionsProviderProps) => {\n\tconst { gettingExtensions } = useExtensions()\n\n\t// Store connected extension accounts\n\tconst [extensionAccounts, setExtensionAccounts] = useState<Account[]>([])\n\t// Stores initialised extensions\n\tconst [extensionsInitialised, setExtensionsInitialised] = useState<string[]>(\n\t\t[],\n\t)\n\t// Store whether previously enabled extensions have been re-connected\n\tconst [extensionsSynced, setExtensionsSynced] = useState<Sync>(\n\t\tgetReconnectSync(),\n\t)\n\n\t// Handle initial connection to previously enabled extensions\n\tconst handleInitialConnect = async () => {\n\t\tif (!gettingExtensions && extensionsSynced === 'unsynced') {\n\t\t\t// Defensive: unsubscribe from all accounts and reset state\n\t\t\tunsubAll()\n\t\t\tresetAccounts()\n\t\t\tawait reconnectExtensions(dappName, ss58)\n\t\t}\n\t}\n\n\t// Connects to a single extension and processes its accounts\n\tconst connectExtension = async (id: string): Promise<boolean> =>\n\t\tawait doConnectExtension(dappName, ss58, id)\n\n\t// Get extension accounts, formatted by a provided ss58 prefix\n\tconst getExtensionAccounts = (ss58Prefix: number) =>\n\t\textensionAccounts\n\t\t\t.map((account) => {\n\t\t\t\tconst formattedAddress = formatAccountSs58(account.address, ss58Prefix)\n\t\t\t\tif (!formattedAddress) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...account,\n\t\t\t\t\taddress: formattedAddress,\n\t\t\t\t}\n\t\t\t})\n\t\t\t.filter((account) => account !== null)\n\n\t// Get an imported extension account\n\tconst getExtensionAccount = (\n\t\taddress: string,\n\t): ExtensionAccount | undefined => {\n\t\tconst account = extensionAccounts.find(\n\t\t\t(item) =>\n\t\t\t\tformatAccountSs58(item.address, 0) === formatAccountSs58(address, 0),\n\t\t)\n\t\treturn account ? { ...account, address } : undefined\n\t}\n\n\t// Initialise extension accounts sync\n\tuseEffect(() => {\n\t\thandleInitialConnect()\n\t\treturn () => unsubAll()\n\t}, [gettingExtensions])\n\n\t// Subscribes to observables and updates state\n\tuseEffect(() => {\n\t\tconst sub = combineLatest([\n\t\t\tinitialisedExtensions$,\n\t\t\textensionAccounts$,\n\t\t\treconnectSync$,\n\t\t]).subscribe(([initialised, accounts, sync]) => {\n\t\t\tsetExtensionsInitialised(initialised)\n\t\t\tsetExtensionAccounts(accounts)\n\t\t\tsetExtensionsSynced(sync)\n\t\t})\n\t\treturn () => {\n\t\t\tsub.unsubscribe()\n\t\t}\n\t}, [])\n\n\treturn (\n\t\t<ExtensionAccountsContext.Provider\n\t\t\tvalue={{\n\t\t\t\textensionsInitialised,\n\t\t\t\tconnectExtension,\n\t\t\t\textensionsSynced,\n\t\t\t\tgetExtensionAccount,\n\t\t\t\tgetExtensionAccounts,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</ExtensionAccountsContext.Provider>\n\t)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { createSafeContext } from '@w3ux/hooks'\nimport {\n\tcanConnect,\n\textensionsStatus$,\n\tgetStatus,\n\tgettingExtensions$,\n\tremoveStatus,\n\tsetStatus,\n} from '@w3ux/observables-connect'\nimport {\n\tgetExtensions,\n\tinjectMimir,\n} from '@w3ux/observables-connect/extensions'\nimport type { ExtensionStatus, ExtensionsStatus } 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\tcreateSafeContext<ExtensionsConnectContextInterface>()\n\nexport const ExtensionsConnectProvider = ({\n\tchildren,\n}: {\n\tchildren: ReactNode\n}) => {\n\t// Store whether extensions are being fetched\n\tconst [gettingExtensions, setGettingExtensions] = useState<boolean>(true)\n\n\t// Store discovered extensions along with their status\n\tconst [extensionsStatus, setExtensionsStatus] = useState<ExtensionsStatus>({})\n\n\t// Setter for an extension status\n\tconst setExtensionStatus = (id: string, status: ExtensionStatus) => {\n\t\tsetStatus(id, status)\n\t}\n\n\t// Removes an extension status\n\tconst removeExtensionStatus = (id: string) => {\n\t\tremoveStatus(id)\n\t}\n\n\t// Checks if an extension has been installed\n\tconst extensionInstalled = (id: string): boolean =>\n\t\tgetStatus(id) !== undefined\n\n\t// Checks whether an extension can be connected to\n\tconst extensionCanConnect = (id: string): boolean => canConnect(id)\n\n\t// Init extensions discovery\n\tconst discoverExtensions = async () => {\n\t\t// Handle Mimir iframe injection\n\t\tawait injectMimir()\n\t\t// Fetch extensions from `injectedWeb3`\n\t\tgetExtensions()\n\t}\n\n\t// Subscribes to observables and updates state\n\tuseEffect(() => {\n\t\tdiscoverExtensions()\n\t\tconst sub = combineLatest([\n\t\t\tgettingExtensions$,\n\t\t\textensionsStatus$,\n\t\t]).subscribe(([getting, status]) => {\n\t\t\tsetGettingExtensions(getting)\n\t\t\tsetExtensionsStatus(status)\n\t\t})\n\t\treturn () => {\n\t\t\tsub.unsubscribe()\n\t\t}\n\t}, [])\n\n\treturn (\n\t\t<ExtensionsConnectContext.Provider\n\t\t\tvalue={{\n\t\t\t\textensionsStatus,\n\t\t\t\tgettingExtensions,\n\t\t\t\tsetExtensionStatus,\n\t\t\t\tremoveExtensionStatus,\n\t\t\t\textensionInstalled,\n\t\t\t\textensionCanConnect,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</ExtensionsConnectContext.Provider>\n\t)\n}\n","/* @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\tss58,\n\tdappName,\n\tchildren,\n}: ExtensionsProviderProps) => (\n\t<ExtensionsConnectProvider>\n\t\t<ExtensionAccountsProvider ss58={ss58} dappName={dappName}>\n\t\t\t{children}\n\t\t</ExtensionAccountsProvider>\n\t</ExtensionsConnectProvider>\n)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { createSafeContext } from '@w3ux/hooks'\nimport {\n\tgetHardwareAccountsLocal,\n\tHardwareAccountsKey,\n\thardwareAccounts$,\n\tsetHardwareAccounts,\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\tcreateSafeContext<HardwareAccountsContextInterface>()\n\nexport const HardwareAccountsProvider = ({\n\tchildren,\n}: {\n\tchildren: ReactNode\n}) => {\n\t// Store imported hardware accounts\n\tconst [hardwareAccounts, setHardwareAccountsState] = useState<\n\t\tHardwareAccount[]\n\t>(getHardwareAccountsLocal())\n\n\t// Check if an account exists\n\tconst hardwareAccountExists = (\n\t\tsource: HardwareAccountSource,\n\t\tnetwork: string,\n\t\taddress: string,\n\t) =>\n\t\t!!hardwareAccounts.find(\n\t\t\t(a) =>\n\t\t\t\ta.source === source && a.address === address && a.network === network,\n\t\t)\n\n\t// Adds an account\n\tconst addHardwareAccount = (\n\t\tsource: HardwareAccountSource,\n\t\tnetwork: string,\n\t\taddress: string,\n\t\tindex: number,\n\t\tcallback?: () => void,\n\t) => {\n\t\tif (!hardwareAccountExists(source, network, address)) {\n\t\t\tconst newAccount: HardwareAccount = {\n\t\t\t\taddress,\n\t\t\t\tnetwork,\n\t\t\t\tname: ellipsisFn(address),\n\t\t\t\tsource,\n\t\t\t\tindex,\n\t\t\t}\n\t\t\tconst newHardwareAccounts = [...hardwareAccounts].concat(newAccount)\n\t\t\tlocalStorage.setItem(\n\t\t\t\tHardwareAccountsKey,\n\t\t\t\tJSON.stringify(newHardwareAccounts),\n\t\t\t)\n\t\t\tsetHardwareAccounts(newHardwareAccounts)\n\t\t\t// Handle optional callback function\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback()\n\t\t\t}\n\t\t\treturn newAccount\n\t\t}\n\t\treturn null\n\t}\n\n\t// Removes an account\n\tconst removeHardwareAccount = (\n\t\tsource: HardwareAccountSource,\n\t\tnetwork: string,\n\t\taddress: string,\n\t\tcallback?: () => void,\n\t) => {\n\t\tconst newHardwareAccounts = [...hardwareAccounts].filter(\n\t\t\t(a) =>\n\t\t\t\t!(\n\t\t\t\t\ta.source === source &&\n\t\t\t\t\ta.address === address &&\n\t\t\t\t\ta.network === network\n\t\t\t\t),\n\t\t)\n\n\t\tif (!newHardwareAccounts.length) {\n\t\t\tlocalStorage.removeItem(HardwareAccountsKey)\n\t\t} else {\n\t\t\tlocalStorage.setItem(\n\t\t\t\tHardwareAccountsKey,\n\t\t\t\tJSON.stringify(newHardwareAccounts),\n\t\t\t)\n\t\t}\n\t\tsetHardwareAccounts(newHardwareAccounts)\n\t\t// Handle optional callback function\n\t\tif (typeof callback === 'function') {\n\t\t\tcallback()\n\t\t}\n\t}\n\n\t// Renames an imported account\n\tconst renameHardwareAccount = (\n\t\tsource: HardwareAccountSource,\n\t\tnetwork: string,\n\t\taddress: string,\n\t\tnewName: string,\n\t) => {\n\t\tconst newHardwareAccounts = [...hardwareAccounts].map((a) =>\n\t\t\ta.source === source && a.network === network && a.address === address\n\t\t\t\t? {\n\t\t\t\t\t\t...a,\n\t\t\t\t\t\tname: newName,\n\t\t\t\t\t}\n\t\t\t\t: a,\n\t\t)\n\t\tlocalStorage.setItem(\n\t\t\tHardwareAccountsKey,\n\t\t\tJSON.stringify(newHardwareAccounts),\n\t\t)\n\t\tsetHardwareAccounts(newHardwareAccounts)\n\t}\n\n\t// Gets an imported account\n\tconst getHardwareAccount = (\n\t\tsource: HardwareAccountSource,\n\t\tnetwork: string,\n\t\taddress: string,\n\t) =>\n\t\thardwareAccounts.find(\n\t\t\t(a) =>\n\t\t\t\ta.source === source && a.network === network && a.address === address,\n\t\t) || null\n\n\t// Gets all accounts for a network and source\n\tconst getHardwareAccounts = (\n\t\tsource: HardwareAccountSource,\n\t\tnetwork: string,\n\t) =>\n\t\thardwareAccounts.filter((a) => a.source === source && a.network === network)\n\n\t// Subscribes to observables and updates state\n\tuseEffect(() => {\n\t\tconst sub = hardwareAccounts$.subscribe((accounts) => {\n\t\t\tsetHardwareAccountsState(accounts)\n\t\t})\n\t\treturn () => {\n\t\t\tsub.unsubscribe()\n\t\t}\n\t}, [])\n\n\treturn (\n\t\t<HardwareAccountsContext.Provider\n\t\t\tvalue={{\n\t\t\t\thardwareAccountExists,\n\t\t\t\tgetHardwareAccount,\n\t\t\t\taddHardwareAccount,\n\t\t\t\tremoveHardwareAccount,\n\t\t\t\trenameHardwareAccount,\n\t\t\t\tgetHardwareAccounts,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</HardwareAccountsContext.Provider>\n\t)\n}\n"],"mappings":"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","names":["import_hooks","import_observables_connect","import_extensions","import_react","import_rxjs","import_jsx_runtime","doConnectExtension","import_jsx_runtime","import_hooks","import_observables_connect","import_utils","import_react","import_jsx_runtime"]}
package/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
1
  import { Sync, ExtensionAccount, Account, ExtensionStatus, HardwareAccountSource, HardwareAccount } from '@w3ux/types';
3
2
  import * as react from 'react';
4
3
  import { ReactNode } from 'react';
4
+ import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
 
6
6
  interface ExtensionsConnectContextInterface {
7
7
  gettingExtensions: boolean;
@@ -24,12 +24,12 @@ interface ExtensionsProviderProps {
24
24
  dappName: string;
25
25
  }
26
26
 
27
- declare const ExtensionsProvider: ({ ss58, dappName, children, }: ExtensionsProviderProps) => react_jsx_runtime.JSX.Element;
28
-
29
27
  declare const useExtensionAccounts: () => ExtensionAccountsContextInterface;
30
28
 
31
29
  declare const useExtensions: () => ExtensionsConnectContextInterface;
32
30
 
31
+ declare const ExtensionsProvider: ({ ss58, dappName, children, }: ExtensionsProviderProps) => react_jsx_runtime.JSX.Element;
32
+
33
33
  interface HardwareAccountsContextInterface {
34
34
  hardwareAccountExists: (source: HardwareAccountSource, network: string, a: string) => boolean;
35
35
  addHardwareAccount: (source: HardwareAccountSource, network: string, address: string, index: number, callback?: () => void) => HardwareAccount | null;
package/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
1
  import { Sync, ExtensionAccount, Account, ExtensionStatus, HardwareAccountSource, HardwareAccount } from '@w3ux/types';
3
2
  import * as react from 'react';
4
3
  import { ReactNode } from 'react';
4
+ import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
 
6
6
  interface ExtensionsConnectContextInterface {
7
7
  gettingExtensions: boolean;
@@ -24,12 +24,12 @@ interface ExtensionsProviderProps {
24
24
  dappName: string;
25
25
  }
26
26
 
27
- declare const ExtensionsProvider: ({ ss58, dappName, children, }: ExtensionsProviderProps) => react_jsx_runtime.JSX.Element;
28
-
29
27
  declare const useExtensionAccounts: () => ExtensionAccountsContextInterface;
30
28
 
31
29
  declare const useExtensions: () => ExtensionsConnectContextInterface;
32
30
 
31
+ declare const ExtensionsProvider: ({ ss58, dappName, children, }: ExtensionsProviderProps) => react_jsx_runtime.JSX.Element;
32
+
33
33
  interface HardwareAccountsContextInterface {
34
34
  hardwareAccountExists: (source: HardwareAccountSource, network: string, a: string) => boolean;
35
35
  addHardwareAccount: (source: HardwareAccountSource, network: string, address: string, index: number, callback?: () => void) => HardwareAccount | null;
package/index.js CHANGED
@@ -26,7 +26,10 @@ import {
26
26
  removeStatus,
27
27
  setStatus
28
28
  } from "@w3ux/observables-connect";
29
- import { getExtensions } from "@w3ux/observables-connect/extensions";
29
+ import {
30
+ getExtensions,
31
+ injectMimir
32
+ } from "@w3ux/observables-connect/extensions";
30
33
  import { useEffect, useState } from "react";
31
34
  import { combineLatest } from "rxjs";
32
35
  import { jsx } from "react/jsx-runtime";
@@ -44,8 +47,12 @@ var ExtensionsConnectProvider = ({
44
47
  };
45
48
  const extensionInstalled = (id) => getStatus(id) !== void 0;
46
49
  const extensionCanConnect = (id) => canConnect(id);
47
- useEffect(() => {
50
+ const discoverExtensions = async () => {
51
+ await injectMimir();
48
52
  getExtensions();
53
+ };
54
+ useEffect(() => {
55
+ discoverExtensions();
49
56
  const sub = combineLatest([
50
57
  gettingExtensions$,
51
58
  extensionsStatus$
@@ -86,7 +93,9 @@ var ExtensionAccountsProvider = ({
86
93
  const [extensionsInitialised, setExtensionsInitialised] = useState2(
87
94
  []
88
95
  );
89
- const [extensionsSynced, setExtensionsSynced] = useState2(getReconnectSync());
96
+ const [extensionsSynced, setExtensionsSynced] = useState2(
97
+ getReconnectSync()
98
+ );
90
99
  const handleInitialConnect = async () => {
91
100
  if (!gettingExtensions && extensionsSynced === "unsynced") {
92
101
  unsubAll();
@@ -156,8 +165,8 @@ var ExtensionsProvider = ({
156
165
  import { createSafeContext as createSafeContext3 } from "@w3ux/hooks";
157
166
  import {
158
167
  getHardwareAccountsLocal,
159
- hardwareAccounts$,
160
168
  HardwareAccountsKey,
169
+ hardwareAccounts$,
161
170
  setHardwareAccounts
162
171
  } from "@w3ux/observables-connect";
163
172
  import { ellipsisFn } from "@w3ux/utils";
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Extensions/Accounts.tsx","../src/Extensions/Connect.tsx","../src/Extensions/Provider.tsx","../src/Hardware/index.tsx"],"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","/* @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","/* @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","/* @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"],"mappings":"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","names":["createSafeContext","useEffect","useState","combineLatest","jsx","createSafeContext","useState","useEffect","combineLatest","jsx","createSafeContext","useEffect","useState","jsx"]}
1
+ {"version":3,"sources":["../src/Extensions/Accounts.tsx","../src/Extensions/Connect.tsx","../src/Extensions/Provider.tsx","../src/Hardware/index.tsx"],"sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { createSafeContext } from '@w3ux/hooks'\nimport {\n\textensionAccounts$,\n\tgetReconnectSync,\n\tinitialisedExtensions$,\n\treconnectSync$,\n\tresetAccounts,\n} from '@w3ux/observables-connect'\nimport { unsubAll } from '@w3ux/observables-connect/accounts'\nimport {\n\tconnectExtension as doConnectExtension,\n\treconnectExtensions,\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\tExtensionAccountsContextInterface,\n\tExtensionsProviderProps,\n} from './types'\n\nexport const [ExtensionAccountsContext, useExtensionAccounts] =\n\tcreateSafeContext<ExtensionAccountsContextInterface>()\n\nexport const ExtensionAccountsProvider = ({\n\tchildren,\n\tss58,\n\tdappName,\n}: ExtensionsProviderProps) => {\n\tconst { gettingExtensions } = useExtensions()\n\n\t// Store connected extension accounts\n\tconst [extensionAccounts, setExtensionAccounts] = useState<Account[]>([])\n\t// Stores initialised extensions\n\tconst [extensionsInitialised, setExtensionsInitialised] = useState<string[]>(\n\t\t[],\n\t)\n\t// Store whether previously enabled extensions have been re-connected\n\tconst [extensionsSynced, setExtensionsSynced] = useState<Sync>(\n\t\tgetReconnectSync(),\n\t)\n\n\t// Handle initial connection to previously enabled extensions\n\tconst handleInitialConnect = async () => {\n\t\tif (!gettingExtensions && extensionsSynced === 'unsynced') {\n\t\t\t// Defensive: unsubscribe from all accounts and reset state\n\t\t\tunsubAll()\n\t\t\tresetAccounts()\n\t\t\tawait reconnectExtensions(dappName, ss58)\n\t\t}\n\t}\n\n\t// Connects to a single extension and processes its accounts\n\tconst connectExtension = async (id: string): Promise<boolean> =>\n\t\tawait doConnectExtension(dappName, ss58, id)\n\n\t// Get extension accounts, formatted by a provided ss58 prefix\n\tconst getExtensionAccounts = (ss58Prefix: number) =>\n\t\textensionAccounts\n\t\t\t.map((account) => {\n\t\t\t\tconst formattedAddress = formatAccountSs58(account.address, ss58Prefix)\n\t\t\t\tif (!formattedAddress) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...account,\n\t\t\t\t\taddress: formattedAddress,\n\t\t\t\t}\n\t\t\t})\n\t\t\t.filter((account) => account !== null)\n\n\t// Get an imported extension account\n\tconst getExtensionAccount = (\n\t\taddress: string,\n\t): ExtensionAccount | undefined => {\n\t\tconst account = extensionAccounts.find(\n\t\t\t(item) =>\n\t\t\t\tformatAccountSs58(item.address, 0) === formatAccountSs58(address, 0),\n\t\t)\n\t\treturn account ? { ...account, address } : undefined\n\t}\n\n\t// Initialise extension accounts sync\n\tuseEffect(() => {\n\t\thandleInitialConnect()\n\t\treturn () => unsubAll()\n\t}, [gettingExtensions])\n\n\t// Subscribes to observables and updates state\n\tuseEffect(() => {\n\t\tconst sub = combineLatest([\n\t\t\tinitialisedExtensions$,\n\t\t\textensionAccounts$,\n\t\t\treconnectSync$,\n\t\t]).subscribe(([initialised, accounts, sync]) => {\n\t\t\tsetExtensionsInitialised(initialised)\n\t\t\tsetExtensionAccounts(accounts)\n\t\t\tsetExtensionsSynced(sync)\n\t\t})\n\t\treturn () => {\n\t\t\tsub.unsubscribe()\n\t\t}\n\t}, [])\n\n\treturn (\n\t\t<ExtensionAccountsContext.Provider\n\t\t\tvalue={{\n\t\t\t\textensionsInitialised,\n\t\t\t\tconnectExtension,\n\t\t\t\textensionsSynced,\n\t\t\t\tgetExtensionAccount,\n\t\t\t\tgetExtensionAccounts,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</ExtensionAccountsContext.Provider>\n\t)\n}\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { createSafeContext } from '@w3ux/hooks'\nimport {\n\tcanConnect,\n\textensionsStatus$,\n\tgetStatus,\n\tgettingExtensions$,\n\tremoveStatus,\n\tsetStatus,\n} from '@w3ux/observables-connect'\nimport {\n\tgetExtensions,\n\tinjectMimir,\n} from '@w3ux/observables-connect/extensions'\nimport type { ExtensionStatus, ExtensionsStatus } 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\tcreateSafeContext<ExtensionsConnectContextInterface>()\n\nexport const ExtensionsConnectProvider = ({\n\tchildren,\n}: {\n\tchildren: ReactNode\n}) => {\n\t// Store whether extensions are being fetched\n\tconst [gettingExtensions, setGettingExtensions] = useState<boolean>(true)\n\n\t// Store discovered extensions along with their status\n\tconst [extensionsStatus, setExtensionsStatus] = useState<ExtensionsStatus>({})\n\n\t// Setter for an extension status\n\tconst setExtensionStatus = (id: string, status: ExtensionStatus) => {\n\t\tsetStatus(id, status)\n\t}\n\n\t// Removes an extension status\n\tconst removeExtensionStatus = (id: string) => {\n\t\tremoveStatus(id)\n\t}\n\n\t// Checks if an extension has been installed\n\tconst extensionInstalled = (id: string): boolean =>\n\t\tgetStatus(id) !== undefined\n\n\t// Checks whether an extension can be connected to\n\tconst extensionCanConnect = (id: string): boolean => canConnect(id)\n\n\t// Init extensions discovery\n\tconst discoverExtensions = async () => {\n\t\t// Handle Mimir iframe injection\n\t\tawait injectMimir()\n\t\t// Fetch extensions from `injectedWeb3`\n\t\tgetExtensions()\n\t}\n\n\t// Subscribes to observables and updates state\n\tuseEffect(() => {\n\t\tdiscoverExtensions()\n\t\tconst sub = combineLatest([\n\t\t\tgettingExtensions$,\n\t\t\textensionsStatus$,\n\t\t]).subscribe(([getting, status]) => {\n\t\t\tsetGettingExtensions(getting)\n\t\t\tsetExtensionsStatus(status)\n\t\t})\n\t\treturn () => {\n\t\t\tsub.unsubscribe()\n\t\t}\n\t}, [])\n\n\treturn (\n\t\t<ExtensionsConnectContext.Provider\n\t\t\tvalue={{\n\t\t\t\textensionsStatus,\n\t\t\t\tgettingExtensions,\n\t\t\t\tsetExtensionStatus,\n\t\t\t\tremoveExtensionStatus,\n\t\t\t\textensionInstalled,\n\t\t\t\textensionCanConnect,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</ExtensionsConnectContext.Provider>\n\t)\n}\n","/* @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\tss58,\n\tdappName,\n\tchildren,\n}: ExtensionsProviderProps) => (\n\t<ExtensionsConnectProvider>\n\t\t<ExtensionAccountsProvider ss58={ss58} dappName={dappName}>\n\t\t\t{children}\n\t\t</ExtensionAccountsProvider>\n\t</ExtensionsConnectProvider>\n)\n","/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { createSafeContext } from '@w3ux/hooks'\nimport {\n\tgetHardwareAccountsLocal,\n\tHardwareAccountsKey,\n\thardwareAccounts$,\n\tsetHardwareAccounts,\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\tcreateSafeContext<HardwareAccountsContextInterface>()\n\nexport const HardwareAccountsProvider = ({\n\tchildren,\n}: {\n\tchildren: ReactNode\n}) => {\n\t// Store imported hardware accounts\n\tconst [hardwareAccounts, setHardwareAccountsState] = useState<\n\t\tHardwareAccount[]\n\t>(getHardwareAccountsLocal())\n\n\t// Check if an account exists\n\tconst hardwareAccountExists = (\n\t\tsource: HardwareAccountSource,\n\t\tnetwork: string,\n\t\taddress: string,\n\t) =>\n\t\t!!hardwareAccounts.find(\n\t\t\t(a) =>\n\t\t\t\ta.source === source && a.address === address && a.network === network,\n\t\t)\n\n\t// Adds an account\n\tconst addHardwareAccount = (\n\t\tsource: HardwareAccountSource,\n\t\tnetwork: string,\n\t\taddress: string,\n\t\tindex: number,\n\t\tcallback?: () => void,\n\t) => {\n\t\tif (!hardwareAccountExists(source, network, address)) {\n\t\t\tconst newAccount: HardwareAccount = {\n\t\t\t\taddress,\n\t\t\t\tnetwork,\n\t\t\t\tname: ellipsisFn(address),\n\t\t\t\tsource,\n\t\t\t\tindex,\n\t\t\t}\n\t\t\tconst newHardwareAccounts = [...hardwareAccounts].concat(newAccount)\n\t\t\tlocalStorage.setItem(\n\t\t\t\tHardwareAccountsKey,\n\t\t\t\tJSON.stringify(newHardwareAccounts),\n\t\t\t)\n\t\t\tsetHardwareAccounts(newHardwareAccounts)\n\t\t\t// Handle optional callback function\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback()\n\t\t\t}\n\t\t\treturn newAccount\n\t\t}\n\t\treturn null\n\t}\n\n\t// Removes an account\n\tconst removeHardwareAccount = (\n\t\tsource: HardwareAccountSource,\n\t\tnetwork: string,\n\t\taddress: string,\n\t\tcallback?: () => void,\n\t) => {\n\t\tconst newHardwareAccounts = [...hardwareAccounts].filter(\n\t\t\t(a) =>\n\t\t\t\t!(\n\t\t\t\t\ta.source === source &&\n\t\t\t\t\ta.address === address &&\n\t\t\t\t\ta.network === network\n\t\t\t\t),\n\t\t)\n\n\t\tif (!newHardwareAccounts.length) {\n\t\t\tlocalStorage.removeItem(HardwareAccountsKey)\n\t\t} else {\n\t\t\tlocalStorage.setItem(\n\t\t\t\tHardwareAccountsKey,\n\t\t\t\tJSON.stringify(newHardwareAccounts),\n\t\t\t)\n\t\t}\n\t\tsetHardwareAccounts(newHardwareAccounts)\n\t\t// Handle optional callback function\n\t\tif (typeof callback === 'function') {\n\t\t\tcallback()\n\t\t}\n\t}\n\n\t// Renames an imported account\n\tconst renameHardwareAccount = (\n\t\tsource: HardwareAccountSource,\n\t\tnetwork: string,\n\t\taddress: string,\n\t\tnewName: string,\n\t) => {\n\t\tconst newHardwareAccounts = [...hardwareAccounts].map((a) =>\n\t\t\ta.source === source && a.network === network && a.address === address\n\t\t\t\t? {\n\t\t\t\t\t\t...a,\n\t\t\t\t\t\tname: newName,\n\t\t\t\t\t}\n\t\t\t\t: a,\n\t\t)\n\t\tlocalStorage.setItem(\n\t\t\tHardwareAccountsKey,\n\t\t\tJSON.stringify(newHardwareAccounts),\n\t\t)\n\t\tsetHardwareAccounts(newHardwareAccounts)\n\t}\n\n\t// Gets an imported account\n\tconst getHardwareAccount = (\n\t\tsource: HardwareAccountSource,\n\t\tnetwork: string,\n\t\taddress: string,\n\t) =>\n\t\thardwareAccounts.find(\n\t\t\t(a) =>\n\t\t\t\ta.source === source && a.network === network && a.address === address,\n\t\t) || null\n\n\t// Gets all accounts for a network and source\n\tconst getHardwareAccounts = (\n\t\tsource: HardwareAccountSource,\n\t\tnetwork: string,\n\t) =>\n\t\thardwareAccounts.filter((a) => a.source === source && a.network === network)\n\n\t// Subscribes to observables and updates state\n\tuseEffect(() => {\n\t\tconst sub = hardwareAccounts$.subscribe((accounts) => {\n\t\t\tsetHardwareAccountsState(accounts)\n\t\t})\n\t\treturn () => {\n\t\t\tsub.unsubscribe()\n\t\t}\n\t}, [])\n\n\treturn (\n\t\t<HardwareAccountsContext.Provider\n\t\t\tvalue={{\n\t\t\t\thardwareAccountExists,\n\t\t\t\tgetHardwareAccount,\n\t\t\t\taddHardwareAccount,\n\t\t\t\tremoveHardwareAccount,\n\t\t\t\trenameHardwareAccount,\n\t\t\t\tgetHardwareAccounts,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</HardwareAccountsContext.Provider>\n\t)\n}\n"],"mappings":"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","names":["createSafeContext","useEffect","useState","combineLatest","jsx","createSafeContext","useState","useEffect","combineLatest","jsx","createSafeContext","useEffect","useState","jsx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@w3ux/react-connect-kit",
3
- "version": "3.6.10",
3
+ "version": "3.7.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",
@@ -31,7 +31,7 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@w3ux/hooks": "^2.3.4",
34
- "@w3ux/observables-connect": "^0.10.7",
34
+ "@w3ux/observables-connect": "^0.10.8",
35
35
  "@w3ux/utils": "^2.2.1"
36
36
  },
37
37
  "peerDependencies": {