import clsx from 'clsx' import { useEffect, useState } from 'react' import { CPMMContract } from 'common/contract' import { formatMoney } from 'common/util/format' import { useUser } from 'web/hooks/use-user' import { addLiquidity, withdrawLiquidity } from 'web/lib/firebase/api' import { AmountInput } from './amount-input' import { Row } from './layout/row' import { useUserLiquidity } from 'web/hooks/use-liquidity' import { Tabs } from './layout/tabs' import { NoLabel, YesLabel } from './outcome-label' import { Col } from './layout/col' import { track } from 'web/lib/service/analytics' import { InfoTooltip } from './info-tooltip' import { BETTORS, PRESENT_BET } from 'common/user' export function LiquidityPanel(props: { contract: CPMMContract }) { const { contract } = props const user = useUser() const lpShares = useUserLiquidity(contract, user?.id ?? '') const [showWithdrawal, setShowWithdrawal] = useState(false) useEffect(() => { if (!showWithdrawal && lpShares && lpShares.YES && lpShares.NO) setShowWithdrawal(true) }, [showWithdrawal, lpShares]) return ( , }, ...(showWithdrawal ? [ { title: 'Withdraw', content: ( ), }, ] : []), { title: 'Pool', content: , }, ]} /> ) } function AddLiquidityPanel(props: { contract: CPMMContract }) { const { contract } = props const { id: contractId, slug } = contract const user = useUser() const [amount, setAmount] = useState(undefined) const [error, setError] = useState(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) addLiquidity({ amount, contractId }) .then((_) => { setIsSuccess(true) setError(undefined) setIsLoading(false) }) .catch((_) => setError('Server error')) track('add liquidity', { amount, contractId, slug }) } return ( <>
Contribute your M$ to make this market more accurate.{' '}
{isSuccess && amount && (
Success! Added {formatMoney(amount)} in liquidity.
)} {isLoading &&
Processing...
} ) } function ViewLiquidityPanel(props: { contract: CPMMContract }) { const { contract } = props const { pool } = contract const { YES: yesShares, NO: noShares } = pool return (
The liquidity pool for this market currently contains:
{yesShares.toFixed(2)} shares {noShares.toFixed(2)} shares ) } function WithdrawLiquidityPanel(props: { contract: CPMMContract lpShares: { YES: number; NO: number } }) { const { contract, lpShares } = props const { YES: yesShares, NO: noShares } = lpShares const [_error, setError] = useState(undefined) const [isSuccess, setIsSuccess] = useState(false) const [isLoading, setIsLoading] = useState(false) const submit = () => { setIsLoading(true) setIsSuccess(false) withdrawLiquidity({ contractId: contract.id }) .then((_) => { setIsSuccess(true) setError(undefined) setIsLoading(false) }) .catch((_) => setError('Server error')) track('withdraw liquidity') } if (isSuccess) return (
Success! Your liquidity was withdrawn.
) if (!yesShares && !noShares) return (
You do not have any liquidity positions to withdraw.
) return (
Your liquidity position is currently:
{yesShares.toFixed(2)} shares {noShares.toFixed(2)} shares {isLoading &&
Processing...
} ) }