Handle new user: use default feed of top markets this week
This commit is contained in:
parent
21692a7b75
commit
3d96b11c6d
|
@ -5,6 +5,8 @@ import { ClickEvent } from './tracking'
|
|||
import { filterDefined } from './util/array'
|
||||
import { addObjects } from './util/object'
|
||||
|
||||
export const MAX_FEED_CONTRACTS = 75
|
||||
|
||||
export const getRecommendedContracts = (
|
||||
contractsById: { [contractId: string]: Contract },
|
||||
yourBetOnContractIds: string[]
|
||||
|
@ -146,6 +148,8 @@ export function getContractScore(
|
|||
contract: Contract,
|
||||
wordScores: { [word: string]: number }
|
||||
) {
|
||||
if (Object.keys(wordScores).length === 0) return 1
|
||||
|
||||
const wordFrequency = contractToWordFrequency(contract)
|
||||
const score = _.sumBy(Object.keys(wordFrequency), (word) => {
|
||||
const wordFreq = wordFrequency[word] ?? 0
|
||||
|
|
|
@ -14,13 +14,14 @@ import {
|
|||
import { Bet } from '../../common/bet'
|
||||
import { Comment } from '../../common/comment'
|
||||
import { User } from '../../common/user'
|
||||
import { getContractScore } from '../../common/recommended-contracts'
|
||||
import {
|
||||
getContractScore,
|
||||
MAX_FEED_CONTRACTS,
|
||||
} from '../../common/recommended-contracts'
|
||||
import { callCloudFunction } from './call-cloud-function'
|
||||
|
||||
const firestore = admin.firestore()
|
||||
|
||||
const MAX_FEED_CONTRACTS = 75
|
||||
|
||||
export const updateFeed = functions.pubsub
|
||||
.schedule('every 60 minutes')
|
||||
.onRun(async () => {
|
||||
|
|
|
@ -8,6 +8,10 @@ import { trackLatency } from '../lib/firebase/tracking'
|
|||
import { User } from '../../common/user'
|
||||
import { getUserFeed } from '../lib/firebase/users'
|
||||
import { useUpdatedContracts } from './use-contracts'
|
||||
import {
|
||||
getRecentBetsAndComments,
|
||||
getTopWeeklyContracts,
|
||||
} from '../lib/firebase/contracts'
|
||||
|
||||
type feed = {
|
||||
contract: Contract
|
||||
|
@ -23,7 +27,9 @@ export const useAlgoFeed = (user: User | null | undefined) => {
|
|||
useEffect(() => {
|
||||
if (user) {
|
||||
getUserFeed(user.id).then((feed) => {
|
||||
setFeed(feed)
|
||||
if (feed.length === 0) {
|
||||
getDefaultFeed().then((feed) => setFeed(feed))
|
||||
} else setFeed(feed)
|
||||
|
||||
trackLatency('feed', getTime())
|
||||
console.log('feed load time', getTime())
|
||||
|
@ -44,3 +50,11 @@ const useUpdateFeed = (feed: feed | undefined) => {
|
|||
}))
|
||||
: undefined
|
||||
}
|
||||
|
||||
const getDefaultFeed = async () => {
|
||||
const contracts = await getTopWeeklyContracts()
|
||||
const feed = await Promise.all(
|
||||
contracts.map((c) => getRecentBetsAndComments(c))
|
||||
)
|
||||
return feed
|
||||
}
|
||||
|
|
|
@ -94,6 +94,8 @@ export const useUpdatedContracts = (contracts: Contract[] | undefined) => {
|
|||
})
|
||||
})
|
||||
|
||||
triggerUpdate((n) => n + 1)
|
||||
|
||||
return () => {
|
||||
disposes.forEach((dispose) => dispose())
|
||||
}
|
||||
|
|
|
@ -23,6 +23,9 @@ import { createRNG, shuffle } from '../../../common/util/random'
|
|||
import { getCpmmProbability } from '../../../common/calculate-cpmm'
|
||||
import { formatMoney, formatPercent } from '../../../common/util/format'
|
||||
import { DAY_MS } from '../../../common/util/time'
|
||||
import { MAX_FEED_CONTRACTS } from '../../../common/recommended-contracts'
|
||||
import { Bet } from '../../../common/bet'
|
||||
import { Comment } from '../../../common/comment'
|
||||
export type { Contract }
|
||||
|
||||
export function contractPath(contract: Contract) {
|
||||
|
@ -231,6 +234,16 @@ export async function getHotContracts() {
|
|||
)
|
||||
}
|
||||
|
||||
const topWeeklyQuery = query(
|
||||
contractCollection,
|
||||
where('isResolved', '==', false),
|
||||
orderBy('volume7Days', 'desc'),
|
||||
limit(MAX_FEED_CONTRACTS)
|
||||
)
|
||||
export async function getTopWeeklyContracts() {
|
||||
return await getValues<Contract>(topWeeklyQuery)
|
||||
}
|
||||
|
||||
const closingSoonQuery = query(
|
||||
contractCollection,
|
||||
where('isResolved', '==', false),
|
||||
|
@ -276,3 +289,33 @@ export async function getDailyContracts(
|
|||
|
||||
return contractsByDay
|
||||
}
|
||||
|
||||
export async function getRecentBetsAndComments(contract: Contract) {
|
||||
const contractDoc = doc(db, 'contracts', contract.id)
|
||||
|
||||
const [recentBets, recentComments] = await Promise.all([
|
||||
getValues<Bet>(
|
||||
query(
|
||||
collection(contractDoc, 'bets'),
|
||||
where('createdTime', '>', Date.now() - DAY_MS),
|
||||
orderBy('createdTime', 'desc'),
|
||||
limit(1)
|
||||
)
|
||||
),
|
||||
|
||||
getValues<Comment>(
|
||||
query(
|
||||
collection(contractDoc, 'comments'),
|
||||
where('createdTime', '>', Date.now() - 3 * DAY_MS),
|
||||
orderBy('createdTime', 'desc'),
|
||||
limit(3)
|
||||
)
|
||||
),
|
||||
])
|
||||
|
||||
return {
|
||||
contract,
|
||||
recentBets,
|
||||
recentComments,
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user