| import React, { useContext, useState } from "react"; | |
| import { Outlet } from "react-router-dom"; | |
| import { | |
| AppShell, | |
| Burger, | |
| Container, | |
| Header, | |
| MediaQuery, | |
| Navbar, | |
| Paper, | |
| Text, | |
| createStyles, | |
| useMantineTheme, | |
| } from "@mantine/core"; | |
| import UserDataContextProvider, { | |
| UserDataContext, | |
| } from "../context/user-data-context"; | |
| import MainLoader from "../components/MainLoader"; | |
| import NavbarLinks from "../components/NavbarLinks"; | |
| import Logout from "../components/Logout"; | |
| const useStyles = createStyles(() => ({ | |
| body: { | |
| width: "100%", | |
| height: "100%", | |
| }, | |
| root: { | |
| width: "100%", | |
| height: "100vh", | |
| }, | |
| main: { | |
| width: "100%", | |
| height: "100vh", | |
| }, | |
| })); | |
| const MainLayout = () => { | |
| const { classes } = useStyles(); | |
| const theme = useMantineTheme(); | |
| const [opened, setOpened] = useState(false); | |
| const { isLoggedIn, errorMessage } = useContext(UserDataContext); | |
| if (!isLoggedIn) { | |
| return <MainLoader errorMessage={errorMessage} />; | |
| } | |
| return ( | |
| <UserDataContextProvider> | |
| <Paper> | |
| <AppShell | |
| classNames={{ | |
| body: classes.body, | |
| root: classes.root, | |
| main: classes.main, | |
| }} | |
| styles={{ | |
| main: { | |
| background: | |
| theme.colorScheme === "dark" ? "#302e2a" : theme.colors.gray[0], | |
| }, | |
| body: { | |
| textAlign: "center", | |
| }, | |
| }} | |
| layout="alt" | |
| navbar={ | |
| <Navbar | |
| py="md" | |
| px="0" | |
| hiddenBreakpoint="md" | |
| sx={{ backgroundColor: "#262523" }} | |
| hidden={!opened} | |
| width={{ md: 150 }} | |
| > | |
| <Navbar.Section> | |
| <Text size={30} weight={700}> | |
| Chess | |
| </Text> | |
| </Navbar.Section> | |
| <Navbar.Section grow mt="md"> | |
| <NavbarLinks /> | |
| </Navbar.Section> | |
| <Navbar.Section> | |
| <Logout /> | |
| </Navbar.Section> | |
| </Navbar> | |
| } | |
| header={ | |
| <MediaQuery largerThan="sm" styles={{ display: "none" }}> | |
| <Header zIndex={1000} p="md"> | |
| <div | |
| style={{ | |
| display: "flex", | |
| alignItems: "center", | |
| height: "100%", | |
| }} | |
| > | |
| <Burger | |
| opened={opened} | |
| onClick={() => setOpened((o) => !o)} | |
| size="sm" | |
| color={theme.colors.gray[6]} | |
| mr="xl" | |
| /> | |
| <Text>Application header</Text> | |
| </div> | |
| </Header> | |
| </MediaQuery> | |
| } | |
| padding | |
| > | |
| <Container | |
| size="100%" | |
| style={{ height: "100vh" }} | |
| pl={{ md: 150 }} | |
| pr={{ md: 0 }} | |
| > | |
| <Outlet /> | |
| </Container> | |
| </AppShell> | |
| </Paper> | |
| </UserDataContextProvider> | |
| ); | |
| }; | |
| export default MainLayout; | |