import { sortBy, partition, sum } from 'lodash' import { useEffect, useState } from 'react' import { FreeResponseContract, MultipleChoiceContract } from 'common/contract' import { Col } from '../layout/col' import { useUser } from 'web/hooks/use-user' import { getDpmOutcomeProbability } from 'common/calculate-dpm' import { useAnswers } from 'web/hooks/use-answers' import { tradingAllowed } from 'web/lib/firebase/contracts' import { AnswerItem } from './answer-item' import { CreateAnswerPanel } from './create-answer-panel' import { AnswerResolvePanel } from './answer-resolve-panel' import { Spacer } from '../layout/spacer' import { getOutcomeProbability } from 'common/calculate' import { Answer } from 'common/answer' import clsx from 'clsx' import { formatPercent } from 'common/util/format' import { Modal } from 'web/components/layout/modal' import { AnswerBetPanel } from 'web/components/answers/answer-bet-panel' import { Row } from 'web/components/layout/row' import { Avatar } from 'web/components/avatar' import { Linkify } from 'web/components/linkify' import { BuyButton } from 'web/components/yes-no-selector' import { UserLink } from 'web/components/user-link' import { Button } from 'web/components/button' import { useAdmin } from 'web/hooks/use-admin' import { needsAdminToResolve } from 'web/pages/[username]/[contractSlug]' export function AnswersPanel(props: { contract: FreeResponseContract | MultipleChoiceContract }) { const isAdmin = useAdmin() const { contract } = props const { creatorId, resolution, resolutions, totalBets, outcomeType } = contract const [showAllAnswers, setShowAllAnswers] = useState(false) const answers = (useAnswers(contract.id) ?? contract.answers).filter( (a) => a.number != 0 || contract.outcomeType === 'MULTIPLE_CHOICE' ) const [winningAnswers, notWinningAnswers] = partition( answers, (a) => a.id === resolution || (resolutions && resolutions[a.id]) ) const [visibleAnswers, invisibleAnswers] = partition( sortBy(notWinningAnswers, (a) => -getOutcomeProbability(contract, a.id)), (a) => showAllAnswers || totalBets[a.id] > 0 ) const user = useUser() const [resolveOption, setResolveOption] = useState< 'CHOOSE' | 'CHOOSE_MULTIPLE' | 'CANCEL' | undefined >() const [chosenAnswers, setChosenAnswers] = useState<{ [answerId: string]: number }>({}) const chosenTotal = sum(Object.values(chosenAnswers)) const onChoose = (answerId: string, prob: number) => { if (resolveOption === 'CHOOSE') { setChosenAnswers({ [answerId]: prob }) } else { setChosenAnswers((chosenAnswers) => { return { ...chosenAnswers, [answerId]: prob, } }) } } const onDeselect = (answerId: string) => { setChosenAnswers((chosenAnswers) => { const newChosenAnswers = { ...chosenAnswers } delete newChosenAnswers[answerId] return newChosenAnswers }) } useEffect(() => { setChosenAnswers({}) }, [resolveOption]) const showChoice = resolution ? undefined : resolveOption === 'CHOOSE' ? 'radio' : resolveOption === 'CHOOSE_MULTIPLE' ? 'checkbox' : undefined return ( {(resolveOption || resolution) && sortBy(winningAnswers, (a) => -(resolutions?.[a.id] ?? 0)).map((a) => ( ))} {!resolveOption && ( {visibleAnswers.map((a) => ( ))} {invisibleAnswers.length > 0 && !showAllAnswers && ( )} )} {answers.length === 0 && (
No answers yet...
)} {outcomeType === 'FREE_RESPONSE' && tradingAllowed(contract) && (!resolveOption || resolveOption === 'CANCEL') && ( )} {(user?.id === creatorId || (isAdmin && needsAdminToResolve(contract))) && !resolution && ( <> )} ) } function OpenAnswer(props: { contract: FreeResponseContract | MultipleChoiceContract answer: Answer }) { const { answer, contract } = props const { username, avatarUrl, name, text } = answer const prob = getDpmOutcomeProbability(contract.totalShares, answer.id) const probPercent = formatPercent(prob) const [open, setOpen] = useState(false) return ( setOpen(false)} className="sm:max-w-84 !rounded-md bg-white !px-8 !py-6" isModal={true} />
answered
{probPercent} setOpen(true)} />
) }