Commit 8132aceb authored by Michal Čížek's avatar Michal Čížek
Browse files

added sidebar, switched to hash router

parent 32191843
import { MantineProvider } from "@mantine/core"; import { MantineProvider } from "@mantine/core";
import { QueryClientProvider, QueryClient } from "react-query"; import { QueryClientProvider, QueryClient } from "react-query";
import { BrowserRouter } from "react-router-dom"; import { HashRouter } from "react-router-dom";
import axios from "axios"; import axios from "axios";
import { AuthProvider } from "context/auth/auth-provider"; import { AuthProvider } from "context/auth/auth-provider";
...@@ -13,7 +13,7 @@ axios.defaults.withCredentials = true; ...@@ -13,7 +13,7 @@ axios.defaults.withCredentials = true;
export const App = () => { export const App = () => {
return ( return (
<BrowserRouter <HashRouter
basename={process.env.NODE_ENV === "development" ? undefined : "/pa165"} basename={process.env.NODE_ENV === "development" ? undefined : "/pa165"}
> >
<MantineProvider> <MantineProvider>
...@@ -27,6 +27,6 @@ export const App = () => { ...@@ -27,6 +27,6 @@ export const App = () => {
</NotificationProvider> </NotificationProvider>
</QueryClientProvider> </QueryClientProvider>
</MantineProvider> </MantineProvider>
</BrowserRouter> </HashRouter>
); );
}; };
import { useCallback, useMemo, useState } from "react"; import { useMemo } from "react";
import { Coin, Menu2, Logout } from "tabler-icons-react"; import { Coin, Logout } from "tabler-icons-react";
import { import {
ActionIcon,
Avatar, Avatar,
Button, Button,
Center, Center,
Drawer,
Grid, Grid,
Group, Group,
Paper, Paper,
...@@ -14,11 +12,8 @@ import { ...@@ -14,11 +12,8 @@ import {
import { useAuth } from "context/auth/auth-context"; import { useAuth } from "context/auth/auth-context";
import { Navigation } from "./navigation";
export const Header = () => { export const Header = () => {
const { user, logout, isLoggedIn } = useAuth(); const { user, logout, isLoggedIn } = useAuth();
const [isOpen, setIsOpen] = useState(false);
const initials = useMemo(() => { const initials = useMemo(() => {
const parts = user?.name.trim().split(" "); const parts = user?.name.trim().split(" ");
...@@ -32,17 +27,10 @@ export const Header = () => { ...@@ -32,17 +27,10 @@ export const Header = () => {
return result ?? "UN"; return result ?? "UN";
}, [user?.name]); }, [user?.name]);
const openDrawer = useCallback(() => setIsOpen(true), []);
const closeDrawer = useCallback(() => setIsOpen(false), []);
return ( return (
<Paper shadow="sm" sx={{ padding: "0.5rem" }}> <Paper shadow="sm" sx={{ padding: "0.5rem" }}>
<Grid align="center"> <Grid align="center">
<Grid.Col xs={6} md={4}> <Grid.Col xs={6} md={4} />
<ActionIcon onClick={openDrawer}>
<Menu2 />
</ActionIcon>
</Grid.Col>
<Grid.Col <Grid.Col
xs={4} xs={4}
sx={(theme) => ({ sx={(theme) => ({
...@@ -72,19 +60,6 @@ export const Header = () => { ...@@ -72,19 +60,6 @@ export const Header = () => {
</Group> </Group>
</Grid.Col> </Grid.Col>
</Grid> </Grid>
<Drawer
opened={isOpen}
onClose={closeDrawer}
title={
<Text size="md" weight="bold">
Navigation
</Text>
}
size="lg"
padding="md"
>
<Navigation onClick={closeDrawer} />
</Drawer>
</Paper> </Paper>
); );
}; };
import { ReactNode } from "react"; import { ReactNode } from "react";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { Stack, Button } from "@mantine/core"; import { Stack, Button, Paper, Sx } from "@mantine/core";
import { import {
BuildingStore, BuildingStore,
CalendarEvent, CalendarEvent,
Home, Home,
Location, Location,
Login,
UserPlus,
} from "tabler-icons-react"; } from "tabler-icons-react";
import { User } from "models";
import { useAuth } from "../../context/auth/auth-context"; import { useAuth } from "../../context/auth/auth-context";
type NavItem = { type NavItem = {
label: string; label: string;
to: string; to: string;
icon: ReactNode; icon: ReactNode;
showPermission: string; show?: ((user?: User) => boolean) | boolean;
sx?: Sx;
}; };
const navItems: NavItem[] = [ const navItems: NavItem[] = [
...@@ -21,25 +27,36 @@ const navItems: NavItem[] = [ ...@@ -21,25 +27,36 @@ const navItems: NavItem[] = [
label: "Home", label: "Home",
to: "/", to: "/",
icon: <Home />, icon: <Home />,
showPermission: "ALL",
}, },
{ {
label: "Events", label: "Events",
to: "/events", to: "/events",
icon: <CalendarEvent />, icon: <CalendarEvent />,
showPermission: "ALL",
}, },
{ {
label: "Locations", label: "Locations",
to: "/locations", to: "/locations",
icon: <Location />, icon: <Location />,
showPermission: "MANAGER", show: (user) => user?.userRole === "MANAGER",
}, },
{ {
label: "My reservations", label: "My reservations",
to: "/my-reservations", to: "/my-reservations",
icon: <BuildingStore />, icon: <BuildingStore />,
showPermission: "SELLER", show: (user) => user?.userRole === "SELLER",
},
{
label: "Login",
to: "/login",
icon: <Login />,
show: (user) => !user,
sx: { marginTop: "auto" },
},
{
label: "Register",
to: "/register",
icon: <UserPlus />,
show: (user) => !user,
}, },
]; ];
...@@ -47,31 +64,38 @@ interface Props { ...@@ -47,31 +64,38 @@ interface Props {
onClick?: () => void; onClick?: () => void;
} }
export const Navigation = ({ onClick }: Props) => { export const Sidebar = ({ onClick }: Props) => {
const { user } = useAuth(); const { user } = useAuth();
const showPermission = user ? user.userRole : "ALL";
return ( return (
<Stack spacing={5}> <Paper
{navItems withBorder
.filter( sx={{
(item) => flexGrow: 1,
item.showPermission === showPermission || minWidth: 250,
item.showPermission === "ALL" maxWidth: 350,
) position: "relative",
.map(({ icon, label, to }) => ( padding: "1rem",
<Button }}
variant="subtle" >
leftIcon={icon} <Stack spacing={5} sx={{ position: "sticky", top: "1rem" }}>
key={to} {navItems.map(
component={Link} ({ icon, label, to, show = true, sx }) =>
to={to} (show instanceof Function ? show?.(user) : show) && (
onClick={onClick} <Button
> variant="subtle"
{label} leftIcon={icon}
</Button> key={to}
))} component={Link}
</Stack> to={to}
onClick={onClick}
sx={sx}
>
{label}
</Button>
)
)}
</Stack>
</Paper>
); );
}; };
...@@ -5,6 +5,7 @@ import { Header } from "components/header/header"; ...@@ -5,6 +5,7 @@ import { Header } from "components/header/header";
import { useAuth } from "context/auth/auth-context"; import { useAuth } from "context/auth/auth-context";
import { ProtectedRoute } from "components/protected-route/protected-route"; import { ProtectedRoute } from "components/protected-route/protected-route";
import { EntryRoute } from "components/entry-route/entry-route"; import { EntryRoute } from "components/entry-route/entry-route";
import { Sidebar } from "components/sidebar/sidebar";
import { Home } from "./home/home"; import { Home } from "./home/home";
import { StandReservation } from "./stand-reservation/stand-reservation"; import { StandReservation } from "./stand-reservation/stand-reservation";
...@@ -28,30 +29,37 @@ export const AppRoutes = () => { ...@@ -28,30 +29,37 @@ export const AppRoutes = () => {
sx={(theme) => ({ sx={(theme) => ({
flexGrow: 1, flexGrow: 1,
backgroundColor: theme.fn.rgba(theme.colors.dark[1], 0.1), backgroundColor: theme.fn.rgba(theme.colors.dark[1], 0.1),
display: "flex",
})} })}
> >
{isFetchedAfterMount && ( <Sidebar />
<Routes> <Box sx={{ flexGrow: 1 }}>
<Route path="/" element={<Home />} /> {isFetchedAfterMount && (
<Route element={<EntryRoute />}> <Routes>
<Route path="/login" element={<Login />} /> <Route path="/" element={<Home />} />
<Route path="/register" element={<Register />} /> <Route element={<EntryRoute />}>
</Route> <Route path="/login" element={<Login />} />
<Route path="/events" element={<Events />} /> <Route path="/register" element={<Register />} />
<Route path="/events/create" element={<CreateUpdateEvent />} /> </Route>
<Route path="/events/:id/edit" element={<CreateUpdateEvent />} /> <Route path="/events" element={<Events />} />
<Route element={<ProtectedRoute />}> <Route path="/events/create" element={<CreateUpdateEvent />} />
<Route path="/locations" element={<Locations />} /> <Route path="/events/:id/edit" element={<CreateUpdateEvent />} />
<Route path="/stands/list/events/:id" element={<EventStands />} /> <Route element={<ProtectedRoute />}>
</Route> <Route path="/locations" element={<Locations />} />
<Route path="*" element={<NotFound />} /> <Route
<Route path="/stands/list/events/:id"
path="/stand-reservation/:id" element={<EventStands />}
element={<StandReservation />} />
/> </Route>
<Route path="/my-reservations" element={<UserReservations />} /> <Route path="*" element={<NotFound />} />
</Routes> <Route
)} path="/stand-reservation/:id"
element={<StandReservation />}
/>
<Route path="/my-reservations" element={<UserReservations />} />
</Routes>
)}
</Box>
</Box> </Box>
</Box> </Box>
); );
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment