import { useCallback, useContext, useEffect, useState, } from 'react'; import { useTranslation } from 'react-i18next'; import { isWalletConnectProvider } from '../../../lib/provider'; import { parseChainId } from '../../../lib/chains'; import { SimpleTextBody } from '../../../components/Body/SimpleTextBody'; import { FooterButton } from '../../../components/Footer/FooterButton'; import { HeaderNavigation } from '../../../components/Header/HeaderNavigation'; import { SimpleLayout } from '../../../components/SimpleLayout/SimpleLayout'; import { ConnectWidgetViews } from '../../../context/view-context/ConnectViewContextTypes'; import { ConnectActions, ConnectContext } from '../context/ConnectContext'; import { ViewContext, ViewActions } from '../../../context/view-context/ViewContext'; import { addChainChangedListener, removeChainChangedListener } from '../../../lib'; import { ImmutablePlanetHero } from '../../../components/Hero/ImmutablePlanetHero'; export function SwitchNetworkZkEVM() { const { t } = useTranslation(); const { viewDispatch } = useContext(ViewContext); const { connectDispatch, connectState } = useContext(ConnectContext); const { checkout, provider, sendCloseEvent } = connectState; const [buttonTextKey, setButtonTextKey] = useState(t('views.SWITCH_NETWORK.zkEVM.button.text')); useEffect(() => { if (!provider || !checkout) return; const checkCorrectNetwork = async () => { const currentChainId = await provider.send('eth_chainId', []); const parsedChainId = parseChainId(currentChainId); if (parsedChainId === checkout.config.l2ChainId) { connectDispatch({ payload: { type: ConnectActions.SET_PROVIDER, provider, }, }); viewDispatch({ payload: { type: ViewActions.UPDATE_VIEW, view: { type: ConnectWidgetViews.SUCCESS, }, }, }); } }; addChainChangedListener(provider, checkCorrectNetwork); // eslint-disable-next-line consistent-return return () => { removeChainChangedListener(provider, checkCorrectNetwork); }; }, [checkout, provider]); const switchNetwork = useCallback(async () => { if (!provider || !checkout) return; if (!provider.send) return; const currentChainId = await provider.send('eth_chainId', []) as `0x${string}`; const parsedChainId = parseChainId(currentChainId); if (parsedChainId === checkout.config.l2ChainId) { connectDispatch({ payload: { type: ConnectActions.SET_PROVIDER, provider, }, }); viewDispatch({ payload: { type: ViewActions.UPDATE_VIEW, view: { type: ConnectWidgetViews.SUCCESS, }, }, }); return; } try { let walletName = ''; if (isWalletConnectProvider(provider)) { walletName = (provider.ethereumProvider as any)?.session?.peer?.metadata?.name.toLowerCase(); } if (walletName.includes('metamask')) { try { await checkout.addNetwork({ provider, chainId: checkout.config.l2ChainId, }); connectDispatch({ payload: { type: ConnectActions.SET_PROVIDER, provider, }, }); viewDispatch({ payload: { type: ViewActions.UPDATE_VIEW, view: { type: ConnectWidgetViews.SUCCESS, }, }, }); return; } catch { // eslint-disable-next-line no-console console.warn('Failed to add network to wallet, skipping add network'); } } const switchRes = await checkout.switchNetwork({ provider, chainId: checkout.config.l2ChainId, }); connectDispatch({ payload: { type: ConnectActions.SET_PROVIDER, provider: switchRes.provider, }, }); viewDispatch({ payload: { type: ViewActions.UPDATE_VIEW, view: { type: ConnectWidgetViews.SUCCESS, }, }, }); } catch (err: any) { setButtonTextKey(t('views.SWITCH_NETWORK.zkEVM.button.retryText')); } }, [provider, checkout]); return ( )} footer={( )} heroContent={} floatHeader > {isWalletConnectProvider(provider) ? ( t('views.SWITCH_NETWORK.zkEVM.bodyWalletConnect')) : ( t('views.SWITCH_NETWORK.zkEVM.body'))} ); }