import React, { useEffect, useState } from 'react' import { useRouter } from 'next/router' import { PlusSmIcon } from '@heroicons/react/solid' import { Page } from 'web/components/page' import { Col } from 'web/components/layout/col' import { getSavedSort } from 'web/hooks/use-sort-and-query-params' import { ContractSearch, DEFAULT_SORT } from 'web/components/contract-search' import { Contract } from 'common/contract' import { User } from 'common/user' import { ContractPageContent } from './[username]/[contractSlug]' import { getContractFromSlug } from 'web/lib/firebase/contracts' import { getUser } from 'web/lib/firebase/users' import { useTracking } from 'web/hooks/use-tracking' import { track } from 'web/lib/service/analytics' import { redirectIfLoggedOut } from 'web/lib/firebase/server-auth' import { useSaveReferral } from 'web/hooks/use-save-referral' export const getServerSideProps = redirectIfLoggedOut('/', async (_, creds) => { const user = await getUser(creds.user.uid) return { props: { user } } }) const Home = (props: { user: User }) => { const { user } = props const [contract, setContract] = useContractPage() const router = useRouter() useTracking('view home') useSaveReferral() return ( <> { // Show contract without navigating to contract page. setContract(c) // Update the url without switching pages in Nextjs. history.pushState(null, '', `/${c.creatorUsername}/${c.slug}`) }} /> {contract && ( { history.back() }} /> )} ) } const useContractPage = () => { const [contract, setContract] = useState() useEffect(() => { const updateContract = () => { const path = location.pathname.split('/').slice(1) if (path[0] === 'home') setContract(undefined) else { const [username, contractSlug] = path if (!username || !contractSlug) setContract(undefined) else { // Show contract if route is to a contract: '/[username]/[contractSlug]'. getContractFromSlug(contractSlug).then((contract) => { const path = location.pathname.split('/').slice(1) const [_username, contractSlug] = path // Make sure we're still on the same contract. if (contract?.slug === contractSlug) setContract(contract) }) } } } addEventListener('popstate', updateContract) const { pushState, replaceState } = window.history window.history.pushState = function () { // eslint-disable-next-line prefer-rest-params pushState.apply(history, arguments as any) updateContract() } window.history.replaceState = function () { // eslint-disable-next-line prefer-rest-params replaceState.apply(history, arguments as any) updateContract() } return () => { removeEventListener('popstate', updateContract) window.history.pushState = pushState window.history.replaceState = replaceState } }, []) useEffect(() => { if (contract) window.scrollTo(0, 0) }, [contract]) return [contract, setContract] as const } export default Home