Embed markets below landing page. Listen for market changes
This commit is contained in:
parent
1c4a834696
commit
9bf257ef64
|
@ -30,13 +30,6 @@ export const Hero = () => {
|
|||
Sign in to get started!
|
||||
</button>
|
||||
</div>
|
||||
<div className="mt-2">
|
||||
<Link href="/markets">
|
||||
<a className="text-green-500 text-sm hover:underline hover:decoration-2">
|
||||
Or explore all markets
|
||||
</a>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -5,7 +5,7 @@ export function Title(props: { text: string; className?: string }) {
|
|||
return (
|
||||
<h1
|
||||
className={clsx(
|
||||
'text-3xl font-major-mono tracking-tight lowercase text-indigo-700 font-bold mt-6 mb-4',
|
||||
'text-3xl font-major-mono tracking-tight lowercase text-indigo-700 font-bold inline-block mt-6 mb-4',
|
||||
className
|
||||
)}
|
||||
>
|
||||
|
|
12
web/hooks/use-contracts.ts
Normal file
12
web/hooks/use-contracts.ts
Normal file
|
@ -0,0 +1,12 @@
|
|||
import { useEffect, useState } from 'react'
|
||||
import { Contract, listenForContracts } from '../lib/firebase/contracts'
|
||||
|
||||
export const useContracts = () => {
|
||||
const [contracts, setContracts] = useState<Contract[] | 'loading'>('loading')
|
||||
|
||||
useEffect(() => {
|
||||
return listenForContracts(setContracts)
|
||||
}, [])
|
||||
|
||||
return contracts
|
||||
}
|
|
@ -93,6 +93,15 @@ export async function listAllContracts(): Promise<Contract[]> {
|
|||
return snapshot.docs.map((doc) => doc.data() as Contract)
|
||||
}
|
||||
|
||||
export function listenForContracts(
|
||||
setContracts: (contracts: Contract[]) => void
|
||||
) {
|
||||
const q = query(contractCollection, orderBy('createdTime', 'desc'), limit(25))
|
||||
return onSnapshot(q, (snap) => {
|
||||
setContracts(snap.docs.map((doc) => doc.data() as Contract))
|
||||
})
|
||||
}
|
||||
|
||||
export function listenForContract(
|
||||
contractId: string,
|
||||
setContract: (contract: Contract | null) => void
|
||||
|
|
|
@ -5,12 +5,29 @@ import type { NextPage } from 'next'
|
|||
import { Hero } from '../components/hero'
|
||||
import { useUser } from '../hooks/use-user'
|
||||
import Markets from './markets'
|
||||
import { useContracts } from '../hooks/use-contracts'
|
||||
import { SearchableGrid } from '../components/contracts-list'
|
||||
import { Title } from '../components/title'
|
||||
|
||||
const Home: NextPage = () => {
|
||||
const user = useUser()
|
||||
|
||||
if (user === undefined) return <></>
|
||||
return user ? <Markets /> : <Hero />
|
||||
return user ? <Markets /> : <LandingPage />
|
||||
}
|
||||
|
||||
function LandingPage() {
|
||||
const contracts = useContracts()
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Hero />
|
||||
<div className="max-w-4xl py-8 mx-auto">
|
||||
<Title text="Explore prediction markets" />
|
||||
<SearchableGrid contracts={contracts === 'loading' ? [] : contracts} />
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default Home
|
||||
|
|
|
@ -1,20 +1,15 @@
|
|||
import { useEffect, useState } from 'react'
|
||||
import { SearchableGrid } from '../components/contracts-list'
|
||||
import { Header } from '../components/header'
|
||||
import { listAllContracts } from '../lib/firebase/contracts'
|
||||
import { Contract } from '../lib/firebase/contracts'
|
||||
import { useContracts } from '../hooks/use-contracts'
|
||||
|
||||
export default function Markets() {
|
||||
const [contracts, setContracts] = useState<Contract[]>([])
|
||||
useEffect(() => {
|
||||
listAllContracts().then(setContracts)
|
||||
}, [])
|
||||
const contracts = useContracts()
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Header />
|
||||
<div className="max-w-4xl py-8 mx-auto">
|
||||
<SearchableGrid contracts={contracts} />
|
||||
<SearchableGrid contracts={contracts === 'loading' ? [] : contracts} />
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue
Block a user