import dayjs from 'dayjs' import { Contract } from 'common/contract' import { Bet } from 'common/bet' import { User } from 'common/user' import { useUser, useUserById } from 'web/hooks/use-user' import { Row } from 'web/components/layout/row' import { Avatar, EmptyAvatar } from 'web/components/avatar' import clsx from 'clsx' import { UserIcon, UsersIcon } from '@heroicons/react/solid' import { formatMoney } from 'common/util/format' import { OutcomeLabel } from 'web/components/outcome-label' import { RelativeTimestamp } from 'web/components/relative-timestamp' import React, { Fragment } from 'react' import { uniqBy, partition, sumBy, groupBy } from 'lodash' import { JoinSpans } from 'web/components/join-spans' import { UserLink } from '../user-page' export function FeedBet(props: { contract: Contract bet: Bet hideOutcome: boolean smallAvatar: boolean }) { const { contract, bet, hideOutcome, smallAvatar } = props const { userId, createdTime } = bet const isBeforeJune2022 = dayjs(createdTime).isBefore('2022-06-01') // eslint-disable-next-line react-hooks/rules-of-hooks const bettor = isBeforeJune2022 ? undefined : useUserById(userId) const user = useUser() const isSelf = user?.id === userId return ( <> {isSelf ? ( ) : bettor ? ( ) : (
)}
) } export function BetStatusText(props: { contract: Contract bet: Bet isSelf: boolean bettor?: User hideOutcome?: boolean }) { const { bet, contract, bettor, isSelf, hideOutcome } = props const { amount, outcome, createdTime } = bet const bought = amount >= 0 ? 'bought' : 'sold' const money = formatMoney(Math.abs(amount)) return (
{bettor ? ( ) : ( {isSelf ? 'You' : 'A trader'} )}{' '} {bought} {money} {!hideOutcome && ( <> {' '} of{' '} )}
) } function BetGroupSpan(props: { contract: Contract bets: Bet[] outcome?: string }) { const { contract, bets, outcome } = props const numberTraders = uniqBy(bets, (b) => b.userId).length const [buys, sells] = partition(bets, (bet) => bet.amount >= 0) const buyTotal = sumBy(buys, (b) => b.amount) const sellTotal = sumBy(sells, (b) => -b.amount) return ( {numberTraders} {numberTraders > 1 ? 'traders' : 'trader'}{' '} {buyTotal > 0 && <>bought {formatMoney(buyTotal)} } {sellTotal > 0 && <>sold {formatMoney(sellTotal)} } {outcome && ( <> {' '} of{' '} )}{' '} ) } export function FeedBetGroup(props: { contract: Contract bets: Bet[] hideOutcome: boolean }) { const { contract, bets, hideOutcome } = props const betGroups = groupBy(bets, (bet) => bet.outcome) const outcomes = Object.keys(betGroups) // Use the time of the last bet for the entire group const createdTime = bets[bets.length - 1].createdTime return ( <>
{outcomes.map((outcome, index) => ( {index !== outcomes.length - 1 &&
}
))}
) }