sendou.ink/components/layout/index.tsx
Kalle 1589b84c4b
New layout (#427) closes #405
* side layout initial

* add elements to side nav

* side buttons links

* remove clog

* calendar page initial

* position sticky working

* x trends page initial

* new table

* same mode selector

* mobile friendly table

* no underline for nav links

* xsearch

* x trends page outlined

* sr initial

* relocate calendar components

* calendar fix flex

* topnav fancier look

* layout looking good edition

* relocate xtrends

* xtrends remove linecharts

* x trends new

* calender page new

* delete headbanner, new login

* remove calendar stuff from api

* rename stuff in utils

* fix user item margin

* new home page initial

* remove page concept

* no pointer xtrends

* remove xrank from app

* xtrends service

* move fa from app

* move plus

* maps tweaks

* new table for plus history

* navigational sidebar flex tweaks

* builds page

* analyzer

* user page

* free agents

* plans

* remove mx

* tweaks

* change layout to grid

* home page finalized

* mobile nav

* restrict main content width

* tweaks style

* language switcher

* container in css

* sticky nav

* use duplicate icons for now

* change mapsketch width to old

* chara tour vid

* borzoic icons
2021-04-21 17:26:50 +03:00

82 lines
2.0 KiB
TypeScript

import { useToast } from "@chakra-ui/react";
import { t } from "@lingui/macro";
import { useRouter } from "next/router";
import { useState } from "react";
import { SWRConfig } from "swr";
import Footer from "./Footer";
import Header from "./Header";
import MobileNav from "./MobileNav";
import Nav from "./Nav";
const DATE_KEYS = ["createdAt", "updatedAt"];
const WIDE = [
"analyzer",
"plans",
"builds",
"u/",
"sr/leaderboards",
"plus/history",
];
const Layout = ({ children }: { children: React.ReactNode }) => {
const [navIsOpen, setNavIsOpen] = useState(false);
const router = useRouter();
const [errors, setErrors] = useState(new Set<string>());
const toast = useToast();
return (
<SWRConfig
value={{
fetcher: (resource, init) =>
fetch(resource, init).then(async (res) => {
const data = await res.text();
return JSON.parse(data, reviver);
}),
revalidateOnFocus: false,
revalidateOnReconnect: false,
onError: (_, key) => {
console.error(key + ": " + _);
if (errors.has(key)) return;
setErrors(new Set([...errors, key]));
toast({
duration: null,
isClosable: true,
position: "top-right",
status: "error",
description: t`An error occurred`,
onCloseComplete: () =>
setErrors(
new Set(Array.from(errors).filter((error) => error !== key))
),
});
},
}}
>
<Header openNav={() => setNavIsOpen(true)} />
<Nav />
<MobileNav isOpen={navIsOpen} onClose={() => setNavIsOpen(false)} />
<main>{children}</main>
<Footer />
</SWRConfig>
);
};
function reviver(key: any, value: any) {
if (Array.isArray(value)) {
return value.map((entry) => {
if (entry.updatedAt)
return { ...entry, updatedAt: new Date(entry.updatedAt) };
return entry;
});
}
if (DATE_KEYS.includes(key)) return new Date(value);
return value;
}
export default Layout;