manifold/web/lib/firebase/bets.ts

98 lines
2.2 KiB
TypeScript
Raw Normal View History

import {
collection,
collectionGroup,
query,
onSnapshot,
where,
2022-01-05 06:32:52 +00:00
getDocs,
} from 'firebase/firestore'
2022-01-05 06:32:52 +00:00
import _ from 'lodash'
2021-12-10 17:14:05 +00:00
import { db } from './init'
export type Bet = {
id: string
userId: string
contractId: string
amount: number // bet size; negative if SELL bet
outcome: 'YES' | 'NO'
shares: number // dynamic parimutuel pool weight; negative if SELL bet
2021-12-12 22:14:52 +00:00
probBefore: number
probAfter: number
sale?: {
amount: number // amount user makes from sale
betId: string // id of bet being sold
// TODO: add sale time?
}
isSold?: boolean // true if this BUY bet has been sold
2021-12-12 22:14:52 +00:00
createdTime: number
2021-12-10 17:14:05 +00:00
}
2021-12-12 22:14:52 +00:00
function getBetsCollection(contractId: string) {
return collection(db, 'contracts', contractId, 'bets')
}
export function listenForBets(
contractId: string,
setBets: (bets: Bet[]) => void
) {
return onSnapshot(getBetsCollection(contractId), (snap) => {
const bets = snap.docs.map((doc) => doc.data() as Bet)
bets.sort((bet1, bet2) => bet1.createdTime - bet2.createdTime)
setBets(bets)
})
2021-12-10 17:14:05 +00:00
}
export function listenForUserBets(
userId: string,
setBets: (bets: Bet[]) => void
) {
const userQuery = query(
collectionGroup(db, 'bets'),
where('userId', '==', userId)
)
return onSnapshot(userQuery, (snap) => {
const bets = snap.docs.map((doc) => doc.data() as Bet)
bets.sort((bet1, bet2) => bet1.createdTime - bet2.createdTime)
setBets(bets)
})
}
2022-01-05 06:32:52 +00:00
export function listenForRecentBets(
timePeriodMs: number,
setBets: (bets: Bet[]) => void
) {
const recentQuery = query(
collectionGroup(db, 'bets'),
where('createdTime', '>', Date.now() - timePeriodMs)
)
return onSnapshot(recentQuery, (snap) => {
const bets = snap.docs.map((doc) => doc.data() as Bet)
bets.sort((bet1, bet2) => bet1.createdTime - bet2.createdTime)
setBets(bets)
})
}
export async function getRecentBets(timePeriodMs: number) {
const recentQuery = query(
collectionGroup(db, 'bets'),
where('createdTime', '>', Date.now() - timePeriodMs)
)
const snapshot = await getDocs(recentQuery)
const bets = snapshot.docs.map((doc) => doc.data() as Bet)
bets.sort((bet1, bet2) => bet1.createdTime - bet2.createdTime)
return bets
}