Use firebase query instead of algolia search for groups

This commit is contained in:
James Grugett 2022-09-16 01:03:24 -05:00
parent 6dc320ae43
commit 346d588ec8
3 changed files with 64 additions and 8 deletions

View File

@ -8,10 +8,12 @@ import {
getUserBetContracts, getUserBetContracts,
getUserBetContractsQuery, getUserBetContractsQuery,
trendingContractsQuery, trendingContractsQuery,
getContractsQuery,
} from 'web/lib/firebase/contracts' } from 'web/lib/firebase/contracts'
import { useQueryClient } from 'react-query' import { useQueryClient } from 'react-query'
import { MINUTE_MS } from 'common/util/time' import { MINUTE_MS } from 'common/util/time'
import { query, limit } from 'firebase/firestore' import { query, limit } from 'firebase/firestore'
import { Sort } from 'web/components/contract-search'
export const useContracts = () => { export const useContracts = () => {
const [contracts, setContracts] = useState<Contract[] | undefined>() const [contracts, setContracts] = useState<Contract[] | undefined>()
@ -31,6 +33,18 @@ export const useTrendingContracts = (maxContracts: number) => {
return result.data return result.data
} }
export const useContractsQuery = (
sort: Sort,
maxContracts: number,
filters: { groupSlug?: string } = {}
) => {
const result = useFirestoreQueryData(
['contracts-query', sort, maxContracts, filters],
getContractsQuery(sort, maxContracts, filters)
)
return result.data
}
export const useInactiveContracts = () => { export const useInactiveContracts = () => {
const [contracts, setContracts] = useState<Contract[] | undefined>() const [contracts, setContracts] = useState<Contract[] | undefined>()

View File

@ -24,6 +24,7 @@ import { Bet } from 'common/bet'
import { Comment } from 'common/comment' import { Comment } from 'common/comment'
import { ENV_CONFIG } from 'common/envs/constants' import { ENV_CONFIG } from 'common/envs/constants'
import { getBinaryProb } from 'common/contract-details' import { getBinaryProb } from 'common/contract-details'
import { Sort } from 'web/components/contract-search'
export const contracts = coll<Contract>('contracts') export const contracts = coll<Contract>('contracts')
@ -320,6 +321,50 @@ export const getTopGroupContracts = async (
return await getValues<Contract>(creatorContractsQuery) return await getValues<Contract>(creatorContractsQuery)
} }
const sortToField = {
newest: 'createdTime',
score: 'popularityScore',
'most-traded': 'volume',
'24-hour-vol': 'volume24Hours',
'prob-change-day': 'probChanges.day',
'last-updated': 'lastUpdated',
liquidity: 'totalLiquidity',
'close-date': 'closeTime',
'resolve-date': 'resolutionTime',
'prob-descending': 'prob',
'prob-ascending': 'prob',
} as const
const sortToDirection = {
newest: 'desc',
score: 'desc',
'most-traded': 'desc',
'24-hour-vol': 'desc',
'prob-change-day': 'desc',
'last-updated': 'desc',
liquidity: 'desc',
'close-date': 'asc',
'resolve-date': 'desc',
'prob-ascending': 'asc',
'prob-descending': 'desc',
} as const
export const getContractsQuery = (
sort: Sort,
maxItems: number,
filters: { groupSlug?: string } = {}
) => {
const { groupSlug } = filters
return query(
contracts,
where('isResolved', '==', false),
where('visibility', '==', 'public'),
...(groupSlug ? [where('groupSlugs', 'array-contains', groupSlug)] : []),
orderBy(sortToField[sort], sortToDirection[sort]),
limit(maxItems)
)
}
export const getRecommendedContracts = async ( export const getRecommendedContracts = async (
contract: Contract, contract: Contract,
excludeBettorId: string, excludeBettorId: string,

View File

@ -40,6 +40,8 @@ import { GroupCard } from 'web/pages/groups'
import { chooseRandomSubset } from 'common/util/random' import { chooseRandomSubset } from 'common/util/random'
import { MenuButton } from 'web/components/nav/menu' import { MenuButton } from 'web/components/nav/menu'
import { hasCompletedStreakToday } from 'web/components/profile/betting-streak-modal' import { hasCompletedStreakToday } from 'web/components/profile/betting-streak-modal'
import { useContractsQuery } from 'web/hooks/use-contracts'
import { ContractsGrid } from 'web/components/contract/contracts-grid'
export default function Home() { export default function Home() {
const user = useUser() const user = useUser()
@ -158,6 +160,8 @@ function GroupSection(props: {
}) { }) {
const { group, user } = props const { group, user } = props
const contracts = useContractsQuery('score', 4, { groupSlug: group.slug })
return ( return (
<Col> <Col>
<SectionHeader label={group.name} href={groupPath(group.slug)}> <SectionHeader label={group.name} href={groupPath(group.slug)}>
@ -180,14 +184,7 @@ function GroupSection(props: {
]} ]}
/> />
</SectionHeader> </SectionHeader>
<ContractSearch <ContractsGrid contracts={contracts} />
user={user}
defaultSort={'score'}
additionalFilter={{ groupSlug: group.slug }}
noControls
maxResults={4}
persistPrefix={`experimental-home-${group.slug}`}
/>
</Col> </Col>
) )
} }