Newer
Older
import {
InjectedAccountWithMeta,
InjectedExtension,
} from "@polkadot/extension-inject/types";
import { useEffect, useState } from "react";
import { useIsMounted } from "./use-is-mounted";
import { documentReadyPromise } from "./utils";
accounts: InjectedAccountWithMeta[] | null;
error: Error | null;
export const extensionSetup = async () => {
const extensionDapp = await import("@polkadot/extension-dapp");
const { web3Accounts, web3Enable, web3AccountsSubscribe } = extensionDapp;
const enabledApps = await web3Enable("polkadot-extension");
console.log("enabled Apps", enabledApps);
if (enabledApps.length === 0) {
console.log("no extension");
return;
}
};
export const checkEnabled: (
extensionName: string
) => Promise<checkEnabledReturnType> = async (
extensionName: string = "polkadot-extension"
) => {
const extensionDapp = await import("@polkadot/extension-dapp");
const { web3Accounts, web3Enable } = extensionDapp;
try {
const enabledApps = await web3Enable(extensionName);
console.log("enabled Apps", enabledApps);
const w3Enabled = enabledApps.length > 0;
let accounts = null;
if (w3Enabled) {
accounts = await web3Accounts();
console.log("accounts", accounts);
return { accounts, error: null };
return {
accounts: null,
error: new Error(
"please allow your extension to access this dApp and refresh the page or install a substrate wallet"
),
};
} catch (error: any) {
return { accounts: null, error };
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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 isMounted = useIsMounted();
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(() => {
const setup = async () => {
const extensionDapp = await import("@polkadot/extension-dapp");
const { web3AccountsSubscribe, web3Enable, web3Accounts } = extensionDapp;
// const enabledApps = await web3Enable("polkadot-extension");
const injectedPromise = documentReadyPromise(() =>
web3Enable("polkadot-extension")
);
// const injectedPromise = await web3Enable("polkadot-extension");
const extensions = await injectedPromise;
setExtensions(extensions);
if (extensions.length === 0) {
console.log("no extension");
return;
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// const accounts = await web3Accounts();
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) {
setup();
}
}, [extensions, isReady]);
useEffect(() => {
const getInjector = async () => {
const { web3FromSource } = await import("@polkadot/extension-dapp");
const actingAccount =
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);