baublet/w8mngr

View on GitHub
client/Application.tsx

Summary

Maintainability
C
1 day
Test Coverage
import React from "react";
import { Link as ReactRouterLink, useLocation } from "react-router-dom";

import { IsLoggedIn } from "./components/Auth/IsLoggedIn";
import { IsLoggedOut } from "./components/Auth/IsLoggedOut";
import { ContentContainer } from "./components/Containers/ContentContainer";
import { Link } from "./components/Link";
import { Logo } from "./components/Logo";
import { HeaderNavigation } from "./components/Navigation/HeaderNavigation";
import { ToastProvider } from "./helpers";
import { Routes } from "./Routes";

export function Application(): React.ReactComponentElement<any> {
  // When the URL changes, scroll to the top
  const { pathname, search } = useLocation();
  React.useEffect(() => {
    document.body.scrollTop = 0;
    document.documentElement.scrollTop = 0;
  }, [pathname, search]);

  return (
    <div className="max-w-screen-xl w-full flex flex-col min-h-full px-1 sm:px-2 md:px-8 bg-white pt-8">
      <div className="min-h-screen flex flex-col gap-8 lg:gap-12">
        <header className="overflow-x-auto lg:overflow-x-hidden">
          <ContentContainer className="flex items-center">
            <h1 className="text-center text-emerald-400 mr-12">
              <ReactRouterLink
                to="/"
                title="w8mngr"
                className="flex items-center text-6xl"
              >
                <Logo />
              </ReactRouterLink>
            </h1>
            <HeaderNavigation />
          </ContentContainer>
        </header>
        <main className="flex-grow flex-1 flex-col">
          <ToastProvider>
            <Routes />
          </ToastProvider>
        </main>
      </div>
      <footer className="mt-12 text-sm text-slate-200 bg-slate-900 mt-13 py-8 px-2 md:px-8 lg:px-12 -mx-2 md:-mx-8 flex items-center min-h-screen">
        <ContentContainer>
          <div className="flex gap-6 space-around flex-wrap md:flex-nowrap">
            <div className="w-full md:w-1/3">
              <FooterHeader>About</FooterHeader>
              <div className="flex flex-col gap-2">
                <p>Copyright 2009-2022, Ryan Poe</p>
                <p>
                  w8mngr was built from scratch with TypeScript, React,
                  Tailwind, and Apollo. Hosted by Netlify.
                </p>
                <p>
                  This software is open source. Want to add a feature or report
                  a bug? Checkout{" "}
                  <FooterLink to="https://github.com/baublet/w8mngr">
                    w8mngr on GitHub
                  </FooterLink>
                  .
                </p>
              </div>
            </div>

            <div className="w-5/12 md:w-1/3">
              <FooterHeader>Account</FooterHeader>
              <IsLoggedOut>
                <ul className="list-disc list-inside">
                  <li>
                    <FooterLink to="/register">Get Started</FooterLink>
                  </li>
                  <li>
                    <FooterLink to="/login">Login</FooterLink>
                  </li>
                </ul>
              </IsLoggedOut>
              <IsLoggedIn>
                <ul className="list-disc list-inside">
                  <li>
                    <FooterLink to="/nutrition">Dashboard</FooterLink>
                  </li>
                  <li>
                    <FooterLink to="/logout">Logout</FooterLink>
                  </li>
                </ul>
              </IsLoggedIn>
            </div>

            <div className="w-5/12 md:w-1/3">
              <FooterHeader>
                w<span className="text-emerald-300">8</span>mngr
              </FooterHeader>
              <ul className="list-disc list-inside">
                <li>
                  <FooterLink to="/">Home</FooterLink>
                </li>
                <li>
                  <FooterLink to="/register">Register</FooterLink>
                </li>
                <li>
                  <FooterLink to="/privacy">Privacy Policy</FooterLink>
                </li>
                <li>
                  <FooterLink to="/tos">Terms of Service</FooterLink>
                </li>
              </ul>
            </div>
          </div>
        </ContentContainer>
      </footer>
    </div>
  );
}

function FooterHeader({ children }: React.PropsWithChildren<{}>) {
  return <h3 className="text-3xl font-thin mb-4">{children}</h3>;
}

function FooterLink(props: React.ComponentProps<typeof Link>) {
  return (
    <Link
      {...props}
      className="text-emerald-500 underline-offset-4 hover:text-slate-50 hover:underline hover:decoration-emerald-500"
    />
  );
}