mirror of
https://github.com/oceanprotocol/market.git
synced 2024-12-02 05:57:29 +01:00
refactor Price component to be more universal
This commit is contained in:
parent
ebdd46efe0
commit
5a8c864d6c
@ -3,4 +3,5 @@
|
||||
font-size: var(--font-size-small);
|
||||
margin-left: calc(var(--spacer) / 6);
|
||||
color: var(--color-secondary);
|
||||
font-weight: var(--font-weight-base);
|
||||
}
|
||||
|
19
src/components/atoms/Price/PriceUnit.module.css
Normal file
19
src/components/atoms/Price/PriceUnit.module.css
Normal file
@ -0,0 +1,19 @@
|
||||
.price {
|
||||
display: inline-block;
|
||||
font-weight: var(--font-weight-bold);
|
||||
font-size: var(--font-size-large);
|
||||
color: var(--brand-grey-dark);
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.price span:first-child {
|
||||
font-weight: var(--font-weight-base);
|
||||
color: var(--color-secondary);
|
||||
font-size: var(--font-size-base);
|
||||
}
|
||||
|
||||
.small {
|
||||
/* lazy making-conversion-smaller-with-same-markup */
|
||||
transform: scale(0.8);
|
||||
transform-origin: left 80%;
|
||||
}
|
35
src/components/atoms/Price/PriceUnit.tsx
Normal file
35
src/components/atoms/Price/PriceUnit.tsx
Normal file
@ -0,0 +1,35 @@
|
||||
import React, { ReactElement } from 'react'
|
||||
import { formatCurrency } from '@coingecko/cryptoformat'
|
||||
import classNames from 'classnames/bind'
|
||||
import Conversion from './Conversion'
|
||||
import styles from './PriceUnit.module.css'
|
||||
|
||||
const cx = classNames.bind(styles)
|
||||
|
||||
export default function PriceUnit({
|
||||
price,
|
||||
className,
|
||||
small,
|
||||
conversion,
|
||||
symbol
|
||||
}: {
|
||||
price: string
|
||||
className?: string
|
||||
small?: boolean
|
||||
conversion?: boolean
|
||||
symbol?: string
|
||||
}): ReactElement {
|
||||
const styleClasses = cx({
|
||||
price: true,
|
||||
small: small,
|
||||
[className]: className
|
||||
})
|
||||
|
||||
return (
|
||||
<div className={styleClasses}>
|
||||
{formatCurrency(Number(price), '', 'en', false, true)}{' '}
|
||||
<span>{symbol || 'OCEAN'}</span>
|
||||
{conversion && <Conversion price={price} />}
|
||||
</div>
|
||||
)
|
||||
}
|
@ -1,23 +1,4 @@
|
||||
.price {
|
||||
font-weight: var(--font-weight-bold);
|
||||
font-size: var(--font-size-large);
|
||||
color: var(--brand-grey-dark);
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.price span:first-child {
|
||||
font-weight: var(--font-weight-base);
|
||||
color: var(--color-secondary);
|
||||
font-size: var(--font-size-base);
|
||||
}
|
||||
|
||||
.empty {
|
||||
color: var(--color-secondary);
|
||||
font-weight: var(--font-weight-bold);
|
||||
}
|
||||
|
||||
.small {
|
||||
/* lazy making-conversion-smaller-with-same-markup */
|
||||
transform: scale(0.8);
|
||||
transform-origin: left 80%;
|
||||
}
|
||||
|
@ -1,24 +1,22 @@
|
||||
import React, { ReactElement, useState, useEffect } from 'react'
|
||||
import classNames from 'classnames/bind'
|
||||
import PriceConversion from './Conversion'
|
||||
import styles from './index.module.css'
|
||||
import { formatCurrency } from '@coingecko/cryptoformat'
|
||||
import { useMetadata, useOcean } from '@oceanprotocol/react'
|
||||
import { DDO } from '@oceanprotocol/lib'
|
||||
import Loader from '../Loader'
|
||||
import Tooltip from '../Tooltip'
|
||||
|
||||
const cx = classNames.bind(styles)
|
||||
import PriceUnit from './PriceUnit'
|
||||
|
||||
export default function Price({
|
||||
ddo,
|
||||
className,
|
||||
small,
|
||||
conversion,
|
||||
setPriceOutside
|
||||
}: {
|
||||
ddo: DDO
|
||||
className?: string
|
||||
small?: boolean
|
||||
conversion?: boolean
|
||||
setPriceOutside?: (price: string) => void
|
||||
}): ReactElement {
|
||||
const { ocean, chainId, accountId } = useOcean()
|
||||
@ -35,27 +33,15 @@ export default function Price({
|
||||
init()
|
||||
}, [chainId, accountId, ocean])
|
||||
|
||||
const styleClasses = cx({
|
||||
price: true,
|
||||
small: small,
|
||||
[className]: className
|
||||
})
|
||||
|
||||
const isFree = price === '0'
|
||||
|
||||
const displayPrice = isFree ? (
|
||||
'Free'
|
||||
) : (
|
||||
<>
|
||||
<span>OCEAN</span> {formatCurrency(Number(price), '', 'en', false, true)}
|
||||
<PriceConversion price={price} />
|
||||
</>
|
||||
)
|
||||
|
||||
return !ocean ? (
|
||||
<div className={styles.empty}>Please connect your wallet to view price</div>
|
||||
) : price ? (
|
||||
<div className={styleClasses}>{displayPrice}</div>
|
||||
<PriceUnit
|
||||
price={price}
|
||||
className={className}
|
||||
small={small}
|
||||
conversion={conversion}
|
||||
/>
|
||||
) : price === '' ? (
|
||||
<div className={styles.empty}>
|
||||
No price found{' '}
|
||||
|
@ -89,7 +89,7 @@ export default function Compute({
|
||||
|
||||
return (
|
||||
<div className={styles.compute}>
|
||||
<Price ddo={ddo} setPriceOutside={setPrice} />
|
||||
<Price ddo={ddo} setPriceOutside={setPrice} conversion />
|
||||
|
||||
<div className={styles.info}>
|
||||
<div className={styles.selectType}>
|
||||
|
@ -49,7 +49,7 @@ export default function Consume({
|
||||
<File file={file} />
|
||||
</div>
|
||||
<div className={styles.pricewrapper}>
|
||||
<Price ddo={ddo} setPriceOutside={setPrice} />
|
||||
<Price ddo={ddo} setPriceOutside={setPrice} conversion />
|
||||
<PurchaseButton />
|
||||
</div>
|
||||
</div>
|
||||
|
@ -13,14 +13,14 @@
|
||||
display: inline-block;
|
||||
border: 1px solid var(--brand-grey-lighter);
|
||||
border-radius: 50%;
|
||||
padding: 0.4rem;
|
||||
padding: 0.3rem;
|
||||
vertical-align: middle;
|
||||
margin-right: calc(var(--spacer) / 8);
|
||||
}
|
||||
|
||||
.icon svg {
|
||||
width: var(--font-size-large);
|
||||
height: var(--font-size-large);
|
||||
width: var(--font-size-base);
|
||||
height: var(--font-size-base);
|
||||
}
|
||||
|
||||
/* Data Token Icon Style */
|
||||
|
@ -1,7 +1,7 @@
|
||||
import React, { ReactElement } from 'react'
|
||||
import styles from './Token.module.css'
|
||||
import { ReactComponent as Logo } from '../../../../images/logo.svg'
|
||||
import { formatCurrency } from '@coingecko/cryptoformat'
|
||||
import PriceUnit from '../../../atoms/Price/PriceUnit'
|
||||
|
||||
export default function Token({
|
||||
symbol,
|
||||
@ -15,8 +15,7 @@ export default function Token({
|
||||
<figure className={`${styles.icon} ${symbol}`}>
|
||||
<Logo />
|
||||
</figure>
|
||||
{formatCurrency(Number(balance), '', 'en', false, true)}{' '}
|
||||
<span className={styles.symbol}>{symbol}</span>
|
||||
<PriceUnit price={balance} symbol={symbol} small />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
@ -1,8 +1,25 @@
|
||||
.title {
|
||||
.dataToken {
|
||||
margin-bottom: var(--spacer);
|
||||
padding-bottom: calc(var(--spacer) / 1.5);
|
||||
font-size: var(--font-size-large);
|
||||
margin-bottom: calc(var(--spacer) / 4);
|
||||
border-bottom: 1px solid var(--brand-grey-lighter);
|
||||
margin-left: -2rem;
|
||||
margin-right: -2rem;
|
||||
padding-left: var(--spacer);
|
||||
padding-right: var(--spacer);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.poolTokens {
|
||||
display: grid;
|
||||
gap: var(--spacer);
|
||||
grid-template-columns: 1fr 1fr;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: var(--font-size-base);
|
||||
margin-bottom: calc(var(--spacer) / 1.5);
|
||||
}
|
||||
|
||||
.tokens {
|
||||
margin-bottom: var(--spacer);
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
import React, { ReactElement, useEffect, useState } from 'react'
|
||||
import { useOcean, useMetadata } from '@oceanprotocol/react'
|
||||
import { DDO } from '@oceanprotocol/lib'
|
||||
import { formatCurrency } from '@coingecko/cryptoformat'
|
||||
import styles from './index.module.css'
|
||||
import Token from './Token'
|
||||
import PriceUnit from '../../../atoms/Price/PriceUnit'
|
||||
|
||||
interface Balance {
|
||||
ocean: string
|
||||
@ -14,7 +14,6 @@ export default function Pool({ ddo }: { ddo: DDO }): ReactElement {
|
||||
const { ocean, accountId } = useOcean()
|
||||
const { getBestPool } = useMetadata()
|
||||
const [totalBalance, setTotalBalance] = useState<Balance>()
|
||||
const [poolPrice, setPoolPrice] = useState<string>()
|
||||
const [dtPrice, setDtPrice] = useState<string>()
|
||||
const [dtSymbol, setDtSymbol] = useState<string>()
|
||||
const [userBalance, setUserBalance] = useState<Balance>()
|
||||
@ -22,8 +21,7 @@ export default function Pool({ ddo }: { ddo: DDO }): ReactElement {
|
||||
useEffect(() => {
|
||||
async function init() {
|
||||
try {
|
||||
const { poolAddress, poolPrice } = await getBestPool(ddo.dataToken)
|
||||
setPoolPrice(poolPrice)
|
||||
const { poolAddress } = await getBestPool(ddo.dataToken)
|
||||
|
||||
const dtSymbol = await ocean.datatokens.getSymbol(
|
||||
ddo.dataToken,
|
||||
@ -64,36 +62,28 @@ export default function Pool({ ddo }: { ddo: DDO }): ReactElement {
|
||||
|
||||
return (
|
||||
<>
|
||||
<h3 className={styles.title}>Your Pooled Tokens</h3>
|
||||
{userBalance && (
|
||||
<div className={styles.tokens}>
|
||||
<Token symbol="OCEAN" balance={userBalance.ocean} />
|
||||
<Token symbol={dtSymbol} balance={userBalance.dt} />
|
||||
</div>
|
||||
)}
|
||||
<div className={styles.dataToken}>
|
||||
<PriceUnit price="1" symbol={dtSymbol} /> ={' '}
|
||||
<PriceUnit price={dtPrice} />
|
||||
</div>
|
||||
|
||||
<h3 className={styles.title}>Total Pooled Tokens</h3>
|
||||
{totalBalance && (
|
||||
<div className={styles.tokens}>
|
||||
<Token symbol="OCEAN" balance={totalBalance.ocean} />
|
||||
<Token symbol={dtSymbol} balance={totalBalance.dt} />
|
||||
</div>
|
||||
)}
|
||||
<div className={styles.poolTokens}>
|
||||
{userBalance && (
|
||||
<div className={styles.tokens}>
|
||||
<h3 className={styles.title}>Your Pooled Tokens</h3>
|
||||
<Token symbol="OCEAN" balance={userBalance.ocean} />
|
||||
<Token symbol={dtSymbol} balance={userBalance.dt} />
|
||||
</div>
|
||||
)}
|
||||
|
||||
{poolPrice && (
|
||||
<p>
|
||||
Pool Price: <br />
|
||||
<span className={styles.symbol}>OCEAN</span>{' '}
|
||||
{formatCurrency(Number(poolPrice), '', 'en', false, true)}
|
||||
</p>
|
||||
)}
|
||||
{dtPrice && (
|
||||
<p>
|
||||
Data Token Price: <br />
|
||||
<span className={styles.symbol}>OCEAN</span>{' '}
|
||||
{formatCurrency(Number(dtPrice), '', 'en', false, true)}
|
||||
</p>
|
||||
)}
|
||||
{totalBalance && (
|
||||
<div className={styles.tokens}>
|
||||
<h3 className={styles.title}>Total Pooled Tokens</h3>
|
||||
<Token symbol="OCEAN" balance={totalBalance.ocean} />
|
||||
<Token symbol={dtSymbol} balance={totalBalance.dt} />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user