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 ответов

4 просмотра

Удали

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
How to create an OS in C? what to study?
Linus
18
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
9
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
Карта сайта