@w3ux/react-connect-kit 0.1.1 → 0.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.
|
@@ -6,6 +6,8 @@ export var defaultExtensionsContext = {
|
|
|
6
6
|
extensionInstalled: function (id) { return false; },
|
|
7
7
|
extensionCanConnect: function (id) { return false; },
|
|
8
8
|
extensionHasFeature: function (id, feature) { return false; },
|
|
9
|
+
setSnapsEnabled: function (enabled) { },
|
|
10
|
+
snapsEnabled: false,
|
|
9
11
|
};
|
|
10
12
|
|
|
11
13
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ExtensionsProvider/defaults.ts"],"names":[],"mappings":"AAAA;wCACwC;AACxC,6GAA6G;AAI7G,MAAM,CAAC,IAAM,wBAAwB,GAA+B;IAClE,oBAAoB,EAAE,KAAK;IAC3B,gBAAgB,EAAE,EAAE;IACpB,kBAAkB,EAAE,UAAC,EAAE,EAAE,MAAM,IAAM,CAAC;IACtC,qBAAqB,EAAE,UAAC,EAAE,IAAM,CAAC;IACjC,kBAAkB,EAAE,UAAC,EAAE,IAAK,OAAA,KAAK,EAAL,CAAK;IACjC,mBAAmB,EAAE,UAAC,EAAE,IAAK,OAAA,KAAK,EAAL,CAAK;IAClC,mBAAmB,EAAE,UAAC,EAAE,EAAE,OAAO,IAAK,OAAA,KAAK,EAAL,CAAK;
|
|
1
|
+
{"version":3,"sources":["../src/ExtensionsProvider/defaults.ts"],"names":[],"mappings":"AAAA;wCACwC;AACxC,6GAA6G;AAI7G,MAAM,CAAC,IAAM,wBAAwB,GAA+B;IAClE,oBAAoB,EAAE,KAAK;IAC3B,gBAAgB,EAAE,EAAE;IACpB,kBAAkB,EAAE,UAAC,EAAE,EAAE,MAAM,IAAM,CAAC;IACtC,qBAAqB,EAAE,UAAC,EAAE,IAAM,CAAC;IACjC,kBAAkB,EAAE,UAAC,EAAE,IAAK,OAAA,KAAK,EAAL,CAAK;IACjC,mBAAmB,EAAE,UAAC,EAAE,IAAK,OAAA,KAAK,EAAL,CAAK;IAClC,mBAAmB,EAAE,UAAC,EAAE,EAAE,OAAO,IAAK,OAAA,KAAK,EAAL,CAAK;IAC3C,eAAe,EAAE,UAAC,OAAO,IAAM,CAAC;IAChC,YAAY,EAAE,KAAK;CACpB,CAAC","file":"defaults.js","sourcesContent":["/* @license Copyright 2024 w3ux authors & contributors\nSPDX-License-Identifier: GPL-3.0-only */\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function, no-unused-vars */\n\nimport type { ExtensionsContextInterface } from \"./types\";\n\nexport const defaultExtensionsContext: ExtensionsContextInterface = {\n checkingInjectedWeb3: false,\n extensionsStatus: {},\n setExtensionStatus: (id, status) => {},\n removeExtensionStatus: (id) => {},\n extensionInstalled: (id) => false,\n extensionCanConnect: (id) => false,\n extensionHasFeature: (id, feature) => false,\n setSnapsEnabled: (enabled) => {},\n snapsEnabled: false,\n};\n"]}
|
|
@@ -46,7 +46,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
48
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
49
|
-
import { setStateWithRef } from "@w3ux/utils";
|
|
49
|
+
import { setStateWithRef, withTimeout } from "@w3ux/utils";
|
|
50
50
|
import { useEffect, useRef, useState, createContext, useContext, } from "react";
|
|
51
51
|
import { defaultExtensionsContext } from "./defaults";
|
|
52
52
|
import { polkadotSnapAvailable } from "./utils";
|
|
@@ -61,6 +61,7 @@ export var ExtensionsProvider = function (_a) {
|
|
|
61
61
|
var intervalInitialisedRef = useRef(false);
|
|
62
62
|
var _c = useState({}), extensionsStatus = _c[0], setExtensionsStatus = _c[1];
|
|
63
63
|
var extensionsStatusRef = useRef(extensionsStatus);
|
|
64
|
+
var _d = useState(false), snapsEnabled = _d[0], setSnapsEnabled = _d[1];
|
|
64
65
|
var injectedWeb3Interval;
|
|
65
66
|
var injectCounter = useRef(0);
|
|
66
67
|
var handleClearInterval = function (hasInjectedWeb3) {
|
|
@@ -73,10 +74,13 @@ export var ExtensionsProvider = function (_a) {
|
|
|
73
74
|
switch (_a.label) {
|
|
74
75
|
case 0: return [4 , polkadotSnapAvailable()];
|
|
75
76
|
case 1:
|
|
76
|
-
snapAvailable = _a.sent();
|
|
77
|
-
return [
|
|
77
|
+
snapAvailable = (_a.sent()) && snapsEnabled;
|
|
78
|
+
if (!snapsEnabled) return [3 , 3];
|
|
79
|
+
return [4 , withTimeout(500, web3Enable("w3ux"))];
|
|
78
80
|
case 2:
|
|
79
|
-
_a.sent();
|
|
81
|
+
_a.sent();
|
|
82
|
+
_a.label = 3;
|
|
83
|
+
case 3:
|
|
80
84
|
if (hasInjectedWeb3 || snapAvailable) {
|
|
81
85
|
setStateWithRef(getExtensionsStatus(snapAvailable), setExtensionsStatus, extensionsStatusRef);
|
|
82
86
|
}
|
|
@@ -154,6 +158,8 @@ export var ExtensionsProvider = function (_a) {
|
|
|
154
158
|
extensionInstalled: extensionInstalled,
|
|
155
159
|
extensionCanConnect: extensionCanConnect,
|
|
156
160
|
extensionHasFeature: extensionHasFeature,
|
|
161
|
+
setSnapsEnabled: setSnapsEnabled,
|
|
162
|
+
snapsEnabled: snapsEnabled,
|
|
157
163
|
}, children: children }));
|
|
158
164
|
};
|
|
159
165
|
|
|
@@ -1 +1 @@
|
|
|
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 } 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 { polkadotSnapAvailable } from \"./utils\";\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 = ({ children }: { children: ReactNode }) => {\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 // 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 = (hasInjectedWeb3: boolean) => {\n clearInterval(injectedWeb3Interval);\n // Check if Metamask Polkadot Snap is available.\n handleSnapInjection(hasInjectedWeb3);\n };\n\n // Handle injecting of `metamask-polkadot-snap` into injectedWeb3 if avaialble, and complete\n // `injectedWeb3` syncing process.\n const handleSnapInjection = async (hasInjectedWeb3: boolean) => {\n const snapAvailable = await polkadotSnapAvailable();\n await web3Enable(\"w3ux\"); // injects polkagate snap\n\n if (hasInjectedWeb3 || snapAvailable) {\n setStateWithRef(\n getExtensionsStatus(snapAvailable),\n setExtensionsStatus,\n extensionsStatusRef\n );\n }\n\n setStateWithRef(false, setCheckingInjectedWeb3, checkingInjectedWeb3Ref);\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 // 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 = (snapAvailable: boolean) => {\n const { injectedWeb3 } = window;\n\n const newExtensionsStatus = { ...extensionsStatus };\n if (snapAvailable) {\n newExtensionsStatus[\"metamask-polkadot-snap\"] = \"installed\";\n }\n\n const extensionsAsArray = Object.entries(extensions).map(\n ([key, value]) => ({\n id: key,\n ...value,\n })\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 // 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\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 { ExtensionStatus, ExtensionsContextInterface } from \"./types\";\nimport { defaultExtensionsContext } from \"./defaults\";\nimport { polkadotSnapAvailable } from \"./utils\";\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 = ({ children }: { children: ReactNode }) => {\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 [snapsEnabled, setSnapsEnabled] = useState<boolean>(false);\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 = (hasInjectedWeb3: boolean) => {\n clearInterval(injectedWeb3Interval);\n // Check if Metamask Polkadot Snap is available.\n handleSnapInjection(hasInjectedWeb3);\n };\n\n // Handle injecting of `metamask-polkadot-snap` into injectedWeb3 if avaialble, and complete\n // `injectedWeb3` syncing process.\n const handleSnapInjection = async (hasInjectedWeb3: boolean) => {\n const snapAvailable = (await polkadotSnapAvailable()) && snapsEnabled;\n\n // Injects PolkaGate snap.\n if (snapsEnabled) {\n await withTimeout(500, web3Enable(\"w3ux\"));\n }\n\n if (hasInjectedWeb3 || snapAvailable) {\n setStateWithRef(\n getExtensionsStatus(snapAvailable),\n setExtensionsStatus,\n extensionsStatusRef\n );\n }\n\n setStateWithRef(false, setCheckingInjectedWeb3, checkingInjectedWeb3Ref);\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 // 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 = (snapAvailable: boolean) => {\n const { injectedWeb3 } = window;\n\n const newExtensionsStatus = { ...extensionsStatus };\n if (snapAvailable) {\n newExtensionsStatus[\"metamask-polkadot-snap\"] = \"installed\";\n }\n\n const extensionsAsArray = Object.entries(extensions).map(\n ([key, value]) => ({\n id: key,\n ...value,\n })\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 // 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\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 setSnapsEnabled,\n snapsEnabled,\n }}\n >\n {children}\n </ExtensionsContext.Provider>\n );\n};\n"]}
|
|
@@ -8,6 +8,8 @@ export interface ExtensionsContextInterface {
|
|
|
8
8
|
extensionInstalled: (id: string) => boolean;
|
|
9
9
|
extensionCanConnect: (id: string) => boolean;
|
|
10
10
|
extensionHasFeature: (id: string, feature: string) => boolean;
|
|
11
|
+
setSnapsEnabled: (enabled: boolean) => void;
|
|
12
|
+
snapsEnabled: boolean;
|
|
11
13
|
}
|
|
12
14
|
export interface ExtensionInjected extends ExtensionConfig {
|
|
13
15
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ExtensionsProvider/types.ts"],"names":[],"mappings":"AAAA;wCACwC","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 { AnyJson, ExternalAccountAddedBy, VoidFn } from \"../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":"AAAA;wCACwC","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 { AnyJson, ExternalAccountAddedBy, VoidFn } from \"../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 setSnapsEnabled: (enabled: boolean) => void;\n snapsEnabled: 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"]}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@w3ux/react-connect-kit",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"license": "GPL-3.0-only",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
7
7
|
"@chainsafe/metamask-polkadot-adapter": "^0.6.0",
|
|
8
8
|
"@polkadot/util": "^12.6.2",
|
|
9
9
|
"@polkagate/extension-dapp": "^0.46.7-22",
|
|
10
|
-
"@w3ux/extension-assets": "0.
|
|
10
|
+
"@w3ux/extension-assets": "^0.2.3",
|
|
11
11
|
"@w3ux/hooks": "^0.0.3",
|
|
12
12
|
"@w3ux/utils": "^0.0.2"
|
|
13
13
|
}
|