2022-10-11 02:56:16 +00:00
import { CPMMContract } from 'common/contract'
import { formatMoney } from 'common/util/format'
import { useState } from 'react'
import { useUser } from 'web/hooks/use-user'
import { addSubsidy } from 'web/lib/firebase/api'
import { track } from 'web/lib/service/analytics'
import { AmountInput } from '../amount-input'
import { Button } from '../button'
import { InfoTooltip } from '../info-tooltip'
import { Col } from '../layout/col'
import { Modal } from '../layout/modal'
import { Row } from '../layout/row'
import { Title } from '../title'
export function LiquidityModal ( props : {
contract : CPMMContract
isOpen : boolean
setOpen : ( open : boolean ) = > void
} ) {
const { contract , isOpen , setOpen } = props
const { totalLiquidity } = contract
return (
< Modal open = { isOpen } setOpen = { setOpen } size = "sm" >
< Col className = "gap-2.5 rounded bg-white p-4 pb-8 sm:gap-4" >
2022-10-11 21:22:28 +00:00
< Title className = "!mt-0 !mb-2" text = "💧 Add liquidity" / >
2022-10-11 02:56:16 +00:00
< div > Total liquidity subsidies : { formatMoney ( totalLiquidity ) } < / div >
< AddLiquidityPanel contract = { contract as CPMMContract } / >
< / Col >
< / Modal >
)
}
function AddLiquidityPanel ( props : { contract : CPMMContract } ) {
const { contract } = props
const { id : contractId , slug } = contract
const user = useUser ( )
const [ amount , setAmount ] = useState < number | undefined > ( undefined )
const [ error , setError ] = useState < string | undefined > ( undefined )
const [ isSuccess , setIsSuccess ] = useState ( false )
const [ isLoading , setIsLoading ] = useState ( false )
const onAmountChange = ( amount : number | undefined ) = > {
setIsSuccess ( false )
setAmount ( amount )
// Check for errors.
if ( amount !== undefined ) {
if ( user && user . balance < amount ) {
setError ( 'Insufficient balance' )
} else if ( amount < 1 ) {
setError ( 'Minimum amount: ' + formatMoney ( 1 ) )
} else {
setError ( undefined )
}
}
}
const submit = ( ) = > {
if ( ! amount ) return
setIsLoading ( true )
setIsSuccess ( false )
addSubsidy ( { amount , contractId } )
. then ( ( _ ) = > {
setIsSuccess ( true )
setError ( undefined )
setIsLoading ( false )
} )
. catch ( ( _ ) = > setError ( 'Server error' ) )
track ( 'add liquidity' , { amount , contractId , slug } )
}
return (
< >
< div className = "mb-4 text-gray-500" >
Contribute your M $ to make this market more accurate by subsidizing
trading . { ' ' }
< InfoTooltip text = "Liquidity is how much money traders can make if they're right. The more traders can earn, the greater the incentive to find the correct probability." / >
< / div >
< Row >
< AmountInput
amount = { amount }
onChange = { onAmountChange }
label = "M$"
error = { error }
disabled = { isLoading }
2022-10-11 21:22:28 +00:00
inputClassName = "w-28 mr-4"
2022-10-11 02:56:16 +00:00
/ >
< Button size = "md" color = "blue" onClick = { submit } disabled = { isLoading } >
Add
< / Button >
< / Row >
{ isSuccess && amount && (
< div > Success ! Added { formatMoney ( amount ) } in liquidity . < / div >
) }
{ isLoading && < div > Processing . . . < / div > }
< / >
)
}