import { useCallback, useState } from "react"; import { useTranslation } from "react-i18next"; import { ArrowUpCircleIcon, Check, MoreVertical, PanelsRightBottom, RectangleVertical, Settings, type LucideIcon, } from "lucide-react"; import { WindowManager } from "@bindings/services"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger, } from "@/components/DropdownMenu"; import { IconButton } from "@/components/buttons/IconButton"; import { ProfileDropdown } from "@/modules/profiles/ProfileDropdown"; import { useClientVersion } from "@/contexts/ClientVersionContext"; import { cn } from "@/lib/cn"; import { formatShortcut, useKeyboardShortcut } from "@/hooks/useKeyboardShortcut"; import { useViewMode, type ViewMode } from "@/contexts/ViewModeContext"; import { useRestrictions } from "@/contexts/RestrictionsContext"; import { isWindows } from "@/lib/platform.ts"; const SETTINGS_SHORTCUT = { key: ",", cmd: true } as const; export const MainHeader = () => { const { t } = useTranslation(); const [menuOpen, setMenuOpen] = useState(false); const { viewMode, setViewMode } = useViewMode(); const { updateAvailable } = useClientVersion(); const { mdm, features } = useRestrictions(); const openSettings = useCallback(() => { setMenuOpen(false); WindowManager.OpenSettings("").catch((err: unknown) => console.error("open settings window failed", err), ); }, []); useKeyboardShortcut(SETTINGS_SHORTCUT, openSettings); const openAbout = () => { setMenuOpen(false); WindowManager.OpenSettings("about").catch((err: unknown) => console.error("open settings (about) window failed", err), ); }; const openManageProfiles = () => { WindowManager.OpenSettings("profiles").catch((err: unknown) => console.error("open settings (profiles) window failed", err), ); }; const selectMode = (mode: ViewMode) => { setMenuOpen(false); setViewMode(mode); }; const profileSlot = features.disableProfiles ? null : ( ); const settingsSlot = (
{updateAvailable && ( <>
{t("header.menu.updateAvailable")}
)}
{t("header.menu.settings")} {formatShortcut(SETTINGS_SHORTCUT)}
{!mdm.disableAdvancedView && ( <> selectMode("default")} /> selectMode("advanced")} /> )}
{updateAvailable && ( )}
); return (
{/* Windows narrower width compensates for the OS frame Wails counts differently than macOS. See https://github.com/wailsapp/wails/issues/3260 */}
{profileSlot}
{settingsSlot}
); }; type ViewModeItemProps = { icon: LucideIcon; label: string; selected: boolean; onSelect: () => void; }; const ViewModeItem = ({ icon: Icon, label, selected, onSelect }: ViewModeItemProps) => (
{label} {selected && }
);