mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-04-24 06:58:10 -05:00
* 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
82 lines
2.0 KiB
TypeScript
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;
|