import { useFirestoreQueryData } from '@react-query-firebase/firestore' import { useEffect, useState } from 'react' import { Contract, listenForContracts, listenForHotContracts, listenForInactiveContracts, getUserBetContracts, getUserBetContractsQuery, listAllContracts, trendingContractsQuery, } from 'web/lib/firebase/contracts' import { QueryClient, useQuery, useQueryClient } from 'react-query' import { MINUTE_MS } from 'common/util/time' import { query, limit } from 'firebase/firestore' import { dailyScoreIndex } from 'web/lib/service/algolia' import { CPMMBinaryContract } from 'common/contract' import { zipObject } from 'lodash' export const useContracts = () => { const [contracts, setContracts] = useState() useEffect(() => { return listenForContracts(setContracts) }, []) return contracts } export const useContractsByDailyScoreGroups = ( groupSlugs: string[] | undefined ) => { const facetFilters = ['isResolved:false'] const { data } = useQuery(['daily-score', groupSlugs], () => Promise.all( (groupSlugs ?? []).map((slug) => dailyScoreIndex.search('', { facetFilters: [...facetFilters, `groupLinks.slug:${slug}`], }) ) ) ) if (!groupSlugs || !data || data.length !== groupSlugs.length) return undefined return zipObject( groupSlugs, data.map((d) => d.hits.filter((c) => c.dailyScore)) ) } const q = new QueryClient() export const getCachedContracts = async () => q.fetchQuery(['contracts'], () => listAllContracts(1000), { staleTime: Infinity, }) export const useTrendingContracts = (maxContracts: number) => { const result = useFirestoreQueryData( ['trending-contracts', maxContracts], query(trendingContractsQuery, limit(maxContracts)) ) return result.data } export const useInactiveContracts = () => { const [contracts, setContracts] = useState() useEffect(() => { return listenForInactiveContracts(setContracts) }, []) return contracts } export const useHotContracts = () => { const [hotContracts, setHotContracts] = useState() useEffect(() => listenForHotContracts(setHotContracts), []) return hotContracts } export const usePrefetchUserBetContracts = (userId: string) => { const queryClient = useQueryClient() return queryClient.prefetchQuery( ['contracts', 'bets', userId], () => getUserBetContracts(userId), { staleTime: 5 * MINUTE_MS } ) } export const useUserBetContracts = (userId: string) => { const result = useFirestoreQueryData( ['contracts', 'bets', userId], getUserBetContractsQuery(userId) ) return result.data }