From 1e486cc1f623df6f4c15b9a844b46c3f569a8b99 Mon Sep 17 00:00:00 2001 From: Matej Lubej Date: Wed, 13 Mar 2024 06:19:34 +0100 Subject: [PATCH 1/2] Reset HomePage state upon account change --- frontend/src/pages/HomePage/index.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/HomePage/index.tsx b/frontend/src/pages/HomePage/index.tsx index 6d69a53..70553df 100644 --- a/frontend/src/pages/HomePage/index.tsx +++ b/frontend/src/pages/HomePage/index.tsx @@ -1,4 +1,4 @@ -import { FC, useState } from 'react' +import { FC, useEffect, useState } from 'react' import { CaretRightIcon } from '../../components/icons/CaretRightIcon.tsx' import { Button } from '../../components/Button' import { Card } from '../../components/Card' @@ -16,7 +16,7 @@ type MascotChoices = 0 | 1 | 2 export const HomePage: FC = () => { const { - state: { isConnected }, + state: { isConnected, account }, vote, canVoteOnPoll, } = useWeb3() @@ -31,6 +31,11 @@ export const HomePage: FC = () => { const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState('') + useEffect(() => { + setPageStatus('vote') + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [account]) + const handleSelectChoice = (choice: MascotChoices) => { setSelectedChoice(choice) } From 416db49dbdb4406dc3354f9bb3298587d8d134d2 Mon Sep 17 00:00:00 2001 From: Matej Lubej Date: Wed, 13 Mar 2024 22:19:40 +0100 Subject: [PATCH 2/2] Refactor signer & pollManager to vote - there is no need to hold the signer & pollManager in Web3Provider state --- frontend/src/providers/Web3Context.ts | 4 +--- frontend/src/providers/Web3Provider.tsx | 18 +++++------------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/frontend/src/providers/Web3Context.ts b/frontend/src/providers/Web3Context.ts index 95ad525..877a496 100644 --- a/frontend/src/providers/Web3Context.ts +++ b/frontend/src/providers/Web3Context.ts @@ -1,6 +1,6 @@ import { createContext } from 'react' import * as sapphire from '@oasisprotocol/sapphire-paratime' -import { BigNumberish, BrowserProvider, Signer, TransactionResponse } from 'ethers' +import { BigNumberish, BrowserProvider, TransactionResponse } from 'ethers' import { type PollManager } from '@oasisprotocol/dapp-voting-backend/src/contracts' import { DefaultReturnType } from '@oasisprotocol/dapp-voting-backend/src/contracts/common.ts' import { Poll } from '../types' @@ -10,11 +10,9 @@ export interface Web3ProviderState { isVoidSignerConnected: boolean ethProvider: BrowserProvider | null sapphireEthProvider: (BrowserProvider & sapphire.SapphireAnnex) | null - signer: Signer | null account: string | null explorerBaseUrl: string | null chainName: string | null - pollManager: PollManager | null pollManagerVoidSigner: PollManager | null } diff --git a/frontend/src/providers/Web3Provider.tsx b/frontend/src/providers/Web3Provider.tsx index 0d625ef..d1f072f 100644 --- a/frontend/src/providers/Web3Provider.tsx +++ b/frontend/src/providers/Web3Provider.tsx @@ -21,11 +21,9 @@ const web3ProviderInitialState: Web3ProviderState = { isVoidSignerConnected: false, ethProvider: null, sapphireEthProvider: null, - signer: null, account: null, explorerBaseUrl: null, chainName: null, - pollManager: null, pollManagerVoidSigner: null, } @@ -138,17 +136,12 @@ export const Web3ContextProvider: FC = ({ children }) => { const network = await sapphireEthProvider.getNetwork() _setNetworkSpecificVars(network.chainId, sapphireEthProvider) - const signer = sapphire.wrapEthersSigner(await sapphireEthProvider.getSigner()) - const pollManager = PollManager__factory.connect(VITE_CONTRACT_POLLMANAGER, signer) - setState(prevState => ({ ...prevState, isConnected: true, ethProvider, sapphireEthProvider, account, - signer, - pollManager, })) } catch (ex) { setState(prevState => ({ @@ -238,15 +231,14 @@ export const Web3ContextProvider: FC = ({ children }) => { } const vote = async (choiceId: BigNumberish) => { - const { pollManager, signer } = state + const { sapphireEthProvider } = state - if (!pollManager) { - throw new Error('[pollManager] not initialized!') + if (!sapphireEthProvider) { + throw new Error('[sapphireEthProvider] not initialized!') } - if (!signer) { - throw new Error('[signer] Signer not connected!') - } + const signer = sapphire.wrapEthersSigner(await sapphireEthProvider.getSigner()) + const pollManager = PollManager__factory.connect(VITE_CONTRACT_POLLMANAGER, signer) const unsignedTx = await pollManager.vote.populateTransaction(VITE_PROPOSAL_ID, choiceId, EMPTY_IN_DATA) unsignedTx.gasLimit = MAX_GAS_LIMIT