import React, { memo, useCallback, useMemo, useState } from "react"; import { Navigate } from "react-router-dom"; import { HeaderContainer, Header, HeaderMenuButton, HeaderGlobalBar, HeaderGlobalAction, } from "@carbon/react"; import { Close, UserAvatarFilledAlt } from "@carbon/react/icons"; import { LoggedInUser, useLayoutType, ExtensionSlot, ConfigurableLink, useSession, useConnectedExtensions, useConfig, } from "@openmrs/esm-framework"; import { isDesktop } from "../../utils"; import Logo from "../logo/logo.component"; import NotificationsMenuPanel from "../navbar-header-panels/notifications-menu-panel.component"; import OfflineBanner from "../offline-banner/offline-banner.component"; import UserMenuPanel from "../navbar-header-panels/user-menu-panel.component"; import SideMenuPanel from "../navbar-header-panels/side-menu-panel.component"; import styles from "./navbar.scss"; import AppSearchLaunch from "../app-search-icon/app-search-icon.component"; const Navbar: React.FC = () => { const session = useSession(); const config = useConfig(); const [user, setUser] = useState( session?.user ?? null ); const [activeHeaderPanel, setActiveHeaderPanel] = useState(null); const allowedLocales = session?.allowedLocales ?? null; const layout = useLayoutType(); const navMenuItems = useConnectedExtensions( "patient-chart-dashboard-slot" ).map((e) => e.id); const openmrsSpaBase = window["getOpenmrsSpaBase"](); const appMenuItems = useConnectedExtensions("app-menu-slot"); const userMenuItems = useConnectedExtensions("user-panel-slot"); const isActivePanel = useCallback( (panelName: string) => activeHeaderPanel === panelName, [activeHeaderPanel] ); const togglePanel = useCallback( (panelName: string) => setActiveHeaderPanel((activeHeaderPanel) => activeHeaderPanel === panelName ? null : panelName ), [] ); const logout = useCallback(() => setUser(false), []); const hidePanel = useCallback(() => { setActiveHeaderPanel(null); }, []); const showHamburger = useMemo( () => !isDesktop(layout) && navMenuItems.length > 0, [navMenuItems.length, layout] ); const showAppMenu = useMemo( () => appMenuItems.length > 0, [appMenuItems.length] ); const showUserMenu = useMemo( () => userMenuItems.length > 0, [userMenuItems.length] ); const HeaderItems = () => ( <>
{showHamburger && ( { togglePanel("sideMenu"); event.stopPropagation(); }} isActive={isActivePanel("sideMenu")} /> )}
{showUserMenu && ( { togglePanel("userMenu"); event.stopPropagation(); }} > {isActivePanel("userMenu") ? ( ) : ( )} )} {!isDesktop(layout) && ( )} {showAppMenu && } {showUserMenu && ( )}
); if (user && session) { return session.sessionLocation ? ( ) : ( ); } return ( ); }; export default Navbar;