diff --git a/src/Components/DashboardLayout/index.js b/src/Components/DashboardLayout/index.js index a1c27de..a3e3e02 100644 --- a/src/Components/DashboardLayout/index.js +++ b/src/Components/DashboardLayout/index.js @@ -1,20 +1,70 @@ -import { Layout } from "antd"; -import SideMenu from "../SideMenu"; +import { Grid, Layout } from "antd"; +import { SideMenuContent } from "../SideMenu"; import PageContent from "../PageContent"; -import { useState } from "react"; +import { useRef, useState } from "react"; +import SideMenuMobile from "../SideMenu/Mobile"; +import SideMenuDesktop from "../SideMenu/Desktop"; + +const { useBreakpoint } = Grid; + +const Content = ({ + isSideMenuCollapsed, + setIsSideMenuCollapsed, + setUserSession, + userSession, + contentFirstRender, +}) => { + return ( + + ); +}; export default function DashboardLayout({ userSession, setUserSession }) { - const [isSideMenuCollapsed, setIsSideMenuCollapsed] = useState(false); + const screenBreakpoint = useBreakpoint(); + + // open on desktop, closed on mobile on page open + const [isSideMenuCollapsed, setIsSideMenuCollapsed] = useState( + !screenBreakpoint.lg + ); + // used to prevent auto close the sideMenu on mobile on first render as the the useEffect on the content component will be called after the first render + const contentFirstRender = useRef(true); return ( - + {screenBreakpoint.lg ? ( + + + + ) : ( + + + + )} + setIsSideMenuCollapsed(collapsed)} + > + {children} + + ); +} diff --git a/src/Components/SideMenu/Mobile/index.js b/src/Components/SideMenu/Mobile/index.js new file mode 100644 index 0000000..82ca6ad --- /dev/null +++ b/src/Components/SideMenu/Mobile/index.js @@ -0,0 +1,18 @@ +import { Drawer } from "antd"; + +export default function SideMenuMobile({ + children, + isSideMenuCollapsed, + setIsSideMenuCollapsed, +}) { + return ( + setIsSideMenuCollapsed(true)} + placement="left" + styles={{ body: { padding: 0 } }} + > + {children} + + ); +} diff --git a/src/Components/SideMenu/index.js b/src/Components/SideMenu/index.js index f253a22..4aeafcd 100644 --- a/src/Components/SideMenu/index.js +++ b/src/Components/SideMenu/index.js @@ -13,11 +13,10 @@ import { UsergroupAddOutlined, } from "@ant-design/icons"; import { Badge, Divider, Menu } from "antd"; -import Sider from "antd/es/layout/Sider"; import { useEffect, useRef, useState } from "react"; import { useLocation, useNavigate } from "react-router-dom"; -import PropTypes from "prop-types"; import { + BreakpointLgWidth, BrowserTabSession, Constants, hasOnePermission, @@ -31,11 +30,11 @@ import { useAppContext } from "../../Contexts/AppContext"; import { useWebSocketContext } from "../../Contexts/WebSocketContext"; import { SentMessagesCommands } from "../../Handlers/WebSocketMessageHandler"; -export default function SideMenu({ +export function SideMenuContent({ userSession, setUserSession, - isSideMenuCollapsed, setIsSideMenuCollapsed, + contentFirstRender, }) { const appContext = useAppContext(); const webSocketContext = useWebSocketContext(); @@ -45,22 +44,10 @@ export default function SideMenu({ const { t } = useTranslation(); const lastSubscribedTopic = useRef(""); + console.log("SideMenuContent"); + const navigate = useNavigate(); - const getCurrentUsedScannerName = () => { - /*const scannerName = webSocketContext.Scanners.find( - (scanner) => scanner.UsedByUserId === getUserId() - )?.Name; - - return scannerName === undefined - ? t("sideMenu.adminArea.noScannerSelected") - : scannerName; */ - - // TODO: handle scanner name - - return Constants.LOADING; - }; - const getFirstMenuItems = () => { // dashboard let items = [ @@ -256,18 +243,11 @@ export default function SideMenu({ let items = []; // scanner - if ( - hasPermission( - appContext.userPermissions, - Constants.PERMISSIONS.SCANNER.USE_SCANNERS - ) - ) { - items.push({ - icon: , - label: getCurrentUsedScannerName(), - key: Constants.ROUTE_PATHS.SCANNERS, - }); - } + items.push({ + icon: , + label: "Scanner", + key: Constants.ROUTE_PATHS.SCANNERS, + }); // connection status, userprofile, logout items.push( @@ -324,89 +304,66 @@ export default function SideMenu({ }); // auto close sideMenu on mobile + // this will prevent to auto close sideMenu on first render as the useEffects will be called after the first render + if (contentFirstRender.current) { + contentFirstRender.current = false; + return; + } + if ( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( navigator.userAgent - ) + ) || + document.body.clientWidth < BreakpointLgWidth ) { + console.log("close"); setIsSideMenuCollapsed(true); } }, [location.pathname]); return ( - setIsSideMenuCollapsed(collapsed)} > - - - - C - O - M - P - A - N - Y - - - Admin Dashboard - - navigate(item.key)} - theme="light" - selectedKeys={[selectedKeys]} - items={getFirstMenuItems()} - defaultOpenKeys={["/admin-area", "/group-tasks"]} - /> + + + C + O + M + P + A + N + Y - - + Admin Dashboard - navigate(item.key)} - items={getSecondMenuItems()} - /> - + navigate(item.key)} + theme="light" + selectedKeys={[selectedKeys]} + items={getFirstMenuItems()} + defaultOpenKeys={["/admin-area", "/group-tasks"]} + /> - + + + + + navigate(item.key)} + items={getSecondMenuItems()} + /> + + ); } - -/* - - J - A - N - N - E - X - -*/ - -SideMenu.propTypes = { - setUserSession: PropTypes.func.isRequired, -};