import { memo, useState } from 'react' import { getOutcomeProbability } from 'common/calculate' import { Pagination } from 'web/components/pagination' import { FeedBet } from '../feed/feed-bets' import { FeedLiquidity } from '../feed/feed-liquidity' import { FeedAnswerCommentGroup } from '../feed/feed-answer-comment-group' import { FeedCommentThread, ContractCommentInput } from '../feed/feed-comments' import { groupBy, sortBy } from 'lodash' import { Bet } from 'common/bet' import { Contract } from 'common/contract' import { PAST_BETS } from 'common/user' import { ContractBetsTable } from '../bets-list' import { Spacer } from '../layout/spacer' import { Tabs } from '../layout/tabs' import { Col } from '../layout/col' import { LoadingIndicator } from 'web/components/loading-indicator' import { useComments } from 'web/hooks/use-comments' import { useLiquidity } from 'web/hooks/use-liquidity' import { useTipTxns } from 'web/hooks/use-tip-txns' import { capitalize } from 'lodash' import { DEV_HOUSE_LIQUIDITY_PROVIDER_ID, HOUSE_LIQUIDITY_PROVIDER_ID, } from 'common/antes' import { buildArray } from 'common/util/array' export function ContractTabs(props: { contract: Contract bets: Bet[] userBets: Bet[] }) { const { contract, bets, userBets } = props const yourTrades = (
) const tabs = buildArray( { title: 'Comments', content: , }, { title: capitalize(PAST_BETS), content: , }, userBets.length > 0 && { title: 'Your trades', content: yourTrades, } ) return ( ) } const CommentsTabContent = memo(function CommentsTabContent(props: { contract: Contract }) { const { contract } = props const tips = useTipTxns({ contractId: contract.id }) const comments = useComments(contract.id) if (comments == null) { return } if (contract.outcomeType === 'FREE_RESPONSE') { const generalComments = comments.filter( (c) => c.answerOutcome === undefined && c.betId === undefined ) const sortedAnswers = sortBy( contract.answers, (a) => -getOutcomeProbability(contract, a.id) ) const commentsByOutcome = groupBy( comments, (c) => c.answerOutcome ?? c.betOutcome ?? '_' ) return ( <> {sortedAnswers.map((answer) => (
))}
General Comments
{generalComments.map((comment) => ( ))} ) } else { const commentsByParent = groupBy(comments, (c) => c.replyToCommentId ?? '_') const topLevelComments = commentsByParent['_'] ?? [] return ( <> {sortBy(topLevelComments, (c) => -c.createdTime).map((parent) => ( c.createdTime )} tips={tips} /> ))} ) } }) const BetsTabContent = memo(function BetsTabContent(props: { contract: Contract bets: Bet[] }) { const { contract, bets } = props const [page, setPage] = useState(0) const ITEMS_PER_PAGE = 50 const start = page * ITEMS_PER_PAGE const end = start + ITEMS_PER_PAGE const lps = useLiquidity(contract.id) ?? [] const visibleBets = bets.filter( (bet) => !bet.isAnte && !bet.isRedemption && bet.amount !== 0 ) const visibleLps = lps.filter( (l) => !l.isAnte && l.userId !== HOUSE_LIQUIDITY_PROVIDER_ID && l.userId !== DEV_HOUSE_LIQUIDITY_PROVIDER_ID && l.amount > 0 ) const items = [ ...visibleBets.map((bet) => ({ type: 'bet' as const, id: bet.id + '-' + bet.isSold, bet, })), ...visibleLps.map((lp) => ({ type: 'liquidity' as const, id: lp.id, lp, })), ] const pageItems = sortBy(items, (item) => item.type === 'bet' ? -item.bet.createdTime : item.type === 'liquidity' ? -item.lp.createdTime : undefined ).slice(start, end) return ( <> {pageItems.map((item) => item.type === 'bet' ? ( ) : ( ) )} ) })