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

18 просмотров

Удали

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта