mirror of
https://github.com/oceanprotocol/market.git
synced 2024-12-02 05:57:29 +01:00
114 lines
3.3 KiB
TypeScript
114 lines
3.3 KiB
TypeScript
import { DataTokenOptions, useOcean } from '@oceanprotocol/react'
|
|
import PriceUnit from '../../../atoms/Price/PriceUnit'
|
|
import React, { ReactElement, useEffect, useState } from 'react'
|
|
import { PriceOptionsMarket } from '../../../../@types/MetaData'
|
|
import { useSiteMetadata } from '../../../../hooks/useSiteMetadata'
|
|
import { isCorrectNetwork } from '../../../../utils/wallet'
|
|
import Alert from '../../../atoms/Alert'
|
|
import FormHelp from '../../../atoms/Input/Help'
|
|
import Tooltip from '../../../atoms/Tooltip'
|
|
import Wallet from '../../Wallet'
|
|
import Coin from './Coin'
|
|
import styles from './Dynamic.module.css'
|
|
import Fees from './Fees'
|
|
import stylesIndex from './index.module.css'
|
|
|
|
export default function Dynamic({
|
|
ocean,
|
|
priceOptions,
|
|
datatokenOptions,
|
|
generateName,
|
|
content
|
|
}: {
|
|
ocean: number
|
|
priceOptions: PriceOptionsMarket
|
|
datatokenOptions: DataTokenOptions
|
|
generateName: () => void
|
|
content: any
|
|
}): ReactElement {
|
|
const { appConfig } = useSiteMetadata()
|
|
const { account, balance, networkId, refreshBalance } = useOcean()
|
|
const { weightOnDataToken } = priceOptions
|
|
|
|
const [error, setError] = useState<string>()
|
|
const correctNetwork = isCorrectNetwork(networkId)
|
|
const desiredNetworkName = appConfig.network.replace(/^\w/, (c: string) =>
|
|
c.toUpperCase()
|
|
)
|
|
|
|
// Check: account, network & insufficient balance
|
|
useEffect(() => {
|
|
if (!account) {
|
|
setError(`No account connected. Please connect your Web3 wallet.`)
|
|
} else if (!correctNetwork) {
|
|
setError(`Wrong Network. Please connect to ${desiredNetworkName}.`)
|
|
} else if (Number(balance.ocean) < Number(ocean)) {
|
|
setError(`Insufficient balance. You need at least ${ocean} OCEAN`)
|
|
} else {
|
|
setError(undefined)
|
|
}
|
|
}, [ocean, networkId, account, balance, correctNetwork, desiredNetworkName])
|
|
|
|
// refetch balance periodically
|
|
useEffect(() => {
|
|
if (!account) return
|
|
|
|
refreshBalance()
|
|
const balanceInterval = setInterval(() => refreshBalance(), 10000) // 10 sec.
|
|
|
|
return () => {
|
|
clearInterval(balanceInterval)
|
|
}
|
|
}, [ocean, networkId, account])
|
|
|
|
return (
|
|
<div className={styles.dynamic}>
|
|
<FormHelp className={stylesIndex.help}>{content.info}</FormHelp>
|
|
|
|
<aside className={styles.wallet}>
|
|
{balance?.ocean && (
|
|
<PriceUnit
|
|
className={styles.balance}
|
|
price={balance.ocean}
|
|
symbol="OCEAN"
|
|
small
|
|
/>
|
|
)}
|
|
<Wallet />
|
|
</aside>
|
|
|
|
<h4 className={styles.title}>
|
|
Datatoken Liquidity Pool <Tooltip content={content.tooltips.poolInfo} />
|
|
</h4>
|
|
|
|
<div className={styles.tokens}>
|
|
<Coin
|
|
name="price.price"
|
|
datatokenOptions={{ symbol: 'OCEAN', name: 'Ocean Token' }}
|
|
weight={`${100 - Number(Number(weightOnDataToken) * 10)}%`}
|
|
/>
|
|
<Coin
|
|
name="price.tokensToMint"
|
|
datatokenOptions={datatokenOptions}
|
|
weight={`${Number(weightOnDataToken) * 10}%`}
|
|
generateName={generateName}
|
|
readOnly
|
|
/>
|
|
</div>
|
|
|
|
<Fees tooltips={content.tooltips} />
|
|
|
|
<footer className={styles.summary}>
|
|
You will get: <br />
|
|
100% share of pool
|
|
</footer>
|
|
|
|
{error && (
|
|
<div className={styles.alertArea}>
|
|
<Alert text={error} state="error" />
|
|
</div>
|
|
)}
|
|
</div>
|
|
)
|
|
}
|