@web3-react/walletconnect-connector#WalletConnectConnector TypeScript Examples
The following examples show how to use
@web3-react/walletconnect-connector#WalletConnectConnector.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: connectors.ts From dxvote with GNU Affero General Public License v3.0 | 6 votes |
findWalletType = (connector: any) => {
if (connector instanceof InjectedConnector) {
return 'MetaMask';
} else if (connector instanceof WalletConnectConnector) {
return 'WalletConnect';
} else {
return null;
}
}
Example #2
Source File: web3React.ts From glide-frontend with GNU General Public License v3.0 | 6 votes |
walletconnect = new WalletConnectConnector({
// rpc: { [chainId]: rpcUrl },
rpc: {
1: `https://mainnet.infura.io/v3/${process.env.REACT_APP_INFURA_KEY}`,
20: 'https://api.elastos.io/eth',
56: 'https://bsc-dataseed1.defibit.io/',
128: 'https://http-mainnet.hecochain.com',
},
bridge: 'https://walletconnect.elastos.net/v2',
qrcode: true,
// pollingInterval: POLLING_INTERVAL,
})
Example #3
Source File: connectors.ts From index-ui with MIT License | 6 votes |
walletconnect = new WalletConnectConnector({
rpc: {
[MAINNET_CHAIN_DATA.chainId]: MAINNET_CHAIN_DATA.rpcUrl,
[POLYGON_CHAIN_DATA.chainId]: POLYGON_CHAIN_DATA.rpcUrl,
},
bridge: 'https://bridge.walletconnect.org',
qrcode: true,
pollingInterval: 15000,
supportedChainIds: [1, 137],
})
Example #4
Source File: useAuth.ts From mozartfinance-swap-interface with GNU General Public License v3.0 | 6 votes |
useAuth = () => {
const { activate, deactivate } = useWeb3React()
const { toastError } = useToast()
const login = useCallback((connectorID: ConnectorNames) => {
const connector = connectorsByName[connectorID]
if (connector) {
activate(connector, async (error: Error) => {
window.localStorage.removeItem(connectorLocalStorageKey)
if (error instanceof UnsupportedChainIdError) {
toastError('Unsupported Chain Id', 'Unsupported Chain Id Error. Check your chain Id.')
} else if (error instanceof NoEthereumProviderError || error instanceof NoBscProviderError) {
toastError('Provider Error', 'No provider was found')
} else if (
error instanceof UserRejectedRequestErrorInjected ||
error instanceof UserRejectedRequestErrorWalletConnect
) {
if (connector instanceof WalletConnectConnector) {
const walletConnector = connector as WalletConnectConnector
walletConnector.walletConnectProvider = null
}
toastError('Authorization Error', 'Please authorize to access your account')
} else {
toastError(error.name, error.message)
}
})
} else {
toastError("Can't find connector", 'The connector config is wrong')
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
return { login, logout: deactivate }
}
Example #5
Source File: Web3ReactConnectorButton.tsx From useDApp with MIT License | 6 votes |
Web3ReactConnectorButton = () => {
const { account, activate, deactivate } = useEthers()
const { ens } = useLookupAddress(account)
const [showModal, setShowModal] = useState(false)
const [activateError, setActivateError] = useState('')
const { error } = useEthers()
useEffect(() => {
if (error) {
setActivateError(error.message)
}
}, [error])
const activateProvider = async () => {
const web3Connector = new WalletConnectConnector({
rpc: NETWORK_CONNECTIONS,
bridge: 'https://bridge.walletconnect.org',
qrcode: true,
})
await activate(web3Connector)
}
return (
<Account>
<ErrorWrapper>{activateError}</ErrorWrapper>
{showModal && <AccountModal setShowModal={setShowModal} />}
{account ? (
<>
<AccountLabel onClick={() => setShowModal(!showModal)}>{ens ?? shortenAddress(account)}</AccountLabel>
<LoginButton onClick={() => deactivate()}>Disconnect</LoginButton>
</>
) : (
<LoginButton onClick={activateProvider}>Connect</LoginButton>
)}
</Account>
)
}
Example #6
Source File: web3.ts From dope-monorepo with GNU General Public License v3.0 | 6 votes |
walletconnect = new WalletConnectConnector({
rpc: Object.keys(NETWORK).reduce(
(rpcs, chainId) => ({
...rpcs,
[chainId]: NETWORK[parseInt(chainId, 10) as 1 | 10 | 42 | 69].rpc,
}),
{},
),
bridge: 'https://bridge.walletconnect.org',
qrcode: true,
})
Example #7
Source File: useAuth.ts From pancake-swap-testnet with MIT License | 6 votes |
useAuth = () => {
const { activate, deactivate } = useWeb3React()
const { toastError } = useToast()
const login = useCallback((connectorID: ConnectorNames) => {
const connector = connectorsByName[connectorID]
if (connector) {
activate(connector, async (error: Error) => {
window.localStorage.removeItem(connectorLocalStorageKey)
if (error instanceof UnsupportedChainIdError) {
toastError('Unsupported Chain Id', 'Unsupported Chain Id Error. Check your chain Id.')
} else if (error instanceof NoEthereumProviderError || error instanceof NoBscProviderError) {
toastError('Provider Error', 'No provider was found')
} else if (
error instanceof UserRejectedRequestErrorInjected ||
error instanceof UserRejectedRequestErrorWalletConnect
) {
if (connector instanceof WalletConnectConnector) {
const walletConnector = connector as WalletConnectConnector
walletConnector.walletConnectProvider = null
}
toastError('Authorization Error', 'Please authorize to access your account')
} else {
toastError(error.name, error.message)
}
})
} else {
toastError("Can't find connector", 'The connector config is wrong')
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
return { login, logout: deactivate }
}
Example #8
Source File: useAuth.ts From pancake-swap-exchange-testnet with GNU General Public License v3.0 | 6 votes |
useAuth = () => {
const { activate, deactivate } = useWeb3React()
const { toastError } = useToast()
const login = useCallback((connectorID: ConnectorNames) => {
const connector = connectorsByName[connectorID]
if (connector) {
activate(connector, async (error: Error) => {
window.localStorage.removeItem(connectorLocalStorageKey)
if (error instanceof UnsupportedChainIdError) {
toastError('Unsupported Chain Id', 'Unsupported Chain Id Error. Check your chain Id.')
} else if (error instanceof NoEthereumProviderError || error instanceof NoBscProviderError) {
toastError('Provider Error', 'No provider was found')
} else if (
error instanceof UserRejectedRequestErrorInjected ||
error instanceof UserRejectedRequestErrorWalletConnect
) {
if (connector instanceof WalletConnectConnector) {
const walletConnector = connector as WalletConnectConnector
walletConnector.walletConnectProvider = null
}
toastError('Authorization Error', 'Please authorize to access your account')
} else {
toastError(error.name, error.message)
}
})
} else {
toastError("Can't find connector", 'The connector config is wrong')
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
return { login, logout: deactivate }
}
Example #9
Source File: index.ts From goose-frontend-amm with GNU General Public License v3.0 | 5 votes |
walletconnect = new WalletConnectConnector({
rpc: { 1: NETWORK_URL },
bridge: 'https://bridge.walletconnect.org',
qrcode: true,
pollingInterval: 15000,
})
Example #10
Source File: web3React.ts From vvs-ui with GNU General Public License v3.0 | 5 votes |
walletconnect = new WalletConnectConnector({
rpc: { [chainId]: rpcUrl },
qrcode: true,
pollingInterval: POLLING_INTERVAL,
})
Example #11
Source File: index.ts From mozartfinance-swap-interface with GNU General Public License v3.0 | 5 votes |
walletconnect = new WalletConnectConnector({
rpc: { [NETWORK_CHAIN_ID]: NETWORK_URL },
bridge: 'https://bridge.walletconnect.org',
qrcode: true,
pollingInterval: 15000,
})
Example #12
Source File: index.ts From pancake-swap-exchange-testnet with GNU General Public License v3.0 | 5 votes |
walletconnect = new WalletConnectConnector({
rpc: { [NETWORK_CHAIN_ID]: NETWORK_URL },
bridge: 'https://bridge.walletconnect.org',
qrcode: true,
pollingInterval: 15000,
})
Example #13
Source File: index.ts From pancake-swap-testnet with MIT License | 5 votes |
walletconnect = new WalletConnectConnector({
rpc: { [NETWORK_CHAIN_ID]: NETWORK_URL },
bridge: 'https://bridge.walletconnect.org',
qrcode: true,
pollingInterval: 15000,
})
Example #14
Source File: index.ts From pancake-swap-interface-v1 with GNU General Public License v3.0 | 5 votes |
walletconnect = new WalletConnectConnector({
rpc: { [NETWORK_CHAIN_ID]: NETWORK_URL },
bridge: 'https://bridge.walletconnect.org',
qrcode: true,
pollingInterval: 15000,
})
Example #15
Source File: index.ts From nft-market with MIT License | 5 votes |
walletconnect = new WalletConnectConnector({
qrcode: true,
// pollingInterval: POLLING_INTERVAL,
infuraId: process.env.REACT_APP_INFURA_ID,
rpc: { 4: RPC_URLS[4] },
chainId: 4,
supportedChainIds: [4],
})
Example #16
Source File: index.ts From forward.swaps with GNU General Public License v3.0 | 5 votes |
walletconnect = new WalletConnectConnector({
rpc: { 1: NETWORK_URL },
bridge: 'https://bridge.walletconnect.org',
qrcode: true,
pollingInterval: 15000
})
Example #17
Source File: index.ts From luaswap-interface with GNU General Public License v3.0 | 5 votes |
walletconnect = new WalletConnectConnector({
supportedChainIds: [1, 3, 4, 5, 42, 88, 89, 99],
rpc: { 1: NETWORK_URL, 88: 'https://rpc.tomochain.com' },
qrcode: true
})
Example #18
Source File: useAuth.ts From vvs-ui with GNU General Public License v3.0 | 5 votes |
useAuth = () => {
const { t } = useTranslation()
const dispatch = useAppDispatch()
const { activate, deactivate } = useWeb3React()
const { toastError } = useToast()
const login = useCallback(
(connectorID: ConnectorNames) => {
const connector = connectorsByName[connectorID]
if (connector) {
window.gtag('event', 'wallet', {
hitType: 'event',
eventCategory: 'Wallet',
eventAction: 'connect',
eventLabel: connectorID,
})
activate(connector, async (error: Error) => {
if (error instanceof UnsupportedChainIdError && connectorID !== ConnectorNames.CDCDefiWallet) {
const hasSetup = await setupNetwork()
if (hasSetup) {
activate(connector)
}
} else {
window.localStorage.removeItem(connectorLocalStorageKey)
if (error instanceof NoEthereumProviderError || error instanceof NoBscProviderError) {
toastError(t('Provider Error'), t('No provider was found'))
} else if (
error instanceof UserRejectedRequestErrorInjected ||
error instanceof UserRejectedRequestErrorWalletConnect
) {
if (connector instanceof WalletConnectConnector) {
const walletConnector = connector as WalletConnectConnector
walletConnector.walletConnectProvider = null
}
toastError(t('Authorization Error'), t('Please authorize to access your account'))
} else {
/** :TODO: remote this code */
if(error instanceof UnsupportedChainIdError && connectorID === ConnectorNames.CDCDefiWallet) {
toastError('Wrong Network', 'Please switch to [Cronos Beta] on Chrome Wallet Extension to connect')
return
}
toastError(error.name, error.message)
}
}
})
} else {
toastError(t('Unable to find connector'), t('The connector config is wrong'))
}
},
[t, activate, toastError],
)
const logout = useCallback(() => {
dispatch(profileClear())
deactivate()
// This localStorage key is set by @web3-react/walletconnect-connector
if (window.localStorage.getItem('walletconnect')) {
connectorsByName.walletconnect.close()
connectorsByName.walletconnect.walletConnectProvider = null
}
window.localStorage.removeItem(connectorLocalStorageKey)
}, [deactivate, dispatch])
return { login, logout }
}
Example #19
Source File: connectors.ts From dxvote with GNU Affero General Public License v3.0 | 5 votes |
export function getWalletConnectConnector(
customRpcUrls: Record<ChainConfig['id'], string>
) {
return new WalletConnectConnector({
rpc: customRpcUrls,
qrcode: true,
});
}
Example #20
Source File: useAuth.ts From glide-frontend with GNU General Public License v3.0 | 5 votes |
useAuth = () => {
const { t } = useTranslation()
const dispatch = useAppDispatch()
const { activate, deactivate } = useWeb3React()
const { toastError } = useToast()
const login = useCallback(
(connectorID: ConnectorNames) => {
const connector = connectorsByName[connectorID]
if (connector) {
activate(connector, async (error: Error) => {
if (error instanceof UnsupportedChainIdError) {
const hasSetup = await setupNetwork(20) // specify network to switch to
if (hasSetup) {
activate(connector)
}
} else {
window.localStorage.removeItem(connectorLocalStorageKey)
if (error instanceof NoEthereumProviderError || error instanceof NoBscProviderError) {
toastError(t('Provider Error'), t('No provider was found'))
} else if (
error instanceof UserRejectedRequestErrorInjected ||
error instanceof UserRejectedRequestErrorWalletConnect
) {
if (connector instanceof WalletConnectConnector) {
const walletConnector = connector as WalletConnectConnector
walletConnector.walletConnectProvider = null
}
toastError(t('Authorization Error'), t('Please authorize to access your account'))
} else {
toastError(error.name, error.message)
}
}
})
} else {
toastError(t('Unable to find connector'), t('The connector config is wrong'))
}
},
[t, activate, toastError],
)
const logout = useCallback(() => {
dispatch(profileClear())
deactivate()
// This localStorage key is set by @web3-react/walletconnect-connector
if (window.localStorage.getItem('walletconnect')) {
connectorsByName.walletconnect.close()
connectorsByName.walletconnect.walletConnectProvider = null
}
window.localStorage.removeItem("walletconnect")
}, [deactivate, dispatch])
return { login, logout }
}
Example #21
Source File: index.ts From dyp with Do What The F*ck You Want To Public License | 5 votes |
walletconnect = new WalletConnectConnector({
rpc: { 1: NETWORK_URL },
bridge: 'https://bridge.walletconnect.org',
qrcode: true,
pollingInterval: 15000
})
Example #22
Source File: index.ts From cuiswap with GNU General Public License v3.0 | 5 votes |
walletconnect = new WalletConnectConnector({
rpc: { 1: NETWORK_URL },
bridge: 'https://bridge.walletconnect.org',
qrcode: true,
pollingInterval: 15000
})
Example #23
Source File: index.ts From cheeseswap-interface with GNU General Public License v3.0 | 5 votes |
walletconnect = new WalletConnectConnector({
rpc: { 1: NETWORK_URL },
bridge: 'https://bridge.walletconnect.org',
qrcode: true,
})
Example #24
Source File: connectors.ts From hypertext with GNU General Public License v3.0 | 5 votes |
walletconnect = new WalletConnectConnector({
rpc: {
1: `https://${INFURA_PREFIXES[1]}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`,
},
bridge: 'https://bridge.walletconnect.org',
})
Example #25
Source File: index.ts From sybil-interface with GNU General Public License v3.0 | 5 votes |
walletconnect = new WalletConnectConnector({
rpc: { 1: NETWORK_URL },
bridge: 'https://bridge.walletconnect.org',
qrcode: true,
pollingInterval: 15000,
})
Example #26
Source File: index.ts From interface-v2 with GNU General Public License v3.0 | 5 votes |
walletconnect = new WalletConnectConnector({
rpc: { 137: NETWORK_URL },
bridge: 'https://bridge.walletconnect.org',
qrcode: true,
})
Example #27
Source File: index.tsx From nouns-monorepo with GNU General Public License v3.0 | 4 votes |
WalletConnectModal: React.FC<{ onDismiss: () => void }> = props => {
const { onDismiss } = props;
const { activate } = useEthers();
const supportedChainIds = [CHAIN_ID];
const wallets = (
<div className={classes.walletConnectModal}>
<WalletButton
onClick={() => {
const injected = new InjectedConnector({
supportedChainIds,
});
activate(injected);
}}
walletType={WALLET_TYPE.metamask}
/>
<WalletButton
onClick={() => {
const fortmatic = new FortmaticConnector({
apiKey: 'pk_live_60FAF077265B4CBA',
chainId: CHAIN_ID,
});
activate(fortmatic);
}}
walletType={WALLET_TYPE.fortmatic}
/>
<WalletButton
onClick={() => {
const walletlink = new WalletConnectConnector({
supportedChainIds,
chainId: CHAIN_ID,
rpc: {
[CHAIN_ID]: config.app.jsonRpcUri,
},
});
activate(walletlink);
}}
walletType={WALLET_TYPE.walletconnect}
/>
<WalletButton
onClick={() => {
const walletlink = new WalletLinkConnector({
appName: 'Nouns.WTF',
appLogoUrl: 'https://nouns.wtf/static/media/logo.cdea1650.svg',
url: config.app.jsonRpcUri,
supportedChainIds,
});
activate(walletlink);
}}
walletType={WALLET_TYPE.coinbaseWallet}
/>
<WalletButton
onClick={() => {
const injected = new InjectedConnector({
supportedChainIds,
});
activate(injected);
}}
walletType={WALLET_TYPE.brave}
/>
{/* <WalletButton
onClick={() => {
const ledger = new LedgerConnector({
//TODO: refactor
chainId: config.supportedChainId,
url: config.rinkebyJsonRpc,
});
activate(ledger);
}}
walletType={WALLET_TYPE.ledger}
/> */}
<WalletButton
onClick={() => {
const trezor = new TrezorConnector({
chainId: CHAIN_ID,
url: config.app.jsonRpcUri,
manifestAppUrl: 'https://nouns.wtf',
manifestEmail: '[email protected]',
});
activate(trezor);
}}
walletType={WALLET_TYPE.trezor}
/>
<div
className={clsx(classes.clickable, classes.walletConnectData)}
onClick={() => localStorage.removeItem('walletconnect')}
>
<Trans>Clear WalletConnect Data</Trans>
</div>
</div>
);
return (
<Modal title={<Trans>Connect your wallet</Trans>} content={wallets} onDismiss={onDismiss} />
);
}
Example #28
Source File: index.tsx From cuiswap with GNU General Public License v3.0 | 4 votes |
export default function WalletModal({
pendingTransactions,
confirmedTransactions,
ENSName
}: {
pendingTransactions: string[] // hashes of pending
confirmedTransactions: string[] // hashes of confirmed
ENSName?: string
}) {
// important that these are destructed from the account-specific web3-react context
const { active, account, connector, activate, error } = useWeb3React()
const [walletView, setWalletView] = useState(WALLET_VIEWS.ACCOUNT)
const [pendingWallet, setPendingWallet] = useState()
const [pendingError, setPendingError] = useState<boolean>()
const walletModalOpen = useWalletModalOpen()
const toggleWalletModal = useWalletModalToggle()
const previousAccount = usePrevious(account)
// close on connection, when logged out before
useEffect(() => {
if (account && !previousAccount && walletModalOpen) {
toggleWalletModal()
}
}, [account, previousAccount, toggleWalletModal, walletModalOpen])
// always reset to account view
useEffect(() => {
if (walletModalOpen) {
setPendingError(false)
setWalletView(WALLET_VIEWS.ACCOUNT)
}
}, [walletModalOpen])
// close modal when a connection is successful
const activePrevious = usePrevious(active)
const connectorPrevious = usePrevious(connector)
useEffect(() => {
if (walletModalOpen && ((active && !activePrevious) || (connector && connector !== connectorPrevious && !error))) {
setWalletView(WALLET_VIEWS.ACCOUNT)
}
}, [setWalletView, active, error, connector, walletModalOpen, activePrevious, connectorPrevious])
const tryActivation = async connector => {
let name = ''
Object.keys(SUPPORTED_WALLETS).map(key => {
if (connector === SUPPORTED_WALLETS[key].connector) {
return (name = SUPPORTED_WALLETS[key].name)
}
return true
})
// log selected wallet
ReactGA.event({
category: 'Wallet',
action: 'Change Wallet',
label: name
})
setPendingWallet(connector) // set wallet for pending view
setWalletView(WALLET_VIEWS.PENDING)
// if the connector is walletconnect and the user has already tried to connect, manually reset the connector
if (connector instanceof WalletConnectConnector && connector.walletConnectProvider?.wc?.uri) {
connector.walletConnectProvider = undefined
}
activate(connector, undefined, true).catch(error => {
if (error instanceof UnsupportedChainIdError) {
activate(connector) // a little janky...can't use setError because the connector isn't set
} else {
setPendingError(true)
}
})
}
// close wallet modal if fortmatic modal is active
useEffect(() => {
fortmatic.on(OVERLAY_READY, () => {
toggleWalletModal()
})
}, [toggleWalletModal])
// get wallets user can switch too, depending on device/browser
function getOptions() {
const isMetamask = window.ethereum && window.ethereum.isMetaMask
return Object.keys(SUPPORTED_WALLETS).map(key => {
const option = SUPPORTED_WALLETS[key]
// check for mobile options
if (isMobile) {
//disable portis on mobile for now
if (option.connector === portis) {
return null
}
if (!window.web3 && !window.ethereum && option.mobile) {
return (
<Option
onClick={() => {
option.connector !== connector && !option.href && tryActivation(option.connector)
}}
id={`connect-${key}`}
key={key}
active={option.connector && option.connector === connector}
color={option.color}
link={option.href}
header={option.name}
subheader={null}
icon={require('../../assets/images/' + option.iconName)}
/>
)
}
return null
}
// overwrite injected when needed
if (option.connector === injected) {
// don't show injected if there's no injected provider
if (!(window.web3 || window.ethereum)) {
if (option.name === 'MetaMask') {
return (
<Option
id={`connect-${key}`}
key={key}
color={'#E8831D'}
header={'Install Metamask'}
subheader={null}
link={'https://metamask.io/'}
icon={MetamaskIcon}
/>
)
} else {
return null //dont want to return install twice
}
}
// don't return metamask if injected provider isn't metamask
else if (option.name === 'MetaMask' && !isMetamask) {
return null
}
// likewise for generic
else if (option.name === 'Injected' && isMetamask) {
return null
}
}
// return rest of options
return (
!isMobile &&
!option.mobileOnly && (
<Option
id={`connect-${key}`}
onClick={() => {
option.connector === connector
? setWalletView(WALLET_VIEWS.ACCOUNT)
: !option.href && tryActivation(option.connector)
}}
key={key}
active={option.connector === connector}
color={option.color}
link={option.href}
header={option.name}
subheader={null} //use option.descriptio to bring back multi-line
icon={require('../../assets/images/' + option.iconName)}
/>
)
)
})
}
function getModalContent() {
if (error) {
return (
<UpperSection>
<CloseIcon onClick={toggleWalletModal}>
<CloseColor />
</CloseIcon>
<HeaderRow>{error instanceof UnsupportedChainIdError ? 'Wrong Network' : 'Error connecting'}</HeaderRow>
<ContentWrapper>
{error instanceof UnsupportedChainIdError ? (
<h5>Please connect to the appropriate Ethereum network.</h5>
) : (
'Error connecting. Try refreshing the page.'
)}
</ContentWrapper>
</UpperSection>
)
}
if (account && walletView === WALLET_VIEWS.ACCOUNT) {
return (
<AccountDetails
toggleWalletModal={toggleWalletModal}
pendingTransactions={pendingTransactions}
confirmedTransactions={confirmedTransactions}
ENSName={ENSName}
openOptions={() => setWalletView(WALLET_VIEWS.OPTIONS)}
/>
)
}
return (
<UpperSection>
<CloseIcon onClick={toggleWalletModal}>
<CloseColor />
</CloseIcon>
{walletView !== WALLET_VIEWS.ACCOUNT ? (
<HeaderRow color="blue">
<HoverText
onClick={() => {
setPendingError(false)
setWalletView(WALLET_VIEWS.ACCOUNT)
}}
>
Back
</HoverText>
</HeaderRow>
) : (
<HeaderRow>
<HoverText>Connect to a wallet</HoverText>
</HeaderRow>
)}
<ContentWrapper>
{walletView === WALLET_VIEWS.PENDING ? (
<PendingView
connector={pendingWallet}
error={pendingError}
setPendingError={setPendingError}
tryActivation={tryActivation}
/>
) : (
<OptionGrid>{getOptions()}</OptionGrid>
)}
{walletView !== WALLET_VIEWS.PENDING && (
<Blurb>
<span>New to Ethereum? </span>{' '}
<ExternalLink href="https://ethereum.org/wallets/">Learn more about wallets</ExternalLink>
</Blurb>
)}
</ContentWrapper>
</UpperSection>
)
}
return (
<Modal isOpen={walletModalOpen} onDismiss={toggleWalletModal} minHeight={null} maxHeight={90}>
<Wrapper>{getModalContent()}</Wrapper>
</Modal>
)
}
Example #29
Source File: index.tsx From luaswap-interface with GNU General Public License v3.0 | 4 votes |
export default function WalletModal({
pendingTransactions,
confirmedTransactions,
ENSName
}: {
pendingTransactions: string[] // hashes of pending
confirmedTransactions: string[] // hashes of confirmed
ENSName?: string
}) {
// important that these are destructed from the account-specific web3-react context
const { active, account, connector, activate, error } = useWeb3React()
const [walletView, setWalletView] = useState(WALLET_VIEWS.ACCOUNT)
const [pendingWallet, setPendingWallet] = useState<AbstractConnector | undefined>()
const [pendingError, setPendingError] = useState<boolean>()
const walletModalOpen = useModalOpen(ApplicationModal.WALLET)
const toggleWalletModal = useWalletModalToggle()
const previousAccount = usePrevious(account)
// close on connection, when logged out before
useEffect(() => {
if (account && !previousAccount && walletModalOpen) {
toggleWalletModal()
}
}, [account, previousAccount, toggleWalletModal, walletModalOpen])
// always reset to account view
useEffect(() => {
if (walletModalOpen) {
setPendingError(false)
setWalletView(WALLET_VIEWS.ACCOUNT)
}
}, [walletModalOpen])
// close modal when a connection is successful
const activePrevious = usePrevious(active)
const connectorPrevious = usePrevious(connector)
useEffect(() => {
if (walletModalOpen && ((active && !activePrevious) || (connector && connector !== connectorPrevious && !error))) {
setWalletView(WALLET_VIEWS.ACCOUNT)
}
}, [setWalletView, active, error, connector, walletModalOpen, activePrevious, connectorPrevious])
const tryActivation = async (connector: AbstractConnector | undefined) => {
let name = ''
Object.keys(SUPPORTED_WALLETS).map(key => {
if (connector === SUPPORTED_WALLETS[key].connector) {
return (name = SUPPORTED_WALLETS[key].name)
}
return true
})
// log selected wallet
ReactGA.event({
category: 'Wallet',
action: 'Change Wallet',
label: name
})
setPendingWallet(connector) // set wallet for pending view
setWalletView(WALLET_VIEWS.PENDING)
// if the connector is walletconnect and the user has already tried to connect, manually reset the connector
if (connector instanceof WalletConnectConnector && connector.walletConnectProvider?.wc?.uri) {
connector.walletConnectProvider = undefined
}
connector &&
activate(connector, undefined, true).catch(error => {
if (error instanceof UnsupportedChainIdError) {
activate(connector) // a little janky...can't use setError because the connector isn't set
} else {
setPendingError(true)
}
})
}
// close wallet modal if fortmatic modal is active
useEffect(() => {
fortmatic.on(OVERLAY_READY, () => {
toggleWalletModal()
})
}, [toggleWalletModal])
// get wallets user can switch too, depending on device/browser
function getOptions() {
const isMetamask = window.ethereum && window.ethereum.isMetaMask
return Object.keys(SUPPORTED_WALLETS).map(key => {
const option = SUPPORTED_WALLETS[key]
// check for mobile options
if (isMobile) {
//disable portis on mobile for now
if (option.connector === portis) {
return null
}
if (!window.web3 && !window.ethereum && option.mobile) {
return (
<Option
onClick={() => {
option.connector !== connector && !option.href && tryActivation(option.connector)
}}
id={`connect-${key}`}
key={key}
active={option.connector && option.connector === connector}
color={option.color}
link={option.href}
header={option.name}
subheader={null}
icon={require('../../assets/images/' + option.iconName)}
/>
)
}
return null
}
// overwrite injected when needed
if (option.connector === injected) {
// don't show injected if there's no injected provider
if (!(window.web3 || window.ethereum)) {
if (option.name === 'MetaMask') {
return (
<Option
id={`connect-${key}`}
key={key}
color={'#E8831D'}
header={'Install Metamask'}
subheader={null}
link={'https://metamask.io/'}
icon={MetamaskIcon}
/>
)
} else {
return null //dont want to return install twice
}
}
// don't return metamask if injected provider isn't metamask
else if (option.name === 'MetaMask' && !isMetamask) {
return null
}
// likewise for generic
else if (option.name === 'Injected' && isMetamask) {
return null
}
}
// return rest of options
return (
!isMobile &&
!option.mobileOnly && (
<Option
id={`connect-${key}`}
onClick={() => {
option.connector === connector
? setWalletView(WALLET_VIEWS.ACCOUNT)
: !option.href && tryActivation(option.connector)
}}
key={key}
active={option.connector === connector}
color={option.color}
link={option.href}
header={option.name}
subheader={null} //use option.descriptio to bring back multi-line
icon={require('../../assets/images/' + option.iconName)}
/>
)
)
})
}
function getModalContent() {
if (error) {
return (
<UpperSection>
<CloseIcon onClick={toggleWalletModal}>
<CloseColor />
</CloseIcon>
<HeaderRow>{error instanceof UnsupportedChainIdError ? 'Wrong Network' : 'Error connecting'}</HeaderRow>
<ContentWrapper>
{error instanceof UnsupportedChainIdError ? (
<h5>Please connect to the appropriate Ethereum network.</h5>
) : (
'Error connecting. Try refreshing the page.'
)}
</ContentWrapper>
</UpperSection>
)
}
if (account && walletView === WALLET_VIEWS.ACCOUNT) {
return (
<AccountDetails
toggleWalletModal={toggleWalletModal}
pendingTransactions={pendingTransactions}
confirmedTransactions={confirmedTransactions}
ENSName={ENSName}
openOptions={() => setWalletView(WALLET_VIEWS.OPTIONS)}
/>
)
}
return (
<UpperSection>
<CloseIcon onClick={toggleWalletModal}>
<CloseColor />
</CloseIcon>
{walletView !== WALLET_VIEWS.ACCOUNT ? (
<HeaderRow color="blue">
<HoverText
onClick={() => {
setPendingError(false)
setWalletView(WALLET_VIEWS.ACCOUNT)
}}
>
Back
</HoverText>
</HeaderRow>
) : (
<HeaderRow>
<HoverText>Connect to a wallet</HoverText>
</HeaderRow>
)}
<ContentWrapper>
{walletView === WALLET_VIEWS.PENDING ? (
<PendingView
connector={pendingWallet}
error={pendingError}
setPendingError={setPendingError}
tryActivation={tryActivation}
/>
) : (
<OptionGrid>{getOptions()}</OptionGrid>
)}
{walletView !== WALLET_VIEWS.PENDING && (
<Blurb>
{/* <span>New to Ethereum? </span>{' '} */}
<ExternalLink href="https://ethereum.org/wallets/">Learn more about wallets</ExternalLink>
</Blurb>
)}
</ContentWrapper>
</UpperSection>
)
}
return (
<Modal isOpen={walletModalOpen} onDismiss={toggleWalletModal} minHeight={false} maxHeight={90}>
<Wrapper>{getModalContent()}</Wrapper>
</Modal>
)
}