1
0
mirror of https://github.com/oceanprotocol/market.git synced 2024-12-02 05:57:29 +01:00
2022-06-17 13:06:18 +03:00

135 lines
4.2 KiB
TypeScript

import React, { ChangeEvent, ReactElement, useEffect, useState } from 'react'
import { formatCurrency } from '@coingecko/cryptoformat'
import { useUserPreferences } from '@context/UserPreferences'
import Button from '@shared/atoms/Button'
import AddToken from '@shared/AddToken'
import Conversion from '@shared/Price/Conversion'
import { useWeb3 } from '@context/Web3'
import { getOceanConfig } from '@utils/ocean'
import styles from './Details.module.css'
import InputElement from '@shared/FormInput/InputElement'
export default function Details(): ReactElement {
const {
web3Provider,
web3ProviderInfo,
web3Modal,
connect,
logout,
networkData,
networkId,
balance
} = useWeb3()
const { locale } = useUserPreferences()
const [mainCurrency, setMainCurrency] = useState<string>()
const [oceanTokenMetadata, setOceanTokenMetadata] = useState<{
address: string
symbol: string
}>()
const [portisNetwork, setPortisNetwork] = useState<string>()
useEffect(() => {
if (!networkId) return
const symbol =
networkId === 2021000 ? 'GX' : networkData?.nativeCurrency.symbol
setMainCurrency(symbol)
const oceanConfig = getOceanConfig(networkId)
oceanConfig &&
setOceanTokenMetadata({
address: oceanConfig.oceanTokenAddress,
symbol: oceanConfig.oceanTokenSymbol
})
}, [networkData, networkId])
// Handle network change for Portis
async function handlePortisNetworkChange(e: ChangeEvent<HTMLSelectElement>) {
setPortisNetwork(e.target.value)
const portisNetworkName = e.target.value.toLowerCase()
await web3Provider._portis.changeNetwork(portisNetworkName)
// TODO: using our connect initializes a new Portis instance,
// which then defaults back to initial network (Mainnet).
// await connect()
}
return (
<div className={styles.details}>
<ul>
{Object.entries(balance).map(([key, value]) => (
<li className={styles.balance} key={key}>
<span className={styles.symbol}>
{key === 'eth' ? mainCurrency : oceanTokenMetadata?.symbol}
</span>{' '}
{formatCurrency(Number(value), '', locale, false, {
significantFigures: 4
})}
{key === 'ocean' && <Conversion price={value} />}
</li>
))}
<li className={styles.actions}>
<div title="Connected provider" className={styles.walletInfo}>
<span className={styles.walletLogoWrap}>
<img className={styles.walletLogo} src={web3ProviderInfo?.logo} />
{web3ProviderInfo?.name}
</span>
{web3ProviderInfo?.name === 'Portis' && (
<InputElement
name="network"
type="select"
options={['Mainnet', 'Ropsten', 'Rinkeby']}
size="mini"
value={portisNetwork}
onChange={handlePortisNetworkChange}
/>
)}
{web3ProviderInfo?.name === 'MetaMask' && (
<AddToken
address={oceanTokenMetadata?.address}
symbol={oceanTokenMetadata?.symbol}
logo="https://raw.githubusercontent.com/oceanprotocol/art/main/logo/token.png"
className={styles.addToken}
web3Provider={web3Provider}
/>
)}
</div>
<p>
{web3ProviderInfo?.name === 'Portis' && (
<Button
style="text"
size="small"
onClick={() => web3Provider._portis.showPortis()}
>
Show Portis
</Button>
)}
<Button
style="text"
size="small"
onClick={async () => {
await web3Modal?.clearCachedProvider()
connect()
}}
>
Switch Wallet
</Button>
<Button
style="text"
size="small"
onClick={() => {
logout()
location.reload()
}}
>
Disconnect
</Button>
</p>
</li>
</ul>
</div>
)
}