From 4dbabd2a7742651003495286d5bb36e7558d50ea Mon Sep 17 00:00:00 2001 From: Ian Philips Date: Thu, 4 Aug 2022 05:53:35 -0600 Subject: [PATCH] Add challenge slug to bet and filter by it --- common/bet.ts | 1 + functions/src/accept-challenge.ts | 2 ++ .../challenges/accept-challenge-button.tsx | 12 ++-------- web/components/feed/contract-activity.tsx | 5 +++- web/components/feed/feed-bets.tsx | 23 +++++++++++++++++-- web/hooks/use-bets.ts | 20 +++++++++++++--- web/pages/[username]/[contractSlug].tsx | 5 +++- 7 files changed, 51 insertions(+), 17 deletions(-) diff --git a/common/bet.ts b/common/bet.ts index d5072c0f..56e050a7 100644 --- a/common/bet.ts +++ b/common/bet.ts @@ -26,6 +26,7 @@ export type Bet = { isAnte?: boolean isLiquidityProvision?: boolean isRedemption?: boolean + challengeSlug?: string } & Partial export type NumericBet = Bet & { diff --git a/functions/src/accept-challenge.ts b/functions/src/accept-challenge.ts index 08f7af10..fa98c8c6 100644 --- a/functions/src/accept-challenge.ts +++ b/functions/src/accept-challenge.ts @@ -91,6 +91,7 @@ export const acceptchallenge = newEndpoint({}, async (req, auth) => { loanAmount: 0, createdTime, fees: noFees, + challengeSlug: challenge.slug, }) const yourNewBetDoc = contractDoc.collection('bets').doc() @@ -114,6 +115,7 @@ export const acceptchallenge = newEndpoint({}, async (req, auth) => { loanAmount: 0, createdTime, fees: noFees, + challengeSlug: challenge.slug, }) const creatorBetDoc = contractDoc.collection('bets').doc() trans.create(creatorBetDoc, { diff --git a/web/components/challenges/accept-challenge-button.tsx b/web/components/challenges/accept-challenge-button.tsx index 86eb4079..62a45a7a 100644 --- a/web/components/challenges/accept-challenge-button.tsx +++ b/web/components/challenges/accept-challenge-button.tsx @@ -21,7 +21,7 @@ export function AcceptChallengeButton(props: { const [open, setOpen] = useState(false) const [errorText, setErrorText] = useState('') const [loading, setLoading] = useState(false) - const { acceptorAmount } = challenge + const { acceptorAmount, creatorAmount } = challenge useEffect(() => { setErrorText('') @@ -72,13 +72,6 @@ export function AcceptChallengeButton(props: { {formatMoney(acceptorAmount)} - {/**/} - {/* Probability:{' '}*/} - {/* */} - {/* {' '}*/} - {/* {Math.round(yourProb * 100) + '%'}*/} - {/* */} - {/**/} @@ -86,9 +79,8 @@ export function AcceptChallengeButton(props: { {' '} - {formatMoney(challenge.creatorAmount)} + {formatMoney(creatorAmount + acceptorAmount)} - {/**/} diff --git a/web/components/feed/contract-activity.tsx b/web/components/feed/contract-activity.tsx index b1c8f6ee..cd490701 100644 --- a/web/components/feed/contract-activity.tsx +++ b/web/components/feed/contract-activity.tsx @@ -26,7 +26,10 @@ export function ContractActivity(props: { const contract = useContractWithPreload(props.contract) ?? props.contract const comments = props.comments - const updatedBets = useBets(contract.id) + const updatedBets = useBets(contract.id, { + filterChallenges: false, + filterRedemptions: true, + }) const bets = (updatedBets ?? props.bets).filter( (bet) => !bet.isRedemption && bet.amount !== 0 ) diff --git a/web/components/feed/feed-bets.tsx b/web/components/feed/feed-bets.tsx index 408404ba..29645136 100644 --- a/web/components/feed/feed-bets.tsx +++ b/web/components/feed/feed-bets.tsx @@ -10,11 +10,14 @@ import { UsersIcon } from '@heroicons/react/solid' import { formatMoney, formatPercent } from 'common/util/format' import { OutcomeLabel } from 'web/components/outcome-label' import { RelativeTimestamp } from 'web/components/relative-timestamp' -import React, { Fragment } from 'react' +import React, { Fragment, useEffect } from 'react' import { uniqBy, partition, sumBy, groupBy } from 'lodash' import { JoinSpans } from 'web/components/join-spans' import { UserLink } from '../user-page' import { formatNumericProbability } from 'common/pseudo-numeric' +import { SiteLink } from 'web/components/site-link' +import { getChallenge, getChallengeUrl } from 'web/lib/firebase/challenges' +import { Challenge } from 'common/challenge' export function FeedBet(props: { contract: Contract @@ -79,7 +82,15 @@ export function BetStatusText(props: { const { outcomeType } = contract const isPseudoNumeric = outcomeType === 'PSEUDO_NUMERIC' const isFreeResponse = outcomeType === 'FREE_RESPONSE' - const { amount, outcome, createdTime } = bet + const { amount, outcome, createdTime, challengeSlug } = bet + const [challenge, setChallenge] = React.useState() + useEffect(() => { + if (challengeSlug) { + getChallenge(challengeSlug, contract.id).then((c) => { + setChallenge(c) + }) + } + }, [challengeSlug, contract.id]) const bought = amount >= 0 ? 'bought' : 'sold' const outOfTotalAmount = @@ -133,6 +144,14 @@ export function BetStatusText(props: { {fromProb === toProb ? `at ${fromProb}` : `from ${fromProb} to ${toProb}`} + {challengeSlug && ( + + [challenge] + + )} )} diff --git a/web/hooks/use-bets.ts b/web/hooks/use-bets.ts index 68b296cd..38b73dd1 100644 --- a/web/hooks/use-bets.ts +++ b/web/hooks/use-bets.ts @@ -9,12 +9,26 @@ import { } from 'web/lib/firebase/bets' import { LimitBet } from 'common/bet' -export const useBets = (contractId: string) => { +export const useBets = ( + contractId: string, + options?: { filterChallenges: boolean; filterRedemptions: boolean } +) => { const [bets, setBets] = useState() useEffect(() => { - if (contractId) return listenForBets(contractId, setBets) - }, [contractId]) + if (contractId) + return listenForBets(contractId, (bets) => { + if (options) + setBets( + bets.filter( + (bet) => + (options.filterChallenges ? !bet.challengeSlug : true) && + (options.filterRedemptions ? !bet.isRedemption : true) + ) + ) + else setBets(bets) + }) + }, [contractId, options]) return bets } diff --git a/web/pages/[username]/[contractSlug].tsx b/web/pages/[username]/[contractSlug].tsx index 01d7067c..0da6c994 100644 --- a/web/pages/[username]/[contractSlug].tsx +++ b/web/pages/[username]/[contractSlug].tsx @@ -211,7 +211,10 @@ export function ContractPageContent( )} - + !b.challengeSlug)} + /> {isNumeric && (