Add hot markets to home feed
This commit is contained in:
parent
75fd870d69
commit
f80ef1cd34
|
@ -4,6 +4,7 @@ import {
|
|||
query,
|
||||
onSnapshot,
|
||||
where,
|
||||
orderBy,
|
||||
} from 'firebase/firestore'
|
||||
import _ from 'lodash'
|
||||
|
||||
|
@ -23,6 +24,19 @@ export async function listAllBets(contractId: string) {
|
|||
return bets
|
||||
}
|
||||
|
||||
const DAY_IN_MS = 24 * 60 * 60 * 1000
|
||||
|
||||
// Define "recent" as "<24 hours ago" for now
|
||||
const recentBetsQuery = query(
|
||||
collectionGroup(db, 'bets'),
|
||||
where('createdTime', '>', Date.now() - DAY_IN_MS),
|
||||
orderBy('createdTime', 'desc')
|
||||
)
|
||||
|
||||
export async function getRecentBets() {
|
||||
return getValues<Bet>(recentBetsQuery)
|
||||
}
|
||||
|
||||
export function listenForBets(
|
||||
contractId: string,
|
||||
setBets: (bets: Bet[]) => void
|
||||
|
|
|
@ -7,6 +7,7 @@ import { Col } from '../components/layout/col'
|
|||
import { Bet } from '../../common/bet'
|
||||
|
||||
const MAX_ACTIVE_CONTRACTS = 75
|
||||
const MAX_HOT_MARKETS = 10
|
||||
|
||||
// This does NOT include comment times, since those aren't part of the contract atm.
|
||||
// TODO: Maybe store last activity time directly in the contract?
|
||||
|
@ -23,9 +24,11 @@ function lastActivityTime(contract: Contract) {
|
|||
// - Comment on a market
|
||||
// - New market created
|
||||
// - Market resolved
|
||||
// - Markets with most betting in last 24 hours
|
||||
export function findActiveContracts(
|
||||
allContracts: Contract[],
|
||||
recentComments: Comment[],
|
||||
recentBets: Bet[],
|
||||
daysAgo = 3
|
||||
) {
|
||||
const idToActivityTime = new Map<string, number>()
|
||||
|
@ -56,6 +59,26 @@ export function findActiveContracts(
|
|||
}
|
||||
}
|
||||
|
||||
// Add recent top-trading contracts, ordered by last bet.
|
||||
const contractBets = _.groupBy(recentBets, (bet) => bet.contractId)
|
||||
const contractTotalBets = _.mapValues(contractBets, (bets) =>
|
||||
_.sumBy(bets, (bet) => bet.amount)
|
||||
)
|
||||
const topTradedContracts = _.sortBy(
|
||||
_.toPairs(contractTotalBets),
|
||||
([_, total]) => -1 * total
|
||||
)
|
||||
.map(([id]) => contractsById.get(id) as Contract)
|
||||
.slice(0, MAX_HOT_MARKETS)
|
||||
|
||||
for (const contract of topTradedContracts) {
|
||||
const bet = recentBets.find((bet) => bet.contractId === contract.id)
|
||||
if (bet) {
|
||||
contracts.push(contract)
|
||||
record(contract.id, bet.createdTime)
|
||||
}
|
||||
}
|
||||
|
||||
contracts = _.uniqBy(contracts, (c) => c.id)
|
||||
contracts = contracts.filter((contract) => contract.visibility === 'public')
|
||||
contracts = _.sortBy(contracts, (c) => -(idToActivityTime.get(c.id) ?? 0))
|
||||
|
|
|
@ -50,6 +50,7 @@ export async function getStaticProps(props: { params: { slugs: string[] } }) {
|
|||
let activeContracts = findActiveContracts(
|
||||
contracts,
|
||||
_.flatten(contractComments),
|
||||
[],
|
||||
365
|
||||
)
|
||||
const [resolved, unresolved] = _.partition(
|
||||
|
|
|
@ -10,7 +10,7 @@ import {
|
|||
Comment,
|
||||
listAllComments,
|
||||
} from '../lib/firebase/comments'
|
||||
import { Bet, listAllBets } from '../lib/firebase/bets'
|
||||
import { Bet, getRecentBets, listAllBets } from '../lib/firebase/bets'
|
||||
import FeedCreate from '../components/feed-create'
|
||||
import { Spacer } from '../components/layout/spacer'
|
||||
import { Col } from '../components/layout/col'
|
||||
|
@ -18,12 +18,17 @@ import { useUser } from '../hooks/use-user'
|
|||
import { useContracts } from '../hooks/use-contracts'
|
||||
|
||||
export async function getStaticProps() {
|
||||
const [contracts, recentComments] = await Promise.all([
|
||||
const [contracts, recentComments, recentBets] = await Promise.all([
|
||||
listAllContracts().catch((_) => []),
|
||||
getRecentComments().catch(() => []),
|
||||
getRecentBets().catch(() => []),
|
||||
])
|
||||
|
||||
const activeContracts = findActiveContracts(contracts, recentComments)
|
||||
const activeContracts = findActiveContracts(
|
||||
contracts,
|
||||
recentComments,
|
||||
recentBets
|
||||
)
|
||||
const activeContractBets = await Promise.all(
|
||||
activeContracts.map((contract) => listAllBets(contract.id).catch((_) => []))
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue
Block a user