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:
parent
eb602556bf
commit
38170bfbb2
5 changed files with 27 additions and 90 deletions
|
@ -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
5
pages/index.tsx
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import HomePage from "../src/app/HomePage";
|
||||||
|
|
||||||
|
export default function HomePageWrapper() {
|
||||||
|
return <HomePage />;
|
||||||
|
}
|
|
@ -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;
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
<Box as="a" display="flex">
|
||||||
<SearchIcon color="gray.400" />
|
<SearchIcon color="gray.400" />
|
||||||
</Box>
|
</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;
|
||||||
|
|
Loading…
Reference in a new issue