refactor: Layout component cleanups
This commit is contained in:
parent
6720a39a95
commit
10945a6dd5
|
@ -4,15 +4,32 @@ import React, { ErrorInfo } from "react";
|
|||
|
||||
import { Logo2 } from "../icons/index";
|
||||
|
||||
/* Utilities */
|
||||
const classNameSelected = (isSelected: boolean) =>
|
||||
`no-underline py-4 px-2 ml-4 text-md font-medium cursor-pointer border-b-2 border-transparent ${
|
||||
isSelected
|
||||
? "text-blue-700 border-blue-700"
|
||||
: "text-gray-400 hover:text-blue-500 hover:border-blue-500"
|
||||
}`;
|
||||
interface MenuItem {
|
||||
page: string;
|
||||
link: string;
|
||||
title: string;
|
||||
}
|
||||
|
||||
let calculateLastUpdate = () => {
|
||||
const menu: MenuItem[] = [
|
||||
{
|
||||
page: "search",
|
||||
link: "/",
|
||||
title: "Search",
|
||||
},
|
||||
{
|
||||
page: "tools",
|
||||
link: "/tools",
|
||||
title: "Tools",
|
||||
},
|
||||
{
|
||||
page: "about",
|
||||
link: "/about",
|
||||
title: "About",
|
||||
},
|
||||
];
|
||||
|
||||
/* Utilities */
|
||||
const calculateLastUpdate = () => {
|
||||
let today = new Date().toISOString();
|
||||
let yesterdayObj = new Date();
|
||||
yesterdayObj.setDate(yesterdayObj.getDate() - 1);
|
||||
|
@ -66,26 +83,16 @@ class ErrorBoundary extends React.Component<
|
|||
}
|
||||
}
|
||||
|
||||
interface Props {
|
||||
page: string; // id used for menu
|
||||
}
|
||||
|
||||
/* Main */
|
||||
export const Layout = ({ page, children }) => {
|
||||
export const Layout: React.FC<Props> = ({ page, children }) => {
|
||||
let lastUpdated = calculateLastUpdate();
|
||||
// The correct way to do this would be by passing a prop to Layout,
|
||||
// and to get the last updating using server side props.
|
||||
|
||||
const refreshPage = () => {
|
||||
// window.location.reload(true);
|
||||
// window.location.replace(window.location.pathname);
|
||||
// window.location.reload();
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/Location/reload
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/Location/replace
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/Location/assign
|
||||
// window.location.hostname
|
||||
if (typeof window !== "undefined") {
|
||||
if ((window.location as any) != window.location.pathname) {
|
||||
window.location.assign(window.location.pathname);
|
||||
}
|
||||
}
|
||||
};
|
||||
return (
|
||||
<div>
|
||||
<Head>
|
||||
|
@ -95,54 +102,56 @@ export const Layout = ({ page, children }) => {
|
|||
<div>
|
||||
<nav className="bg-white shadow">
|
||||
<div className="container max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div className="items-center justify-between flex">
|
||||
<div className="flex sm:flex-row">
|
||||
<button onClick={refreshPage}>
|
||||
<div className="flex items-center justify-between">
|
||||
<div className="flex">
|
||||
<Link href="/" passHref>
|
||||
<a className="no-underline font-md justify-center items-center flex">
|
||||
<span className="mr-2 sm:text-lg text-blue-800">
|
||||
<span className="mr-2">
|
||||
<Logo2 className="mt-1 mr-1 h-8 w-8" />
|
||||
</span>
|
||||
<span className="text-sm sm:text-2xl text-gray-700">
|
||||
Metaforecast
|
||||
</span>
|
||||
</a>
|
||||
</button>
|
||||
<div
|
||||
className={`flex py-4 px-2 sm:ml-4 text-base text-gray-400 ${
|
||||
lastUpdated || "hidden"
|
||||
}`}
|
||||
>
|
||||
<div className="hidden sm:inline-flex items-center text-gray-700">
|
||||
<svg className="ml-4 mr-1 mt-1" height="10" width="16">
|
||||
<circle cx="4" cy="4" r="4" fill="rgb(29, 78, 216)" />
|
||||
</svg>
|
||||
</Link>
|
||||
{lastUpdated ? (
|
||||
<div className="flex py-4 px-2 sm:ml-4">
|
||||
<div className="hidden sm:inline-flex items-center text-gray-700">
|
||||
<svg className="ml-4 mr-1 mt-1" height="10" width="16">
|
||||
<circle cx="4" cy="4" r="4" fill="rgb(29, 78, 216)" />
|
||||
</svg>
|
||||
|
||||
<span>{`Last updated: ${
|
||||
lastUpdated && !!lastUpdated.slice
|
||||
? lastUpdated.slice(0, 10)
|
||||
: "unknown"
|
||||
}`}</span>
|
||||
<span>{`Last updated: ${
|
||||
lastUpdated && !!lastUpdated.slice
|
||||
? lastUpdated.slice(0, 10)
|
||||
: "unknown"
|
||||
}`}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
) : null}
|
||||
</div>
|
||||
|
||||
<div className="flex flex-row-reverse items-start space-x-4 text-sm sm:text-lg md:text-lg lg:text-lg">
|
||||
<Link href={`/about`} passHref>
|
||||
<a className={classNameSelected(page === "about")}>About</a>
|
||||
</Link>
|
||||
<Link href={`/tools`} passHref>
|
||||
<a className={classNameSelected(page === "tools")}>Tools</a>
|
||||
</Link>
|
||||
<Link href={`/`} passHref>
|
||||
<a className={classNameSelected(page === "search")}>Search</a>
|
||||
</Link>
|
||||
<div className="flex space-x-4">
|
||||
{menu.map((item) => (
|
||||
<Link href={item.link} passHref key={item.page}>
|
||||
<a
|
||||
className={`no-underline py-4 px-2 text-sm sm:text-lg font-medium cursor-pointer border-b-2 border-transparent ${
|
||||
page === item.page
|
||||
? "text-blue-700 border-blue-700"
|
||||
: "text-gray-400 hover:text-blue-500 hover:border-blue-500"
|
||||
}`}
|
||||
>
|
||||
{item.title}
|
||||
</a>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<main>
|
||||
<ErrorBoundary>
|
||||
<div className="container max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-left pt-5">
|
||||
<div className="container max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 pt-5">
|
||||
{children}
|
||||
</div>
|
||||
</ErrorBoundary>
|
||||
|
|
Loading…
Reference in New Issue
Block a user