|
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; |
|
|