import "ojs/ojtoolbar"; import "ojs/ojmenu"; import "ojs/ojbutton"; import * as ResponsiveUtils from "ojs/ojresponsiveutils"; import { ojMenu } from "ojs/ojmenu"; import { ojButton } from "ojs/ojbutton"; import { FunctionComponent } from "preact"; import { useRef, useState, useEffect } from "preact/hooks"; import { isLinkItem, isPluginItem, NavigationItem, Plugin } from "../hooks/useQuery"; import { NavigateFunction } from "react-router-dom"; type Props = Readonly<{ appName: string, userLogin: string, login: () => void, logout: () => void, navigate: NavigateFunction; navigations: NavigationItem[] | undefined, plugins: Plugin[] | undefined }>; export const Header: FunctionComponent = ({ appName, userLogin, login, logout, navigate, navigations, plugins }) => { const mediaQueryRef = useRef(window.matchMedia(ResponsiveUtils.getFrameworkQuery("sm-only"))); const [isSmallWidth, setIsSmallWidth] = useState(mediaQueryRef.current.matches); useEffect(() => { mediaQueryRef.current.addEventListener("change", handleMediaQueryChange); return (() => mediaQueryRef.current.removeEventListener("change", handleMediaQueryChange)); }, [mediaQueryRef]); function handleMediaQueryChange(e: MediaQueryListEvent) { setIsSmallWidth(e.matches); } function getDisplayType() { return (isSmallWidth ? "icons" : "all"); }; function getEndIconClass() { return (isSmallWidth ? "oj-icon demo-appheader-avatar" : "oj-component-icon oj-button-menu-dropdown-icon"); } const loginButtonAction = (_: ojButton.ojAction) => { login(); }; const userMenuAction = (event: ojMenu.ojMenuAction) => { switch (event.detail.selectedValue) { case "out": logout(); break; } }; const navigationAction = (event: ojMenu.ojMenuAction) => { const navItem: NavigationItem = event.detail.selectedValue; if (isLinkItem(navItem)) { window.open(navItem.path, navItem.openInNewTab ? "_blank" : "_self"); } else if (isPluginItem(navItem)) { // window.location.pathname = plugins.find(p => p.name === navItem.pluginName)?.path; navigate(plugins.find(p => p.name === navItem.pluginName)?.path); } }; return ( ); }