Files
Fulfillment-Frontend/src/components/Navbar/Navbar.tsx

200 lines
5.4 KiB
TypeScript

import { Center, Flex, Image, rem, Stack, Tooltip, UnstyledButton, useMantineColorScheme } from "@mantine/core";
import {
IconArrowLeft,
IconBarcode,
IconBox,
IconBuildingWarehouse,
IconCash, IconChartDots,
IconDashboard,
IconFileBarcode,
IconHome2,
IconLogout,
IconMan,
IconMoon,
IconShoppingCart,
IconSun,
} from "@tabler/icons-react";
import classes from "./Navbar.module.css";
import { useAppDispatch } from "../../redux/store.ts";
import { logout } from "../../features/authSlice.ts";
import { useNavigate, useRouterState } from "@tanstack/react-router";
import { setHideNavbar } from "../../features/uiSlice.ts";
interface NavbarLinkProps {
icon: typeof IconHome2;
label?: string;
active?: boolean;
href: string;
onClick?(navlink: NavbarLinkProps): void;
index: number;
}
function NavbarLink(props: NavbarLinkProps) {
const { icon: Icon, label, active, onClick } = props;
return (
<Tooltip
display={!label ? "none" : "flex"}
label={label}
position="right"
transitionProps={{ duration: 0 }}>
<UnstyledButton
onClick={() => onClick && onClick(props)}
className={classes.link}
data-active={active || undefined}>
<Icon
style={{ width: rem(20), height: rem(20) }}
stroke={1.5}
/>
</UnstyledButton>
</Tooltip>
);
}
const mockdata = [
{
icon: IconCash,
label: "Сделки",
href: "/leads",
},
// {
// icon: IconTable,
// label: 'Таблица сделок',
// href: '/deals'
// },
{
icon: IconMan,
label: "Клиенты",
href: "/clients",
},
{
icon: IconBox,
label: "Услуги",
href: "/services",
},
{
icon: IconBarcode,
label: "Товары",
href: "/products",
},
{
icon: IconFileBarcode,
label: "Штрихкоды",
href: "/barcode",
},
{
icon: IconBuildingWarehouse,
label: "Склады отгрузки",
href: "/shipping_warehouses",
},
{
icon: IconShoppingCart,
label: "Маркетплейсы",
href: "/marketplaces",
},
{
icon: IconChartDots,
label: "Статистика",
href: "/statistics",
}
];
export function Navbar() {
const dispatch = useAppDispatch();
const navigate = useNavigate();
const router = useRouterState();
const { colorScheme, toggleColorScheme } = useMantineColorScheme({
keepTransitions: true,
});
const onLogoutClick = () => {
dispatch(logout());
navigate({ to: "/login" });
};
const onNavlinkClick = (props: NavbarLinkProps) => {
navigate({ to: props.href });
};
const links = mockdata.map((link, index) => (
<NavbarLink
{...link}
index={index}
key={link.label}
active={router.location.pathname === link.href}
onClick={onNavlinkClick}
/>
));
return (
<nav className={classes.navbar}>
<Flex
direction={"column"}
align={"center"}
gap={rem(30)}>
<Center p={rem(5)}>
<Image
flex={1}
// style={{filter: "drop-shadow(0 0 30px #fff)"}}
src={
colorScheme == "dark"
? "/icons/logo-light.png"
: "/icons/logo.png"
}
/>
</Center>
<div className={classes.navbarMain}>
<Stack
justify="center"
gap={rem(10)}>
{links}
</Stack>
</div>
</Flex>
<Stack
w={"100%"}
justify="center"
gap={0}>
<NavbarLink
icon={IconDashboard}
href={"/admin"}
index={-1}
label={"Панель администратора"}
onClick={() =>
onNavlinkClick({
href: "/admin",
index: -1,
icon: IconDashboard,
})
}
/>
<NavbarLink
label={"Сменить тему"}
onClick={toggleColorScheme}
icon={colorScheme == "dark" ? IconSun : IconMoon}
href={"#"}
index={-1}
/>
<NavbarLink
index={-1}
href={"#"}
onClick={onLogoutClick}
icon={IconLogout}
label="Выйти"
/>
<NavbarLink
icon={IconArrowLeft}
href={"#"}
index={-1}
label={"Свернуть"}
onClick={() => {
dispatch(setHideNavbar(true));
}}
/>
</Stack>
</nav>
);
}