Migrate home page to Next.js routing

I think that means we're done? :3 Gonna uninstall react-router-dom next.
This commit is contained in:
Emi Matchu 2022-09-15 00:43:05 -07:00
parent eb602556bf
commit 38170bfbb2
5 changed files with 27 additions and 90 deletions

View file

@ -1,22 +0,0 @@
import React from "react";
import type { NextPageWithLayout } from "./_app";
// import App from '../src'
// next/dynamic is used to prevent breaking incompatibilities
// with SSR from window.SOME_VAR usage, if this is not used
// next/dynamic can be removed to take advantage of SSR/prerendering
import dynamic from "next/dynamic";
// try changing "ssr" to true below to test for incompatibilities, if
// no errors occur the above static import can be used instead and the
// below removed
const App = dynamic(() => import("../src/app/App"), { ssr: false });
const FallbackPage: NextPageWithLayout = () => {
return <App />;
};
// This old fallback page uses App, which already has PageLayout built-in.
FallbackPage.renderWithLayout = (children: JSX.Element) => children;
export default FallbackPage;

5
pages/index.tsx Normal file
View file

@ -0,0 +1,5 @@
import HomePage from "../src/app/HomePage";
export default function HomePageWrapper() {
return <HomePage />;
}

View file

@ -1,46 +0,0 @@
import React from "react";
import {
BrowserRouter as Router,
Switch,
Route,
useLocation,
} from "react-router-dom";
import PageLayout from "./PageLayout";
import { loadable } from "./util";
const HomePage = loadable(() => import("./HomePage"));
/**
* App is the entry point of our application. There's not a ton of exciting
* stuff happening here, mostly just setting up some globals and theming!
*
* To really dive into the code, try going down into a page component!
*/
function App() {
return (
<Router>
<ScrollToTop />
<Switch>
<Route path="/">
<PageLayout hideHomeLink>
<HomePage />
</PageLayout>
</Route>
</Switch>
</Router>
);
}
/**
* ScrollToTop scrolls to the top of the page when you navigate.
* Copied from https://reactrouter.com/web/guides/scroll-restoration/scroll-to-top.
*/
function ScrollToTop() {
const { pathname } = useLocation();
React.useEffect(() => window.scrollTo(0, 0), [pathname]);
return null;
}
export default App;

View file

@ -37,7 +37,7 @@ function GlobalHeader() {
function HomeLink(props) { function HomeLink(props) {
const { pathname } = useRouter(); const { pathname } = useRouter();
const isHomePage = pathname === ""; const isHomePage = pathname === "/";
return ( return (
<Link href="/" passHref> <Link href="/" passHref>

View file

@ -35,8 +35,9 @@ import {
VStack, VStack,
} from "@chakra-ui/react"; } from "@chakra-ui/react";
import { ArrowForwardIcon, SearchIcon } from "@chakra-ui/icons"; import { ArrowForwardIcon, SearchIcon } from "@chakra-ui/icons";
import { Link, useHistory, useLocation } from "react-router-dom";
import { useLazyQuery, useQuery } from "@apollo/client"; import { useLazyQuery, useQuery } from "@apollo/client";
import Link from "next/link";
import { useRouter } from "next/router";
import Image from "next/image"; import Image from "next/image";
import { import {
@ -136,7 +137,7 @@ function HomePage() {
} }
function StartOutfitForm({ onChange }) { function StartOutfitForm({ onChange }) {
const history = useHistory(); const { push: pushHistory } = useRouter();
const idealPose = React.useMemo( const idealPose = React.useMemo(
() => (Math.random() > 0.5 ? "HAPPY_FEM" : "HAPPY_MASC"), () => (Math.random() > 0.5 ? "HAPPY_FEM" : "HAPPY_MASC"),
@ -161,7 +162,7 @@ function StartOutfitForm({ onChange }) {
pose: closestPose, pose: closestPose,
}); });
history.push(`/outfits/new?${params}`); pushHistory(`/outfits/new?${params}`);
}; };
const buttonBgColor = useColorModeValue("green.600", "green.300"); const buttonBgColor = useColorModeValue("green.600", "green.300");
@ -208,10 +209,9 @@ function StartOutfitForm({ onChange }) {
} }
function SubmitPetForm() { function SubmitPetForm() {
const history = useHistory(); const { query, push: pushHistory } = useRouter();
const theme = useTheme(); const theme = useTheme();
const toast = useToast(); const toast = useToast();
const location = useLocation();
const [petName, setPetName] = React.useState(""); const [petName, setPetName] = React.useState("");
@ -247,7 +247,7 @@ function SubmitPetForm() {
for (const item of items) { for (const item of items) {
params.append("objects[]", item.id); params.append("objects[]", item.id);
} }
history.push(`/outfits/new?${params}`); pushHistory(`/outfits/new?${params}`);
}, },
onError: () => { onError: () => {
toast({ toast({
@ -279,14 +279,13 @@ function SubmitPetForm() {
// custom search engines. (I feel like a route or a different UX would be // custom search engines. (I feel like a route or a different UX would be
// better, but I don't really know enough to commit to one… let's just keep // better, but I don't really know enough to commit to one… let's just keep
// this simple for now, I think. We might change this someday!) // this simple for now, I think. We might change this someday!)
const autoLoadPetName = query.loadPet;
React.useEffect(() => { React.useEffect(() => {
const params = new URLSearchParams(location.search); if (autoLoadPetName != null) {
const petName = params.get("loadPet"); setPetName(autoLoadPetName);
if (petName) { loadPet(autoLoadPetName);
setPetName(petName);
loadPet(petName);
} }
}, [location, loadPet]); }, [autoLoadPetName, loadPet]);
const { brightBackground } = useCommonStyles(); const { brightBackground } = useCommonStyles();
const inputBorderColor = useColorModeValue("green.600", "green.500"); const inputBorderColor = useColorModeValue("green.600", "green.500");
@ -358,22 +357,24 @@ function NewItemsSection() {
function ItemsSearchField() { function ItemsSearchField() {
const [query, setQuery] = React.useState(""); const [query, setQuery] = React.useState("");
const { brightBackground } = useCommonStyles(); const { brightBackground } = useCommonStyles();
const history = useHistory(); const { push: pushHistory } = useRouter();
return ( return (
<form <form
onSubmit={(e) => { onSubmit={(e) => {
e.preventDefault(); e.preventDefault();
if (query) { if (query) {
history.push(`/items/search/${encodeURIComponent(query)}`); pushHistory(`/items/search/${encodeURIComponent(query)}`);
} }
}} }}
> >
<InputGroup size="sm"> <InputGroup size="sm">
<InputLeftElement> <InputLeftElement>
<Box as={Link} to="/items/search" display="flex"> <Link href="/items/search" passHref>
<SearchIcon color="gray.400" /> <Box as="a" display="flex">
</Box> <SearchIcon color="gray.400" />
</Box>
</Link>
</InputLeftElement> </InputLeftElement>
<Input <Input
value={query} value={query}
@ -906,12 +907,11 @@ function FeedbackForm() {
* other people know about the tools and poke around a powerless interface! * other people know about the tools and poke around a powerless interface!
*/ */
function useSupportSetup() { function useSupportSetup() {
const location = useLocation(); const { query } = useRouter();
const toast = useToast(); const toast = useToast();
const supportSecret = query.supportSecret;
React.useEffect(() => { React.useEffect(() => {
const params = new URLSearchParams(location.search);
const supportSecret = params.get("supportSecret");
const existingSupportSecret = localStorage.getItem("supportSecret"); const existingSupportSecret = localStorage.getItem("supportSecret");
if (supportSecret && supportSecret !== existingSupportSecret) { if (supportSecret && supportSecret !== existingSupportSecret) {
@ -937,7 +937,7 @@ function useSupportSetup() {
isClosable: true, isClosable: true,
}); });
} }
}, [location, toast]); }, [supportSecret, toast]);
} }
export default HomePage; export default HomePage;