169 похожих чатов

Import { useState, useCallback, useEffect } from "react"; import { useDispatch

} from "react-redux";

import { Web3 } from "web3";
import { connectSmart } from "../redux/blockchain/blockchainActions";
import {
refreshSmartContract,
updateAccount,
} from "../redux/blockchain/blockchainReducer";
import { switchNetworkIfRequired } from "../utils/utils";

import useError from "./useError";

const isInstalled = () => {
if (typeof window.ethereum !== "undefined") return true;
else return false;
};

const connectWallet = async (cb) => {
if (!isInstalled) throw new Error("Please install MetaMask plugin");
await window.ethereum.request({ method: "eth_requestAccounts" });

const provider = new Web3(window.ethereum);
const accounts = await provider.eth.getAccounts();
const chainId = await provider.eth.net.getId();

cb?.(provider, accounts, chainId);
};

const useMetamask = () => {
const listeners = [
{
type: "accountsChanged",
func: handleAccountsChanged,
},
{
type: "сhainChanged",
func: handleChainChanged,
},
{
type: "disconnect",
func: disconnect,
},
];

const [account, setAccount] = useState();
const [provider, setProvider] = useState();
const [chainId, setChainId] = useState();
const [network, setNetwork] = useState(97);

const [error, withErrorHandler] = useError();
const dispatch = useDispatch();

const connect = async () => {
await connectWallet((provider, accounts, chainId) => {
dispatch(connectSmart());
setProvider(provider);

handleChainChanged(chainId);
handleAccountsChanged(accounts);
});
};

const switchNetworkWrapped = withErrorHandler(
switchNetworkIfRequired(provider, chainId, network)
);

const listenersActions = useCallback(
(listener) => {
return () => {
listeners.map(({ type, func }) => {
return listener(type, func);
});
};
},
[listeners]
);

const refreshState = useCallback(() => {
setAccount();
setChainId();
setNetwork("");
setProvider("");

dispatch(refreshSmartContract());
}, [dispatch]);
const disconnect = useCallback(() => {
refreshState();
listenersActions(provider.removeListener());
}, [refreshState, listenersActions, provider]);

const handleAccountsChanged = useCallback(
(accounts) => {
if (accounts) {
setAccount(accounts[0]);
dispatch(updateAccount(accounts[0]));
}
},
[dispatch]
);

const handleChainChanged = useCallback(
(_hexChainId) => {
setChainId(_hexChainId);
switchNetworkWrapped();
},
[switchNetworkWrapped]
);

useEffect(() => {
if (!provider?.on) {
return;
}
listenersActions(provider.on());
}, [
listenersActions,
provider,
handleAccountsChanged,
handleChainChanged,
disconnect,
]);

return {
account,
connect,
disconnect,
};
};

export default useMetamask;

1 ответов

14 просмотров

Удали

Похожие вопросы

Обсуждают сегодня

Всем привет. Сейчас я изучаю erlang по книге Erlang and OTP in action. Дошел до главы где реализуется первый gen server на примере tcp rpc сервера. Меня очень сильно смутил ко...
Freezing Death
10
У меня это всегда вопрос вызывало.. Нафига писать код так, чтобы потом ошибки вылавливать?
Nik
44
что за асемблер кста?
Shvabrikk Nya
19
Добрый день! Пробую отловить исключение EConvertError: function _TryTextToDouble(var DoubleVar: Extended; Text: String): Boolean; begin try DoubleVar := StrToFloat...
Kirill Filippenok
19
всем привет. реально ли понять чем в процессе занята память? delphi/linux, процесс свой
Handatros
12
Подскажите... Есть ли название у способа разработки кода, в котором: сперва пишут минимальную рабочую структуру: Напр. ввод, обработка, вывод, контроль. Потом эту структуру д...
Budemposmotret
6
В дизассемблере вижу, что строки пихают в регистры через lea, почему так, а не через mov?
Oleg
8
А где @Grinyaha уважаемый пропал?
Am Ambrion
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Коллеги, а не могли бы вы подсказать, как происходит оптимизация кода при выполнении кода julia? (Точнее, как управлять уровнем оптимизации, аналогично LLVM/GCC). Потому что...
Илья Гаража
5
Карта сайта