89 lines
2.2 KiB
React
Raw Normal View History

import {
DesktopOutlined,
FileOutlined,
PieChartOutlined,
TeamOutlined,
UserOutlined,
} from "@ant-design/icons";
import { Layout, Menu, theme } from "antd";
import { Content, Header } from "antd/es/layout/layout";
import Sider from "antd/es/layout/Sider";
import React, { useState } from "react";
import { Outlet, useLocation } from "react-router-dom";
import menuConfig from "../config/menuConfig";
import { useSelector } from "react-redux";
import { selectUserRole } from "../features/auth/authSlice";
function getItem(label, key, icon, children) {
return {
key,
icon,
children,
label,
};
}
const items = [
getItem("Option 1", "1", <PieChartOutlined />),
getItem("Option 2", "2", <DesktopOutlined />),
getItem("User", "sub1", <UserOutlined />, [
getItem("Tom", "3"),
getItem("Bill", "4"),
getItem("Alex", "5"),
]),
getItem("Team", "sub2", <TeamOutlined />, [
getItem("Team 1", "6"),
getItem("Team 2", "8"),
]),
getItem("Files", "9", <FileOutlined />),
];
export default function CommonLayout() {
const location = useLocation();
const [collapsed, setCollapsed] = useState(false);
const {
token: { colorBgContainer, borderRadiusLG },
} = theme.useToken();
const roles = useSelector(selectUserRole);
const menu = menuConfig.filter(
(item) => !item.roles || item.roles.some((role) => roles.includes(role))
);
return (
<Layout style={{ minHeight: "100vh" }}>
<Sider
collapsible
collapsed={collapsed}
onCollapse={(value) => setCollapsed(value)}
>
<div className="demo-logo-vertical" />
<Menu
theme="dark"
selectedKeys={[location.pathname]}
mode="inline"
items={menu.map((item) => ({
key: item.path,
label: item.label,
icon: React.createElement(item.icon),
}))}
/>
</Sider>
<Layout>
<Header style={{ padding: 0, background: colorBgContainer }} />
<Content
style={{
margin: "16px 16px",
background: colorBgContainer,
borderRadius: borderRadiusLG,
}}
>
<Outlet />
</Content>
</Layout>
</Layout>
);
}