Only query when necessary
This commit is contained in:
parent
8e751f1471
commit
eeaf4bde14
|
@ -113,69 +113,65 @@ export function ContractSearch(props: {
|
||||||
track('select search category', { category: pill ?? 'all' })
|
track('select search category', { category: pill ?? 'all' })
|
||||||
}
|
}
|
||||||
|
|
||||||
const { facetFilters, numericFilters } = useMemo(() => {
|
let facetFilters = [
|
||||||
let facetFilters = [
|
filter === 'open' ? 'isResolved:false' : '',
|
||||||
filter === 'open' ? 'isResolved:false' : '',
|
filter === 'closed' ? 'isResolved:false' : '',
|
||||||
filter === 'closed' ? 'isResolved:false' : '',
|
filter === 'resolved' ? 'isResolved:true' : '',
|
||||||
filter === 'resolved' ? 'isResolved:true' : '',
|
additionalFilter?.creatorId
|
||||||
additionalFilter?.creatorId
|
? `creatorId:${additionalFilter.creatorId}`
|
||||||
? `creatorId:${additionalFilter.creatorId}`
|
: '',
|
||||||
: '',
|
additionalFilter?.tag ? `lowercaseTags:${additionalFilter.tag}` : '',
|
||||||
additionalFilter?.tag ? `lowercaseTags:${additionalFilter.tag}` : '',
|
additionalFilter?.groupSlug
|
||||||
additionalFilter?.groupSlug
|
? `groupLinks.slug:${additionalFilter.groupSlug}`
|
||||||
? `groupLinks.slug:${additionalFilter.groupSlug}`
|
: '',
|
||||||
: '',
|
pillFilter && pillFilter !== 'personal' && pillFilter !== 'your-bets'
|
||||||
pillFilter && pillFilter !== 'personal' && pillFilter !== 'your-bets'
|
? `groupLinks.slug:${pillFilter}`
|
||||||
? `groupLinks.slug:${pillFilter}`
|
: '',
|
||||||
: '',
|
pillFilter === 'personal'
|
||||||
pillFilter === 'personal'
|
? // Show contracts in groups that the user is a member of
|
||||||
? // Show contracts in groups that the user is a member of
|
memberGroupSlugs
|
||||||
memberGroupSlugs
|
.map((slug) => `groupLinks.slug:${slug}`)
|
||||||
.map((slug) => `groupLinks.slug:${slug}`)
|
// Show contracts created by users the user follows
|
||||||
// Show contracts created by users the user follows
|
.concat(follows?.map((followId) => `creatorId:${followId}`) ?? [])
|
||||||
.concat(follows?.map((followId) => `creatorId:${followId}`) ?? [])
|
// Show contracts bet on by users the user follows
|
||||||
// Show contracts bet on by users the user follows
|
.concat(
|
||||||
.concat(
|
follows?.map((followId) => `uniqueBettorIds:${followId}`) ?? []
|
||||||
follows?.map((followId) => `uniqueBettorIds:${followId}`) ?? []
|
)
|
||||||
)
|
: '',
|
||||||
: '',
|
// Subtract contracts you bet on from For you.
|
||||||
// Subtract contracts you bet on from For you.
|
pillFilter === 'personal' && user ? `uniqueBettorIds:-${user.id}` : '',
|
||||||
pillFilter === 'personal' && user ? `uniqueBettorIds:-${user.id}` : '',
|
pillFilter === 'your-bets' && user
|
||||||
pillFilter === 'your-bets' && user
|
? // Show contracts bet on by the user
|
||||||
? // Show contracts bet on by the user
|
`uniqueBettorIds:${user.id}`
|
||||||
`uniqueBettorIds:${user.id}`
|
: '',
|
||||||
: '',
|
].filter((f) => f)
|
||||||
].filter((f) => f)
|
// Hack to make Algolia work.
|
||||||
// Hack to make Algolia work.
|
facetFilters = ['', ...facetFilters]
|
||||||
facetFilters = ['', ...facetFilters]
|
|
||||||
|
|
||||||
const numericFilters = [
|
const numericFilters = [
|
||||||
filter === 'open' ? `closeTime > ${Date.now()}` : '',
|
filter === 'open' ? `closeTime > ${Date.now()}` : '',
|
||||||
filter === 'closed' ? `closeTime <= ${Date.now()}` : '',
|
filter === 'closed' ? `closeTime <= ${Date.now()}` : '',
|
||||||
].filter((f) => f)
|
].filter((f) => f)
|
||||||
|
|
||||||
return { facetFilters, numericFilters }
|
|
||||||
}, [
|
|
||||||
filter,
|
|
||||||
Object.values(additionalFilter ?? {}).join(','),
|
|
||||||
memberGroupSlugs.join(','),
|
|
||||||
(follows ?? []).join(','),
|
|
||||||
pillFilter,
|
|
||||||
])
|
|
||||||
|
|
||||||
const indexName = `${indexPrefix}contracts-${sort}`
|
const indexName = `${indexPrefix}contracts-${sort}`
|
||||||
const index = useMemo(() => searchClient.initIndex(indexName), [indexName])
|
const index = useMemo(() => searchClient.initIndex(indexName), [indexName])
|
||||||
|
|
||||||
const [query, setQuery] = useState('')
|
const [query, setQuery] = useState('')
|
||||||
const [page, setPage] = useState(0)
|
const [page, setPage] = useState(0)
|
||||||
|
const [numPages, setNumPages] = useState(1)
|
||||||
const [hitsByPage, setHitsByPage] = useState<{ [page: string]: Contract[] }>(
|
const [hitsByPage, setHitsByPage] = useState<{ [page: string]: Contract[] }>(
|
||||||
{}
|
{}
|
||||||
)
|
)
|
||||||
const hits = range(0, page + 1)
|
|
||||||
.map((p) => hitsByPage[p] ?? [])
|
|
||||||
.flat()
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
console.log('search', {
|
||||||
|
query,
|
||||||
|
page,
|
||||||
|
numPages,
|
||||||
|
index,
|
||||||
|
facetFilters,
|
||||||
|
numericFilters,
|
||||||
|
})
|
||||||
index
|
index
|
||||||
.search(query, {
|
.search(query, {
|
||||||
facetFilters,
|
facetFilters,
|
||||||
|
@ -194,17 +190,31 @@ export function ContractSearch(props: {
|
||||||
[page]: results.hits,
|
[page]: results.hits,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
setNumPages(results.nbPages)
|
||||||
console.log(results.page, '/', results.nbPages, results.hits)
|
console.log(results.page, '/', results.nbPages, results.hits)
|
||||||
})
|
})
|
||||||
}, [query, page, index, facetFilters, numericFilters])
|
// Note numeric filters are unique based on current time, so can't compare
|
||||||
|
// them by value.
|
||||||
|
}, [query, page, index, JSON.stringify(facetFilters), filter])
|
||||||
|
|
||||||
const showTime =
|
const loadMore = () => {
|
||||||
sort === 'close-date' || sort === 'resolve-date' ? sort : undefined
|
if (page >= numPages - 1) return
|
||||||
|
|
||||||
|
const haveLoadedCurrentPage = hitsByPage[page]
|
||||||
|
if (haveLoadedCurrentPage) setPage(page + 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const hits = range(0, page + 1)
|
||||||
|
.map((p) => hitsByPage[p] ?? [])
|
||||||
|
.flat()
|
||||||
|
|
||||||
const contracts = hits.filter(
|
const contracts = hits.filter(
|
||||||
(c) => !additionalFilter?.excludeContractIds?.includes(c.id)
|
(c) => !additionalFilter?.excludeContractIds?.includes(c.id)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const showTime =
|
||||||
|
sort === 'close-date' || sort === 'resolve-date' ? sort : undefined
|
||||||
|
|
||||||
const selectFilter = (filter: filter) => {
|
const selectFilter = (filter: filter) => {
|
||||||
setFilter(filter)
|
setFilter(filter)
|
||||||
trackCallback('select search filter', { filter })
|
trackCallback('select search filter', { filter })
|
||||||
|
@ -314,7 +324,7 @@ export function ContractSearch(props: {
|
||||||
) : (
|
) : (
|
||||||
<ContractsGrid
|
<ContractsGrid
|
||||||
contracts={contracts}
|
contracts={contracts}
|
||||||
loadMore={() => hitsByPage[page] && setPage(page + 1)}
|
loadMore={loadMore}
|
||||||
hasMore={true}
|
hasMore={true}
|
||||||
showTime={showTime}
|
showTime={showTime}
|
||||||
onContractClick={onContractClick}
|
onContractClick={onContractClick}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user