import { Dialog } from '@base-ui/react/dialog'; import { useDisclosure, useFullscreenDocument } from '@mantine/hooks'; import { memo, PropsWithChildren } from 'react'; import { IoClose, IoExpand, IoLockClosedOutline, IoPencilOutline, IoSwapVertical } from 'react-icons/io5'; import { LuCoffee } from 'react-icons/lu'; import { useLocation } from 'react-router'; import { isLocalhost, supportsFullscreen } from '../../../externals'; import { canUseWakeLock, useKeepAwakeOptions } from '../../../features/keep-awake/useWakeLock'; import { navigatorConstants } from '../../../viewerConfig'; import useUrlPresets from '../../hooks-query/useUrlPresets'; import { useIsSmallScreen } from '../../hooks/useIsSmallScreen'; import { useClientStore } from '../../stores/clientStore'; import { useViewOptionsStore } from '../../stores/viewOptions'; import IconButton from '../buttons/IconButton'; import { RenameClientModal } from '../client-modal/RenameClientModal'; import Eyebrow from '../eyebrow/Eyebrow'; import ClientLink from './client-link/ClientLink'; import EditorNavigation from './editor-navigation/EditorNavigation'; import NavigationMenuItem from './navigation-menu-item/NavigationMenuItem'; import NavigationMenuToggle from './navigation-menu-item/NavigationMenuToggle'; import OtherAddresses from './other-addresses/OtherAddresses'; import style from './NavigationMenu.module.scss'; interface NavigationMenuProps { isOpen: boolean; onClose: () => void; } export default memo(NavigationMenu); function NavigationMenu({ isOpen, onClose }: NavigationMenuProps) { const id = useClientStore((store) => store.id); const name = useClientStore((store) => store.name); const isSmallScreen = useIsSmallScreen(); const [isRenameOpen, handlers] = useDisclosure(false); const { fullscreen, toggle } = useFullscreenDocument(); const { mirror, toggleMirror } = useViewOptionsStore(); const { keepAwake, toggleKeepAwake } = useKeepAwakeOptions(); const location = useLocation(); return ( { if (!open) { onClose(); } }} >
Ontime {name && {name}}
{supportsFullscreen && ( } label='Fullscreen' onToggle={toggle} /> )} } label='Flip Screen' onToggle={() => toggleMirror()} /> {canUseWakeLock && ( } label='Keep Awake' onToggle={toggleKeepAwake} /> )} Rename Client Cuesheet Operator {navigatorConstants.map((route) => ( {route.label} ))}
{isLocalhost && }
); } function MenuGroup({ label, children }: PropsWithChildren<{ label: string }>) { return (
{label}
{children}
); } function PresetNavigation({ isSmallScreen, onClose }: { isSmallScreen: boolean; onClose: () => void }) { const location = useLocation(); const { data: urlPresets } = useUrlPresets(); const navPresets = urlPresets.filter((preset) => preset.enabled && preset.displayInNav); if (navPresets.length === 0) return null; return ( {navPresets.map((preset) => ( {preset.alias} ))} ); }