Client-side render pages that need auth
These pages are now client-side rendered: - /home - /leaderboards - /market/... - /fold/...
This commit is contained in:
		
							parent
							
								
									eef35cd7d0
								
							
						
					
					
						commit
						20d18f3588
					
				|  | @ -29,7 +29,7 @@ export const useContractWithPreload = ( | ||||||
|   useEffect(() => { |   useEffect(() => { | ||||||
|     if (contractId) return listenForContract(contractId, setContract) |     if (contractId) return listenForContract(contractId, setContract) | ||||||
| 
 | 
 | ||||||
|     if (contractId !== null) |     if (contractId !== null && slug) | ||||||
|       getContractFromSlug(slug).then((c) => setContractId(c?.id || null)) |       getContractFromSlug(slug).then((c) => setContractId(c?.id || null)) | ||||||
|   }, [contractId, slug]) |   }, [contractId, slug]) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										30
									
								
								web/hooks/use-propz.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								web/hooks/use-propz.ts
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | import _ from 'lodash' | ||||||
|  | import { useRouter } from 'next/router' | ||||||
|  | import { useState, useEffect } from 'react' | ||||||
|  | 
 | ||||||
|  | type PropzProps = { | ||||||
|  |   params: any | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // getStaticPropz should exactly match getStaticProps
 | ||||||
|  | // This allows us to client-side render the page for authenticated users.
 | ||||||
|  | // TODO: Could cache the result using stale-while-revalidate: https://swr.vercel.app/
 | ||||||
|  | export function usePropz( | ||||||
|  |   getStaticPropz: (props?: PropzProps) => Promise<any>, | ||||||
|  |   // Dynamic routes will need the query params from the router
 | ||||||
|  |   needParams?: boolean | ||||||
|  | ) { | ||||||
|  |   // Get params from router
 | ||||||
|  |   const router = useRouter() | ||||||
|  |   const params = router.query | ||||||
|  | 
 | ||||||
|  |   const [propz, setPropz] = useState<any>(undefined) | ||||||
|  |   useEffect(() => { | ||||||
|  |     if (needParams && _.isEmpty(params)) { | ||||||
|  |       return | ||||||
|  |     } | ||||||
|  |     // @ts-ignore
 | ||||||
|  |     getStaticPropz({ params }).then((result) => setPropz(result.props)) | ||||||
|  |   }, [params]) | ||||||
|  |   return propz | ||||||
|  | } | ||||||
|  | @ -29,8 +29,9 @@ import { useFoldsWithTags } from '../../hooks/use-fold' | ||||||
| import { listAllAnswers } from '../../lib/firebase/answers' | import { listAllAnswers } from '../../lib/firebase/answers' | ||||||
| import { Answer } from '../../../common/answer' | import { Answer } from '../../../common/answer' | ||||||
| import { AnswersPanel } from '../../components/answers/answers-panel' | import { AnswersPanel } from '../../components/answers/answers-panel' | ||||||
|  | import { usePropz } from '../../hooks/use-propz' | ||||||
| 
 | 
 | ||||||
| export async function getStaticProps(props: { | export async function getStaticPropz(props: { | ||||||
|   params: { username: string; contractSlug: string } |   params: { username: string; contractSlug: string } | ||||||
| }) { | }) { | ||||||
|   const { username, contractSlug } = props.params |   const { username, contractSlug } = props.params | ||||||
|  | @ -64,7 +65,7 @@ export async function getStaticProps(props: { | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function getStaticPaths() { | export async function getStaticPathz() { | ||||||
|   return { paths: [], fallback: 'blocking' } |   return { paths: [], fallback: 'blocking' } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -77,6 +78,16 @@ export default function ContractPage(props: { | ||||||
|   slug: string |   slug: string | ||||||
|   folds: Fold[] |   folds: Fold[] | ||||||
| }) { | }) { | ||||||
|  |   // @ts-ignore
 | ||||||
|  |   props = usePropz(getStaticPropz, true) ?? { | ||||||
|  |     contract: null, | ||||||
|  |     username: '', | ||||||
|  |     comments: [], | ||||||
|  |     answers: [], | ||||||
|  |     bets: [], | ||||||
|  |     slug: '', | ||||||
|  |     folds: [], | ||||||
|  |   } | ||||||
|   const user = useUser() |   const user = useUser() | ||||||
| 
 | 
 | ||||||
|   const contract = useContractWithPreload(props.slug, props.contract) |   const contract = useContractWithPreload(props.slug, props.contract) | ||||||
|  |  | ||||||
|  | @ -40,8 +40,9 @@ import FeedCreate from '../../../components/feed-create' | ||||||
| import { SEO } from '../../../components/SEO' | import { SEO } from '../../../components/SEO' | ||||||
| import { useTaggedContracts } from '../../../hooks/use-contracts' | import { useTaggedContracts } from '../../../hooks/use-contracts' | ||||||
| import { Linkify } from '../../../components/linkify' | import { Linkify } from '../../../components/linkify' | ||||||
|  | import { usePropz } from '../../../hooks/use-propz' | ||||||
| 
 | 
 | ||||||
| export async function getStaticProps(props: { params: { slugs: string[] } }) { | export async function getStaticPropz(props: { params: { slugs: string[] } }) { | ||||||
|   const { slugs } = props.params |   const { slugs } = props.params | ||||||
| 
 | 
 | ||||||
|   const fold = await getFoldBySlug(slugs[0]) |   const fold = await getFoldBySlug(slugs[0]) | ||||||
|  | @ -124,7 +125,7 @@ async function toTopUsers(userScores: { [userId: string]: number }) { | ||||||
|   return topUsers.filter((user) => user) |   return topUsers.filter((user) => user) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function getStaticPaths() { | export async function getStaticPathz() { | ||||||
|   return { paths: [], fallback: 'blocking' } |   return { paths: [], fallback: 'blocking' } | ||||||
| } | } | ||||||
| const foldSubpages = [undefined, 'activity', 'markets', 'leaderboards'] as const | const foldSubpages = [undefined, 'activity', 'markets', 'leaderboards'] as const | ||||||
|  | @ -141,6 +142,19 @@ export default function FoldPage(props: { | ||||||
|   creatorScores: { [userId: string]: number } |   creatorScores: { [userId: string]: number } | ||||||
|   topCreators: User[] |   topCreators: User[] | ||||||
| }) { | }) { | ||||||
|  |   // @ts-ignore
 | ||||||
|  |   props = usePropz(getStaticPropz, true) ?? { | ||||||
|  |     fold: null, | ||||||
|  |     curator: null, | ||||||
|  |     contracts: [], | ||||||
|  |     activeContracts: [], | ||||||
|  |     activeContractBets: [], | ||||||
|  |     activeContractComments: [], | ||||||
|  |     traderScores: {}, | ||||||
|  |     topTraders: [], | ||||||
|  |     creatorScores: {}, | ||||||
|  |     topCreators: [], | ||||||
|  |   } | ||||||
|   const { |   const { | ||||||
|     curator, |     curator, | ||||||
|     activeContractBets, |     activeContractBets, | ||||||
|  | @ -154,7 +168,7 @@ export default function FoldPage(props: { | ||||||
|   const router = useRouter() |   const router = useRouter() | ||||||
|   const { slugs } = router.query as { slugs: string[] } |   const { slugs } = router.query as { slugs: string[] } | ||||||
| 
 | 
 | ||||||
|   const page = (slugs[1] ?? 'activity') as typeof foldSubpages[number] |   const page = (slugs?.[1] ?? 'activity') as typeof foldSubpages[number] | ||||||
| 
 | 
 | ||||||
|   const fold = useFold(props.fold?.id) ?? props.fold |   const fold = useFold(props.fold?.id) ?? props.fold | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -20,8 +20,9 @@ import { | ||||||
|   useFindActiveContracts, |   useFindActiveContracts, | ||||||
| } from '../hooks/use-active-contracts' | } from '../hooks/use-active-contracts' | ||||||
| import { useGetRecentBets } from '../hooks/use-bets' | import { useGetRecentBets } from '../hooks/use-bets' | ||||||
|  | import { usePropz } from '../hooks/use-propz' | ||||||
| 
 | 
 | ||||||
| export async function getStaticProps() { | export async function getStaticPropz() { | ||||||
|   const contractInfo = await getAllContractInfo() |   const contractInfo = await getAllContractInfo() | ||||||
| 
 | 
 | ||||||
|   return { |   return { | ||||||
|  | @ -36,6 +37,11 @@ const Home = (props: { | ||||||
|   recentBets: Bet[] |   recentBets: Bet[] | ||||||
|   recentComments: Comment[] |   recentComments: Comment[] | ||||||
| }) => { | }) => { | ||||||
|  |   props = usePropz(getStaticPropz) ?? { | ||||||
|  |     contracts: [], | ||||||
|  |     folds: [], | ||||||
|  |     recentComments: [], | ||||||
|  |   } | ||||||
|   const { contracts, folds, recentComments } = props |   const { contracts, folds, recentComments } = props | ||||||
|   const user = useUser() |   const user = useUser() | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -5,8 +5,9 @@ import { Leaderboard } from '../components/leaderboard' | ||||||
| import { Page } from '../components/page' | import { Page } from '../components/page' | ||||||
| import { getTopCreators, getTopTraders, User } from '../lib/firebase/users' | import { getTopCreators, getTopTraders, User } from '../lib/firebase/users' | ||||||
| import { formatMoney } from '../../common/util/format' | import { formatMoney } from '../../common/util/format' | ||||||
|  | import { usePropz } from '../hooks/use-propz' | ||||||
| 
 | 
 | ||||||
| export async function getStaticProps() { | export async function getStaticPropz() { | ||||||
|   const [topTraders, topCreators] = await Promise.all([ |   const [topTraders, topCreators] = await Promise.all([ | ||||||
|     getTopTraders().catch((_) => {}), |     getTopTraders().catch((_) => {}), | ||||||
|     getTopCreators().catch((_) => {}), |     getTopCreators().catch((_) => {}), | ||||||
|  | @ -26,6 +27,10 @@ export default function Leaderboards(props: { | ||||||
|   topTraders: User[] |   topTraders: User[] | ||||||
|   topCreators: User[] |   topCreators: User[] | ||||||
| }) { | }) { | ||||||
|  |   props = usePropz(getStaticPropz) ?? { | ||||||
|  |     topTraders: [], | ||||||
|  |     topCreators: [], | ||||||
|  |   } | ||||||
|   const { topTraders, topCreators } = props |   const { topTraders, topCreators } = props | ||||||
| 
 | 
 | ||||||
|   return ( |   return ( | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user