Skip to content

Commit e611ef9

Browse files
authored
Fix/network change hooks (#155)
* Fix `onNetworkChange` and #153 * Add changeset
1 parent 4c2056d commit e611ef9

File tree

2 files changed

+66
-48
lines changed

2 files changed

+66
-48
lines changed

.changeset/lucky-starfishes-bow.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@web3-ui/hooks': patch
3+
---
4+
5+
Fix issues related to accountChange and networkChange

packages/hooks/src/Provider.tsx

Lines changed: 61 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ export interface Web3ContextType {
1616
network: number;
1717
}
1818

19-
export const Web3Context = React.createContext<Web3ContextType | undefined>(undefined);
19+
export const Web3Context = React.createContext<Web3ContextType | undefined>(
20+
undefined
21+
);
2022

2123
export interface ProviderProps {
2224
/**
@@ -55,16 +57,18 @@ export const Provider: React.FC<ProviderProps> = ({
5557
children,
5658
network,
5759
infuraId,
58-
extraWalletProviders = [],
60+
extraWalletProviders = []
5961
}) => {
6062
const [signer, setSigner] = React.useState<null | JsonRpcSigner>();
61-
const [provider, setProvider] = React.useState<ethers.providers.Web3Provider | null>();
63+
const [
64+
provider,
65+
setProvider
66+
] = React.useState<ethers.providers.Web3Provider | null>();
6267
const [userAddress, setUserAddress] = React.useState<null | string>();
6368
const [web3Modal, setWeb3Modal] = React.useState<Web3Modal>();
6469
const [chainId, setChainId] = React.useState<number | null>();
6570
const [connected, setConnected] = React.useState<boolean>(false);
6671
const [correctNetwork, setCorrectNetwork] = React.useState<boolean>(true);
67-
const [connection, setConnection] = React.useState<any>();
6872

6973
const connectWallet = React.useCallback(async () => {
7074
const defaulProviderOptions = {
@@ -76,71 +80,78 @@ export const Provider: React.FC<ProviderProps> = ({
7680
rpc: {
7781
1: `https://eth-mainnet.alchemyapi.io/v2/${infuraId}`, // mainnet // For more WalletConnect providers: https://docs.walletconnect.org/quick-start/dapps/web3-provider#required
7882
42: `https://kovan.infura.io/v3/${infuraId}`,
79-
100: 'https://dai.poa.network', // xDai
80-
},
81-
},
82-
},
83+
100: 'https://dai.poa.network' // xDai
84+
}
85+
}
86+
}
8387
};
8488

8589
const web3Modal = new Web3Modal({
86-
providerOptions: Object.assign(defaulProviderOptions, ...extraWalletProviders),
90+
providerOptions: Object.assign(
91+
defaulProviderOptions,
92+
...extraWalletProviders
93+
)
8794
});
8895
setWeb3Modal(web3Modal);
8996
const connection = await web3Modal.connect();
90-
setConnection(connection);
9197
const provider = new ethers.providers.Web3Provider(connection);
9298
setProvider(provider);
93-
const chainId = await provider.getNetwork().then(network => network.chainId);
99+
const chainId = await provider
100+
.getNetwork()
101+
.then(network => network.chainId);
94102
setChainId(chainId);
95103
setCorrectNetwork(chainId === network);
96104
const signer = provider.getSigner();
97105
setSigner(signer);
98106
setUserAddress(await signer.getAddress());
99107
setConnected(true);
100108

101-
connection.on('chainChanged', onNetworkChange);
102-
connection.on('accountsChanged', onAccountsChanged);
103-
connection.on('disconnect', onDisconnect);
109+
connection.on('chainChanged', async (newChainId: string) => {
110+
const formattedChainId = +newChainId.split('0x')[1];
111+
setChainId(formattedChainId);
112+
setCorrectNetwork(formattedChainId === network);
113+
const provider = new ethers.providers.Web3Provider(connection);
114+
setProvider(provider);
115+
const signer = provider.getSigner();
116+
setSigner(signer);
117+
setUserAddress(await signer.getAddress());
118+
setConnected(true);
119+
});
120+
121+
connection.on('accountsChanged', async (accounts: string[]) => {
122+
if (accounts.length === 0) {
123+
// The user has disconnected their account from Metamask
124+
web3Modal?.clearCachedProvider();
125+
disconnectWallet();
126+
return;
127+
}
128+
const provider = new ethers.providers.Web3Provider(connection);
129+
setProvider(provider);
130+
const chainId = await provider
131+
.getNetwork()
132+
.then(network => network.chainId);
133+
setChainId(chainId);
134+
setCorrectNetwork(chainId === network);
135+
const signer = provider.getSigner();
136+
setSigner(signer);
137+
setUserAddress(await signer.getAddress());
138+
setConnected(true);
139+
});
140+
141+
connection.on('disconnect', async () => {
142+
web3Modal?.clearCachedProvider();
143+
disconnectWallet();
144+
});
104145
}, [
105146
Web3Modal,
106147
web3Modal,
107148
WalletConnectProvider,
108149
network,
109150
infuraId,
110151
ethers,
111-
correctNetwork,
112-
connection,
152+
correctNetwork
113153
]);
114154

115-
const onNetworkChange = async (newChainId: string) => {
116-
const formattedChainId = +newChainId.split('0x')[1];
117-
setChainId(formattedChainId);
118-
setCorrectNetwork(formattedChainId === network);
119-
const provider = new ethers.providers.Web3Provider(connection);
120-
setProvider(provider);
121-
const signer = provider.getSigner();
122-
setSigner(signer);
123-
setUserAddress(await signer.getAddress());
124-
setConnected(true);
125-
};
126-
127-
const onAccountsChanged = async () => {
128-
const provider = new ethers.providers.Web3Provider(connection);
129-
setProvider(provider);
130-
const chainId = await provider.getNetwork().then(network => network.chainId);
131-
setChainId(chainId);
132-
setCorrectNetwork(chainId === network);
133-
const signer = provider.getSigner();
134-
setSigner(signer);
135-
setUserAddress(await signer.getAddress());
136-
setConnected(true);
137-
};
138-
139-
const onDisconnect = async () => {
140-
web3Modal?.clearCachedProvider();
141-
disconnectWallet();
142-
};
143-
144155
const disconnectWallet = React.useCallback(() => {
145156
web3Modal?.clearCachedProvider();
146157
setSigner(null);
@@ -158,7 +169,7 @@ export const Provider: React.FC<ProviderProps> = ({
158169
provider,
159170
network,
160171
chainId,
161-
correctNetwork,
172+
correctNetwork
162173
}),
163174
[
164175
connectWallet,
@@ -169,9 +180,11 @@ export const Provider: React.FC<ProviderProps> = ({
169180
provider,
170181
network,
171182
chainId,
172-
correctNetwork,
183+
correctNetwork
173184
]
174185
);
175186

176-
return <Web3Context.Provider value={{ ...value }}>{children}</Web3Context.Provider>;
187+
return (
188+
<Web3Context.Provider value={{ ...value }}>{children}</Web3Context.Provider>
189+
);
177190
};

0 commit comments

Comments
 (0)