import React, { useState } from "react"; import { Layout, Menu, Grid, ConfigProvider, Drawer, Button } from "antd"; import { DashboardOutlined, LogoutOutlined, UnorderedListOutlined, BarsOutlined, } from "@ant-design/icons"; import { useTranslate, useLogout, useTitle, CanAccess, ITreeMenu, useIsExistAuthentication, useRouterContext, useMenu, useRefineContext, } from "@pankod/refine-core"; import { Title as DefaultTitle } from "@components"; import { drawerButtonStyles } from "./styles"; import { RefineLayoutSiderProps } from "../types"; const { SubMenu } = Menu; export const Sider: React.FC = ({ render }) => { const [collapsed, setCollapsed] = useState(false); const [drawerOpen, setDrawerOpen] = useState(false); const isExistAuthentication = useIsExistAuthentication(); const { Link } = useRouterContext(); const { mutate: mutateLogout } = useLogout(); const Title = useTitle(); const translate = useTranslate(); const { menuItems, selectedKey, defaultOpenKeys } = useMenu(); const breakpoint = Grid.useBreakpoint(); const { hasDashboard } = useRefineContext(); const isMobile = typeof breakpoint.lg === "undefined" ? false : !breakpoint.lg; const RenderToTitle = Title ?? DefaultTitle; const renderTreeView = (tree: ITreeMenu[], selectedKey: string) => { return tree.map((item: ITreeMenu) => { const { icon, label, route, name, children, parentName } = item; if (children.length > 0) { return ( } title={label} > {renderTreeView(children, selectedKey)} ); } const isSelected = route === selectedKey; const isRoute = !( parentName !== undefined && children.length === 0 ); return ( )} > {label} {!collapsed && isSelected && (
)} ); }); }; const logout = isExistAuthentication && ( mutateLogout()} icon={} > {translate("buttons.logout", "Logout")} ); const dashboard = hasDashboard ? ( } > {translate("dashboard.title", "Dashboard")} {!collapsed && selectedKey === "/" && (
)} ) : null; const items = renderTreeView(menuItems, selectedKey); const renderSider = () => { if (render) { return render({ dashboard, items, logout, collapsed, }); } return ( <> {dashboard} {items} {logout} ); }; const renderMenu = () => { return ( <> { setDrawerOpen(false); if (!breakpoint.lg) { setCollapsed(true); } }} > {renderSider()} ); }; const renderDrawerSider = () => { return ( <> setDrawerOpen(false)} placement="left" closable={false} width={200} bodyStyle={{ padding: 0, }} maskClosable={true} > {renderMenu()} ); }; const renderContent = () => { if (isMobile) { return renderDrawerSider(); } return ( setCollapsed(collapsed) } collapsedWidth={80} breakpoint="lg" > {renderMenu()} ); }; return ( {renderContent()} ); };