@w3ux/react-connect-kit 2.1.1 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
1
  import { ExtensionEnableResults, RawExtensions } from "../types";
2
- import { ExtensionAccount, ExtensionInterface } from "../ExtensionsProvider/types";
2
+ import { ExtensionInterface } from "../ExtensionsProvider/types";
3
+ import { ExtensionAccount } from "@w3ux/types";
3
4
  export declare class Extensions {
4
5
  static getFromIds: (extensionIds: string[]) => RawExtensions;
5
6
  static enable: (extensions: RawExtensions, dappName: string) => Promise<PromiseSettledResult<ExtensionInterface>[]>;
@@ -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 {\n ExtensionAccount,\n ExtensionInterface,\n} from \"../ExtensionsProvider/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[]>(\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 { 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 +1 @@
1
- {"version":3,"sources":["../src/ExtensionAccountsProvider/index.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC/E,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,+BAA+B,EAAE,MAAM,YAAY,CAAC;AAU7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAGrD,MAAM,CAAC,MAAM,wBAAwB,GACnC,aAAa,CACX,+BAA+B,CAChC,CAAC;AAEJ,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC;AAE/E,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,EACxC,QAAQ,EACR,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,kBAAkB,GACa,EAAE,EAAE;IACnC,MAAM,EAAE,qBAAqB,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAEvD,MAAM,EACJ,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,GACpB,GAAG,aAAa,EAAE,CAAC;IAGpB,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CACxD,EAAE,CACH,CAAC;IACF,MAAM,oBAAoB,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAGvD,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,GACzD,QAAQ,CAAO,UAAU,CAAC,CAAC;IAG7B,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,GAAG,QAAQ,CAChE,EAAE,CACH,CAAC;IACF,MAAM,wBAAwB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAG/D,MAAM,MAAM,GAAG,MAAM,CAAyB,EAAE,CAAC,CAAC;IAGlD,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAE,EAAE;QAChD,IAAI,OAAO,gBAAgB,KAAK,UAAU,EAAE,CAAC;YAC3C,gBAAgB,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC;IAGF,MAAM,uBAAuB,GAAG,CAAC,EAAU,EAAE,EAAE;QAC7C,IAAI,OAAO,kBAAkB,KAAK,UAAU,EAAE,CAAC;YAC7C,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,CAAC,OAA+B,EAAE,EAAE;QAC3D,qBAAqB,CAAC,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC;IAQF,MAAM,uBAAuB,GAAG,KAAK,IAAI,EAAE;QACzC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACnD,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAID,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAG1D,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,CAC5C,aAAa,EACb,MAAM,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CACjD,CAAC;QAGF,MAAM,mBAAmB,GAAG,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAGhE,MAAM,mBAAmB,GAAG,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAGhE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CACpD,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,CAC1B,CAAC;QAMF,MAAM,eAAe,GACnB,MAAM,UAAU,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QAIvD,MAAM,sBAAsB,GAAG,eAAe;aAC3C,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACb,GAAG,GAAG;YACN,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC;SAC9C,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,KAAK,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAK3E,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE;YAChE,oBAAoB,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YACpD,kBAAkB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YACpC,2BAA2B,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,uBAAuB,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAM9D,MAAM,cAAc,GAAG,CACrB,WAAmB,EACnB,QAA4B,EAC5B,MAAmB,EACnB,EAAE;YACF,MAAM,EACJ,WAAW,EACX,IAAI,EAAE,EAAE,gBAAgB,EAAE,GAC3B,GAAG,qBAAqB,CACvB,WAAW,EACX,oBAAoB,CAAC,OAAO,EAC5B,MAAM,EACN,QAAQ,EACR,OAAO,EACP,IAAI,CACL,CAAC;YAGF,uBAAuB,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC1E,CAAC,CAAC;QAGF,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAC1C,mBAAmB,CAAC,OAAO,EAAE,CAC9B,EAAE,CAAC;YAEF,IAAI,mBAAmB,CAAC,EAAE,EAAE,mBAAmB,CAAC,EAAE,CAAC;gBACjD,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACtD,cAAc,CAAC,EAAE,EAAE,QAAQ,IAAI,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gBACvD,CAAC,CAAC,CAAC;gBAEH,gBAAgB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAGD,IAAI,sBAAsB,EAAE,CAAC;YAC3B,6BAA6B,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC,CAAC;IAMF,MAAM,wBAAwB,GAAG,KAAK,EAAE,EAAU,EAAoB,EAAE;QACtE,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,SAAS,CAAC;QAEnE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,2BAA2B,CACzB,qBAAqB,wBAAwB,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CACnE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBAEH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBAG3C,MAAM,SAAS,GAAuB,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAG7D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;oBAE5B,MAAM,cAAc,GAAG,CAAC,QAA4B,EAAE,EAAE;wBACtD,MAAM,EACJ,WAAW,EACX,IAAI,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,GACjD,GAAG,qBAAqB,CACvB,EAAE,EACF,oBAAoB,CAAC,OAAO,EAC5B,SAAS,CAAC,MAAM,EAChB,QAAQ,EACR,OAAO,EACP,IAAI,CACL,CAAC;wBAEF,IAAI,CAAC,aAAa,EAAE,CAAC;4BACnB,MAAM,sBAAsB,GAAG,yBAAyB,CACtD,OAAO,EACP,IAAI,EACJ,WAAW,CACZ,CAAC;4BACF,IACE,sBAAsB,EAAE,OAAO,KAAK,oBAAoB;gCACxD,oBAAoB,KAAK,IAAI,EAC7B,CAAC;gCACD,6BAA6B,CAC3B,sBAAsB,EACtB,gBAAgB,CACjB,CAAC;4BACJ,CAAC;wBACH,CAAC;wBAGD,uBAAuB,CAAC;4BACtB,GAAG,EAAE,WAAW;4BAChB,MAAM,EAAE,gBAAgB;yBACzB,CAAC,CAAC;wBAGH,2BAA2B,CAAC,EAAE,CAAC,CAAC;oBAClC,CAAC,CAAC;oBAGF,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;oBAE1B,uBAAuB,CAAC,EAAE,CAAC,CAAC;oBAC5B,kBAAkB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;oBAGpC,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,mBAAmB,CAAC,EAAE,CAAC;wBAClD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;wBAChD,cAAc,CAAC,QAAQ,CAAC,CAAC;oBAC3B,CAAC;yBAAM,CAAC;wBACN,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE;4BACtD,cAAc,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;wBACjC,CAAC,CAAC,CAAC;wBACH,gBAAgB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;oBAC9B,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,oBAAoB,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAGF,MAAM,oBAAoB,GAAG,CAAC,EAAU,EAAE,GAAW,EAAE,EAAE;QAEvD,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAE5B,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YAG/B,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,mBAAmB,EAAE,CAAC;gBACjD,qBAAqB,CAAC,EAAE,CAAC,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBAEN,kBAAkB,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC;IAGF,MAAM,2BAA2B,GAAG,CAAC,EAAU,EAAE,EAAE;QACjD,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACnD,eAAe,CACb,CAAC,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAChD,wBAAwB,EACxB,wBAAwB,CACzB,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAGF,MAAM,uBAAuB,GAAG,CAAC,EAC/B,GAAG,EACH,MAAM,GAIP,EAAE,EAAE;QAEH,MAAM,WAAW,GAAG,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC;aAClD,MAAM,CAAC,GAAG,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC;QAE5E,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAElB,aAAa,CAAC,MAAM,CAAC,CAAC;YAGtB,IACE,aAAa;gBACb,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,KAAK,aAAa,CAAC,KAAK,SAAS,EACrE,CAAC;gBACD,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,eAAe,CAAC,WAAW,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;IAC3E,CAAC,CAAC;IAGF,MAAM,gBAAgB,GAAG,CAAC,EAAU,EAAE,KAAa,EAAE,EAAE;QACrD,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;IAC7B,CAAC,CAAC;IAGF,MAAM,aAAa,GAAG,CAAC,QAA2B,EAAE,EAAE;QAEpD,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,QAAQ,EAAE,CAAC;gBACnC,IAAI,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC;oBACpE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACtC,IAAI,KAAK,EAAE,CAAC;wBACV,KAAK,EAAE,CAAC;wBACR,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACjC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAGF,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9C,KAAK,EAAE,CAAC;QACV,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,2BAA2B,GAAG,KAAK,IAAI,EAAE;QAE7C,IAAI,CAAC,oBAAoB,IAAI,uBAAuB,KAAK,UAAU,EAAE,CAAC;YAEpE,WAAW,EAAE,CAAC;YACd,eAAe,CAAC,EAAE,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;YAChE,eAAe,CAAC,EAAE,EAAE,wBAAwB,EAAE,wBAAwB,CAAC,CAAC;YAGxE,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC;gBAEzC,MAAM,eAAe,GAAG,qBAAqB,CAC3C,mBAAmB,EACnB,EAAE,EACF,IAAI,CACL,CAAC;gBACF,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC;oBACnE,0BAA0B,CAAC,SAAS,CAAC,CAAC;oBACtC,MAAM,uBAAuB,EAAE,CAAC;gBAClC,CAAC;YACH,CAAC;YAGD,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC;IAGF,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAqB,EAAE,CAC/D,iBAAiB;SACd,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,GAAG,OAAO;YACV,OAAO,EAAE,gBAAgB;SAC1B,CAAC;IACJ,CAAC,CAAC;SAED,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;IAG3C,SAAS,CAAC,GAAG,EAAE;QACb,2BAA2B,EAAE,CAAC;QAE9B,OAAO,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC,EAAE,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAItE,sBAAsB,CAAC,GAAG,EAAE;QAC1B,IACE,CAAC,oBAAoB;YACrB,qBAAqB,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,EACrE,CAAC;YACD,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,EAAE,CAAC,oBAAoB,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAElD,OAAO,CACL,KAAC,wBAAwB,CAAC,QAAQ,IAChC,KAAK,EAAE;YACL,wBAAwB;YACxB,uBAAuB;YACvB,oBAAoB;SACrB,YAEA,QAAQ,GACyB,CACrC,CAAC;AACJ,CAAC,CAAC","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 { ImportedAccount } from \"../types\";\nimport {\n ExtensionAccount,\n ExtensionInterface,\n} 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 { AnyFunction, 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: AnyFunction\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 { 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 {\n AnyFunction,\n ExtensionAccount,\n ImportedAccount,\n Sync,\n VoidFn,\n} 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: AnyFunction\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,7 +1,5 @@
1
1
  import { ReactNode } from "react";
2
- import { ExtensionAccount } from "../ExtensionsProvider/types";
3
- import { ImportedAccount, MaybeAddress } from "../types";
4
- import { Sync } from "@w3ux/types";
2
+ import { Sync, MaybeString, ImportedAccount, ExtensionAccount } from "@w3ux/types";
5
3
  export interface ExtensionAccountsContextInterface {
6
4
  connectExtensionAccounts: (id?: string) => Promise<boolean>;
7
5
  extensionAccountsSynced: Sync;
@@ -12,15 +10,14 @@ export interface ExtensionAccountsProviderProps {
12
10
  network: string;
13
11
  ss58: number;
14
12
  dappName: string;
15
- activeAccount?: MaybeAddress;
16
- setActiveAccount?: (address: MaybeAddress) => void;
13
+ activeAccount?: MaybeString;
14
+ setActiveAccount?: (address: MaybeString) => void;
17
15
  onExtensionEnabled?: (id: string) => void;
18
16
  }
19
17
  export interface HandleImportExtension {
20
18
  newAccounts: ExtensionAccount[];
21
19
  meta: {
22
20
  accountsToRemove: ExtensionAccount[];
23
- removedActiveAccount: MaybeAddress;
21
+ removedActiveAccount: MaybeString;
24
22
  };
25
23
  }
26
- export type HexString = `0x${string}`;
@@ -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 { ExtensionAccount } from \"../ExtensionsProvider/types\";\nimport { ImportedAccount, MaybeAddress } from \"../types\";\nimport { Sync } 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?: MaybeAddress;\n setActiveAccount?: (address: MaybeAddress) => void;\n onExtensionEnabled?: (id: string) => void;\n}\n\nexport interface HandleImportExtension {\n newAccounts: ExtensionAccount[];\n meta: {\n accountsToRemove: ExtensionAccount[];\n removedActiveAccount: MaybeAddress;\n };\n}\n\nexport type HexString = `0x${string}`;\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 { 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,6 +1,5 @@
1
- import type { ExtensionAccount } from "../ExtensionsProvider/types";
2
1
  import { HandleImportExtension } from "./types";
3
- import { AnyFunction } from "@w3ux/types";
2
+ import { AnyFunction, ExtensionAccount } from "@w3ux/types";
4
3
  export declare const useImportExtension: () => {
5
4
  handleImportExtension: (id: string, currentAccounts: ExtensionAccount[], signer: AnyFunction, newAccounts: ExtensionAccount[], network: string, ss58: number) => HandleImportExtension;
6
5
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ExtensionAccountsProvider/useImportExtension.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGhE,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,MAAmB,EACnB,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 type { ExtensionAccount } from \"../ExtensionsProvider/types\";\nimport { HandleImportExtension } from \"./types\";\nimport { getActiveAccountLocal, getInExternalAccounts } from \"./utils\";\nimport { defaultHandleImportExtension } from \"./defaults\";\nimport { AnyFunction } 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: AnyFunction,\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":"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,MAAmB,EACnB,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 { AnyFunction, 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: AnyFunction,\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,6 +1,4 @@
1
- import { ExtensionAccount } from "../ExtensionsProvider/types";
2
- import { ExternalAccount } from "../types";
3
- import { AnyFunction } from "@w3ux/types";
1
+ import { AnyFunction, ExtensionAccount, ExternalAccount } from "@w3ux/types";
4
2
  export declare const getActiveAccountLocal: (network: string, ss58: number) => string | null;
5
3
  export declare const getActiveExtensionAccount: (network: string, ss58: number, accounts: ExtensionAccount[]) => ExtensionAccount;
6
4
  export declare const connectActiveExtensionAccount: (account: ExtensionAccount | null, callback: AnyFunction) => void;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ExtensionAccountsProvider/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAUvE,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,QAAqB,EACrB,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 { ExtensionAccount } from \"../ExtensionsProvider/types\";\nimport { ExternalAccount } from \"../types\";\nimport { AnyFunction } 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: AnyFunction\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":"AAGA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAQvE,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,QAAqB,EACrB,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 { AnyFunction, ExtensionAccount, ExternalAccount } 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: AnyFunction\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 +1 @@
1
- {"version":3,"sources":["../src/ExtensionsProvider/index.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAEL,SAAS,EACT,MAAM,EACN,QAAQ,EACR,aAAa,EACb,UAAU,GACX,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAC5C,wBAAwB,CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAEjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EACjC,QAAQ,EACR,OAAO,GAOR,EAAE,EAAE;IAKH,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GACnD,QAAQ,CAAU,IAAI,CAAC,CAAC;IAC1B,MAAM,uBAAuB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAG7D,MAAM,sBAAsB,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;IAGtD,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAEtD,EAAE,CAAC,CAAC;IACN,MAAM,mBAAmB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAGrD,MAAM,CAAC,oBAAoB,CAAC,GAAG,QAAQ,CACrC,OAAO,EAAE,oBAAoB,IAAI,KAAK,CACvC,CAAC;IAGF,IAAI,oBAAoD,CAAC;IACzD,MAAM,aAAa,GAAG,MAAM,CAAS,CAAC,CAAC,CAAC;IAKxC,MAAM,mBAAmB,GAAG,KAAK,EAAE,eAAwB,EAAE,EAAE;QAC7D,aAAa,CAAC,oBAAoB,CAAC,CAAC;QAGpC,IAAI,oBAAoB,EAAE,CAAC;YACzB,MAAM,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;YAEhD,IAAI,eAAe,EAAE,CAAC;gBACpB,eAAe,CACb,mBAAmB,EAAE,EACrB,mBAAmB,EACnB,mBAAmB,CACpB,CAAC;YACJ,CAAC;QACH,CAAC;QACD,eAAe,CAAC,KAAK,EAAE,uBAAuB,EAAE,uBAAuB,CAAC,CAAC;IAC3E,CAAC,CAAC;IAMF,MAAM,mBAAmB,GAAG,GAAG,EAAE;QAC/B,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;QAChC,MAAM,mBAAmB,GAAG,EAAE,GAAG,gBAAgB,EAAE,CAAC;QACpD,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CACtD,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACjB,EAAE,EAAE,GAAG;YACP,GAAG,KAAK;SACT,CAAC,CACH,CAAC;QACF,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC9B,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC;gBACrC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC;YAC1C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,mBAAmB,CAAC;IAC7B,CAAC,CAAC;IAGF,MAAM,kBAAkB,GAAG,CAAC,EAAU,EAAE,MAAuB,EAAE,EAAE;QACjE,eAAe,CACb;YACE,GAAG,mBAAmB,CAAC,OAAO;YAC9B,CAAC,EAAE,CAAC,EAAE,MAAM;SACb,EACD,mBAAmB,EACnB,mBAAmB,CACpB,CAAC;IACJ,CAAC,CAAC;IAGF,MAAM,qBAAqB,GAAG,CAAC,EAAU,EAAE,EAAE;QAC3C,MAAM,mBAAmB,GAAG,EAAE,GAAG,mBAAmB,CAAC,OAAO,EAAE,CAAC;QAC/D,OAAO,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAE/B,eAAe,CACb,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,CACpB,CAAC;IACJ,CAAC,CAAC;IAGF,MAAM,kBAAkB,GAAG,CAAC,EAAU,EAAW,EAAE,CACjD,gBAAgB,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC;IAGrC,MAAM,mBAAmB,GAAG,CAAC,EAAU,EAAW,EAAE,CAClD,kBAAkB,CAAC,EAAE,CAAC,IAAI,gBAAgB,CAAC,EAAE,CAAC,KAAK,WAAW,CAAC;IAGjE,MAAM,mBAAmB,GAAG,CAAC,EAAU,EAAE,OAAe,EAAW,EAAE;QACnE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAOF,MAAM,YAAY,GAAG,GAAG,CAAC;IAEzB,MAAM,WAAW,GAAG,EAAE,CAAC;IACvB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,CAAC;YACpC,sBAAsB,CAAC,OAAO,GAAG,IAAI,CAAC;YAEtC,oBAAoB,GAAG,WAAW,CAAC,GAAG,EAAE;gBACtC,aAAa,CAAC,OAAO,EAAE,CAAC;gBACxB,IAAI,aAAa,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;oBAC1C,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBAEN,MAAM,YAAY,GAAG,MAAM,EAAE,YAAY,IAAI,IAAI,CAAC;oBAClD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;wBAC1B,mBAAmB,CAAC,IAAI,CAAC,CAAC;oBAC5B,CAAC;gBACH,CAAC;YACH,CAAC,EAAE,YAAY,CAAC,CAAC;QACnB,CAAC;QAED,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,KAAC,iBAAiB,CAAC,QAAQ,IACzB,KAAK,EAAE;YACL,gBAAgB,EAAE,mBAAmB,CAAC,OAAO;YAC7C,oBAAoB;YACpB,kBAAkB;YAClB,qBAAqB;YACrB,kBAAkB;YAClB,mBAAmB;YACnB,mBAAmB;SACpB,YAEA,QAAQ,GACkB,CAC9B,CAAC;AACJ,CAAC,CAAC","file":"index.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { setStateWithRef, withTimeout } from \"@w3ux/utils\";\nimport {\n ReactNode,\n useEffect,\n useRef,\n useState,\n createContext,\n useContext,\n} from \"react\";\nimport type { ExtensionStatus, ExtensionsContextInterface } from \"./types\";\nimport { defaultExtensionsContext } from \"./defaults\";\nimport extensions from \"@w3ux/extension-assets\";\nimport { web3Enable } from \"@polkagate/extension-dapp\";\n\nexport const ExtensionsContext = createContext<ExtensionsContextInterface>(\n defaultExtensionsContext\n);\n\nexport const useExtensions = () => useContext(ExtensionsContext);\n\nexport const ExtensionsProvider = ({\n children,\n options,\n}: {\n children: ReactNode;\n options?: {\n chainSafeSnapEnabled?: boolean;\n polkagateSnapEnabled?: boolean;\n };\n}) => {\n // Store whether initial `injectedWeb3` checking is underway.\n //\n // Injecting `injectedWeb3` is an asynchronous process, so we need to check for its existence for\n // a period of time.\n const [checkingInjectedWeb3, setCheckingInjectedWeb3] =\n useState<boolean>(true);\n const checkingInjectedWeb3Ref = useRef(checkingInjectedWeb3);\n\n // Store whether injected interval has been initialised.\n const intervalInitialisedRef = useRef<boolean>(false);\n\n // Store each extension's status in state.\n const [extensionsStatus, setExtensionsStatus] = useState<\n Record<string, ExtensionStatus>\n >({});\n const extensionsStatusRef = useRef(extensionsStatus);\n\n // Store whether Metamask Snaps are enabled.\n const [polkaGateSnapEnabled] = useState<boolean>(\n options?.polkagateSnapEnabled || false\n );\n\n // Listen for window.injectedWeb3 with an interval.\n let injectedWeb3Interval: ReturnType<typeof setInterval>;\n const injectCounter = useRef<number>(0);\n\n // Handle completed interval check for `injectedWeb3`.\n //\n // Clear interval and move on to checking for Metamask Polkadot Snap.\n const handleClearInterval = async (hasInjectedWeb3: boolean) => {\n clearInterval(injectedWeb3Interval);\n\n // Check if Metamask PolkaGate Snap is available.\n if (polkaGateSnapEnabled) {\n await withTimeout(500, web3Enable(\"snap_only\"));\n\n if (hasInjectedWeb3) {\n setStateWithRef(\n getExtensionsStatus(),\n setExtensionsStatus,\n extensionsStatusRef\n );\n }\n }\n setStateWithRef(false, setCheckingInjectedWeb3, checkingInjectedWeb3Ref);\n };\n\n // Getter for the currently installed extensions.\n //\n // Loops through the supported extensios and checks if they are present in `injectedWeb3`. Adds\n // `installed` status to the extension if it is present.\n const getExtensionsStatus = () => {\n const { injectedWeb3 } = window;\n const newExtensionsStatus = { ...extensionsStatus };\n const extensionsAsArray = Object.entries(extensions).map(\n ([key, value]) => ({\n id: key,\n ...value,\n })\n );\n extensionsAsArray.forEach((e) => {\n if (injectedWeb3[e.id] !== undefined) {\n newExtensionsStatus[e.id] = \"installed\";\n }\n });\n\n return newExtensionsStatus;\n };\n\n // Setter for an extension status.\n const setExtensionStatus = (id: string, status: ExtensionStatus) => {\n setStateWithRef(\n {\n ...extensionsStatusRef.current,\n [id]: status,\n },\n setExtensionsStatus,\n extensionsStatusRef\n );\n };\n\n // Removes an extension from the `extensionsStatus` state.\n const removeExtensionStatus = (id: string) => {\n const newExtensionsStatus = { ...extensionsStatusRef.current };\n delete newExtensionsStatus[id];\n\n setStateWithRef(\n newExtensionsStatus,\n setExtensionsStatus,\n extensionsStatusRef\n );\n };\n\n // Checks if an extension has been installed.\n const extensionInstalled = (id: string): boolean =>\n extensionsStatus[id] !== undefined;\n\n // Checks whether an extension can be connected to.\n const extensionCanConnect = (id: string): boolean =>\n extensionInstalled(id) && extensionsStatus[id] !== \"connected\";\n\n // Checks whether an extension supports a feature.\n const extensionHasFeature = (id: string, feature: string): boolean => {\n const { features } = extensions[id];\n if (features === \"*\" || features.includes(feature)) {\n return true;\n } else {\n return false;\n }\n };\n\n // Check for `injectedWeb3` and Metamask Snap on mount. To trigger interval on soft page\n // refreshes, no empty dependency array is provided to this `useEffect`. Checks for `injectedWeb3`\n // for a total of 3 seconds before giving up.\n //\n // Interval duration.\n const checkEveryMs = 300;\n // Total interval iterations.\n const totalChecks = 10;\n useEffect(() => {\n if (!intervalInitialisedRef.current) {\n intervalInitialisedRef.current = true;\n\n injectedWeb3Interval = setInterval(() => {\n injectCounter.current++;\n if (injectCounter.current === totalChecks) {\n handleClearInterval(false);\n } else {\n // `injectedWeb3` is present\n const injectedWeb3 = window?.injectedWeb3 || null;\n if (injectedWeb3 !== null) {\n handleClearInterval(true);\n }\n }\n }, checkEveryMs);\n }\n\n return () => clearInterval(injectedWeb3Interval);\n });\n\n return (\n <ExtensionsContext.Provider\n value={{\n extensionsStatus: extensionsStatusRef.current,\n checkingInjectedWeb3,\n setExtensionStatus,\n removeExtensionStatus,\n extensionInstalled,\n extensionCanConnect,\n extensionHasFeature,\n }}\n >\n {children}\n </ExtensionsContext.Provider>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/ExtensionsProvider/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 { setStateWithRef, withTimeout } from \"@w3ux/utils\";\nimport {\n ReactNode,\n useEffect,\n useRef,\n useState,\n createContext,\n useContext,\n} from \"react\";\nimport type { ExtensionsContextInterface } from \"./types\";\nimport { defaultExtensionsContext } from \"./defaults\";\nimport extensions from \"@w3ux/extension-assets\";\nimport { web3Enable } from \"@polkagate/extension-dapp\";\nimport { ExtensionStatus } from \"@w3ux/types\";\n\nexport const ExtensionsContext = createContext<ExtensionsContextInterface>(\n defaultExtensionsContext\n);\n\nexport const useExtensions = () => useContext(ExtensionsContext);\n\nexport const ExtensionsProvider = ({\n children,\n options,\n}: {\n children: ReactNode;\n options?: {\n chainSafeSnapEnabled?: boolean;\n polkagateSnapEnabled?: boolean;\n };\n}) => {\n // Store whether initial `injectedWeb3` checking is underway.\n //\n // Injecting `injectedWeb3` is an asynchronous process, so we need to check for its existence for\n // a period of time.\n const [checkingInjectedWeb3, setCheckingInjectedWeb3] =\n useState<boolean>(true);\n const checkingInjectedWeb3Ref = useRef(checkingInjectedWeb3);\n\n // Store whether injected interval has been initialised.\n const intervalInitialisedRef = useRef<boolean>(false);\n\n // Store each extension's status in state.\n const [extensionsStatus, setExtensionsStatus] = useState<\n Record<string, ExtensionStatus>\n >({});\n const extensionsStatusRef = useRef(extensionsStatus);\n\n // Store whether Metamask Snaps are enabled.\n const [polkaGateSnapEnabled] = useState<boolean>(\n options?.polkagateSnapEnabled || false\n );\n\n // Listen for window.injectedWeb3 with an interval.\n let injectedWeb3Interval: ReturnType<typeof setInterval>;\n const injectCounter = useRef<number>(0);\n\n // Handle completed interval check for `injectedWeb3`.\n //\n // Clear interval and move on to checking for Metamask Polkadot Snap.\n const handleClearInterval = async (hasInjectedWeb3: boolean) => {\n clearInterval(injectedWeb3Interval);\n\n // Check if Metamask PolkaGate Snap is available.\n if (polkaGateSnapEnabled) {\n await withTimeout(500, web3Enable(\"snap_only\"));\n\n if (hasInjectedWeb3) {\n setStateWithRef(\n getExtensionsStatus(),\n setExtensionsStatus,\n extensionsStatusRef\n );\n }\n }\n setStateWithRef(false, setCheckingInjectedWeb3, checkingInjectedWeb3Ref);\n };\n\n // Getter for the currently installed extensions.\n //\n // Loops through the supported extensios and checks if they are present in `injectedWeb3`. Adds\n // `installed` status to the extension if it is present.\n const getExtensionsStatus = () => {\n const { injectedWeb3 } = window;\n const newExtensionsStatus = { ...extensionsStatus };\n const extensionsAsArray = Object.entries(extensions).map(\n ([key, value]) => ({\n id: key,\n ...value,\n })\n );\n extensionsAsArray.forEach((e) => {\n if (injectedWeb3[e.id] !== undefined) {\n newExtensionsStatus[e.id] = \"installed\";\n }\n });\n\n return newExtensionsStatus;\n };\n\n // Setter for an extension status.\n const setExtensionStatus = (id: string, status: ExtensionStatus) => {\n setStateWithRef(\n {\n ...extensionsStatusRef.current,\n [id]: status,\n },\n setExtensionsStatus,\n extensionsStatusRef\n );\n };\n\n // Removes an extension from the `extensionsStatus` state.\n const removeExtensionStatus = (id: string) => {\n const newExtensionsStatus = { ...extensionsStatusRef.current };\n delete newExtensionsStatus[id];\n\n setStateWithRef(\n newExtensionsStatus,\n setExtensionsStatus,\n extensionsStatusRef\n );\n };\n\n // Checks if an extension has been installed.\n const extensionInstalled = (id: string): boolean =>\n extensionsStatus[id] !== undefined;\n\n // Checks whether an extension can be connected to.\n const extensionCanConnect = (id: string): boolean =>\n extensionInstalled(id) && extensionsStatus[id] !== \"connected\";\n\n // Checks whether an extension supports a feature.\n const extensionHasFeature = (id: string, feature: string): boolean => {\n const { features } = extensions[id];\n if (features === \"*\" || features.includes(feature)) {\n return true;\n } else {\n return false;\n }\n };\n\n // Check for `injectedWeb3` and Metamask Snap on mount. To trigger interval on soft page\n // refreshes, no empty dependency array is provided to this `useEffect`. Checks for `injectedWeb3`\n // for a total of 3 seconds before giving up.\n //\n // Interval duration.\n const checkEveryMs = 300;\n // Total interval iterations.\n const totalChecks = 10;\n useEffect(() => {\n if (!intervalInitialisedRef.current) {\n intervalInitialisedRef.current = true;\n\n injectedWeb3Interval = setInterval(() => {\n injectCounter.current++;\n if (injectCounter.current === totalChecks) {\n handleClearInterval(false);\n } else {\n // `injectedWeb3` is present\n const injectedWeb3 = window?.injectedWeb3 || null;\n if (injectedWeb3 !== null) {\n handleClearInterval(true);\n }\n }\n }, checkEveryMs);\n }\n\n return () => clearInterval(injectedWeb3Interval);\n });\n\n return (\n <ExtensionsContext.Provider\n value={{\n extensionsStatus: extensionsStatusRef.current,\n checkingInjectedWeb3,\n setExtensionStatus,\n removeExtensionStatus,\n extensionInstalled,\n extensionCanConnect,\n extensionHasFeature,\n }}\n >\n {children}\n </ExtensionsContext.Provider>\n );\n};\n"]}
@@ -1,6 +1,5 @@
1
1
  import type { FunctionComponent, SVGProps } from "react";
2
- import { ExternalAccountAddedBy } from "../types";
3
- import { AnyJson, VoidFn } from "@w3ux/types";
2
+ import { AnyJson, ExtensionAccount, ExtensionStatus, VoidFn } from "@w3ux/types";
4
3
  export interface ExtensionsContextInterface {
5
4
  checkingInjectedWeb3: boolean;
6
5
  extensionsStatus: Record<string, ExtensionStatus>;
@@ -23,12 +22,6 @@ export interface ExtensionInterface {
23
22
  metadata: AnyJson;
24
23
  signer: AnyJson;
25
24
  }
26
- export interface ExtensionAccount extends ExtensionMetadata {
27
- address: string;
28
- meta?: AnyJson;
29
- name: string;
30
- signer?: AnyJson;
31
- }
32
25
  export interface ExtensionConfig {
33
26
  id: string;
34
27
  title: string;
@@ -37,8 +30,3 @@ export interface ExtensionConfig {
37
30
  }>;
38
31
  url: string;
39
32
  }
40
- export interface ExtensionMetadata {
41
- addedBy?: ExternalAccountAddedBy;
42
- source: string;
43
- }
44
- export type ExtensionStatus = "installed" | "not_authenticated" | "connected";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ExtensionsProvider/types.ts"],"names":[],"mappings":"","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { FunctionComponent, SVGProps } from \"react\";\nimport { ExternalAccountAddedBy } from \"../types\";\nimport { AnyJson, VoidFn } from \"@w3ux/types\";\n\n// Extensions context interface.\nexport interface ExtensionsContextInterface {\n checkingInjectedWeb3: boolean;\n extensionsStatus: Record<string, ExtensionStatus>;\n setExtensionStatus: (id: string, status: ExtensionStatus) => void;\n removeExtensionStatus: (id: string) => void;\n extensionInstalled: (id: string) => boolean;\n extensionCanConnect: (id: string) => boolean;\n extensionHasFeature: (id: string, feature: string) => boolean;\n}\n\n// Top level required properties the extension must expose via their `injectedWeb3` entry.\nexport interface ExtensionInjected extends ExtensionConfig {\n id: string;\n enable: (n: string) => Promise<ExtensionInterface>;\n}\n\n// Required properties `enable` must provide after resolution.\nexport interface ExtensionInterface {\n accounts: {\n subscribe: (a: (b: ExtensionAccount[]) => void) => VoidFn;\n get: () => Promise<ExtensionAccount[]>;\n };\n provider: AnyJson;\n metadata: AnyJson;\n signer: AnyJson;\n}\n\n// Required properties returned after subscribing to accounts.\nexport interface ExtensionAccount extends ExtensionMetadata {\n address: string;\n meta?: AnyJson;\n name: string;\n signer?: AnyJson;\n}\n\n// Configuration item of an extension.\nexport interface ExtensionConfig {\n id: string;\n title: string;\n icon: FunctionComponent<\n SVGProps<SVGSVGElement> & { title?: string | undefined }\n >;\n url: string;\n}\n\n// Miscellaneous metadata added to an extension.\nexport interface ExtensionMetadata {\n addedBy?: ExternalAccountAddedBy;\n source: string;\n}\n\nexport type ExtensionStatus = \"installed\" | \"not_authenticated\" | \"connected\";\n"]}
1
+ {"version":3,"sources":["../src/ExtensionsProvider/types.ts"],"names":[],"mappings":"","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport type { FunctionComponent, SVGProps } from \"react\";\nimport {\n AnyJson,\n ExtensionAccount,\n ExtensionStatus,\n VoidFn,\n} from \"@w3ux/types\";\n\n// Extensions context interface.\nexport interface ExtensionsContextInterface {\n checkingInjectedWeb3: boolean;\n extensionsStatus: Record<string, ExtensionStatus>;\n setExtensionStatus: (id: string, status: ExtensionStatus) => void;\n removeExtensionStatus: (id: string) => void;\n extensionInstalled: (id: string) => boolean;\n extensionCanConnect: (id: string) => boolean;\n extensionHasFeature: (id: string, feature: string) => boolean;\n}\n\n// Top level required properties the extension must expose via their `injectedWeb3` entry.\nexport interface ExtensionInjected extends ExtensionConfig {\n id: string;\n enable: (n: string) => Promise<ExtensionInterface>;\n}\n\n// Required properties `enable` must provide after resolution.\nexport interface ExtensionInterface {\n accounts: {\n subscribe: (a: (b: ExtensionAccount[]) => void) => VoidFn;\n get: () => Promise<ExtensionAccount[]>;\n };\n provider: AnyJson;\n metadata: AnyJson;\n signer: AnyJson;\n}\n\n// Configuration item of an extension.\nexport interface ExtensionConfig {\n id: string;\n title: string;\n icon: FunctionComponent<\n SVGProps<SVGSVGElement> & { title?: string | undefined }\n >;\n url: string;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/LedgerAccountsProvider/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, useRef, useState } from \"react\";\nimport { defaultLedgerAccountsContext } from \"./defaults\";\nimport {\n LedgerAccountsContextInterface,\n LedgerAccountsProviderProps,\n} from \"./types\";\nimport { LedgerAccount } from \"../types\";\nimport {\n getLocalLedgerAccounts,\n getLocalLedgerAddresses,\n isLocalLedgerAccount,\n renameLocalLedgerAddress,\n} from \"./utils\";\nimport { setStateWithRef } from \"@w3ux/utils\";\n\nexport const LedgerAccountsContext =\n createContext<LedgerAccountsContextInterface>(defaultLedgerAccountsContext);\n\nexport const useLedgerAccounts = () => useContext(LedgerAccountsContext);\n\nexport const LedgerAccountsProvider = ({\n children,\n}: LedgerAccountsProviderProps) => {\n // Store the fetched ledger accounts.\n const [ledgerAccounts, setLedgerAccountsState] = useState<LedgerAccount[]>(\n getLocalLedgerAccounts()\n );\n const ledgerAccountsRef = useRef(ledgerAccounts);\n\n // Check if a Ledger address exists in imported addresses.\n const ledgerAccountExists = (network: string, address: string) =>\n !!getLocalLedgerAccounts().find((account) =>\n isLocalLedgerAccount(network, account, address)\n );\n\n // Adds a ledger address to the list of fetched addresses.\n const addLedgerAccount = (\n network: string,\n address: string,\n index: number,\n callback?: () => void\n ) => {\n let newLedgerAccounts = getLocalLedgerAccounts();\n\n const ledgerAddress = getLocalLedgerAddresses().find((a) =>\n isLocalLedgerAccount(network, a, address)\n );\n\n if (\n ledgerAddress &&\n !newLedgerAccounts.find((account) =>\n isLocalLedgerAccount(network, account, address)\n )\n ) {\n const newAccount = {\n address,\n network,\n name: ledgerAddress.name,\n source: \"ledger\",\n index,\n };\n\n // Update the full list of local ledger accounts with new entry.\n newLedgerAccounts = [...newLedgerAccounts].concat(newAccount);\n localStorage.setItem(\n \"ledger_accounts\",\n JSON.stringify(newLedgerAccounts)\n );\n\n // Store only those accounts on the current network in state.\n setStateWithRef(\n newLedgerAccounts.filter((account) => account.network === network),\n setLedgerAccountsState,\n ledgerAccountsRef\n );\n\n // Handle optional callback function.\n if (typeof callback === \"function\") {\n callback();\n }\n return newAccount;\n }\n return null;\n };\n\n // Removes a Ledger account from state and local storage.\n const removeLedgerAccount = (\n network: string,\n address: string,\n callback?: () => void\n ) => {\n // Remove th account from local storage records\n const newLedgerAccounts = getLocalLedgerAccounts().filter((account) => {\n if (account.address !== address) {\n return true;\n }\n if (account.network !== network) {\n return true;\n }\n return false;\n });\n if (!newLedgerAccounts.length) {\n localStorage.removeItem(\"ledger_accounts\");\n } else {\n localStorage.setItem(\n \"ledger_accounts\",\n JSON.stringify(newLedgerAccounts)\n );\n }\n\n // Update state with the new list of accounts.\n setStateWithRef(\n newLedgerAccounts.filter((account) => account.network === network),\n setLedgerAccountsState,\n ledgerAccountsRef\n );\n\n // Handle optional callback function.\n if (typeof callback === \"function\") {\n callback();\n }\n };\n\n // Renames an imported ledger account.\n const renameLedgerAccount = (\n network: string,\n address: string,\n newName: string\n ) => {\n // Update the local storage records.\n const newLedgerAccounts = getLocalLedgerAccounts().map((account) =>\n isLocalLedgerAccount(network, account, address)\n ? {\n ...account,\n name: newName,\n }\n : account\n );\n renameLocalLedgerAddress(address, newName, network);\n localStorage.setItem(\"ledger_accounts\", JSON.stringify(newLedgerAccounts));\n\n // Update state with the new list of accounts.\n setStateWithRef(\n newLedgerAccounts.filter((account) => account.network === network),\n setLedgerAccountsState,\n ledgerAccountsRef\n );\n };\n\n // Gets an imported address along with its Ledger metadata.\n const getLedgerAccount = (network: string, address: string) => {\n const localLedgerAccounts = getLocalLedgerAccounts();\n if (!localLedgerAccounts) {\n return null;\n }\n return (\n localLedgerAccounts.find((account) =>\n isLocalLedgerAccount(network, account, address)\n ) || null\n );\n };\n\n // Gets Ledger accounts for a network.\n const getLedgerAccounts = (network: string) =>\n ledgerAccountsRef.current.filter((a) => a.network === network);\n\n return (\n <LedgerAccountsContext.Provider\n value={{\n ledgerAccountExists,\n getLedgerAccount,\n addLedgerAccount,\n removeLedgerAccount,\n renameLedgerAccount,\n getLedgerAccounts,\n ledgerAccounts: ledgerAccountsRef.current,\n }}\n >\n {children}\n </LedgerAccountsContext.Provider>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/LedgerAccountsProvider/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, useRef, useState } from \"react\";\nimport { defaultLedgerAccountsContext } from \"./defaults\";\nimport {\n LedgerAccountsContextInterface,\n LedgerAccountsProviderProps,\n} from \"./types\";\nimport {\n getLocalLedgerAccounts,\n getLocalLedgerAddresses,\n isLocalLedgerAccount,\n renameLocalLedgerAddress,\n} from \"./utils\";\nimport { setStateWithRef } from \"@w3ux/utils\";\nimport { LedgerAccount } from \"@w3ux/types\";\n\nexport const LedgerAccountsContext =\n createContext<LedgerAccountsContextInterface>(defaultLedgerAccountsContext);\n\nexport const useLedgerAccounts = () => useContext(LedgerAccountsContext);\n\nexport const LedgerAccountsProvider = ({\n children,\n}: LedgerAccountsProviderProps) => {\n // Store the fetched ledger accounts.\n const [ledgerAccounts, setLedgerAccountsState] = useState<LedgerAccount[]>(\n getLocalLedgerAccounts()\n );\n const ledgerAccountsRef = useRef(ledgerAccounts);\n\n // Check if a Ledger address exists in imported addresses.\n const ledgerAccountExists = (network: string, address: string) =>\n !!getLocalLedgerAccounts().find((account) =>\n isLocalLedgerAccount(network, account, address)\n );\n\n // Adds a ledger address to the list of fetched addresses.\n const addLedgerAccount = (\n network: string,\n address: string,\n index: number,\n callback?: () => void\n ) => {\n let newLedgerAccounts = getLocalLedgerAccounts();\n\n const ledgerAddress = getLocalLedgerAddresses().find((a) =>\n isLocalLedgerAccount(network, a, address)\n );\n\n if (\n ledgerAddress &&\n !newLedgerAccounts.find((account) =>\n isLocalLedgerAccount(network, account, address)\n )\n ) {\n const newAccount = {\n address,\n network,\n name: ledgerAddress.name,\n source: \"ledger\",\n index,\n };\n\n // Update the full list of local ledger accounts with new entry.\n newLedgerAccounts = [...newLedgerAccounts].concat(newAccount);\n localStorage.setItem(\n \"ledger_accounts\",\n JSON.stringify(newLedgerAccounts)\n );\n\n // Store only those accounts on the current network in state.\n setStateWithRef(\n newLedgerAccounts.filter((account) => account.network === network),\n setLedgerAccountsState,\n ledgerAccountsRef\n );\n\n // Handle optional callback function.\n if (typeof callback === \"function\") {\n callback();\n }\n return newAccount;\n }\n return null;\n };\n\n // Removes a Ledger account from state and local storage.\n const removeLedgerAccount = (\n network: string,\n address: string,\n callback?: () => void\n ) => {\n // Remove th account from local storage records\n const newLedgerAccounts = getLocalLedgerAccounts().filter((account) => {\n if (account.address !== address) {\n return true;\n }\n if (account.network !== network) {\n return true;\n }\n return false;\n });\n if (!newLedgerAccounts.length) {\n localStorage.removeItem(\"ledger_accounts\");\n } else {\n localStorage.setItem(\n \"ledger_accounts\",\n JSON.stringify(newLedgerAccounts)\n );\n }\n\n // Update state with the new list of accounts.\n setStateWithRef(\n newLedgerAccounts.filter((account) => account.network === network),\n setLedgerAccountsState,\n ledgerAccountsRef\n );\n\n // Handle optional callback function.\n if (typeof callback === \"function\") {\n callback();\n }\n };\n\n // Renames an imported ledger account.\n const renameLedgerAccount = (\n network: string,\n address: string,\n newName: string\n ) => {\n // Update the local storage records.\n const newLedgerAccounts = getLocalLedgerAccounts().map((account) =>\n isLocalLedgerAccount(network, account, address)\n ? {\n ...account,\n name: newName,\n }\n : account\n );\n renameLocalLedgerAddress(address, newName, network);\n localStorage.setItem(\"ledger_accounts\", JSON.stringify(newLedgerAccounts));\n\n // Update state with the new list of accounts.\n setStateWithRef(\n newLedgerAccounts.filter((account) => account.network === network),\n setLedgerAccountsState,\n ledgerAccountsRef\n );\n };\n\n // Gets an imported address along with its Ledger metadata.\n const getLedgerAccount = (network: string, address: string) => {\n const localLedgerAccounts = getLocalLedgerAccounts();\n if (!localLedgerAccounts) {\n return null;\n }\n return (\n localLedgerAccounts.find((account) =>\n isLocalLedgerAccount(network, account, address)\n ) || null\n );\n };\n\n // Gets Ledger accounts for a network.\n const getLedgerAccounts = (network: string) =>\n ledgerAccountsRef.current.filter((a) => a.network === network);\n\n return (\n <LedgerAccountsContext.Provider\n value={{\n ledgerAccountExists,\n getLedgerAccount,\n addLedgerAccount,\n removeLedgerAccount,\n renameLedgerAccount,\n getLedgerAccounts,\n ledgerAccounts: ledgerAccountsRef.current,\n }}\n >\n {children}\n </LedgerAccountsContext.Provider>\n );\n};\n"]}
@@ -1,5 +1,5 @@
1
+ import { LedgerAccount } from "@w3ux/types";
1
2
  import { ReactNode } from "react";
2
- import { LedgerAccount } from "../types";
3
3
  export interface LedgerAccountsContextInterface {
4
4
  ledgerAccountExists: (network: string, a: string) => boolean;
5
5
  addLedgerAccount: (network: string, address: string, index: number, callback?: () => void) => LedgerAccount | null;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/LedgerAccountsProvider/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 { LedgerAccount } from \"../types\";\n\nexport interface LedgerAccountsContextInterface {\n ledgerAccountExists: (network: string, a: string) => boolean;\n addLedgerAccount: (\n network: string,\n address: string,\n index: number,\n callback?: () => void\n ) => LedgerAccount | null;\n removeLedgerAccount: (\n network: string,\n address: string,\n callback?: () => void\n ) => void;\n renameLedgerAccount: (network: string, address: string, name: string) => void;\n getLedgerAccount: (network: string, address: string) => LedgerAccount | null;\n getLedgerAccounts: (network: string) => LedgerAccount[];\n ledgerAccounts: LedgerAccount[];\n}\n\nexport interface LedgerAccountsProviderProps {\n children: ReactNode;\n}\n\nexport interface LedgerAddress {\n address: string;\n index: number;\n name: string;\n network: string;\n pubKey: string;\n}\n"]}
1
+ {"version":3,"sources":["../src/LedgerAccountsProvider/types.ts"],"names":[],"mappings":"","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { LedgerAccount } from \"@w3ux/types\";\nimport { ReactNode } from \"react\";\n\nexport interface LedgerAccountsContextInterface {\n ledgerAccountExists: (network: string, a: string) => boolean;\n addLedgerAccount: (\n network: string,\n address: string,\n index: number,\n callback?: () => void\n ) => LedgerAccount | null;\n removeLedgerAccount: (\n network: string,\n address: string,\n callback?: () => void\n ) => void;\n renameLedgerAccount: (network: string, address: string, name: string) => void;\n getLedgerAccount: (network: string, address: string) => LedgerAccount | null;\n getLedgerAccounts: (network: string) => LedgerAccount[];\n ledgerAccounts: LedgerAccount[];\n}\n\nexport interface LedgerAccountsProviderProps {\n children: ReactNode;\n}\n\nexport interface LedgerAddress {\n address: string;\n index: number;\n name: string;\n network: string;\n pubKey: string;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { LedgerAccount } from "../types";
2
1
  import { LedgerAddress } from "./types";
2
+ import { LedgerAccount } from "@w3ux/types";
3
3
  export declare const getLocalLedgerAccounts: (network?: string) => LedgerAccount[];
4
4
  export declare const isLocalLedgerAccount: (network: string, account: {
5
5
  address: string | null;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/LedgerAccountsProvider/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAKpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,OAAgB,EAAmB,EAAE;IAC1E,MAAM,cAAc,GAAG,qBAAqB,CAC1C,iBAAiB,EACjB,EAAE,EACF,IAAI,CACc,CAAC;IAErB,OAAO,OAAO;QACZ,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;QACrD,CAAC,CAAC,cAAc,CAAC;AACrB,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAAe,EACf,OAAoD,EACpD,OAAe,EACf,EAAE,CAAC,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC;AAGhE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC1D,MAAM,cAAc,GAAG,qBAAqB,CAC1C,kBAAkB,EAClB,EAAE,EACF,IAAI,CACc,CAAC;IAErB,OAAO,OAAO;QACZ,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;QACrD,CAAC,CAAC,cAAc,CAAC;AACrB,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,OAAe,EACf,IAAY,EACZ,OAAe,EACf,EAAE;IACF,MAAM,WAAW,GACf,qBAAqB,CAAC,kBAAkB,EAAE,EAAE,EAAE,IAAI,CACnD,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACX,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;QAC/C,CAAC,CAAC,CAAC;QACH,CAAC,CAAC;YACE,GAAG,CAAC;YACJ,IAAI;SACL,CACN,CAAC;IACF,IAAI,WAAW,EAAE,CAAC;QAChB,YAAY,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IACxE,CAAC;AACH,CAAC,CAAC","file":"utils.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { localStorageOrDefault } from \"@w3ux/utils\";\nimport { LedgerAccount } from \"../types\";\nimport { LedgerAddress } from \"./types\";\n\n// Gets imported Ledger accounts from local storage.\nexport const getLocalLedgerAccounts = (network?: string): LedgerAccount[] => {\n const localAddresses = localStorageOrDefault(\n \"ledger_accounts\",\n [],\n true\n ) as LedgerAccount[];\n\n return network\n ? localAddresses.filter((a) => a.network === network)\n : localAddresses;\n};\n\n// Gets whether an address is a local Ledger account.\nexport const isLocalLedgerAccount = (\n network: string,\n account: { address: string | null; network: string },\n address: string\n) => account.address === address && account.network === network;\n\n// Gets saved ledger addresses from local storage.\nexport const getLocalLedgerAddresses = (network?: string) => {\n const localAddresses = localStorageOrDefault(\n \"ledger_addresses\",\n [],\n true\n ) as LedgerAddress[];\n\n return network\n ? localAddresses.filter((a) => a.network === network)\n : localAddresses;\n};\n\n// Renames a record from local ledger addresses.\nexport const renameLocalLedgerAddress = (\n address: string,\n name: string,\n network: string\n) => {\n const localLedger = (\n localStorageOrDefault(\"ledger_addresses\", [], true) as LedgerAddress[]\n )?.map((i) =>\n !(i.address === address && i.network === network)\n ? i\n : {\n ...i,\n name,\n }\n );\n if (localLedger) {\n localStorage.setItem(\"ledger_addresses\", JSON.stringify(localLedger));\n }\n};\n"]}
1
+ {"version":3,"sources":["../src/LedgerAccountsProvider/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAKpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,OAAgB,EAAmB,EAAE;IAC1E,MAAM,cAAc,GAAG,qBAAqB,CAC1C,iBAAiB,EACjB,EAAE,EACF,IAAI,CACc,CAAC;IAErB,OAAO,OAAO;QACZ,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;QACrD,CAAC,CAAC,cAAc,CAAC;AACrB,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAAe,EACf,OAAoD,EACpD,OAAe,EACf,EAAE,CAAC,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC;AAGhE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC1D,MAAM,cAAc,GAAG,qBAAqB,CAC1C,kBAAkB,EAClB,EAAE,EACF,IAAI,CACc,CAAC;IAErB,OAAO,OAAO;QACZ,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;QACrD,CAAC,CAAC,cAAc,CAAC;AACrB,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,OAAe,EACf,IAAY,EACZ,OAAe,EACf,EAAE;IACF,MAAM,WAAW,GACf,qBAAqB,CAAC,kBAAkB,EAAE,EAAE,EAAE,IAAI,CACnD,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACX,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;QAC/C,CAAC,CAAC,CAAC;QACH,CAAC,CAAC;YACE,GAAG,CAAC;YACJ,IAAI;SACL,CACN,CAAC;IACF,IAAI,WAAW,EAAE,CAAC;QAChB,YAAY,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IACxE,CAAC;AACH,CAAC,CAAC","file":"utils.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { localStorageOrDefault } from \"@w3ux/utils\";\nimport { LedgerAddress } from \"./types\";\nimport { LedgerAccount } from \"@w3ux/types\";\n\n// Gets imported Ledger accounts from local storage.\nexport const getLocalLedgerAccounts = (network?: string): LedgerAccount[] => {\n const localAddresses = localStorageOrDefault(\n \"ledger_accounts\",\n [],\n true\n ) as LedgerAccount[];\n\n return network\n ? localAddresses.filter((a) => a.network === network)\n : localAddresses;\n};\n\n// Gets whether an address is a local Ledger account.\nexport const isLocalLedgerAccount = (\n network: string,\n account: { address: string | null; network: string },\n address: string\n) => account.address === address && account.network === network;\n\n// Gets saved ledger addresses from local storage.\nexport const getLocalLedgerAddresses = (network?: string) => {\n const localAddresses = localStorageOrDefault(\n \"ledger_addresses\",\n [],\n true\n ) as LedgerAddress[];\n\n return network\n ? localAddresses.filter((a) => a.network === network)\n : localAddresses;\n};\n\n// Renames a record from local ledger addresses.\nexport const renameLocalLedgerAddress = (\n address: string,\n name: string,\n network: string\n) => {\n const localLedger = (\n localStorageOrDefault(\"ledger_addresses\", [], true) as LedgerAddress[]\n )?.map((i) =>\n !(i.address === address && i.network === network)\n ? i\n : {\n ...i,\n name,\n }\n );\n if (localLedger) {\n localStorage.setItem(\"ledger_addresses\", JSON.stringify(localLedger));\n }\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/VaultAccountsProvider/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 { ellipsisFn, setStateWithRef } from \"@w3ux/utils\";\nimport { createContext, useContext, useRef, useState } from \"react\";\nimport { getLocalVaultAccounts, isLocalNetworkAddress } from \"./utils\";\nimport type {\n VaultAccountsContextInterface,\n VaultAccountsProviderProps,\n} from \"./types\";\nimport { defaultVaultAccountsContext } from \"./defaults\";\nimport { VaultAccount } from \"../types\";\n\nexport const VaultAccountsContext =\n createContext<VaultAccountsContextInterface>(defaultVaultAccountsContext);\n\nexport const useVaultAccounts = () => useContext(VaultAccountsContext);\n\nexport const VaultAccountsProvider = ({\n children,\n}: VaultAccountsProviderProps) => {\n const [vaultAccounts, seVaultAccountsState] = useState<VaultAccount[]>(\n getLocalVaultAccounts()\n );\n const vaultAccountsRef = useRef(vaultAccounts);\n\n // Check if a Vault address exists in imported addresses.\n const vaultAccountExists = (network: string, address: string) =>\n !!getLocalVaultAccounts().find((a) =>\n isLocalNetworkAddress(network, a, address)\n );\n\n // Adds a vault account to state and local storage.\n const addVaultAccount = (\n network: string,\n address: string,\n index: number,\n callback?: () => void\n ) => {\n let newVaultAccounts = getLocalVaultAccounts();\n\n if (\n !newVaultAccounts.find((a) => isLocalNetworkAddress(network, a, address))\n ) {\n const account = {\n address,\n network,\n name: ellipsisFn(address),\n source: \"vault\",\n index,\n };\n\n newVaultAccounts = [...newVaultAccounts].concat(account);\n localStorage.setItem(\n \"polkadot_vault_accounts\",\n JSON.stringify(newVaultAccounts)\n );\n\n // store only those accounts on the current network in state.\n setStateWithRef(\n newVaultAccounts.filter((a) => a.network === network),\n seVaultAccountsState,\n vaultAccountsRef\n );\n\n // Handle optional callback function.\n if (typeof callback === \"function\") {\n callback();\n }\n\n return account;\n }\n return null;\n };\n\n const removeVaultAccount = (\n network: string,\n address: string,\n callback?: () => void\n ) => {\n let newVaultAccounts = getLocalVaultAccounts();\n\n newVaultAccounts = newVaultAccounts.filter((a) => {\n if (a.address !== address) {\n return true;\n }\n if (a.network !== network) {\n return true;\n }\n return false;\n });\n\n if (!newVaultAccounts.length) {\n localStorage.removeItem(\"polkadot_vault_accounts\");\n } else {\n localStorage.setItem(\n \"polkadot_vault_accounts\",\n JSON.stringify(newVaultAccounts)\n );\n }\n setStateWithRef(\n newVaultAccounts.filter((a) => a.network === network),\n seVaultAccountsState,\n vaultAccountsRef\n );\n\n // Handle optional callback function.\n if (typeof callback === \"function\") {\n callback();\n }\n };\n\n const getVaultAccount = (network: string, address: string) => {\n const localVaultAccounts = getLocalVaultAccounts();\n if (!localVaultAccounts) {\n return null;\n }\n return (\n localVaultAccounts.find((a) =>\n isLocalNetworkAddress(network, a, address)\n ) ?? null\n );\n };\n\n const renameVaultAccount = (\n network: string,\n address: string,\n newName: string\n ) => {\n let newVaultAccounts = getLocalVaultAccounts();\n\n newVaultAccounts = newVaultAccounts.map((a) =>\n isLocalNetworkAddress(network, a, address)\n ? {\n ...a,\n name: newName,\n }\n : a\n );\n localStorage.setItem(\n \"polkadot_vault_accounts\",\n JSON.stringify(newVaultAccounts)\n );\n setStateWithRef(\n newVaultAccounts.filter((a) => a.network === network),\n seVaultAccountsState,\n vaultAccountsRef\n );\n };\n\n // Gets Vault accounts for a network.\n const getVaultAccounts = (network: string) =>\n vaultAccountsRef.current.filter((a) => a.network === network);\n\n return (\n <VaultAccountsContext.Provider\n value={{\n vaultAccountExists,\n addVaultAccount,\n removeVaultAccount,\n renameVaultAccount,\n getVaultAccount,\n getVaultAccounts,\n vaultAccounts: vaultAccountsRef.current,\n }}\n >\n {children}\n </VaultAccountsContext.Provider>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/VaultAccountsProvider/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 { ellipsisFn, setStateWithRef } from \"@w3ux/utils\";\nimport { createContext, useContext, useRef, useState } from \"react\";\nimport { getLocalVaultAccounts, isLocalNetworkAddress } from \"./utils\";\nimport type {\n VaultAccountsContextInterface,\n VaultAccountsProviderProps,\n} from \"./types\";\nimport { defaultVaultAccountsContext } from \"./defaults\";\nimport { VaultAccount } from \"@w3ux/types\";\n\nexport const VaultAccountsContext =\n createContext<VaultAccountsContextInterface>(defaultVaultAccountsContext);\n\nexport const useVaultAccounts = () => useContext(VaultAccountsContext);\n\nexport const VaultAccountsProvider = ({\n children,\n}: VaultAccountsProviderProps) => {\n const [vaultAccounts, seVaultAccountsState] = useState<VaultAccount[]>(\n getLocalVaultAccounts()\n );\n const vaultAccountsRef = useRef(vaultAccounts);\n\n // Check if a Vault address exists in imported addresses.\n const vaultAccountExists = (network: string, address: string) =>\n !!getLocalVaultAccounts().find((a) =>\n isLocalNetworkAddress(network, a, address)\n );\n\n // Adds a vault account to state and local storage.\n const addVaultAccount = (\n network: string,\n address: string,\n index: number,\n callback?: () => void\n ) => {\n let newVaultAccounts = getLocalVaultAccounts();\n\n if (\n !newVaultAccounts.find((a) => isLocalNetworkAddress(network, a, address))\n ) {\n const account = {\n address,\n network,\n name: ellipsisFn(address),\n source: \"vault\",\n index,\n };\n\n newVaultAccounts = [...newVaultAccounts].concat(account);\n localStorage.setItem(\n \"polkadot_vault_accounts\",\n JSON.stringify(newVaultAccounts)\n );\n\n // store only those accounts on the current network in state.\n setStateWithRef(\n newVaultAccounts.filter((a) => a.network === network),\n seVaultAccountsState,\n vaultAccountsRef\n );\n\n // Handle optional callback function.\n if (typeof callback === \"function\") {\n callback();\n }\n\n return account;\n }\n return null;\n };\n\n const removeVaultAccount = (\n network: string,\n address: string,\n callback?: () => void\n ) => {\n let newVaultAccounts = getLocalVaultAccounts();\n\n newVaultAccounts = newVaultAccounts.filter((a) => {\n if (a.address !== address) {\n return true;\n }\n if (a.network !== network) {\n return true;\n }\n return false;\n });\n\n if (!newVaultAccounts.length) {\n localStorage.removeItem(\"polkadot_vault_accounts\");\n } else {\n localStorage.setItem(\n \"polkadot_vault_accounts\",\n JSON.stringify(newVaultAccounts)\n );\n }\n setStateWithRef(\n newVaultAccounts.filter((a) => a.network === network),\n seVaultAccountsState,\n vaultAccountsRef\n );\n\n // Handle optional callback function.\n if (typeof callback === \"function\") {\n callback();\n }\n };\n\n const getVaultAccount = (network: string, address: string) => {\n const localVaultAccounts = getLocalVaultAccounts();\n if (!localVaultAccounts) {\n return null;\n }\n return (\n localVaultAccounts.find((a) =>\n isLocalNetworkAddress(network, a, address)\n ) ?? null\n );\n };\n\n const renameVaultAccount = (\n network: string,\n address: string,\n newName: string\n ) => {\n let newVaultAccounts = getLocalVaultAccounts();\n\n newVaultAccounts = newVaultAccounts.map((a) =>\n isLocalNetworkAddress(network, a, address)\n ? {\n ...a,\n name: newName,\n }\n : a\n );\n localStorage.setItem(\n \"polkadot_vault_accounts\",\n JSON.stringify(newVaultAccounts)\n );\n setStateWithRef(\n newVaultAccounts.filter((a) => a.network === network),\n seVaultAccountsState,\n vaultAccountsRef\n );\n };\n\n // Gets Vault accounts for a network.\n const getVaultAccounts = (network: string) =>\n vaultAccountsRef.current.filter((a) => a.network === network);\n\n return (\n <VaultAccountsContext.Provider\n value={{\n vaultAccountExists,\n addVaultAccount,\n removeVaultAccount,\n renameVaultAccount,\n getVaultAccount,\n getVaultAccounts,\n vaultAccounts: vaultAccountsRef.current,\n }}\n >\n {children}\n </VaultAccountsContext.Provider>\n );\n};\n"]}
@@ -1,5 +1,5 @@
1
+ import { VaultAccount } from "@w3ux/types";
1
2
  import { ReactNode } from "react";
2
- import { VaultAccount } from "../types";
3
3
  export interface VaultAccountsProviderProps {
4
4
  children: ReactNode;
5
5
  network: string;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/VaultAccountsProvider/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 { VaultAccount } from \"../types\";\n\nexport interface VaultAccountsProviderProps {\n children: ReactNode;\n network: string;\n}\n\nexport interface VaultAccountsContextInterface {\n vaultAccountExists: (network: string, address: string) => boolean;\n addVaultAccount: (\n network: string,\n address: string,\n index: number,\n callback?: () => void\n ) => VaultAccount | null;\n removeVaultAccount: (\n network: string,\n address: string,\n callback?: () => void\n ) => void;\n renameVaultAccount: (\n network: string,\n address: string,\n newName: string\n ) => void;\n getVaultAccount: (network: string, address: string) => VaultAccount | null;\n getVaultAccounts: (network: string) => VaultAccount[];\n vaultAccounts: VaultAccount[];\n}\n"]}
1
+ {"version":3,"sources":["../src/VaultAccountsProvider/types.ts"],"names":[],"mappings":"","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { VaultAccount } from \"@w3ux/types\";\nimport { ReactNode } from \"react\";\n\nexport interface VaultAccountsProviderProps {\n children: ReactNode;\n network: string;\n}\n\nexport interface VaultAccountsContextInterface {\n vaultAccountExists: (network: string, address: string) => boolean;\n addVaultAccount: (\n network: string,\n address: string,\n index: number,\n callback?: () => void\n ) => VaultAccount | null;\n removeVaultAccount: (\n network: string,\n address: string,\n callback?: () => void\n ) => void;\n renameVaultAccount: (\n network: string,\n address: string,\n newName: string\n ) => void;\n getVaultAccount: (network: string, address: string) => VaultAccount | null;\n getVaultAccounts: (network: string) => VaultAccount[];\n vaultAccounts: VaultAccount[];\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { VaultAccount } from "../types";
1
+ import { VaultAccount } from "@w3ux/types";
2
2
  export declare const getLocalVaultAccounts: (network?: string) => VaultAccount[];
3
3
  export declare const isLocalNetworkAddress: (chain: string, a: {
4
4
  address: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/VaultAccountsProvider/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAIpD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAgB,EAAE,EAAE;IACxD,MAAM,cAAc,GAAG,qBAAqB,CAC1C,yBAAyB,EACzB,EAAE,EACF,IAAI,CACa,CAAC;IAEpB,OAAO,OAAO;QACZ,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;QACrD,CAAC,CAAC,cAAc,CAAC;AACrB,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,KAAa,EACb,CAAmD,EACnD,OAAe,EACf,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC","file":"utils.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { localStorageOrDefault } from \"@w3ux/utils\";\nimport { VaultAccount } from \"../types\";\n\n// Gets imported Vault accounts from local storage.\nexport const getLocalVaultAccounts = (network?: string) => {\n const localAddresses = localStorageOrDefault(\n \"polkadot_vault_accounts\",\n [],\n true\n ) as VaultAccount[];\n\n return network\n ? localAddresses.filter((a) => a.network === network)\n : localAddresses;\n};\n\n// Gets whether an address is a local network address.\nexport const isLocalNetworkAddress = (\n chain: string,\n a: { address: string | undefined; network: string },\n address: string\n) => a.address === address && a.network === chain;\n"]}
1
+ {"version":3,"sources":["../src/VaultAccountsProvider/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAgB,EAAE,EAAE;IACxD,MAAM,cAAc,GAAG,qBAAqB,CAC1C,yBAAyB,EACzB,EAAE,EACF,IAAI,CACa,CAAC;IAEpB,OAAO,OAAO;QACZ,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;QACrD,CAAC,CAAC,cAAc,CAAC;AACrB,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,KAAa,EACb,CAAmD,EACnD,OAAe,EACf,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC","file":"utils.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { VaultAccount } from \"@w3ux/types\";\nimport { localStorageOrDefault } from \"@w3ux/utils\";\n\n// Gets imported Vault accounts from local storage.\nexport const getLocalVaultAccounts = (network?: string) => {\n const localAddresses = localStorageOrDefault(\n \"polkadot_vault_accounts\",\n [],\n true\n ) as VaultAccount[];\n\n return network\n ? localAddresses.filter((a) => a.network === network)\n : localAddresses;\n};\n\n// Gets whether an address is a local network address.\nexport const isLocalNetworkAddress = (\n chain: string,\n a: { address: string | undefined; network: string },\n address: string\n) => a.address === address && a.network === chain;\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/WCAccountsProvider/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 { ellipsisFn, setStateWithRef } from \"@w3ux/utils\";\nimport { createContext, useContext, useRef, useState } from \"react\";\nimport { getLocalWcAccounts, isLocalNetworkAddress } from \"./utils\";\nimport type {\n WCAccountsContextInterface,\n WCAccountsProviderProps,\n} from \"./types\";\nimport { defaultWcAccountsContext } from \"./defaults\";\nimport { WCAccount } from \"../types\";\n\nexport const WCAccountsContext = createContext<WCAccountsContextInterface>(\n defaultWcAccountsContext\n);\n\nexport const useWcAccounts = () => useContext(WCAccountsContext);\n\nexport const WCAccountsProvider = ({ children }: WCAccountsProviderProps) => {\n const [wcAccounts, setWcAccountsState] =\n useState<WCAccount[]>(getLocalWcAccounts());\n const wcAccountsRef = useRef(wcAccounts);\n\n // Check if a Wallet Connect address exists in imported addresses.\n const wcAccountExists = (network: string, address: string) =>\n !!wcAccountsRef.current.find((a) =>\n isLocalNetworkAddress(network, a, address)\n );\n\n // Adds a wallet connect account to state and local storage.\n const addWcAccount = (\n network: string,\n address: string,\n index: number,\n callback?: () => void\n ) => {\n let newAccounts = [...wcAccountsRef.current];\n\n if (!newAccounts.find((a) => isLocalNetworkAddress(network, a, address))) {\n const account = {\n address,\n network,\n name: ellipsisFn(address),\n source: \"wallet_connect\",\n index,\n };\n\n newAccounts = [...newAccounts].concat(account);\n localStorage.setItem(\n \"wallet_connect_accounts\",\n JSON.stringify(newAccounts)\n );\n\n // Persist the new accounts to state.\n setStateWithRef(newAccounts, setWcAccountsState, wcAccountsRef);\n\n // Handle optional callback function.\n if (typeof callback === \"function\") {\n callback();\n }\n\n return account;\n }\n return null;\n };\n\n const removeWcAccount = (\n network: string,\n address: string,\n callback?: () => void\n ) => {\n let newAccounts = [...wcAccountsRef.current];\n\n newAccounts = newAccounts.filter((a) => {\n if (a.address !== address) {\n return true;\n }\n if (a.network !== network) {\n return true;\n }\n return false;\n });\n\n if (!newAccounts.length) {\n localStorage.removeItem(\"wallet_connect_accounts\");\n } else {\n localStorage.setItem(\n \"wallet_connect_accounts\",\n JSON.stringify(newAccounts)\n );\n }\n setStateWithRef(newAccounts, setWcAccountsState, wcAccountsRef);\n\n // Handle optional callback function.\n if (typeof callback === \"function\") {\n callback();\n }\n };\n\n const getWcAccount = (network: string, address: string) =>\n wcAccountsRef.current.find((a) =>\n isLocalNetworkAddress(network, a, address)\n ) ?? null;\n\n const renameWcAccount = (\n network: string,\n address: string,\n newName: string\n ) => {\n const newAccounts = wcAccountsRef.current.map((a) =>\n isLocalNetworkAddress(network, a, address)\n ? {\n ...a,\n name: newName,\n }\n : a\n );\n localStorage.setItem(\n \"wallet_connect_accounts\",\n JSON.stringify(newAccounts)\n );\n\n setStateWithRef(newAccounts, setWcAccountsState, wcAccountsRef);\n };\n\n // Gets Wallet Connect accounts for a network.\n const getWcAccounts = (network: string) =>\n wcAccountsRef.current.filter((a) => a.network === network);\n\n return (\n <WCAccountsContext.Provider\n value={{\n wcAccountExists,\n addWcAccount,\n removeWcAccount,\n renameWcAccount,\n getWcAccount,\n getWcAccounts,\n wcAccounts: wcAccountsRef.current,\n }}\n >\n {children}\n </WCAccountsContext.Provider>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/WCAccountsProvider/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 { ellipsisFn, setStateWithRef } from \"@w3ux/utils\";\nimport { createContext, useContext, useRef, useState } from \"react\";\nimport { getLocalWcAccounts, isLocalNetworkAddress } from \"./utils\";\nimport type {\n WCAccountsContextInterface,\n WCAccountsProviderProps,\n} from \"./types\";\nimport { defaultWcAccountsContext } from \"./defaults\";\nimport { WCAccount } from \"@w3ux/types\";\n\nexport const WCAccountsContext = createContext<WCAccountsContextInterface>(\n defaultWcAccountsContext\n);\n\nexport const useWcAccounts = () => useContext(WCAccountsContext);\n\nexport const WCAccountsProvider = ({ children }: WCAccountsProviderProps) => {\n const [wcAccounts, setWcAccountsState] =\n useState<WCAccount[]>(getLocalWcAccounts());\n const wcAccountsRef = useRef(wcAccounts);\n\n // Check if a Wallet Connect address exists in imported addresses.\n const wcAccountExists = (network: string, address: string) =>\n !!wcAccountsRef.current.find((a) =>\n isLocalNetworkAddress(network, a, address)\n );\n\n // Adds a wallet connect account to state and local storage.\n const addWcAccount = (\n network: string,\n address: string,\n index: number,\n callback?: () => void\n ) => {\n let newAccounts = [...wcAccountsRef.current];\n\n if (!newAccounts.find((a) => isLocalNetworkAddress(network, a, address))) {\n const account = {\n address,\n network,\n name: ellipsisFn(address),\n source: \"wallet_connect\",\n index,\n };\n\n newAccounts = [...newAccounts].concat(account);\n localStorage.setItem(\n \"wallet_connect_accounts\",\n JSON.stringify(newAccounts)\n );\n\n // Persist the new accounts to state.\n setStateWithRef(newAccounts, setWcAccountsState, wcAccountsRef);\n\n // Handle optional callback function.\n if (typeof callback === \"function\") {\n callback();\n }\n\n return account;\n }\n return null;\n };\n\n const removeWcAccount = (\n network: string,\n address: string,\n callback?: () => void\n ) => {\n let newAccounts = [...wcAccountsRef.current];\n\n newAccounts = newAccounts.filter((a) => {\n if (a.address !== address) {\n return true;\n }\n if (a.network !== network) {\n return true;\n }\n return false;\n });\n\n if (!newAccounts.length) {\n localStorage.removeItem(\"wallet_connect_accounts\");\n } else {\n localStorage.setItem(\n \"wallet_connect_accounts\",\n JSON.stringify(newAccounts)\n );\n }\n setStateWithRef(newAccounts, setWcAccountsState, wcAccountsRef);\n\n // Handle optional callback function.\n if (typeof callback === \"function\") {\n callback();\n }\n };\n\n const getWcAccount = (network: string, address: string) =>\n wcAccountsRef.current.find((a) =>\n isLocalNetworkAddress(network, a, address)\n ) ?? null;\n\n const renameWcAccount = (\n network: string,\n address: string,\n newName: string\n ) => {\n const newAccounts = wcAccountsRef.current.map((a) =>\n isLocalNetworkAddress(network, a, address)\n ? {\n ...a,\n name: newName,\n }\n : a\n );\n localStorage.setItem(\n \"wallet_connect_accounts\",\n JSON.stringify(newAccounts)\n );\n\n setStateWithRef(newAccounts, setWcAccountsState, wcAccountsRef);\n };\n\n // Gets Wallet Connect accounts for a network.\n const getWcAccounts = (network: string) =>\n wcAccountsRef.current.filter((a) => a.network === network);\n\n return (\n <WCAccountsContext.Provider\n value={{\n wcAccountExists,\n addWcAccount,\n removeWcAccount,\n renameWcAccount,\n getWcAccount,\n getWcAccounts,\n wcAccounts: wcAccountsRef.current,\n }}\n >\n {children}\n </WCAccountsContext.Provider>\n );\n};\n"]}
@@ -1,5 +1,5 @@
1
+ import { WCAccount } from "@w3ux/types";
1
2
  import { ReactNode } from "react";
2
- import { WCAccount } from "../types";
3
3
  export interface WCAccountsProviderProps {
4
4
  children: ReactNode;
5
5
  network: string;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/WCAccountsProvider/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 { WCAccount } from \"../types\";\n\nexport interface WCAccountsProviderProps {\n children: ReactNode;\n network: string;\n}\n\nexport interface WCAccountsContextInterface {\n wcAccountExists: (network: string, address: string) => boolean;\n addWcAccount: (\n network: string,\n address: string,\n index: number,\n callback?: () => void\n ) => WCAccount | null;\n removeWcAccount: (\n network: string,\n address: string,\n callback?: () => void\n ) => void;\n renameWcAccount: (network: string, address: string, newName: string) => void;\n getWcAccount: (network: string, address: string) => WCAccount | null;\n getWcAccounts: (network: string) => WCAccount[];\n wcAccounts: WCAccount[];\n}\n"]}
1
+ {"version":3,"sources":["../src/WCAccountsProvider/types.ts"],"names":[],"mappings":"","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { WCAccount } from \"@w3ux/types\";\nimport { ReactNode } from \"react\";\n\nexport interface WCAccountsProviderProps {\n children: ReactNode;\n network: string;\n}\n\nexport interface WCAccountsContextInterface {\n wcAccountExists: (network: string, address: string) => boolean;\n addWcAccount: (\n network: string,\n address: string,\n index: number,\n callback?: () => void\n ) => WCAccount | null;\n removeWcAccount: (\n network: string,\n address: string,\n callback?: () => void\n ) => void;\n renameWcAccount: (network: string, address: string, newName: string) => void;\n getWcAccount: (network: string, address: string) => WCAccount | null;\n getWcAccounts: (network: string) => WCAccount[];\n wcAccounts: WCAccount[];\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { WCAccount } from "../types";
1
+ import { WCAccount } from "@w3ux/types";
2
2
  export declare const getLocalWcAccounts: (network?: string) => WCAccount[];
3
3
  export declare const isLocalNetworkAddress: (chain: string, a: {
4
4
  address: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/WCAccountsProvider/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAIpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAgB,EAAE,EAAE;IACrD,MAAM,cAAc,GAAG,qBAAqB,CAC1C,yBAAyB,EACzB,EAAE,EACF,IAAI,CACU,CAAC;IAEjB,OAAO,OAAO;QACZ,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;QACrD,CAAC,CAAC,cAAc,CAAC;AACrB,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,KAAa,EACb,CAAmD,EACnD,OAAe,EACf,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC","file":"utils.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { localStorageOrDefault } from \"@w3ux/utils\";\nimport { WCAccount } from \"../types\";\n\n// Gets imported Wallet Connect accounts from local storage.\nexport const getLocalWcAccounts = (network?: string) => {\n const localAddresses = localStorageOrDefault(\n \"wallet_connect_accounts\",\n [],\n true\n ) as WCAccount[];\n\n return network\n ? localAddresses.filter((a) => a.network === network)\n : localAddresses;\n};\n\n// Gets whether an address is a local network address.\nexport const isLocalNetworkAddress = (\n chain: string,\n a: { address: string | undefined; network: string },\n address: string\n) => a.address === address && a.network === chain;\n"]}
1
+ {"version":3,"sources":["../src/WCAccountsProvider/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAgB,EAAE,EAAE;IACrD,MAAM,cAAc,GAAG,qBAAqB,CAC1C,yBAAyB,EACzB,EAAE,EACF,IAAI,CACU,CAAC;IAEjB,OAAO,OAAO;QACZ,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;QACrD,CAAC,CAAC,cAAc,CAAC;AACrB,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,KAAa,EACb,CAAmD,EACnD,OAAe,EACf,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC","file":"utils.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport { WCAccount } from \"@w3ux/types\";\nimport { localStorageOrDefault } from \"@w3ux/utils\";\n\n// Gets imported Wallet Connect accounts from local storage.\nexport const getLocalWcAccounts = (network?: string) => {\n const localAddresses = localStorageOrDefault(\n \"wallet_connect_accounts\",\n [],\n true\n ) as WCAccount[];\n\n return network\n ? localAddresses.filter((a) => a.network === network)\n : localAddresses;\n};\n\n// Gets whether an address is a local network address.\nexport const isLocalNetworkAddress = (\n chain: string,\n a: { address: string | undefined; network: string },\n address: string\n) => a.address === address && a.network === chain;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@w3ux/react-connect-kit",
3
- "version": "2.1.1",
3
+ "version": "2.1.3",
4
4
  "license": "GPL-3.0-only",
5
5
  "dependencies": {
6
6
  "@polkagate/extension-dapp": "^0.48.2",
package/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ExtensionAccount, ExtensionInjected, ExtensionInterface } from "./ExtensionsProvider/types";
1
+ import { ExtensionInjected, ExtensionInterface } from "./ExtensionsProvider/types";
2
2
  declare global {
3
3
  interface Window {
4
4
  injectedWeb3?: Record<string, ExtensionInjected>;
@@ -8,38 +8,6 @@ export * from "./ExtensionsProvider/types";
8
8
  export * from "./ExtensionAccountsProvider/types";
9
9
  export * from "./LedgerAccountsProvider/types";
10
10
  export * from "./VaultAccountsProvider/types";
11
- export type MaybeAddress = string | null;
12
- export type AccountSource = "extension" | "external" | "ledger" | "vault";
13
- export type ExternalAccountAddedBy = "system" | "user";
14
- export type ImportedAccount = ExtensionAccount | ExternalAccount | LedgerAccount | VaultAccount | WCAccount;
15
- export interface ExternalAccount {
16
- address: string;
17
- network: string;
18
- name: string;
19
- source: string;
20
- addedBy: ExternalAccountAddedBy;
21
- }
22
- export interface LedgerAccount {
23
- address: string;
24
- network: string;
25
- name: string;
26
- source: string;
27
- index: number;
28
- }
29
- export interface VaultAccount {
30
- address: string;
31
- network: string;
32
- name: string;
33
- source: string;
34
- index: number;
35
- }
36
- export interface WCAccount {
37
- address: string;
38
- network: string;
39
- name: string;
40
- source: string;
41
- index: number;
42
- }
43
11
  export type RawExtensions = Map<string, RawExtensionEnable>;
44
12
  export type RawExtensionEnable = (name?: string) => Promise<ExtensionInterface>;
45
13
  export type ExtensionEnableStatus = "valid" | "extension_not_found" | "enable_invalid";
package/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"names":[],"mappings":"AAmBA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n ExtensionAccount,\n ExtensionInjected,\n ExtensionInterface,\n} from \"./ExtensionsProvider/types\";\n\ndeclare global {\n interface Window {\n injectedWeb3?: Record<string, ExtensionInjected>;\n }\n}\n\n/*------------------------------------------------------------\n Re-export package inner types.\n ------------------------------------------------------------*/\n\nexport * from \"./ExtensionsProvider/types\";\nexport * from \"./ExtensionAccountsProvider/types\";\nexport * from \"./LedgerAccountsProvider/types\";\nexport * from \"./VaultAccountsProvider/types\";\n\n/*------------------------------------------------------------\n Imported account types.\n ------------------------------------------------------------*/\nexport type MaybeAddress = string | null;\n\nexport type AccountSource = \"extension\" | \"external\" | \"ledger\" | \"vault\";\n\nexport type ExternalAccountAddedBy = \"system\" | \"user\";\n\nexport type ImportedAccount =\n | ExtensionAccount\n | ExternalAccount\n | LedgerAccount\n | VaultAccount\n | WCAccount;\n\nexport interface ExternalAccount {\n address: string;\n network: string;\n name: string;\n source: string;\n addedBy: ExternalAccountAddedBy;\n}\n\nexport interface LedgerAccount {\n address: string;\n network: string;\n name: string;\n source: string;\n index: number;\n}\n\nexport interface VaultAccount {\n address: string;\n network: string;\n name: string;\n source: string;\n index: number;\n}\n\nexport interface WCAccount {\n address: string;\n network: string;\n name: string;\n source: string;\n index: number;\n}\n\n/*------------------------------------------------------------\n Extension import process types.\n ------------------------------------------------------------*/\n\nexport type RawExtensions = Map<string, RawExtensionEnable>;\n\nexport type RawExtensionEnable = (name?: string) => Promise<ExtensionInterface>;\n\nexport type ExtensionEnableStatus =\n | \"valid\"\n | \"extension_not_found\"\n | \"enable_invalid\";\n\nexport type ExtensionEnableResults = Map<string, ExtensionEnableResult>;\n\nexport interface ExtensionEnableResult {\n extension?: ExtensionInterface;\n connected: boolean;\n error?: string;\n}\n"]}
1
+ {"version":3,"sources":["../src/types.ts"],"names":[],"mappings":"AAkBA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC","file":"types.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n\nimport {\n ExtensionInjected,\n ExtensionInterface,\n} from \"./ExtensionsProvider/types\";\n\ndeclare global {\n interface Window {\n injectedWeb3?: Record<string, ExtensionInjected>;\n }\n}\n\n/*------------------------------------------------------------\n Re-export package inner types.\n ------------------------------------------------------------*/\n\nexport * from \"./ExtensionsProvider/types\";\nexport * from \"./ExtensionAccountsProvider/types\";\nexport * from \"./LedgerAccountsProvider/types\";\nexport * from \"./VaultAccountsProvider/types\";\n\n/*------------------------------------------------------------\n Extension import process types.\n ------------------------------------------------------------*/\n\nexport type RawExtensions = Map<string, RawExtensionEnable>;\n\nexport type RawExtensionEnable = (name?: string) => Promise<ExtensionInterface>;\n\nexport type ExtensionEnableStatus =\n | \"valid\"\n | \"extension_not_found\"\n | \"enable_invalid\";\n\nexport type ExtensionEnableResults = Map<string, ExtensionEnableResult>;\n\nexport interface ExtensionEnableResult {\n extension?: ExtensionInterface;\n connected: boolean;\n error?: string;\n}\n"]}