import React, { useEffect, useState } from 'react' import Router, { useRouter } from 'next/router' import { PlusSmIcon } from '@heroicons/react/solid' import { Page } from 'web/components/page' import { Col } from 'web/components/layout/col' import { useUser } from 'web/hooks/use-user' import { getSavedSort } from 'web/hooks/use-sort-and-query-params' import { ContractSearch } from 'web/components/contract-search' import { Contract } from 'common/contract' import { ContractPageContent } from './[username]/[contractSlug]' import { getContractFromSlug } from 'web/lib/firebase/contracts' import { useTracking } from 'web/hooks/use-tracking' import { track } from 'web/lib/service/analytics' const Home = () => { const user = useUser() const [contract, setContract] = useContractPage() const router = useRouter() useTracking('view home') if (user === null) { Router.replace('/') return <> } 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(setContract) } } } 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 () => { window.history.pushState = pushState window.history.replaceState = replaceState } }, []) useEffect(() => { if (contract) window.scrollTo(0, 0) }, [contract]) return [contract, setContract] as const } export default Home