import React from 'react'; import { HyperlinkProps } from '../HyperLink/HyperLink'; import { IconButtonProps } from '../Button/Iconbutton'; import { ProfileButtonProps } from '../ProfileButton/ProfileButton'; import { TextButtonProps } from "../Button/TextButton"; import { TooltipProps } from "../Tooltips/TooltipTypes"; export interface MenuHyperLinkProps extends Pick { label: string; icon?: React.ReactElement; } export interface MenuButton extends Omit { label: string; action: () => void; tooltip?: TooltipProps; } export interface MenuGroupFooter { header: string; note?: string; link?: MenuHyperLinkProps; } export interface MenuGroupHeader { header: string; note?: string; link?: MenuHyperLinkProps; } export interface MenuAccountInfo { firstName: string; lastName: string; email: string; link?: MenuHyperLinkProps; } export interface ProfileMenu { label?: string; user: MenuAccountInfo; sections: MenuNavigationSection[]; signOut?: MenuButton; } export interface MenuIconSubMenuButton extends Omit { type: 'submenu'; icon: React.ReactNode; menu: MenuNavigationItemTypeGroup | MenuNavigationCustomSubMenu; placement?: 'left' | 'right'; } export interface MenuIconButton extends Omit { type: 'action'; icon: React.ReactNode; action: (button?: EventTarget) => boolean | void; placement?: 'left' | 'right'; } export interface MenuProfileButton extends Omit { type: 'profile'; action?: (button?: EventTarget) => boolean | void; placement?: 'left' | 'right'; } export interface MenuSearchButton { type: 'search'; placement?: 'left' | 'right'; } export interface MenuSwitcherButton extends Omit { type: 'switcher'; placement?: 'left' | 'right'; action?: (button?: EventTarget) => boolean | void; } export type DesktopMenuButtonTypes = MenuIconButton | MenuProfileButton | MenuSwitcherButton; export type MobileMenuButtonTypes = MenuIconSubMenuButton | MenuIconButton | MenuProfileButton | MenuSwitcherButton | MenuSearchButton; export interface MobileNavigationMenuProps { label?: string; buttons?: MobileMenuButtonTypes[]; header?: MenuGroupHeader; items?: (MenuNavigationItemTypeItem | MenuNavigationItemTypeGroup)[]; footer?: MenuGroupFooter; action?: MenuButton; } export interface DesktopNavigationMenuProps { buttons?: DesktopMenuButtonTypes[]; items: (MenuNavigationItemTypeItem | MenuNavigationItemTypeDesktopGroup)[]; action?: MenuButton; reverseRightSideOrder?: boolean; } export interface MenuNavigationGroup { label: string; note?: string; buttons?: MobileMenuButtonTypes[]; header?: MenuGroupHeader; items: T[]; footer?: MenuGroupFooter; action?: MenuButton; } export type MenuNavigationItem = { icon?: React.ReactNode; to: string; exact?: boolean; disabled?: boolean; external?: boolean; action?: (e: React.MouseEvent) => void; label: string; note?: string; pinned?: boolean; subItems?: MenuNavigationItem[]; } & Omit, 'onClick' | 'to' | 'exact' | 'onMouseDown'>; export interface MenuNavigationSection { divider?: boolean; pinned?: boolean; label?: string; items: T[]; } export type MenuNavigationItemTypeItem = MenuNavigationItem & { type?: 'item'; }; export type MenuNavigationItemTypeDesktopGroup = { id: string; label?: string; disabled?: boolean; pinned?: boolean; type?: 'desktopgroup'; expanded?: boolean; items: (MenuNavigationItemTypeItem | MenuNavigationItemTypeDesktopGroup)[]; }; export type MenuNavigationItemTypeGroup = MenuNavigationGroup & { type: 'group'; icon?: React.ReactNode; pinned?: boolean; disabled?: boolean; }; export type MenuNavigationItemTypeSection = MenuNavigationSection & { type: 'section'; }; export type MenuNavigationCustomSubMenu = { type: 'custom'; label?: string; buttons?: MobileMenuButtonTypes[]; custom: () => React.ReactNode; };