@w3ux/react-connect-kit 3.0.3 → 3.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/ExtensionAccountsProvider/Extensions.d.ts +3 -3
  2. package/ExtensionAccountsProvider/Extensions.js +8 -8
  3. package/ExtensionAccountsProvider/Extensions.js.map +1 -1
  4. package/ExtensionAccountsProvider/defaults.d.ts +2 -9
  5. package/ExtensionAccountsProvider/defaults.js +0 -5
  6. package/ExtensionAccountsProvider/defaults.js.map +1 -1
  7. package/ExtensionAccountsProvider/index.d.ts +2 -3
  8. package/ExtensionAccountsProvider/index.js +24 -26
  9. package/ExtensionAccountsProvider/index.js.map +1 -1
  10. package/ExtensionAccountsProvider/types.d.ts +2 -2
  11. package/ExtensionAccountsProvider/types.js.map +1 -1
  12. package/ExtensionAccountsProvider/useImportExtension.d.ts +2 -2
  13. package/ExtensionAccountsProvider/useImportExtension.js +4 -4
  14. package/ExtensionAccountsProvider/useImportExtension.js.map +1 -1
  15. package/ExtensionAccountsProvider/utils.d.ts +1 -1
  16. package/ExtensionAccountsProvider/utils.js +2 -2
  17. package/ExtensionAccountsProvider/utils.js.map +1 -1
  18. package/ExtensionsProvider/index.d.ts +3 -4
  19. package/ExtensionsProvider/index.js +10 -11
  20. package/ExtensionsProvider/index.js.map +1 -1
  21. package/ExtensionsProvider/types.d.ts +2 -2
  22. package/ExtensionsProvider/types.js.map +1 -1
  23. package/LedgerAccountsProvider/index.d.ts +2 -3
  24. package/LedgerAccountsProvider/index.js +12 -13
  25. package/LedgerAccountsProvider/index.js.map +1 -1
  26. package/LedgerAccountsProvider/types.d.ts +2 -2
  27. package/LedgerAccountsProvider/types.js.map +1 -1
  28. package/LedgerAccountsProvider/utils.d.ts +2 -2
  29. package/LedgerAccountsProvider/utils.js +5 -5
  30. package/LedgerAccountsProvider/utils.js.map +1 -1
  31. package/VaultAccountsProvider/index.d.ts +2 -3
  32. package/VaultAccountsProvider/index.js +12 -13
  33. package/VaultAccountsProvider/index.js.map +1 -1
  34. package/VaultAccountsProvider/types.d.ts +2 -2
  35. package/VaultAccountsProvider/types.js.map +1 -1
  36. package/VaultAccountsProvider/utils.d.ts +1 -1
  37. package/VaultAccountsProvider/utils.js +2 -2
  38. package/VaultAccountsProvider/utils.js.map +1 -1
  39. package/WCAccountsProvider/index.d.ts +2 -3
  40. package/WCAccountsProvider/index.js +12 -13
  41. package/WCAccountsProvider/index.js.map +1 -1
  42. package/WCAccountsProvider/types.d.ts +2 -2
  43. package/WCAccountsProvider/types.js.map +1 -1
  44. package/WCAccountsProvider/utils.d.ts +1 -1
  45. package/WCAccountsProvider/utils.js +2 -2
  46. package/WCAccountsProvider/utils.js.map +1 -1
  47. package/index.d.ts +5 -5
  48. package/index.js +5 -5
  49. package/index.js.map +1 -1
  50. package/package.json +1 -1
  51. package/types.d.ts +6 -6
  52. package/types.js +4 -4
  53. package/types.js.map +1 -1
  54. package/ExtensionsProvider/defaults.d.ts +0 -2
  55. package/ExtensionsProvider/defaults.js +0 -13
  56. package/ExtensionsProvider/defaults.js.map +0 -1
  57. package/LedgerAccountsProvider/defaults.d.ts +0 -2
  58. package/LedgerAccountsProvider/defaults.js +0 -13
  59. package/LedgerAccountsProvider/defaults.js.map +0 -1
  60. package/VaultAccountsProvider/defaults.d.ts +0 -2
  61. package/VaultAccountsProvider/defaults.js +0 -13
  62. package/VaultAccountsProvider/defaults.js.map +0 -1
  63. package/WCAccountsProvider/defaults.d.ts +0 -2
  64. package/WCAccountsProvider/defaults.js +0 -13
  65. package/WCAccountsProvider/defaults.js.map +0 -1
@@ -1,6 +1,6 @@
1
- import { ExtensionEnableResults, RawExtensions } from "../types";
2
- import { ExtensionInterface } from "../ExtensionsProvider/types";
3
- import { ExtensionAccount } from "@w3ux/types";
1
+ import type { ExtensionAccount } from '@w3ux/types';
2
+ import type { ExtensionInterface } from '../ExtensionsProvider/types';
3
+ import type { ExtensionEnableResults, RawExtensions } from '../types';
4
4
  export declare class Extensions {
5
5
  static getFromIds: (extensionIds: string[]) => RawExtensions;
6
6
  static enable: (extensions: RawExtensions, dappName: string) => Promise<PromiseSettledResult<ExtensionInterface>[]>;
@@ -1,12 +1,12 @@
1
- import { formatAccountSs58, localStorageOrDefault } from "@w3ux/utils";
2
- import { DEFAULT_SS58 } from "./defaults";
1
+ import { formatAccountSs58, localStorageOrDefault } from '@w3ux/utils';
2
+ import { DEFAULT_SS58 } from './defaults';
3
3
  export class Extensions {
4
4
  static getFromIds = (extensionIds) => {
5
5
  const rawExtensions = new Map();
6
6
  extensionIds.forEach(async (id) => {
7
7
  if (this.isLocal(id)) {
8
8
  const { enable } = window.injectedWeb3[id];
9
- if (enable !== undefined && typeof enable === "function") {
9
+ if (enable !== undefined && typeof enable === 'function') {
10
10
  rawExtensions.set(id, enable);
11
11
  }
12
12
  else {
@@ -31,13 +31,13 @@ export class Extensions {
31
31
  for (let i = 0; i < results.length; i++) {
32
32
  const result = results[i];
33
33
  const id = Array.from(extensions.keys())[i];
34
- if (result.status === "fulfilled") {
34
+ if (result.status === 'fulfilled') {
35
35
  extensionsState.set(id, {
36
36
  extension: result.value,
37
37
  connected: true,
38
38
  });
39
39
  }
40
- else if (result.status === "rejected") {
40
+ else if (result.status === 'rejected') {
41
41
  extensionsState.set(id, {
42
42
  connected: false,
43
43
  error: result.reason,
@@ -57,7 +57,7 @@ export class Extensions {
57
57
  const result = results[i];
58
58
  const id = extensionEntries[i][0];
59
59
  const signer = extensionEntries[i][1].extension.signer;
60
- if (result.status === "fulfilled") {
60
+ if (result.status === 'fulfilled') {
61
61
  const filtered = result.value
62
62
  .map((account) => {
63
63
  const formattedAddress = formatAccountSs58(account.address, DEFAULT_SS58);
@@ -100,7 +100,7 @@ export class Extensions {
100
100
  if (Array.isArray(current)) {
101
101
  if (!current.includes(id)) {
102
102
  current.push(id);
103
- localStorage.setItem("active_extensions", JSON.stringify(current));
103
+ localStorage.setItem('active_extensions', JSON.stringify(current));
104
104
  }
105
105
  }
106
106
  };
@@ -108,7 +108,7 @@ export class Extensions {
108
108
  let current = localStorageOrDefault(`active_extensions`, [], true);
109
109
  if (Array.isArray(current)) {
110
110
  current = current.filter((localId) => localId !== id);
111
- localStorage.setItem("active_extensions", JSON.stringify(current));
111
+ localStorage.setItem('active_extensions', JSON.stringify(current));
112
112
  }
113
113
  };
114
114
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ExtensionAccountsProvider/Extensions.ts"],"names":[],"mappings":"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","file":"Extensions.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { formatAccountSs58, localStorageOrDefault } from \"@w3ux/utils\";\nimport {\n ExtensionEnableResult,\n ExtensionEnableResults,\n RawExtensionEnable,\n RawExtensions,\n} from \"../types\";\nimport { ExtensionInterface } from \"../ExtensionsProvider/types\";\nimport { DEFAULT_SS58 } from \"./defaults\";\nimport { ExtensionAccount } from \"@w3ux/types\";\n\n// A static class to manage the discovery and importing of extensions.\nexport class Extensions {\n // Gets a map of extensions with their enable functions from `injectedWeb3`.\n static getFromIds = (extensionIds: string[]): RawExtensions => {\n const rawExtensions = new Map<string, RawExtensionEnable>();\n\n extensionIds.forEach(async (id) => {\n if (this.isLocal(id)) {\n const { enable } = window.injectedWeb3[id];\n\n if (enable !== undefined && typeof enable === \"function\") {\n rawExtensions.set(id, enable);\n } else {\n this.removeFromLocal(id);\n }\n }\n });\n return rawExtensions;\n };\n\n // Calls `enable` for the provided extensions.\n static enable = async (\n extensions: RawExtensions,\n dappName: string\n ): Promise<PromiseSettledResult<ExtensionInterface>[]> => {\n try {\n const results = await Promise.allSettled(\n Array.from(extensions.values()).map((enable) => enable(dappName))\n );\n return results;\n } catch (err) {\n console.error(\"Error during 'enable' call for Extensions: \", err);\n // Return an empty array if an error occurs.\n return [];\n }\n };\n\n // Formats the results of an extension's `enable` function.\n static formatEnabled = (\n extensions: RawExtensions,\n results: PromiseSettledResult<ExtensionInterface>[]\n ): ExtensionEnableResults => {\n // Accumulate resulting extensions state after attempting to enable.\n const extensionsState = new Map<string, ExtensionEnableResult>();\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const id = Array.from(extensions.keys())[i];\n\n if (result.status === \"fulfilled\") {\n extensionsState.set(id, {\n extension: result.value,\n connected: true,\n });\n } else if (result.status === \"rejected\") {\n extensionsState.set(id, {\n connected: false,\n error: result.reason,\n });\n }\n }\n return extensionsState;\n };\n\n // Return successfully connected extensions.\n static connected = (\n extensions: ExtensionEnableResults\n ): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => state.connected)\n );\n\n static withError = (\n extensions: ExtensionEnableResults\n ): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => !state.connected)\n );\n\n // Calls `enable` and formats the results of an extension's `enable` function.\n static getAllAccounts = async (\n extensions: ExtensionEnableResults\n ): Promise<ExtensionAccount[]> => {\n try {\n const results = await Promise.allSettled(\n Array.from(extensions.values()).map(({ extension }) =>\n extension.accounts.get()\n )\n );\n\n const extensionEntries = Array.from(extensions.entries());\n const all: ExtensionAccount[] = [];\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const id = extensionEntries[i][0];\n const signer = extensionEntries[i][1].extension.signer;\n\n if (result.status === \"fulfilled\") {\n const filtered = result.value\n // Reformat addresses with default ss58 prefix.\n .map((account) => {\n const formattedAddress = formatAccountSs58(\n account.address,\n DEFAULT_SS58\n );\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 // Remove accounts that have already been imported.\n .filter(\n ({ address }) =>\n !all.find(\n (currentAccount) => address === currentAccount.address\n )\n )\n // Reformat entries to include extension source.\n .map(({ address, name }) => ({\n address,\n name,\n source: id,\n signer,\n }));\n\n all.push(...filtered);\n }\n }\n\n return all;\n } catch (err) {\n // Return an empty array if an error occurs.\n console.error(\n \"Error during 'enable' and format call for Extensions: \",\n err\n );\n return [];\n }\n };\n\n // Check if an extension exists in local `active_extensions`.\n static isLocal = (id: string): boolean => {\n const current = localStorageOrDefault<string[]>(\n `active_extensions`,\n [],\n true\n );\n let isLocal = false;\n if (Array.isArray(current)) {\n isLocal = current.find((l) => l === id) !== undefined;\n }\n return !!isLocal;\n };\n\n // Adds an extension to local `active_extensions`.\n static addToLocal = (id: string): void => {\n const current = localStorageOrDefault<string[]>(\n `active_extensions`,\n [],\n true\n );\n if (Array.isArray(current)) {\n if (!current.includes(id)) {\n current.push(id);\n localStorage.setItem(\"active_extensions\", JSON.stringify(current));\n }\n }\n };\n\n // Removes extension from local `active_extensions`.\n static removeFromLocal = (id: string): void => {\n let current = localStorageOrDefault<string[]>(\n `active_extensions`,\n [],\n true\n );\n if (Array.isArray(current)) {\n current = current.filter((localId: string) => localId !== id);\n localStorage.setItem(\"active_extensions\", JSON.stringify(current));\n }\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/ExtensionAccountsProvider/Extensions.ts"],"names":[],"mappings":"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","file":"Extensions.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionAccount } from '@w3ux/types'\nimport { formatAccountSs58, localStorageOrDefault } from '@w3ux/utils'\nimport type { ExtensionInterface } from '../ExtensionsProvider/types'\nimport type {\n ExtensionEnableResult,\n ExtensionEnableResults,\n RawExtensionEnable,\n RawExtensions,\n} from '../types'\nimport { DEFAULT_SS58 } from './defaults'\n\n// A static class to manage the discovery and importing of extensions.\nexport class Extensions {\n // Gets a map of extensions with their enable functions from `injectedWeb3`.\n static getFromIds = (extensionIds: string[]): RawExtensions => {\n const rawExtensions = new Map<string, RawExtensionEnable>()\n\n extensionIds.forEach(async (id) => {\n if (this.isLocal(id)) {\n const { enable } = window.injectedWeb3[id]\n\n if (enable !== undefined && typeof enable === 'function') {\n rawExtensions.set(id, enable)\n } else {\n this.removeFromLocal(id)\n }\n }\n })\n return rawExtensions\n }\n\n // Calls `enable` for the provided extensions.\n static enable = async (\n extensions: RawExtensions,\n dappName: string\n ): Promise<PromiseSettledResult<ExtensionInterface>[]> => {\n try {\n const results = await Promise.allSettled(\n Array.from(extensions.values()).map((enable) => enable(dappName))\n )\n return results\n } catch (err) {\n console.error(\"Error during 'enable' call for Extensions: \", err)\n // Return an empty array if an error occurs.\n return []\n }\n }\n\n // Formats the results of an extension's `enable` function.\n static formatEnabled = (\n extensions: RawExtensions,\n results: PromiseSettledResult<ExtensionInterface>[]\n ): ExtensionEnableResults => {\n // Accumulate resulting extensions state after attempting to enable.\n const extensionsState = new Map<string, ExtensionEnableResult>()\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i]\n const id = Array.from(extensions.keys())[i]\n\n if (result.status === 'fulfilled') {\n extensionsState.set(id, {\n extension: result.value,\n connected: true,\n })\n } else if (result.status === 'rejected') {\n extensionsState.set(id, {\n connected: false,\n error: result.reason,\n })\n }\n }\n return extensionsState\n }\n\n // Return successfully connected extensions.\n static connected = (\n extensions: ExtensionEnableResults\n ): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => state.connected)\n )\n\n static withError = (\n extensions: ExtensionEnableResults\n ): ExtensionEnableResults =>\n new Map(\n Array.from(extensions.entries()).filter(([, state]) => !state.connected)\n )\n\n // Calls `enable` and formats the results of an extension's `enable` function.\n static getAllAccounts = async (\n extensions: ExtensionEnableResults\n ): Promise<ExtensionAccount[]> => {\n try {\n const results = await Promise.allSettled(\n Array.from(extensions.values()).map(({ extension }) =>\n extension.accounts.get()\n )\n )\n\n const extensionEntries = Array.from(extensions.entries())\n const all: ExtensionAccount[] = []\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i]\n const id = extensionEntries[i][0]\n const signer = extensionEntries[i][1].extension.signer\n\n if (result.status === 'fulfilled') {\n const filtered = result.value\n // Reformat addresses with default ss58 prefix.\n .map((account) => {\n const formattedAddress = formatAccountSs58(\n account.address,\n DEFAULT_SS58\n )\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 // Remove accounts that have already been imported.\n .filter(\n ({ address }) =>\n !all.find(\n (currentAccount) => address === currentAccount.address\n )\n )\n // Reformat entries to include extension source.\n .map(({ address, name }) => ({\n address,\n name,\n source: id,\n signer,\n }))\n\n all.push(...filtered)\n }\n }\n\n return all\n } catch (err) {\n // Return an empty array if an error occurs.\n console.error(\n \"Error during 'enable' and format call for Extensions: \",\n err\n )\n return []\n }\n }\n\n // Check if an extension exists in local `active_extensions`.\n static isLocal = (id: string): boolean => {\n const current = localStorageOrDefault<string[]>(\n `active_extensions`,\n [],\n true\n )\n let isLocal = false\n if (Array.isArray(current)) {\n isLocal = current.find((l) => l === id) !== undefined\n }\n return !!isLocal\n }\n\n // Adds an extension to local `active_extensions`.\n static addToLocal = (id: string): void => {\n const current = localStorageOrDefault<string[]>(\n `active_extensions`,\n [],\n true\n )\n if (Array.isArray(current)) {\n if (!current.includes(id)) {\n current.push(id)\n localStorage.setItem('active_extensions', JSON.stringify(current))\n }\n }\n }\n\n // Removes extension from local `active_extensions`.\n static removeFromLocal = (id: string): void => {\n let current = localStorageOrDefault<string[]>(`active_extensions`, [], true)\n if (Array.isArray(current)) {\n current = current.filter((localId: string) => localId !== id)\n localStorage.setItem('active_extensions', JSON.stringify(current))\n }\n }\n}\n"]}
@@ -1,10 +1,3 @@
1
- import { ExtensionAccountsContextInterface } from "./types";
2
- export declare const defaultExtensionAccountsContext: ExtensionAccountsContextInterface;
3
- export declare const defaultHandleImportExtension: {
4
- newAccounts: any[];
5
- meta: {
6
- accountsToRemove: any[];
7
- removedActiveAccount: any;
8
- };
9
- };
1
+ import type { HandleImportExtension } from './types';
2
+ export declare const defaultHandleImportExtension: HandleImportExtension;
10
3
  export declare const DEFAULT_SS58 = 0;
@@ -1,8 +1,3 @@
1
- export const defaultExtensionAccountsContext = {
2
- connectExtensionAccounts: () => Promise.resolve(false),
3
- extensionAccountsSynced: "unsynced",
4
- getExtensionAccounts: (ss58) => [],
5
- };
6
1
  export const defaultHandleImportExtension = {
7
2
  newAccounts: [],
8
3
  meta: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ExtensionAccountsProvider/defaults.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,+BAA+B,GAC1C;IACE,wBAAwB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;IACtD,uBAAuB,EAAE,UAAU;IACnC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;CACnC,CAAC;AAEJ,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,WAAW,EAAE,EAAE;IACf,IAAI,EAAE;QACJ,gBAAgB,EAAE,EAAE;QACpB,oBAAoB,EAAE,IAAI;KAC3B;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC","file":"defaults.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function, no-unused-vars */\n\nimport { ExtensionAccountsContextInterface } from \"./types\";\n\nexport const defaultExtensionAccountsContext: ExtensionAccountsContextInterface =\n {\n connectExtensionAccounts: () => Promise.resolve(false),\n extensionAccountsSynced: \"unsynced\",\n getExtensionAccounts: (ss58) => [],\n };\n\nexport const defaultHandleImportExtension = {\n newAccounts: [],\n meta: {\n accountsToRemove: [],\n removedActiveAccount: null,\n },\n};\n\nexport const DEFAULT_SS58 = 0;\n"]}
1
+ {"version":3,"sources":["../src/ExtensionAccountsProvider/defaults.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,4BAA4B,GAA0B;IACjE,WAAW,EAAE,EAAE;IACf,IAAI,EAAE;QACJ,gBAAgB,EAAE,EAAE;QACpB,oBAAoB,EAAE,IAAI;KAC3B;CACF,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAA","file":"defaults.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { HandleImportExtension } from './types'\n\nexport const defaultHandleImportExtension: HandleImportExtension = {\n newAccounts: [],\n meta: {\n accountsToRemove: [],\n removedActiveAccount: null,\n },\n}\n\nexport const DEFAULT_SS58 = 0\n"]}
@@ -1,4 +1,3 @@
1
- import { ExtensionAccountsContextInterface, ExtensionAccountsProviderProps } from "./types";
2
- export declare const ExtensionAccountsContext: import("react").Context<ExtensionAccountsContextInterface>;
3
- export declare const useExtensionAccounts: () => ExtensionAccountsContextInterface;
1
+ import type { ExtensionAccountsContextInterface, ExtensionAccountsProviderProps } from './types';
2
+ export declare const ExtensionAccountsContext: import("react").Context<ExtensionAccountsContextInterface>, useExtensionAccounts: () => ExtensionAccountsContextInterface;
4
3
  export declare const ExtensionAccountsProvider: ({ children, network, ss58, dappName, activeAccount, setActiveAccount, onExtensionEnabled, }: ExtensionAccountsProviderProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,30 +1,28 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { createContext, useContext, useEffect, useRef, useState } from "react";
3
- import { formatAccountSs58, localStorageOrDefault, setStateWithRef, } from "@w3ux/utils";
4
- import { defaultExtensionAccountsContext } from "./defaults";
5
- import { useImportExtension } from "./useImportExtension";
6
- import { Extensions } from "./Extensions";
7
- import { connectActiveExtensionAccount, getActiveAccountLocal, getActiveExtensionAccount, } from "./utils";
8
- import { useExtensions } from "../ExtensionsProvider";
9
- import { useEffectIgnoreInitial } from "@w3ux/hooks";
10
- export const ExtensionAccountsContext = createContext(defaultExtensionAccountsContext);
11
- export const useExtensionAccounts = () => useContext(ExtensionAccountsContext);
2
+ import { createSafeContext, useEffectIgnoreInitial } from '@w3ux/hooks';
3
+ import { formatAccountSs58, localStorageOrDefault, setStateWithRef, } from '@w3ux/utils';
4
+ import { useEffect, useRef, useState } from 'react';
5
+ import { useExtensions } from '../ExtensionsProvider';
6
+ import { Extensions } from './Extensions';
7
+ import { useImportExtension } from './useImportExtension';
8
+ import { connectActiveExtensionAccount, getActiveAccountLocal, getActiveExtensionAccount, } from './utils';
9
+ export const [ExtensionAccountsContext, useExtensionAccounts] = createSafeContext();
12
10
  export const ExtensionAccountsProvider = ({ children, network, ss58, dappName, activeAccount, setActiveAccount, onExtensionEnabled, }) => {
13
11
  const { handleImportExtension } = useImportExtension();
14
12
  const { extensionsStatus, setExtensionStatus, removeExtensionStatus, checkingInjectedWeb3, extensionHasFeature, } = useExtensions();
15
13
  const [extensionAccounts, setExtensionAccounts] = useState([]);
16
14
  const extensionAccountsRef = useRef(extensionAccounts);
17
- const [extensionAccountsSynced, setExtensionAccountsSynced] = useState("unsynced");
15
+ const [extensionAccountsSynced, setExtensionAccountsSynced] = useState('unsynced');
18
16
  const [extensionsInitialised, setExtensionsInitialised] = useState([]);
19
17
  const extensionsInitialisedRef = useRef(extensionsInitialised);
20
18
  const unsubs = useRef({});
21
19
  const maybeSetActiveAccount = (address) => {
22
- if (typeof setActiveAccount === "function") {
20
+ if (typeof setActiveAccount === 'function') {
23
21
  setActiveAccount(address ?? null);
24
22
  }
25
23
  };
26
24
  const maybeOnExtensionEnabled = (id) => {
27
- if (typeof onExtensionEnabled === "function") {
25
+ if (typeof onExtensionEnabled === 'function') {
28
26
  onExtensionEnabled(id);
29
27
  }
30
28
  };
@@ -52,7 +50,7 @@ export const ExtensionAccountsProvider = ({ children, network, ss58, dappName, a
52
50
  handleExtensionError(id, state.error);
53
51
  });
54
52
  Array.from(connectedExtensions.keys()).forEach((id) => {
55
- setExtensionStatus(id, "connected");
53
+ setExtensionStatus(id, 'connected');
56
54
  updateInitialisedExtensions(id);
57
55
  });
58
56
  updateExtensionAccounts({ add: initialAccounts, remove: [] });
@@ -61,7 +59,7 @@ export const ExtensionAccountsProvider = ({ children, network, ss58, dappName, a
61
59
  updateExtensionAccounts({ add: newAccounts, remove: accountsToRemove });
62
60
  };
63
61
  for (const [id, { extension }] of Array.from(connectedExtensions.entries())) {
64
- if (extensionHasFeature(id, "subscribeAccounts")) {
62
+ if (extensionHasFeature(id, 'subscribeAccounts')) {
65
63
  const unsub = extension.accounts.subscribe((accounts) => {
66
64
  handleAccounts(id, accounts || [], extension.signer);
67
65
  });
@@ -100,8 +98,8 @@ export const ExtensionAccountsProvider = ({ children, network, ss58, dappName, a
100
98
  };
101
99
  Extensions.addToLocal(id);
102
100
  maybeOnExtensionEnabled(id);
103
- setExtensionStatus(id, "connected");
104
- if (!extensionHasFeature(id, "subscribeAccounts")) {
101
+ setExtensionStatus(id, 'connected');
102
+ if (!extensionHasFeature(id, 'subscribeAccounts')) {
105
103
  const accounts = await extension.accounts.get();
106
104
  handleAccounts(accounts);
107
105
  }
@@ -121,13 +119,13 @@ export const ExtensionAccountsProvider = ({ children, network, ss58, dappName, a
121
119
  return false;
122
120
  };
123
121
  const handleExtensionError = (id, err) => {
124
- if (err.startsWith("Error")) {
122
+ if (err.startsWith('Error')) {
125
123
  Extensions.removeFromLocal(id);
126
- if (err.substring(0, 17) === "NotInstalledError") {
124
+ if (err.substring(0, 17) === 'NotInstalledError') {
127
125
  removeExtensionStatus(id);
128
126
  }
129
127
  else {
130
- setExtensionStatus(id, "not_authenticated");
128
+ setExtensionStatus(id, 'not_authenticated');
131
129
  }
132
130
  }
133
131
  updateInitialisedExtensions(id);
@@ -172,23 +170,23 @@ export const ExtensionAccountsProvider = ({ children, network, ss58, dappName, a
172
170
  });
173
171
  };
174
172
  const handleSyncExtensionAccounts = async () => {
175
- if (!checkingInjectedWeb3 && extensionAccountsSynced === "unsynced") {
173
+ if (!checkingInjectedWeb3 && extensionAccountsSynced === 'unsynced') {
176
174
  unsubscribe();
177
175
  setStateWithRef([], setExtensionAccounts, extensionAccountsRef);
178
176
  setStateWithRef([], setExtensionsInitialised, extensionsInitialisedRef);
179
177
  if (Object.keys(extensionsStatus).length) {
180
178
  const localExtensions = localStorageOrDefault(`active_extensions`, [], true);
181
179
  if (Object.keys(extensionsStatus).length && localExtensions.length) {
182
- setExtensionAccountsSynced("syncing");
180
+ setExtensionAccountsSynced('syncing');
183
181
  await connectActiveExtensions();
184
182
  }
185
183
  }
186
- setExtensionAccountsSynced("synced");
184
+ setExtensionAccountsSynced('synced');
187
185
  }
188
186
  };
189
- const getExtensionAccounts = (ss58) => extensionAccounts
187
+ const getExtensionAccounts = (ss58Prefix) => extensionAccounts
190
188
  .map((account) => {
191
- const formattedAddress = formatAccountSs58(account.address, ss58);
189
+ const formattedAddress = formatAccountSs58(account.address, ss58Prefix);
192
190
  if (!formattedAddress) {
193
191
  return null;
194
192
  }
@@ -205,7 +203,7 @@ export const ExtensionAccountsProvider = ({ children, network, ss58, dappName, a
205
203
  useEffectIgnoreInitial(() => {
206
204
  if (!checkingInjectedWeb3 &&
207
205
  extensionsInitialised.length === Object.keys(extensionsStatus).length) {
208
- setExtensionAccountsSynced("synced");
206
+ setExtensionAccountsSynced('synced');
209
207
  }
210
208
  }, [checkingInjectedWeb3, extensionsInitialised]);
211
209
  return (_jsx(ExtensionAccountsContext.Provider, { value: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ExtensionAccountsProvider/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { createContext, useContext, useEffect, useRef, useState } from \"react\";\nimport {\n formatAccountSs58,\n localStorageOrDefault,\n setStateWithRef,\n} from \"@w3ux/utils\";\nimport { defaultExtensionAccountsContext } from \"./defaults\";\nimport { ExtensionInterface } from \"../ExtensionsProvider/types\";\nimport {\n ExtensionAccountsContextInterface,\n ExtensionAccountsProviderProps,\n} from \"./types\";\nimport { useImportExtension } from \"./useImportExtension\";\nimport { Extensions } from \"./Extensions\";\nimport {\n connectActiveExtensionAccount,\n getActiveAccountLocal,\n getActiveExtensionAccount,\n} from \"./utils\";\nimport { useExtensions } from \"../ExtensionsProvider\";\nimport { useEffectIgnoreInitial } from \"@w3ux/hooks\";\nimport { ExtensionAccount, ImportedAccount, Sync, VoidFn } from \"@w3ux/types\";\n\nexport const ExtensionAccountsContext =\n createContext<ExtensionAccountsContextInterface>(\n defaultExtensionAccountsContext\n );\n\nexport const useExtensionAccounts = () => useContext(ExtensionAccountsContext);\n\nexport const ExtensionAccountsProvider = ({\n children,\n network,\n ss58,\n dappName,\n activeAccount,\n setActiveAccount,\n onExtensionEnabled,\n}: ExtensionAccountsProviderProps) => {\n const { handleImportExtension } = useImportExtension();\n\n const {\n extensionsStatus,\n setExtensionStatus,\n removeExtensionStatus,\n checkingInjectedWeb3,\n extensionHasFeature,\n } = useExtensions();\n\n // Store connected extension accounts.\n const [extensionAccounts, setExtensionAccounts] = useState<ImportedAccount[]>(\n []\n );\n const extensionAccountsRef = useRef(extensionAccounts);\n\n // Store whether extension accounts have been synced.\n const [extensionAccountsSynced, setExtensionAccountsSynced] =\n useState<Sync>(\"unsynced\");\n\n // Store extensions whose account subscriptions have been initialised.\n const [extensionsInitialised, setExtensionsInitialised] = useState<string[]>(\n []\n );\n const extensionsInitialisedRef = useRef(extensionsInitialised);\n\n // Store unsubscribe handlers for connected extensions.\n const unsubs = useRef<Record<string, VoidFn>>({});\n\n // Helper for setting active account. Ignores if not a valid function.\n const maybeSetActiveAccount = (address: string) => {\n if (typeof setActiveAccount === \"function\") {\n setActiveAccount(address ?? null);\n }\n };\n\n // Helper for calling extension enabled callback. Ignores if not a valid function.\n const maybeOnExtensionEnabled = (id: string) => {\n if (typeof onExtensionEnabled === \"function\") {\n onExtensionEnabled(id);\n }\n };\n\n const connectToAccount = (account: ImportedAccount | null) => {\n maybeSetActiveAccount(account?.address ?? null);\n };\n\n // connectActiveExtensions\n //\n // Connects to extensions that already have been connected to and stored in localStorage. Loop\n // through extensions and connect to accounts. If `activeAccount` exists locally, we wait until\n // all extensions are looped before connecting to it; there is no guarantee it still exists - must\n // explicitly find it.\n const connectActiveExtensions = async () => {\n const extensionIds = Object.keys(extensionsStatus);\n if (!extensionIds.length) {\n return;\n }\n\n // Iterate previously connected extensions and retreive valid `enable` functions.\n // ------------------------------------------------------------------------------\n const rawExtensions = Extensions.getFromIds(extensionIds);\n\n // Attempt to connect to extensions via `enable` and format the results.\n const enableResults = Extensions.formatEnabled(\n rawExtensions,\n await Extensions.enable(rawExtensions, dappName)\n );\n\n // Retrieve the resulting connected extensions only.\n const connectedExtensions = Extensions.connected(enableResults);\n\n // Retrieve extensions that failed to connect.\n const extensionsWithError = Extensions.withError(enableResults);\n\n // Add connected extensions to local storage.\n Array.from(connectedExtensions.keys()).forEach((id) =>\n Extensions.addToLocal(id)\n );\n\n // Initial fetch of extension accounts to populate accounts & extensions state.\n // ----------------------------------------------------------------------------\n\n // Get full list of imported accounts.\n const initialAccounts =\n await Extensions.getAllAccounts(connectedExtensions);\n\n // Get the active account if found in initial accounts. Format initial account addresses to the\n // correct ss58 format before finding.\n const activeAccountInInitial = initialAccounts\n .map((acc) => ({\n ...acc,\n address: formatAccountSs58(acc.address, ss58),\n }))\n .find(({ address }) => address === getActiveAccountLocal(network, ss58));\n\n // Perform all initial state updates.\n // ----------------------------------\n\n Array.from(extensionsWithError.entries()).forEach(([id, state]) => {\n handleExtensionError(id, state.error);\n });\n\n Array.from(connectedExtensions.keys()).forEach((id) => {\n setExtensionStatus(id, \"connected\");\n updateInitialisedExtensions(id);\n });\n\n updateExtensionAccounts({ add: initialAccounts, remove: [] });\n\n // Initiate account subscriptions for connected extensions.\n // --------------------------------------------------------\n\n // Handler function for each extension accounts subscription.\n const handleAccounts = (\n extensionId: string,\n accounts: ExtensionAccount[],\n signer: unknown\n ) => {\n const {\n newAccounts,\n meta: { accountsToRemove },\n } = handleImportExtension(\n extensionId,\n extensionAccountsRef.current,\n signer,\n accounts,\n network,\n ss58\n );\n\n // Update added and removed accounts.\n updateExtensionAccounts({ add: newAccounts, remove: accountsToRemove });\n };\n\n // Try to subscribe to accounts for each connected extension.\n for (const [id, { extension }] of Array.from(\n connectedExtensions.entries()\n )) {\n // If enabled, subscribe to accounts.\n if (extensionHasFeature(id, \"subscribeAccounts\")) {\n const unsub = extension.accounts.subscribe((accounts) => {\n handleAccounts(id, accounts || [], extension.signer);\n });\n // Add unsub to context ref.\n addToUnsubscribe(id, unsub);\n }\n }\n\n // Connect to active account if found in initial accounts.\n if (activeAccountInInitial) {\n connectActiveExtensionAccount(activeAccountInInitial, connectToAccount);\n }\n };\n\n // connectExtensionAccounts\n //\n // Similar to the above but only connects to a single extension. This is invoked by the user by\n // clicking on an extension. If activeAccount is not found here, it is simply ignored.\n const connectExtensionAccounts = async (id: string): Promise<boolean> => {\n const extensionIds = Object.keys(extensionsStatus);\n const exists = extensionIds.find((key) => key === id) || undefined;\n\n if (!exists) {\n updateInitialisedExtensions(\n `unknown_extension_${extensionsInitialisedRef.current.length + 1}`\n );\n } else {\n try {\n // Attempt to get extension `enable` property.\n const { enable } = window.injectedWeb3[id];\n\n // Summons extension popup.\n const extension: ExtensionInterface = await enable(dappName);\n\n // Continue if `enable` succeeded, and if the current network is supported.\n if (extension !== undefined) {\n // Handler for new accounts.\n const handleAccounts = (accounts: ExtensionAccount[]) => {\n const {\n newAccounts,\n meta: { removedActiveAccount, accountsToRemove },\n } = handleImportExtension(\n id,\n extensionAccountsRef.current,\n extension.signer,\n accounts,\n network,\n ss58\n );\n // Set active account for network if not yet set.\n if (!activeAccount) {\n const activeExtensionAccount = getActiveExtensionAccount(\n network,\n ss58,\n newAccounts\n );\n if (\n activeExtensionAccount?.address !== removedActiveAccount &&\n removedActiveAccount !== null\n ) {\n connectActiveExtensionAccount(\n activeExtensionAccount,\n connectToAccount\n );\n }\n }\n\n // Update extension accounts state.\n updateExtensionAccounts({\n add: newAccounts,\n remove: accountsToRemove,\n });\n\n // Update initialised extensions.\n updateInitialisedExtensions(id);\n };\n\n // Call optional `onExtensionEnabled` callback.\n Extensions.addToLocal(id);\n\n maybeOnExtensionEnabled(id);\n setExtensionStatus(id, \"connected\");\n\n // If account subscriptions are not supported, simply get the account(s) from the extension. Otherwise, subscribe to accounts.\n if (!extensionHasFeature(id, \"subscribeAccounts\")) {\n const accounts = await extension.accounts.get();\n handleAccounts(accounts);\n } else {\n const unsub = extension.accounts.subscribe((accounts) => {\n handleAccounts(accounts || []);\n });\n addToUnsubscribe(id, unsub);\n }\n return true;\n }\n } catch (err) {\n handleExtensionError(id, String(err));\n }\n }\n return false;\n };\n\n // Handle errors when communiating with extensions.\n const handleExtensionError = (id: string, err: string) => {\n // if not general error (maybe enabled but no accounts trust app).\n if (err.startsWith(\"Error\")) {\n // remove extension from local `active_extensions`.\n Extensions.removeFromLocal(id);\n\n // extension not found (does not exist).\n if (err.substring(0, 17) === \"NotInstalledError\") {\n removeExtensionStatus(id);\n } else {\n // declare extension as no imported accounts authenticated.\n setExtensionStatus(id, \"not_authenticated\");\n }\n }\n // mark extension as initialised.\n updateInitialisedExtensions(id);\n };\n\n // Update initialised extensions.\n const updateInitialisedExtensions = (id: string) => {\n if (!extensionsInitialisedRef.current.includes(id)) {\n setStateWithRef(\n [...extensionsInitialisedRef.current].concat(id),\n setExtensionsInitialised,\n extensionsInitialisedRef\n );\n }\n };\n\n // Add an extension account to context state.\n const updateExtensionAccounts = ({\n add,\n remove,\n }: {\n add: ExtensionAccount[];\n remove: ExtensionAccount[];\n }) => {\n // Add new accounts and remove any removed accounts.\n const newAccounts = [...extensionAccountsRef.current]\n .concat(add)\n .filter((a) => remove.find((s) => s.address === a.address) === undefined);\n\n if (remove.length) {\n // Unsubscribe from removed accounts.\n unsubAccounts(remove);\n\n // Remove active account if it is being forgotten.\n if (\n activeAccount &&\n remove.find(({ address }) => address === activeAccount) !== undefined\n ) {\n maybeSetActiveAccount(null);\n }\n }\n\n setStateWithRef(newAccounts, setExtensionAccounts, extensionAccountsRef);\n };\n\n // Add an extension id to unsubscribe state.\n const addToUnsubscribe = (id: string, unsub: VoidFn) => {\n unsubs.current[id] = unsub;\n };\n\n // Handle unsubscribing of an removed extension accounts.\n const unsubAccounts = (accounts: ImportedAccount[]) => {\n // Unsubscribe and remove unsub from context ref.\n if (accounts.length) {\n for (const { address } of accounts) {\n if (extensionAccountsRef.current.find((a) => a.address === address)) {\n const unsub = unsubs.current[address];\n if (unsub) {\n unsub();\n delete unsubs.current[address];\n }\n }\n }\n }\n };\n\n // Unsubscrbe all account subscriptions.\n const unsubscribe = () => {\n Object.values(unsubs.current).forEach((unsub) => {\n unsub();\n });\n };\n\n const handleSyncExtensionAccounts = async () => {\n // Wait for injectedWeb3 check to finish before starting account import process.\n if (!checkingInjectedWeb3 && extensionAccountsSynced === \"unsynced\") {\n // Unsubscribe from all accounts and reset state\n unsubscribe();\n setStateWithRef([], setExtensionAccounts, extensionAccountsRef);\n setStateWithRef([], setExtensionsInitialised, extensionsInitialisedRef);\n // If extensions have been fetched, get accounts if extensions exist and local extensions\n // exist (previously connected).\n if (Object.keys(extensionsStatus).length) {\n // get active extensions\n const localExtensions = localStorageOrDefault(\n `active_extensions`,\n [],\n true\n );\n if (Object.keys(extensionsStatus).length && localExtensions.length) {\n setExtensionAccountsSynced(\"syncing\");\n await connectActiveExtensions();\n }\n }\n\n // Syncing is complete. Also covers case where no extensions were found.\n setExtensionAccountsSynced(\"synced\");\n }\n };\n\n // Get extension accounts based on the provided ss58 prefix.\n const getExtensionAccounts = (ss58: number): ImportedAccount[] =>\n extensionAccounts\n .map((account) => {\n const formattedAddress = formatAccountSs58(account.address, ss58);\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 // Re-sync extensions accounts on `unsynced`.\n useEffect(() => {\n handleSyncExtensionAccounts();\n\n return () => unsubscribe();\n }, [extensionsStatus, checkingInjectedWeb3, extensionAccountsSynced]);\n\n // Once initialised extensions equal total extensions present in `injectedWeb3`, mark extensions\n // as fetched.\n useEffectIgnoreInitial(() => {\n if (\n !checkingInjectedWeb3 &&\n extensionsInitialised.length === Object.keys(extensionsStatus).length\n ) {\n setExtensionAccountsSynced(\"synced\");\n }\n }, [checkingInjectedWeb3, extensionsInitialised]);\n\n return (\n <ExtensionAccountsContext.Provider\n value={{\n connectExtensionAccounts,\n extensionAccountsSynced,\n getExtensionAccounts,\n }}\n >\n {children}\n </ExtensionAccountsContext.Provider>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/ExtensionAccountsProvider/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { createSafeContext, useEffectIgnoreInitial } from '@w3ux/hooks'\nimport type {\n ExtensionAccount,\n ImportedAccount,\n Sync,\n VoidFn,\n} from '@w3ux/types'\nimport {\n formatAccountSs58,\n localStorageOrDefault,\n setStateWithRef,\n} from '@w3ux/utils'\nimport { useEffect, useRef, useState } from 'react'\nimport { useExtensions } from '../ExtensionsProvider'\nimport type { ExtensionInterface } from '../ExtensionsProvider/types'\nimport { Extensions } from './Extensions'\nimport type {\n ExtensionAccountsContextInterface,\n ExtensionAccountsProviderProps,\n} from './types'\nimport { useImportExtension } from './useImportExtension'\nimport {\n connectActiveExtensionAccount,\n getActiveAccountLocal,\n getActiveExtensionAccount,\n} from './utils'\n\nexport const [ExtensionAccountsContext, useExtensionAccounts] =\n createSafeContext<ExtensionAccountsContextInterface>()\n\nexport const ExtensionAccountsProvider = ({\n children,\n network,\n ss58,\n dappName,\n activeAccount,\n setActiveAccount,\n onExtensionEnabled,\n}: ExtensionAccountsProviderProps) => {\n const { handleImportExtension } = useImportExtension()\n\n const {\n extensionsStatus,\n setExtensionStatus,\n removeExtensionStatus,\n checkingInjectedWeb3,\n extensionHasFeature,\n } = useExtensions()\n\n // Store connected extension accounts.\n const [extensionAccounts, setExtensionAccounts] = useState<ImportedAccount[]>(\n []\n )\n const extensionAccountsRef = useRef(extensionAccounts)\n\n // Store whether extension accounts have been synced.\n const [extensionAccountsSynced, setExtensionAccountsSynced] =\n useState<Sync>('unsynced')\n\n // Store extensions whose account subscriptions have been initialised.\n const [extensionsInitialised, setExtensionsInitialised] = useState<string[]>(\n []\n )\n const extensionsInitialisedRef = useRef(extensionsInitialised)\n\n // Store unsubscribe handlers for connected extensions.\n const unsubs = useRef<Record<string, VoidFn>>({})\n\n // Helper for setting active account. Ignores if not a valid function.\n const maybeSetActiveAccount = (address: string) => {\n if (typeof setActiveAccount === 'function') {\n setActiveAccount(address ?? null)\n }\n }\n\n // Helper for calling extension enabled callback. Ignores if not a valid function.\n const maybeOnExtensionEnabled = (id: string) => {\n if (typeof onExtensionEnabled === 'function') {\n onExtensionEnabled(id)\n }\n }\n\n const connectToAccount = (account: ImportedAccount | null) => {\n maybeSetActiveAccount(account?.address ?? null)\n }\n\n // connectActiveExtensions\n //\n // Connects to extensions that already have been connected to and stored in localStorage. Loop\n // through extensions and connect to accounts. If `activeAccount` exists locally, we wait until\n // all extensions are looped before connecting to it; there is no guarantee it still exists - must\n // explicitly find it.\n const connectActiveExtensions = async () => {\n const extensionIds = Object.keys(extensionsStatus)\n if (!extensionIds.length) {\n return\n }\n\n // Iterate previously connected extensions and retreive valid `enable` functions.\n // ------------------------------------------------------------------------------\n const rawExtensions = Extensions.getFromIds(extensionIds)\n\n // Attempt to connect to extensions via `enable` and format the results.\n const enableResults = Extensions.formatEnabled(\n rawExtensions,\n await Extensions.enable(rawExtensions, dappName)\n )\n\n // Retrieve the resulting connected extensions only.\n const connectedExtensions = Extensions.connected(enableResults)\n\n // Retrieve extensions that failed to connect.\n const extensionsWithError = Extensions.withError(enableResults)\n\n // Add connected extensions to local storage.\n Array.from(connectedExtensions.keys()).forEach((id) =>\n Extensions.addToLocal(id)\n )\n\n // Initial fetch of extension accounts to populate accounts & extensions state.\n // ----------------------------------------------------------------------------\n\n // Get full list of imported accounts.\n const initialAccounts = await Extensions.getAllAccounts(connectedExtensions)\n\n // Get the active account if found in initial accounts. Format initial account addresses to the\n // correct ss58 format before finding.\n const activeAccountInInitial = initialAccounts\n .map((acc) => ({\n ...acc,\n address: formatAccountSs58(acc.address, ss58),\n }))\n .find(({ address }) => address === getActiveAccountLocal(network, ss58))\n\n // Perform all initial state updates.\n // ----------------------------------\n\n Array.from(extensionsWithError.entries()).forEach(([id, state]) => {\n handleExtensionError(id, state.error)\n })\n\n Array.from(connectedExtensions.keys()).forEach((id) => {\n setExtensionStatus(id, 'connected')\n updateInitialisedExtensions(id)\n })\n\n updateExtensionAccounts({ add: initialAccounts, remove: [] })\n\n // Initiate account subscriptions for connected extensions.\n // --------------------------------------------------------\n\n // Handler function for each extension accounts subscription.\n const handleAccounts = (\n extensionId: string,\n accounts: ExtensionAccount[],\n signer: unknown\n ) => {\n const {\n newAccounts,\n meta: { accountsToRemove },\n } = handleImportExtension(\n extensionId,\n extensionAccountsRef.current,\n signer,\n accounts,\n network,\n ss58\n )\n\n // Update added and removed accounts.\n updateExtensionAccounts({ add: newAccounts, remove: accountsToRemove })\n }\n\n // Try to subscribe to accounts for each connected extension.\n for (const [id, { extension }] of Array.from(\n connectedExtensions.entries()\n )) {\n // If enabled, subscribe to accounts.\n if (extensionHasFeature(id, 'subscribeAccounts')) {\n const unsub = extension.accounts.subscribe((accounts) => {\n handleAccounts(id, accounts || [], extension.signer)\n })\n // Add unsub to context ref.\n addToUnsubscribe(id, unsub)\n }\n }\n\n // Connect to active account if found in initial accounts.\n if (activeAccountInInitial) {\n connectActiveExtensionAccount(activeAccountInInitial, connectToAccount)\n }\n }\n\n // connectExtensionAccounts\n //\n // Similar to the above but only connects to a single extension. This is invoked by the user by\n // clicking on an extension. If activeAccount is not found here, it is simply ignored.\n const connectExtensionAccounts = async (id: string): Promise<boolean> => {\n const extensionIds = Object.keys(extensionsStatus)\n const exists = extensionIds.find((key) => key === id) || undefined\n\n if (!exists) {\n updateInitialisedExtensions(\n `unknown_extension_${extensionsInitialisedRef.current.length + 1}`\n )\n } else {\n try {\n // Attempt to get extension `enable` property.\n const { enable } = window.injectedWeb3[id]\n\n // Summons extension popup.\n const extension: ExtensionInterface = await enable(dappName)\n\n // Continue if `enable` succeeded, and if the current network is supported.\n if (extension !== undefined) {\n // Handler for new accounts.\n const handleAccounts = (accounts: ExtensionAccount[]) => {\n const {\n newAccounts,\n meta: { removedActiveAccount, accountsToRemove },\n } = handleImportExtension(\n id,\n extensionAccountsRef.current,\n extension.signer,\n accounts,\n network,\n ss58\n )\n // Set active account for network if not yet set.\n if (!activeAccount) {\n const activeExtensionAccount = getActiveExtensionAccount(\n network,\n ss58,\n newAccounts\n )\n if (\n activeExtensionAccount?.address !== removedActiveAccount &&\n removedActiveAccount !== null\n ) {\n connectActiveExtensionAccount(\n activeExtensionAccount,\n connectToAccount\n )\n }\n }\n\n // Update extension accounts state.\n updateExtensionAccounts({\n add: newAccounts,\n remove: accountsToRemove,\n })\n\n // Update initialised extensions.\n updateInitialisedExtensions(id)\n }\n\n // Call optional `onExtensionEnabled` callback.\n Extensions.addToLocal(id)\n\n maybeOnExtensionEnabled(id)\n setExtensionStatus(id, 'connected')\n\n // If account subscriptions are not supported, simply get the account(s) from the extension. Otherwise, subscribe to accounts.\n if (!extensionHasFeature(id, 'subscribeAccounts')) {\n const accounts = await extension.accounts.get()\n handleAccounts(accounts)\n } else {\n const unsub = extension.accounts.subscribe((accounts) => {\n handleAccounts(accounts || [])\n })\n addToUnsubscribe(id, unsub)\n }\n return true\n }\n } catch (err) {\n handleExtensionError(id, String(err))\n }\n }\n return false\n }\n\n // Handle errors when communiating with extensions.\n const handleExtensionError = (id: string, err: string) => {\n // if not general error (maybe enabled but no accounts trust app).\n if (err.startsWith('Error')) {\n // remove extension from local `active_extensions`.\n Extensions.removeFromLocal(id)\n\n // extension not found (does not exist).\n if (err.substring(0, 17) === 'NotInstalledError') {\n removeExtensionStatus(id)\n } else {\n // declare extension as no imported accounts authenticated.\n setExtensionStatus(id, 'not_authenticated')\n }\n }\n // mark extension as initialised.\n updateInitialisedExtensions(id)\n }\n\n // Update initialised extensions.\n const updateInitialisedExtensions = (id: string) => {\n if (!extensionsInitialisedRef.current.includes(id)) {\n setStateWithRef(\n [...extensionsInitialisedRef.current].concat(id),\n setExtensionsInitialised,\n extensionsInitialisedRef\n )\n }\n }\n\n // Add an extension account to context state.\n const updateExtensionAccounts = ({\n add,\n remove,\n }: {\n add: ExtensionAccount[]\n remove: ExtensionAccount[]\n }) => {\n // Add new accounts and remove any removed accounts.\n const newAccounts = [...extensionAccountsRef.current]\n .concat(add)\n .filter((a) => remove.find((s) => s.address === a.address) === undefined)\n\n if (remove.length) {\n // Unsubscribe from removed accounts.\n unsubAccounts(remove)\n\n // Remove active account if it is being forgotten.\n if (\n activeAccount &&\n remove.find(({ address }) => address === activeAccount) !== undefined\n ) {\n maybeSetActiveAccount(null)\n }\n }\n\n setStateWithRef(newAccounts, setExtensionAccounts, extensionAccountsRef)\n }\n\n // Add an extension id to unsubscribe state.\n const addToUnsubscribe = (id: string, unsub: VoidFn) => {\n unsubs.current[id] = unsub\n }\n\n // Handle unsubscribing of an removed extension accounts.\n const unsubAccounts = (accounts: ImportedAccount[]) => {\n // Unsubscribe and remove unsub from context ref.\n if (accounts.length) {\n for (const { address } of accounts) {\n if (extensionAccountsRef.current.find((a) => a.address === address)) {\n const unsub = unsubs.current[address]\n if (unsub) {\n unsub()\n delete unsubs.current[address]\n }\n }\n }\n }\n }\n\n // Unsubscrbe all account subscriptions.\n const unsubscribe = () => {\n Object.values(unsubs.current).forEach((unsub) => {\n unsub()\n })\n }\n\n const handleSyncExtensionAccounts = async () => {\n // Wait for injectedWeb3 check to finish before starting account import process.\n if (!checkingInjectedWeb3 && extensionAccountsSynced === 'unsynced') {\n // Unsubscribe from all accounts and reset state\n unsubscribe()\n setStateWithRef([], setExtensionAccounts, extensionAccountsRef)\n setStateWithRef([], setExtensionsInitialised, extensionsInitialisedRef)\n // If extensions have been fetched, get accounts if extensions exist and local extensions\n // exist (previously connected).\n if (Object.keys(extensionsStatus).length) {\n // get active extensions\n const localExtensions = localStorageOrDefault(\n `active_extensions`,\n [],\n true\n )\n if (Object.keys(extensionsStatus).length && localExtensions.length) {\n setExtensionAccountsSynced('syncing')\n await connectActiveExtensions()\n }\n }\n\n // Syncing is complete. Also covers case where no extensions were found.\n setExtensionAccountsSynced('synced')\n }\n }\n\n // Get extension accounts based on the provided ss58 prefix.\n const getExtensionAccounts = (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 // Re-sync extensions accounts on `unsynced`.\n useEffect(() => {\n handleSyncExtensionAccounts()\n\n return () => unsubscribe()\n }, [extensionsStatus, checkingInjectedWeb3, extensionAccountsSynced])\n\n // Once initialised extensions equal total extensions present in `injectedWeb3`, mark extensions\n // as fetched.\n useEffectIgnoreInitial(() => {\n if (\n !checkingInjectedWeb3 &&\n extensionsInitialised.length === Object.keys(extensionsStatus).length\n ) {\n setExtensionAccountsSynced('synced')\n }\n }, [checkingInjectedWeb3, extensionsInitialised])\n\n return (\n <ExtensionAccountsContext.Provider\n value={{\n connectExtensionAccounts,\n extensionAccountsSynced,\n getExtensionAccounts,\n }}\n >\n {children}\n </ExtensionAccountsContext.Provider>\n )\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { ReactNode } from "react";
2
- import { Sync, MaybeString, ImportedAccount, ExtensionAccount } from "@w3ux/types";
1
+ import type { ExtensionAccount, ImportedAccount, MaybeString, Sync } from '@w3ux/types';
2
+ import type { ReactNode } from 'react';
3
3
  export interface ExtensionAccountsContextInterface {
4
4
  connectExtensionAccounts: (id?: string) => Promise<boolean>;
5
5
  extensionAccountsSynced: Sync;
@@ -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 { ReactNode } from \"react\";\nimport {\n Sync,\n MaybeString,\n ImportedAccount,\n ExtensionAccount,\n} from \"@w3ux/types\";\n\nexport interface ExtensionAccountsContextInterface {\n connectExtensionAccounts: (id?: string) => Promise<boolean>;\n extensionAccountsSynced: Sync;\n getExtensionAccounts: (ss58: number) => ImportedAccount[];\n}\n\nexport interface ExtensionAccountsProviderProps {\n children: ReactNode;\n network: string;\n ss58: number;\n dappName: string;\n activeAccount?: MaybeString;\n setActiveAccount?: (address: MaybeString) => void;\n onExtensionEnabled?: (id: string) => void;\n}\n\nexport interface HandleImportExtension {\n newAccounts: ExtensionAccount[];\n meta: {\n accountsToRemove: ExtensionAccount[];\n removedActiveAccount: MaybeString;\n };\n}\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 {\n ExtensionAccount,\n ImportedAccount,\n MaybeString,\n Sync,\n} from '@w3ux/types'\nimport type { ReactNode } from 'react'\n\nexport interface ExtensionAccountsContextInterface {\n connectExtensionAccounts: (id?: string) => Promise<boolean>\n extensionAccountsSynced: Sync\n getExtensionAccounts: (ss58: number) => ImportedAccount[]\n}\n\nexport interface ExtensionAccountsProviderProps {\n children: ReactNode\n network: string\n ss58: number\n dappName: string\n activeAccount?: MaybeString\n setActiveAccount?: (address: MaybeString) => void\n onExtensionEnabled?: (id: string) => void\n}\n\nexport interface HandleImportExtension {\n newAccounts: ExtensionAccount[]\n meta: {\n accountsToRemove: ExtensionAccount[]\n removedActiveAccount: MaybeString\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { HandleImportExtension } from "./types";
2
- import { ExtensionAccount } from "@w3ux/types";
1
+ import type { ExtensionAccount } from '@w3ux/types';
2
+ import type { HandleImportExtension } from './types';
3
3
  export declare const useImportExtension: () => {
4
4
  handleImportExtension: (id: string, currentAccounts: ExtensionAccount[], signer: unknown, newAccounts: ExtensionAccount[], network: string, ss58: number) => HandleImportExtension;
5
5
  };
@@ -1,6 +1,6 @@
1
- import { formatAccountSs58, isValidAddress } from "@w3ux/utils";
2
- import { getActiveAccountLocal, getInExternalAccounts } from "./utils";
3
- import { defaultHandleImportExtension } from "./defaults";
1
+ import { formatAccountSs58, isValidAddress } from '@w3ux/utils';
2
+ import { defaultHandleImportExtension } from './defaults';
3
+ import { getActiveAccountLocal, getInExternalAccounts } from './utils';
4
4
  export const useImportExtension = () => {
5
5
  const handleImportExtension = (id, currentAccounts, signer, newAccounts, network, ss58) => {
6
6
  if (!newAccounts.length) {
@@ -22,7 +22,7 @@ export const useImportExtension = () => {
22
22
  .filter((j) => j.source === id)
23
23
  .filter((j) => !newAccounts.find((i) => i.address === j.address));
24
24
  const removedActiveAccount = removedAccounts.find(({ address }) => address === getActiveAccountLocal(network, ss58))?.address || null;
25
- newAccounts = newAccounts.filter(({ address }) => !currentAccounts.find((j) => j.address === address && j.source !== "external"));
25
+ newAccounts = newAccounts.filter(({ address }) => !currentAccounts.find((j) => j.address === address && j.source !== 'external'));
26
26
  newAccounts = newAccounts.map(({ address, name }) => ({
27
27
  address,
28
28
  name,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ExtensionAccountsProvider/useImportExtension.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAG1D,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE;IAIrC,MAAM,qBAAqB,GAAG,CAC5B,EAAU,EACV,eAAmC,EACnC,MAAe,EACf,WAA+B,EAC/B,OAAe,EACf,IAAY,EACW,EAAE;QACzB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YACxB,OAAO,4BAA4B,CAAC;QACtC,CAAC;QAGD,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;QAG3E,WAAW;aACR,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACf,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAClE,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,CAAC,OAAO,GAAG,gBAAgB,CAAC;YACnC,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;aAED,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;QAGzC,MAAM,UAAU,GAAG,qBAAqB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAG/D,MAAM,eAAe,GAAG,eAAe;aACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC;aAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAGpE,MAAM,oBAAoB,GACxB,eAAe,CAAC,IAAI,CAClB,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,KAAK,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAClE,EAAE,OAAO,IAAI,IAAI,CAAC;QAGrB,WAAW,GAAG,WAAW,CAAC,MAAM,CAC9B,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CACd,CAAC,eAAe,CAAC,IAAI,CACnB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CACxD,CACJ,CAAC;QAGF,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACpD,OAAO;YACP,IAAI;YACJ,MAAM,EAAE,EAAE;YACV,MAAM;SACP,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,WAAW;YACX,IAAI,EAAE;gBACJ,gBAAgB,EAAE,CAAC,GAAG,UAAU,EAAE,GAAG,eAAe,CAAC;gBACrD,oBAAoB;aACrB;SACF,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,qBAAqB;KACtB,CAAC;AACJ,CAAC,CAAC","file":"useImportExtension.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { formatAccountSs58, isValidAddress } from \"@w3ux/utils\";\nimport { HandleImportExtension } from \"./types\";\nimport { getActiveAccountLocal, getInExternalAccounts } from \"./utils\";\nimport { defaultHandleImportExtension } from \"./defaults\";\nimport { ExtensionAccount } from \"@w3ux/types\";\n\nexport const useImportExtension = () => {\n // Handles importing of extension accounts.\n //\n // Gets accounts to be imported and commits them to state.\n const handleImportExtension = (\n id: string,\n currentAccounts: ExtensionAccount[],\n signer: unknown,\n newAccounts: ExtensionAccount[],\n network: string,\n ss58: number\n ): HandleImportExtension => {\n if (!newAccounts.length) {\n return defaultHandleImportExtension;\n }\n\n // Remove accounts that do not contain correctly formatted addresses.\n newAccounts = newAccounts.filter(({ address }) => isValidAddress(address));\n\n // Reformat addresses to ensure default ss58 format.\n newAccounts\n .map((account) => {\n const formattedAddress = formatAccountSs58(account.address, ss58);\n if (!formattedAddress) {\n return null;\n }\n account.address = formattedAddress;\n return account;\n })\n // Remove null entries resulting from invalid formatted addresses.\n .filter((account) => account !== null);\n\n // Remove `newAccounts` from local external accounts if present.\n const inExternal = getInExternalAccounts(newAccounts, network);\n\n // Find any accounts that have been removed from this extension.\n const removedAccounts = currentAccounts\n .filter((j) => j.source === id)\n .filter((j) => !newAccounts.find((i) => i.address === j.address));\n\n // Check whether active account is present in forgotten accounts.\n const removedActiveAccount =\n removedAccounts.find(\n ({ address }) => address === getActiveAccountLocal(network, ss58)\n )?.address || null;\n\n // Remove accounts that have already been added to `currentAccounts` via another extension.\n newAccounts = newAccounts.filter(\n ({ address }) =>\n !currentAccounts.find(\n (j) => j.address === address && j.source !== \"external\"\n )\n );\n\n // Format accounts properties.\n newAccounts = newAccounts.map(({ address, name }) => ({\n address,\n name,\n source: id,\n signer,\n }));\n\n return {\n newAccounts,\n meta: {\n accountsToRemove: [...inExternal, ...removedAccounts],\n removedActiveAccount,\n },\n };\n };\n\n return {\n handleImportExtension,\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/ExtensionAccountsProvider/useImportExtension.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAA;AAEzD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAEtE,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE;IAIrC,MAAM,qBAAqB,GAAG,CAC5B,EAAU,EACV,eAAmC,EACnC,MAAe,EACf,WAA+B,EAC/B,OAAe,EACf,IAAY,EACW,EAAE;QACzB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YACxB,OAAO,4BAA4B,CAAA;QACrC,CAAC;QAGD,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;QAG1E,WAAW;aACR,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACf,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YACjE,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,CAAC,OAAO,GAAG,gBAAgB,CAAA;YAClC,OAAO,OAAO,CAAA;QAChB,CAAC,CAAC;aAED,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,CAAA;QAGxC,MAAM,UAAU,GAAG,qBAAqB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QAG9D,MAAM,eAAe,GAAG,eAAe;aACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC;aAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;QAGnE,MAAM,oBAAoB,GACxB,eAAe,CAAC,IAAI,CAClB,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,KAAK,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAClE,EAAE,OAAO,IAAI,IAAI,CAAA;QAGpB,WAAW,GAAG,WAAW,CAAC,MAAM,CAC9B,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CACd,CAAC,eAAe,CAAC,IAAI,CACnB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CACxD,CACJ,CAAA;QAGD,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACpD,OAAO;YACP,IAAI;YACJ,MAAM,EAAE,EAAE;YACV,MAAM;SACP,CAAC,CAAC,CAAA;QAEH,OAAO;YACL,WAAW;YACX,IAAI,EAAE;gBACJ,gBAAgB,EAAE,CAAC,GAAG,UAAU,EAAE,GAAG,eAAe,CAAC;gBACrD,oBAAoB;aACrB;SACF,CAAA;IACH,CAAC,CAAA;IAED,OAAO;QACL,qBAAqB;KACtB,CAAA;AACH,CAAC,CAAA","file":"useImportExtension.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { ExtensionAccount } from '@w3ux/types'\nimport { formatAccountSs58, isValidAddress } from '@w3ux/utils'\nimport { defaultHandleImportExtension } from './defaults'\nimport type { HandleImportExtension } from './types'\nimport { getActiveAccountLocal, getInExternalAccounts } from './utils'\n\nexport const useImportExtension = () => {\n // Handles importing of extension accounts.\n //\n // Gets accounts to be imported and commits them to state.\n const handleImportExtension = (\n id: string,\n currentAccounts: ExtensionAccount[],\n signer: unknown,\n newAccounts: ExtensionAccount[],\n network: string,\n ss58: number\n ): HandleImportExtension => {\n if (!newAccounts.length) {\n return defaultHandleImportExtension\n }\n\n // Remove accounts that do not contain correctly formatted addresses.\n newAccounts = newAccounts.filter(({ address }) => isValidAddress(address))\n\n // Reformat addresses to ensure default ss58 format.\n newAccounts\n .map((account) => {\n const formattedAddress = formatAccountSs58(account.address, ss58)\n if (!formattedAddress) {\n return null\n }\n account.address = formattedAddress\n return account\n })\n // Remove null entries resulting from invalid formatted addresses.\n .filter((account) => account !== null)\n\n // Remove `newAccounts` from local external accounts if present.\n const inExternal = getInExternalAccounts(newAccounts, network)\n\n // Find any accounts that have been removed from this extension.\n const removedAccounts = currentAccounts\n .filter((j) => j.source === id)\n .filter((j) => !newAccounts.find((i) => i.address === j.address))\n\n // Check whether active account is present in forgotten accounts.\n const removedActiveAccount =\n removedAccounts.find(\n ({ address }) => address === getActiveAccountLocal(network, ss58)\n )?.address || null\n\n // Remove accounts that have already been added to `currentAccounts` via another extension.\n newAccounts = newAccounts.filter(\n ({ address }) =>\n !currentAccounts.find(\n (j) => j.address === address && j.source !== 'external'\n )\n )\n\n // Format accounts properties.\n newAccounts = newAccounts.map(({ address, name }) => ({\n address,\n name,\n source: id,\n signer,\n }))\n\n return {\n newAccounts,\n meta: {\n accountsToRemove: [...inExternal, ...removedAccounts],\n removedActiveAccount,\n },\n }\n }\n\n return {\n handleImportExtension,\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { ExtensionAccount, ExternalAccount, ImportedAccount } from "@w3ux/types";
1
+ import type { ExtensionAccount, ExternalAccount, ImportedAccount } from '@w3ux/types';
2
2
  export declare const getActiveAccountLocal: (network: string, ss58: number) => string | null;
3
3
  export declare const getActiveExtensionAccount: (network: string, ss58: number, accounts: ExtensionAccount[]) => ExtensionAccount;
4
4
  export declare const connectActiveExtensionAccount: (account: ExtensionAccount | null, callback: (account: ImportedAccount | null) => void) => void;
@@ -1,4 +1,4 @@
1
- import { formatAccountSs58, localStorageOrDefault } from "@w3ux/utils";
1
+ import { formatAccountSs58, localStorageOrDefault } from '@w3ux/utils';
2
2
  export const getActiveAccountLocal = (network, ss58) => {
3
3
  const account = localStorageOrDefault(`${network}_active_account`, null);
4
4
  if (account !== null) {
@@ -20,7 +20,7 @@ export const getInExternalAccounts = (accounts, network) => {
20
20
  return (localExternalAccounts.filter((a) => (accounts || []).find((b) => b.address === a.address) !== undefined) || []);
21
21
  };
22
22
  export const getLocalExternalAccounts = (network) => {
23
- let localAccounts = localStorageOrDefault("external_accounts", [], true);
23
+ let localAccounts = localStorageOrDefault('external_accounts', [], true);
24
24
  if (network) {
25
25
  localAccounts = localAccounts.filter((l) => l.network === network);
26
26
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ExtensionAccountsProvider/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAYvE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,OAAe,EACf,IAAY,EACG,EAAE;IACjB,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,OAAO,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAEzE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1D,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,gBAAgB,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,OAAe,EACf,IAAY,EACZ,QAA4B,EAC5B,EAAE,CACF,QAAQ,CAAC,IAAI,CACX,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,KAAK,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAClE,IAAI,IAAI,CAAC;AAGZ,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,OAAgC,EAChC,QAAmD,EACnD,EAAE;IACF,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;AACH,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAA4B,EAC5B,OAAe,EACf,EAAE;IACF,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAEhE,OAAO,CACL,qBAAqB,CAAC,MAAM,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,CAC3E,IAAI,EAAE,CACR,CAAC;AACJ,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC3D,IAAI,aAAa,GAAG,qBAAqB,CACvC,mBAAmB,EACnB,EAAE,EACF,IAAI,CACgB,CAAC;IACvB,IAAI,OAAO,EAAE,CAAC;QACZ,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC","file":"utils.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { formatAccountSs58, localStorageOrDefault } from \"@w3ux/utils\";\nimport {\n ExtensionAccount,\n ExternalAccount,\n ImportedAccount,\n} from \"@w3ux/types\";\n\n/*------------------------------------------------------------\n Active account utils.\n ------------------------------------------------------------*/\n\n// Gets local `active_acount` for a network.\nexport const getActiveAccountLocal = (\n network: string,\n ss58: number\n): string | null => {\n const account = localStorageOrDefault(`${network}_active_account`, null);\n\n if (account !== null) {\n const formattedAddress = formatAccountSs58(account, ss58);\n if (formattedAddress) {\n return formattedAddress;\n }\n }\n return null;\n};\n\n// Checks if the local active account is the provided accounts.\nexport const getActiveExtensionAccount = (\n network: string,\n ss58: number,\n accounts: ExtensionAccount[]\n) =>\n accounts.find(\n ({ address }) => address === getActiveAccountLocal(network, ss58)\n ) ?? null;\n\n// Connects to active account, and calls an optional callback, if provided.\nexport const connectActiveExtensionAccount = (\n account: ExtensionAccount | null,\n callback: (account: ImportedAccount | null) => void\n) => {\n if (account !== null) {\n callback(account);\n }\n};\n\n/*------------------------------------------------------------\n External account utils.\n ------------------------------------------------------------*/\n\n// Gets accounts that exist in local `external_accounts`.\nexport const getInExternalAccounts = (\n accounts: ExtensionAccount[],\n network: string\n) => {\n const localExternalAccounts = getLocalExternalAccounts(network);\n\n return (\n localExternalAccounts.filter(\n (a) => (accounts || []).find((b) => b.address === a.address) !== undefined\n ) || []\n );\n};\n\n// Gets local external accounts for a network.\nexport const getLocalExternalAccounts = (network?: string) => {\n let localAccounts = localStorageOrDefault<ExternalAccount[]>(\n \"external_accounts\",\n [],\n true\n ) as ExternalAccount[];\n if (network) {\n localAccounts = localAccounts.filter((l) => l.network === network);\n }\n return localAccounts;\n};\n"]}
1
+ {"version":3,"sources":["../src/ExtensionAccountsProvider/utils.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAOtE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,OAAe,EACf,IAAY,EACG,EAAE;IACjB,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,OAAO,iBAAiB,EAAE,IAAI,CAAC,CAAA;IAExE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACzD,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,gBAAgB,CAAA;QACzB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,OAAe,EACf,IAAY,EACZ,QAA4B,EAC5B,EAAE,CACF,QAAQ,CAAC,IAAI,CACX,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,KAAK,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAClE,IAAI,IAAI,CAAA;AAGX,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,OAAgC,EAChC,QAAmD,EACnD,EAAE;IACF,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,QAAQ,CAAC,OAAO,CAAC,CAAA;IACnB,CAAC;AACH,CAAC,CAAA;AAOD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAA4B,EAC5B,OAAe,EACf,EAAE;IACF,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAA;IAE/D,OAAO,CACL,qBAAqB,CAAC,MAAM,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,CAC3E,IAAI,EAAE,CACR,CAAA;AACH,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC3D,IAAI,aAAa,GAAG,qBAAqB,CACvC,mBAAmB,EACnB,EAAE,EACF,IAAI,CACgB,CAAA;IACtB,IAAI,OAAO,EAAE,CAAC;QACZ,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAA;IACpE,CAAC;IACD,OAAO,aAAa,CAAA;AACtB,CAAC,CAAA","file":"utils.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type {\n ExtensionAccount,\n ExternalAccount,\n ImportedAccount,\n} from '@w3ux/types'\nimport { formatAccountSs58, localStorageOrDefault } from '@w3ux/utils'\n\n/*------------------------------------------------------------\n Active account utils.\n ------------------------------------------------------------*/\n\n// Gets local `active_acount` for a network.\nexport const getActiveAccountLocal = (\n network: string,\n ss58: number\n): string | null => {\n const account = localStorageOrDefault(`${network}_active_account`, null)\n\n if (account !== null) {\n const formattedAddress = formatAccountSs58(account, ss58)\n if (formattedAddress) {\n return formattedAddress\n }\n }\n return null\n}\n\n// Checks if the local active account is the provided accounts.\nexport const getActiveExtensionAccount = (\n network: string,\n ss58: number,\n accounts: ExtensionAccount[]\n) =>\n accounts.find(\n ({ address }) => address === getActiveAccountLocal(network, ss58)\n ) ?? null\n\n// Connects to active account, and calls an optional callback, if provided.\nexport const connectActiveExtensionAccount = (\n account: ExtensionAccount | null,\n callback: (account: ImportedAccount | null) => void\n) => {\n if (account !== null) {\n callback(account)\n }\n}\n\n/*------------------------------------------------------------\n External account utils.\n ------------------------------------------------------------*/\n\n// Gets accounts that exist in local `external_accounts`.\nexport const getInExternalAccounts = (\n accounts: ExtensionAccount[],\n network: string\n) => {\n const localExternalAccounts = getLocalExternalAccounts(network)\n\n return (\n localExternalAccounts.filter(\n (a) => (accounts || []).find((b) => b.address === a.address) !== undefined\n ) || []\n )\n}\n\n// Gets local external accounts for a network.\nexport const getLocalExternalAccounts = (network?: string) => {\n let localAccounts = localStorageOrDefault<ExternalAccount[]>(\n 'external_accounts',\n [],\n true\n ) as ExternalAccount[]\n if (network) {\n localAccounts = localAccounts.filter((l) => l.network === network)\n }\n return localAccounts\n}\n"]}
@@ -1,7 +1,6 @@
1
- import { ReactNode } from "react";
2
- import type { ExtensionsContextInterface } from "./types";
3
- export declare const ExtensionsContext: import("react").Context<ExtensionsContextInterface>;
4
- export declare const useExtensions: () => ExtensionsContextInterface;
1
+ import type { ReactNode } from 'react';
2
+ import type { ExtensionsContextInterface } from './types';
3
+ export declare const ExtensionsContext: import("react").Context<ExtensionsContextInterface>, useExtensions: () => ExtensionsContextInterface;
5
4
  export declare const ExtensionsProvider: ({ children, options, }: {
6
5
  children: ReactNode;
7
6
  options?: {
@@ -1,11 +1,10 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { setStateWithRef, withTimeout } from "@w3ux/utils";
3
- import { useEffect, useRef, useState, createContext, useContext, } from "react";
4
- import { defaultExtensionsContext } from "./defaults";
5
- import extensions from "@w3ux/extension-assets";
6
- import { web3Enable } from "@polkagate/extension-dapp";
7
- export const ExtensionsContext = createContext(defaultExtensionsContext);
8
- export const useExtensions = () => useContext(ExtensionsContext);
2
+ import { web3Enable } from '@polkagate/extension-dapp';
3
+ import extensions from '@w3ux/extension-assets';
4
+ import { createSafeContext } from '@w3ux/hooks';
5
+ import { setStateWithRef, withTimeout } from '@w3ux/utils';
6
+ import { useEffect, useRef, useState } from 'react';
7
+ export const [ExtensionsContext, useExtensions] = createSafeContext();
9
8
  export const ExtensionsProvider = ({ children, options, }) => {
10
9
  const [checkingInjectedWeb3, setCheckingInjectedWeb3] = useState(true);
11
10
  const checkingInjectedWeb3Ref = useRef(checkingInjectedWeb3);
@@ -18,7 +17,7 @@ export const ExtensionsProvider = ({ children, options, }) => {
18
17
  const handleClearInterval = async (hasInjectedWeb3) => {
19
18
  clearInterval(injectedWeb3Interval);
20
19
  if (polkaGateSnapEnabled) {
21
- await withTimeout(500, web3Enable("snap_only"));
20
+ await withTimeout(500, web3Enable('snap_only'));
22
21
  if (hasInjectedWeb3) {
23
22
  setStateWithRef(getExtensionsStatus(), setExtensionsStatus, extensionsStatusRef);
24
23
  }
@@ -34,7 +33,7 @@ export const ExtensionsProvider = ({ children, options, }) => {
34
33
  }));
35
34
  extensionsAsArray.forEach((e) => {
36
35
  if (injectedWeb3[e.id] !== undefined) {
37
- newExtensionsStatus[e.id] = "installed";
36
+ newExtensionsStatus[e.id] = 'installed';
38
37
  }
39
38
  });
40
39
  return newExtensionsStatus;
@@ -51,10 +50,10 @@ export const ExtensionsProvider = ({ children, options, }) => {
51
50
  setStateWithRef(newExtensionsStatus, setExtensionsStatus, extensionsStatusRef);
52
51
  };
53
52
  const extensionInstalled = (id) => extensionsStatus[id] !== undefined;
54
- const extensionCanConnect = (id) => extensionInstalled(id) && extensionsStatus[id] !== "connected";
53
+ const extensionCanConnect = (id) => extensionInstalled(id) && extensionsStatus[id] !== 'connected';
55
54
  const extensionHasFeature = (id, feature) => {
56
55
  const { features } = extensions[id];
57
- if (features === "*" || features.includes(feature)) {
56
+ if (features === '*' || features.includes(feature)) {
58
57
  return true;
59
58
  }
60
59
  else {