Newer
Older
import { InjectedAccountWithMeta, InjectedExtension } from '@polkadot/extension-inject/types';
import { useEffect, useState } from 'react';
import { documentReadyPromise } from './utils';
export interface UsePolkadotExtensionReturnType {
isReady: boolean;
accounts: InjectedAccountWithMeta[] | null;
error: Error | null;
injector: InjectedExtension | null;
actingAccount: InjectedAccountWithMeta | null;
setActingAccountIdx: (idx: number) => void;
}
export const usePolkadotExtension = (): UsePolkadotExtensionReturnType => {
const [isReady, setIsReady] = useState(false);
const [accounts, setAccounts] = useState<InjectedAccountWithMeta[] | null>(null);
const [extensions, setExtensions] = useState<InjectedExtension[] | null>(null);
const [actingAccountIdx, setActingAccountIdx] = useState<number>(0);
const [error, setError] = useState<Error | null>(null);
const [injector, setInjector] = useState<InjectedExtension | null>(null);
const actingAccount = accounts && accounts[actingAccountIdx];
useEffect(() => {
// This effect is used to setup the browser extension
const extensionSetup = async () => {
const extensionDapp = await import('@polkadot/extension-dapp');
);
const extensions = await injectedPromise;
setExtensions(extensions);
if (extensions.length === 0) {
if (accounts) {
setIsReady(true);
} else {
let unsubscribe: () => void;
// we subscribe to any account change
// note that `web3AccountsSubscribe` returns the function to unsubscribe
unsubscribe = await web3AccountsSubscribe((injectedAccounts) => {
setAccounts(injectedAccounts);
});
return () => unsubscribe && unsubscribe();
}
};
if (!isReady) {
// This effect is used to get the injector from the selected account
// and is triggered when the accounts or the actingAccountIdx change
const { web3FromSource } = await import('@polkadot/extension-dapp');
accounts && actingAccountIdx !== undefined ? accounts[actingAccountIdx] : undefined;
if (actingAccount?.meta.source) {
try {
const injector = await web3FromSource(actingAccount?.meta.source);
setInjector(injector);
} catch (e: any) {
setError(e);