mirror of
https://github.com/oceanprotocol/market.git
synced 2024-12-02 05:57:29 +01:00
135 lines
4.2 KiB
TypeScript
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>
|
|
)
|
|
}
|