Skip to content

Commit

Permalink
Fix mobile drawer on home page
Browse files Browse the repository at this point in the history
  • Loading branch information
maltejur committed Mar 2, 2021
1 parent 87579a0 commit 6ee1b16
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 16 deletions.
13 changes: 11 additions & 2 deletions components/jumbo/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,16 @@ import React from "react";
import { Paper, Typography, useTheme } from "@material-ui/core";
import { JumboThemeProvider } from "hooks/themes";
import Image from "next/image";
import SearchBar from "components/searchBar";
import classes from "./style.module.css";

export default function Jumbo({ search }) {
export default function Jumbo({
query,
setQuery,
}: {
query: string;
setQuery: React.Dispatch<React.SetStateAction<string>>;
}) {
const theme = useTheme();

return (
Expand All @@ -31,7 +38,9 @@ export default function Jumbo({ search }) {
<Typography className={classes.h2}>
Welcome to GitHub's largest open-source algorithm library
</Typography>
<div className={classes.input}>{search}</div>
<div className={classes.input}>
<SearchBar query={query} setQuery={setQuery} />
</div>
</div>
</div>
</JumboThemeProvider>
Expand Down
30 changes: 25 additions & 5 deletions components/navbar/index.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useState, useEffect } from "react";
import React, { useState, useEffect, useMemo } from "react";
import {
AppBar,
Toolbar,
Expand All @@ -14,6 +14,8 @@ import {
import NextLink from "next/link";
import { JumboThemeProvider } from "hooks/themes";
import Link from "components/link";
import { useRouter } from "next/router";
import SearchBar from "components/searchBar";
import classes from "./style.module.css";

const menu = [
Expand All @@ -35,10 +37,22 @@ const menu = [
},
];

export default function Navbar({ search, darkTheme, setDarkTheme }) {
export default function Navbar({
darkTheme,
setDarkTheme,
query,
setQuery,
}: {
darkTheme: boolean;
setDarkTheme: React.Dispatch<React.SetStateAction<boolean>>;
query: string;
setQuery: React.Dispatch<React.SetStateAction<string>>;
}) {
const [atTop, setAtTop] = useState(false);
const smallScreen = useMediaQuery("(max-width:800px)");
const [menuOpen, setMenuOpen] = useState(false);
const router = useRouter();
const isHome = router.route === "/";

useEffect(() => {
setAtTop(window.scrollY < 1);
Expand All @@ -57,7 +71,9 @@ export default function Navbar({ search, darkTheme, setDarkTheme }) {
return (
<AppBar
className={
atTop && !search ? classes.root : `${classes.root} ${classes.scrolled}`
!menuOpen && atTop && isHome
? classes.root
: `${classes.root} ${classes.scrolled}`
}
position="fixed"
>
Expand All @@ -69,7 +85,9 @@ export default function Navbar({ search, darkTheme, setDarkTheme }) {
TheAlgorithms
</Typography>
</Link>
{search && !smallScreen && search}
{!isHome && !smallScreen && (
<SearchBar query={query} setQuery={setQuery} small />
)}
{smallScreen ? (
<>
<IconButton
Expand Down Expand Up @@ -100,7 +118,9 @@ export default function Navbar({ search, darkTheme, setDarkTheme }) {
paper: darkTheme ? classes.drawerDark : classes.drawer,
}}
>
<ListItem className={classes.drawerSearch}>{search}</ListItem>
<ListItem className={classes.drawerSearch}>
<SearchBar query={query} setQuery={setQuery} small />
</ListItem>
{menu.map((item) => (
<NextLink key={item.name} href={item.href}>
<MenuItem>{item.name}</MenuItem>
Expand Down
11 changes: 9 additions & 2 deletions components/searchBar/index.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { FormEvent } from "react";
import React, { FormEvent, useEffect, useRef } from "react";
import {
FormControl,
FilledInput,
Expand Down Expand Up @@ -29,6 +29,7 @@ export default function SearchBar({
}) {
const router = useRouter();
const smallScreen = useMediaQuery("(max-width: 800px)");
const inputRef = useRef<HTMLDivElement>();

function handleInput(event: FormEvent) {
setQuery((event.target as HTMLInputElement).value);
Expand All @@ -51,6 +52,12 @@ export default function SearchBar({
</InputAdornment>
);

useEffect(() => {
if (router.route.startsWith("/search")) {
inputRef.current.getElementsByTagName("input")[0].focus();
}
}, [router.route]);

return (
<form
noValidate
Expand All @@ -76,7 +83,7 @@ export default function SearchBar({
value={query}
placeholder="Search any algorithm"
endAdornment={searchAdornment}
autoFocus
ref={inputRef}
/>
</FormControl>
) : (
Expand Down
10 changes: 3 additions & 7 deletions pages/_app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import { AppProps } from "next/app";
import { lightTheme, darkTheme } from "hooks/themes";
import Jumbo from "components/jumbo";
import Navbar from "components/navbar";
import SearchBar from "components/searchBar";
import Footer from "components/footer";
import Head from "components/head";

Expand All @@ -22,10 +21,6 @@ function MyApp({ Component, pageProps }: AppProps) {
setIsDarkTheme((localStorage.getItem("theme") || "light") === "dark");
}, []);

const searchBar = (
<SearchBar small={router.route !== "/"} query={query} setQuery={setQuery} />
);

return (
<div style={{ height: "100%" }} className={isDarkTheme ? "dark" : ""}>
<ThemeProvider theme={isDarkTheme ? darkTheme : lightTheme}>
Expand All @@ -37,11 +32,12 @@ function MyApp({ Component, pageProps }: AppProps) {
options={{ showSpinner: false }}
/>
<Navbar
search={router.route !== "/" && searchBar}
darkTheme={isDarkTheme}
setDarkTheme={setIsDarkTheme}
query={query}
setQuery={setQuery}
/>
{router.route === "/" && <Jumbo search={searchBar} />}
{router.route === "/" && <Jumbo query={query} setQuery={setQuery} />}
<Component {...pageProps} />
<Footer />
</ThemeProvider>
Expand Down

1 comment on commit 6ee1b16

@vercel
Copy link

@vercel vercel bot commented on 6ee1b16 Mar 2, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.