@w3ux/react-connect-kit 3.0.4 → 3.0.5

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,10 +1,6 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import type { ExtensionsContextInterface } from './types';
3
3
  export declare const ExtensionsContext: import("react").Context<ExtensionsContextInterface>, useExtensions: () => ExtensionsContextInterface;
4
- export declare const ExtensionsProvider: ({ children, options, }: {
4
+ export declare const ExtensionsProvider: ({ children }: {
5
5
  children: ReactNode;
6
- options?: {
7
- chainSafeSnapEnabled?: boolean;
8
- polkagateSnapEnabled?: boolean;
9
- };
10
6
  }) => import("react/jsx-runtime").JSX.Element;
@@ -1,26 +1,21 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { web3Enable } from '@polkagate/extension-dapp';
3
2
  import extensions from '@w3ux/extension-assets';
4
3
  import { createSafeContext } from '@w3ux/hooks';
5
- import { setStateWithRef, withTimeout } from '@w3ux/utils';
4
+ import { setStateWithRef } from '@w3ux/utils';
6
5
  import { useEffect, useRef, useState } from 'react';
7
6
  export const [ExtensionsContext, useExtensions] = createSafeContext();
8
- export const ExtensionsProvider = ({ children, options, }) => {
7
+ export const ExtensionsProvider = ({ children }) => {
9
8
  const [checkingInjectedWeb3, setCheckingInjectedWeb3] = useState(true);
10
9
  const checkingInjectedWeb3Ref = useRef(checkingInjectedWeb3);
11
10
  const intervalInitialisedRef = useRef(false);
12
11
  const [extensionsStatus, setExtensionsStatus] = useState({});
13
12
  const extensionsStatusRef = useRef(extensionsStatus);
14
- const [polkaGateSnapEnabled] = useState(options?.polkagateSnapEnabled || false);
15
13
  let injectedWeb3Interval;
16
14
  const injectCounter = useRef(0);
17
15
  const handleClearInterval = async (hasInjectedWeb3) => {
18
16
  clearInterval(injectedWeb3Interval);
19
- if (polkaGateSnapEnabled) {
20
- await withTimeout(500, web3Enable('snap_only'));
21
- if (hasInjectedWeb3) {
22
- setStateWithRef(getExtensionsStatus(), setExtensionsStatus, extensionsStatusRef);
23
- }
17
+ if (hasInjectedWeb3) {
18
+ setStateWithRef(getExtensionsStatus(), setExtensionsStatus, extensionsStatusRef);
24
19
  }
25
20
  setStateWithRef(false, setCheckingInjectedWeb3, checkingInjectedWeb3Ref);
26
21
  };
@@ -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 { web3Enable } from '@polkagate/extension-dapp'\nimport extensions from '@w3ux/extension-assets'\nimport { createSafeContext } from '@w3ux/hooks'\nimport type { ExtensionStatus } from '@w3ux/types'\nimport { setStateWithRef, withTimeout } from '@w3ux/utils'\nimport type { ReactNode } from 'react'\nimport { useEffect, useRef, useState } from 'react'\nimport type { ExtensionsContextInterface } from './types'\n\nexport const [ExtensionsContext, useExtensions] =\n createSafeContext<ExtensionsContextInterface>()\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 extensions from '@w3ux/extension-assets'\nimport { createSafeContext } from '@w3ux/hooks'\nimport type { ExtensionStatus } from '@w3ux/types'\nimport { setStateWithRef } from '@w3ux/utils'\nimport type { ReactNode } from 'react'\nimport { useEffect, useRef, useState } from 'react'\nimport type { ExtensionsContextInterface } from './types'\n\nexport const [ExtensionsContext, useExtensions] =\n createSafeContext<ExtensionsContextInterface>()\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 = async (hasInjectedWeb3: boolean) => {\n clearInterval(injectedWeb3Interval)\n if (hasInjectedWeb3) {\n setStateWithRef(\n getExtensionsStatus(),\n setExtensionsStatus,\n extensionsStatusRef\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 // To trigger interval on soft page refreshes, no empty dependency array is provided to this\n // `useEffect`. Checks for `injectedWeb3` 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"]}
package/package.json CHANGED
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "name": "@w3ux/react-connect-kit",
3
- "version": "3.0.4",
3
+ "version": "3.0.5",
4
4
  "license": "GPL-3.0-only",
5
5
  "dependencies": {
6
- "@polkagate/extension-dapp": "^0.48.2",
7
- "@w3ux/extension-assets": "^2.0.0",
6
+ "@w3ux/extension-assets": "^2.1.0",
8
7
  "@w3ux/hooks": "^2.0.4",
9
8
  "@w3ux/utils": "^2.0.6"
10
9
  },