Commit e25be8df authored by tom's avatar tom

update `Web3Modal` to v3

Fixes #1314
parent 2605cd63
...@@ -2,6 +2,8 @@ import type CspDev from 'csp-dev'; ...@@ -2,6 +2,8 @@ import type CspDev from 'csp-dev';
import config from 'configs/app'; import config from 'configs/app';
import { KEY_WORDS } from '../utils';
export function walletConnect(): CspDev.DirectiveDescriptor { export function walletConnect(): CspDev.DirectiveDescriptor {
if (!config.features.blockchainInteraction.isEnabled) { if (!config.features.blockchainInteraction.isEnabled) {
return {}; return {};
...@@ -9,11 +11,13 @@ export function walletConnect(): CspDev.DirectiveDescriptor { ...@@ -9,11 +11,13 @@ export function walletConnect(): CspDev.DirectiveDescriptor {
return { return {
'connect-src': [ 'connect-src': [
'*.web3modal.com',
'*.walletconnect.com', '*.walletconnect.com',
'wss://relay.walletconnect.com', 'wss://relay.walletconnect.com',
'wss://www.walletlink.org', 'wss://www.walletlink.org',
], ],
'img-src': [ 'img-src': [
KEY_WORDS.BLOB,
'*.walletconnect.com', '*.walletconnect.com',
], ],
}; };
......
import { ChakraProvider } from '@chakra-ui/react'; import { ChakraProvider } from '@chakra-ui/react';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { w3mProvider } from '@web3modal/ethereum'; import { createWeb3Modal } from '@web3modal/wagmi/react';
import React from 'react'; import React from 'react';
import { configureChains, createConfig, WagmiConfig } from 'wagmi'; import { configureChains, createConfig, WagmiConfig } from 'wagmi';
import { mainnet } from 'wagmi/chains'; import { mainnet } from 'wagmi/chains';
import { WalletConnectConnector } from 'wagmi/connectors/walletConnect';
import type { Props as PageProps } from 'nextjs/getServerSideProps'; import type { Props as PageProps } from 'nextjs/getServerSideProps';
...@@ -33,18 +34,26 @@ const defaultAppContext = { ...@@ -33,18 +34,26 @@ const defaultAppContext = {
}; };
// >>> Web3 stuff // >>> Web3 stuff
const { publicClient } = configureChains( const { publicClient, chains } = configureChains(
[ mainnet ], [ mainnet ],
[ [],
w3mProvider({ projectId: '' }),
],
); );
const wagmiConfig = createConfig({ const wagmiConfig = createConfig({
autoConnect: false, autoConnect: false,
connectors: [ ], connectors: [
new WalletConnectConnector({
options: { projectId: 'xxx' },
}),
],
publicClient, publicClient,
}); });
createWeb3Modal({
wagmiConfig,
projectId: 'xxx',
chains,
});
// <<<< // <<<<
const TestApp = ({ children, withSocket, appContext = defaultAppContext }: Props) => { const TestApp = ({ children, withSocket, appContext = defaultAppContext }: Props) => {
......
import { Alert, Button, Flex } from '@chakra-ui/react'; import { Alert, Button, Flex } from '@chakra-ui/react';
import { useWeb3Modal } from '@web3modal/react'; import { useWeb3Modal, useWeb3ModalState } from '@web3modal/wagmi/react';
import React from 'react'; import React from 'react';
import { useAccount, useDisconnect } from 'wagmi'; import { useAccount, useDisconnect } from 'wagmi';
...@@ -8,7 +8,8 @@ import * as mixpanel from 'lib/mixpanel/index'; ...@@ -8,7 +8,8 @@ import * as mixpanel from 'lib/mixpanel/index';
import AddressEntity from 'ui/shared/entities/address/AddressEntity'; import AddressEntity from 'ui/shared/entities/address/AddressEntity';
const ContractConnectWallet = () => { const ContractConnectWallet = () => {
const { open, isOpen } = useWeb3Modal(); const { open } = useWeb3Modal();
const { open: isOpen } = useWeb3ModalState();
const { disconnect } = useDisconnect(); const { disconnect } = useDisconnect();
const isMobile = useIsMobile(); const isMobile = useIsMobile();
const [ isModalOpening, setIsModalOpening ] = React.useState(false); const [ isModalOpening, setIsModalOpening ] = React.useState(false);
......
import { Alert, Box, Button, chakra, Flex, Link, Radio, RadioGroup } from '@chakra-ui/react'; import { Alert, Box, Button, chakra, Flex, Link, Radio, RadioGroup } from '@chakra-ui/react';
import { useWeb3Modal } from '@web3modal/react'; import { useWeb3Modal } from '@web3modal/wagmi/react';
import React from 'react'; import React from 'react';
import type { SubmitHandler } from 'react-hook-form'; import type { SubmitHandler } from 'react-hook-form';
import { useForm } from 'react-hook-form'; import { useForm } from 'react-hook-form';
......
import { useColorModeValue, useToken } from '@chakra-ui/react'; import { useColorMode } from '@chakra-ui/react';
import { jsonRpcProvider } from '@wagmi/core/providers/jsonRpc'; import { jsonRpcProvider } from '@wagmi/core/providers/jsonRpc';
import { EthereumClient, w3mConnectors } from '@web3modal/ethereum'; import { createWeb3Modal, useWeb3ModalTheme } from '@web3modal/wagmi/react';
import { Web3Modal } from '@web3modal/react';
import React from 'react'; import React from 'react';
import type { Chain } from 'wagmi'; import type { Chain } from 'wagmi';
import { configureChains, createConfig, WagmiConfig } from 'wagmi'; import { configureChains, createConfig, WagmiConfig } from 'wagmi';
import { WalletConnectConnector } from 'wagmi/connectors/walletConnect';
import config from 'configs/app'; import config from 'configs/app';
...@@ -41,29 +41,48 @@ const getConfig = () => { ...@@ -41,29 +41,48 @@ const getConfig = () => {
}, },
}; };
const chains = [ currentChain ]; const { publicClient, webSocketPublicClient, chains } = configureChains(
[ currentChain ],
const { publicClient } = configureChains(chains, [ [
jsonRpcProvider({ jsonRpcProvider({
rpc: () => ({ rpc: () => ({
http: config.chain.rpcUrl || '', http: config.chain.rpcUrl || '',
}), }),
}), }),
]); ],
);
const wagmiConfig = createConfig({ const wagmiConfig = createConfig({
autoConnect: true, autoConnect: true,
connectors: w3mConnectors({ projectId: feature.walletConnect.projectId, chains }), connectors: [
new WalletConnectConnector({
chains,
options: { projectId: feature.walletConnect.projectId, showQrModal: false },
}),
],
publicClient, publicClient,
webSocketPublicClient,
}); });
const ethereumClient = new EthereumClient(wagmiConfig, chains);
return { wagmiConfig, ethereumClient }; createWeb3Modal({
wagmiConfig,
projectId: feature.walletConnect.projectId,
chains,
themeVariables: {
'--w3m-font-family': 'Inter, sans-serif',
'--w3m-accent': '#2B6CB0', // blue.400
'--w3m-border-radius-master': '2px',
'--w3m-z-index': 1400,
},
});
return { wagmiConfig };
} catch (error) { } catch (error) {
return { wagmiConfig: undefined, ethereumClient: undefined }; return { };
} }
}; };
const { wagmiConfig, ethereumClient } = getConfig(); const { wagmiConfig } = getConfig();
interface Props { interface Props {
children: React.ReactNode; children: React.ReactNode;
...@@ -71,27 +90,23 @@ interface Props { ...@@ -71,27 +90,23 @@ interface Props {
} }
const Web3ModalProvider = ({ children, fallback }: Props) => { const Web3ModalProvider = ({ children, fallback }: Props) => {
const modalZIndex = useToken<string>('zIndices', 'modal'); const { colorMode } = useColorMode();
const web3ModalTheme = useColorModeValue('light', 'dark'); const { setThemeMode } = useWeb3ModalTheme();
React.useEffect(() => {
if (wagmiConfig && feature.isEnabled) {
setThemeMode(colorMode);
}
}, [ colorMode, setThemeMode ]);
if (!wagmiConfig || !ethereumClient || !feature.isEnabled) { if (!wagmiConfig || !feature.isEnabled) {
return typeof fallback === 'function' ? fallback() : (fallback || <>{ children }</>); // eslint-disable-line react/jsx-no-useless-fragment return typeof fallback === 'function' ? fallback() : (fallback || <>{ children }</>); // eslint-disable-line react/jsx-no-useless-fragment
} }
return ( return (
<>
<WagmiConfig config={ wagmiConfig }> <WagmiConfig config={ wagmiConfig }>
{ children } { children }
</WagmiConfig> </WagmiConfig>
<Web3Modal
projectId={ feature.walletConnect.projectId }
ethereumClient={ ethereumClient }
themeMode={ web3ModalTheme }
themeVariables={{
'--w3m-z-index': modalZIndex,
}}
/>
</>
); );
}; };
......
import { useWeb3Modal } from '@web3modal/react'; import { useWeb3Modal, useWeb3ModalState } from '@web3modal/wagmi/react';
import React from 'react'; import React from 'react';
import { useAccount, useDisconnect } from 'wagmi'; import { useAccount, useDisconnect } from 'wagmi';
import * as mixpanel from 'lib/mixpanel/index'; import * as mixpanel from 'lib/mixpanel/index';
export default function useWallet() { export default function useWallet() {
const { open, isOpen } = useWeb3Modal(); const { open } = useWeb3Modal();
const { open: isOpen } = useWeb3ModalState();
const { disconnect } = useDisconnect(); const { disconnect } = useDisconnect();
const [ isModalOpening, setIsModalOpening ] = React.useState(false); const [ isModalOpening, setIsModalOpening ] = React.useState(false);
const [ isClientLoaded, setIsClientLoaded ] = React.useState(false); const [ isClientLoaded, setIsClientLoaded ] = React.useState(false);
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment