Better recommended contracts. Include from first group.
This commit is contained in:
parent
e7f369e2b4
commit
cb08a114ae
|
@ -12,7 +12,7 @@ import {
|
|||
updateDoc,
|
||||
where,
|
||||
} from 'firebase/firestore'
|
||||
import { sortBy, sum } from 'lodash'
|
||||
import { sortBy, sum, uniqBy } from 'lodash'
|
||||
|
||||
import { coll, getValues, listenForValue, listenForValues } from './utils'
|
||||
import { BinaryContract, Contract } from 'common/contract'
|
||||
|
@ -305,7 +305,7 @@ export const getRandTopCreatorContracts = async (
|
|||
where('isResolved', '==', false),
|
||||
where('creatorId', '==', creatorId),
|
||||
orderBy('popularityScore', 'desc'),
|
||||
limit(Math.max(count * 2, 15))
|
||||
limit(count * 2)
|
||||
)
|
||||
const data = await getValues<Contract>(creatorContractsQuery)
|
||||
const open = data
|
||||
|
@ -315,6 +315,44 @@ export const getRandTopCreatorContracts = async (
|
|||
return chooseRandomSubset(open, count)
|
||||
}
|
||||
|
||||
export const getRandTopGroupContracts = async (
|
||||
groupSlug: string,
|
||||
count: number,
|
||||
excluding: string[] = []
|
||||
) => {
|
||||
const creatorContractsQuery = query(
|
||||
contracts,
|
||||
where('groupSlugs', 'array-contains', groupSlug),
|
||||
where('isResolved', '==', false),
|
||||
orderBy('popularityScore', 'desc'),
|
||||
limit(count * 2)
|
||||
)
|
||||
const data = await getValues<Contract>(creatorContractsQuery)
|
||||
const open = data
|
||||
.filter((c) => c.closeTime && c.closeTime > Date.now())
|
||||
.filter((c) => !excluding.includes(c.id))
|
||||
|
||||
return chooseRandomSubset(open, count)
|
||||
}
|
||||
|
||||
export const getRecommendedContracts = async (
|
||||
contract: Contract,
|
||||
count: number
|
||||
) => {
|
||||
const { creatorId, groupSlugs, id } = contract
|
||||
|
||||
const [userContracts, groupContracts] = await Promise.all([
|
||||
getRandTopCreatorContracts(creatorId, count, [id]),
|
||||
groupSlugs && groupSlugs[0]
|
||||
? getRandTopGroupContracts(groupSlugs[0], count, [id])
|
||||
: [],
|
||||
])
|
||||
|
||||
const combined = uniqBy([...userContracts, ...groupContracts], (c) => c.id)
|
||||
|
||||
return chooseRandomSubset(combined, count)
|
||||
}
|
||||
|
||||
export async function getRecentBetsAndComments(contract: Contract) {
|
||||
const contractDoc = doc(contracts, contract.id)
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ import { Spacer } from 'web/components/layout/spacer'
|
|||
import {
|
||||
Contract,
|
||||
getContractFromSlug,
|
||||
getRandTopCreatorContracts,
|
||||
getRecommendedContracts,
|
||||
tradingAllowed,
|
||||
} from 'web/lib/firebase/contracts'
|
||||
import { SEO } from 'web/components/SEO'
|
||||
|
@ -40,8 +40,8 @@ import {
|
|||
ContractLeaderboard,
|
||||
ContractTopTrades,
|
||||
} from 'web/components/contract/contract-leaderboard'
|
||||
import { Subtitle } from 'web/components/subtitle'
|
||||
import { ContractsGrid } from 'web/components/contract/contracts-grid'
|
||||
import { Title } from 'web/components/title'
|
||||
|
||||
export const getStaticProps = fromPropz(getStaticPropz)
|
||||
export async function getStaticPropz(props: {
|
||||
|
@ -54,9 +54,7 @@ export async function getStaticPropz(props: {
|
|||
const [bets, comments, recommendedContracts] = await Promise.all([
|
||||
contractId ? listAllBets(contractId) : [],
|
||||
contractId ? listAllComments(contractId) : [],
|
||||
contract
|
||||
? getRandTopCreatorContracts(contract.creatorId, 4, [contract?.id])
|
||||
: [],
|
||||
contract ? getRecommendedContracts(contract, 6) : [],
|
||||
])
|
||||
|
||||
return {
|
||||
|
@ -190,12 +188,11 @@ export function ContractPageContent(
|
|||
props.recommendedContracts
|
||||
)
|
||||
useEffect(() => {
|
||||
if (recommendedContracts.length === 0) {
|
||||
getRandTopCreatorContracts(contract.creatorId, 4, [contract.id]).then(
|
||||
setRecommendedMarkets
|
||||
)
|
||||
if (contract && recommendedContracts.length === 0) {
|
||||
getRecommendedContracts(contract, 6).then(setRecommendedMarkets)
|
||||
}
|
||||
}, [contract.id, contract.creatorId, recommendedContracts])
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [contract.id, recommendedContracts])
|
||||
|
||||
const { isResolved, question, outcomeType } = contract
|
||||
|
||||
|
@ -282,8 +279,8 @@ export function ContractPageContent(
|
|||
</Col>
|
||||
|
||||
{recommendedContracts.length > 0 && (
|
||||
<Col className="gap-2 px-2 sm:px-0">
|
||||
<Subtitle text="Recommended" />
|
||||
<Col className="mt-2 gap-2 px-2 sm:px-0">
|
||||
<Title className="text-gray-700" text="Recommended" />
|
||||
<ContractsGrid contracts={recommendedContracts} />
|
||||
</Col>
|
||||
)}
|
||||
|
|
Loading…
Reference in New Issue
Block a user