"use client"; import { useState, useEffect, useRef } from "react"; import PropTypes from "prop-types"; import { useTheme } from "@/shared/hooks/useTheme"; import ChangelogModal from "./ChangelogModal"; import { ConfirmModal } from "./Modal"; function MenuItem({ icon, label, onClick, trailing, danger }) { return ( ); } MenuItem.propTypes = { icon: PropTypes.string.isRequired, label: PropTypes.string.isRequired, onClick: PropTypes.func.isRequired, trailing: PropTypes.node, danger: PropTypes.bool, }; export default function HeaderMenu({ onLogout }) { const [isOpen, setIsOpen] = useState(false); const [changelogOpen, setChangelogOpen] = useState(false); const [shutdownOpen, setShutdownOpen] = useState(false); const [isShuttingDown, setIsShuttingDown] = useState(false); const { toggleTheme, isDark } = useTheme(); const menuRef = useRef(null); const handleShutdown = async () => { setIsShuttingDown(true); try { await fetch("/api/version/shutdown", { method: "POST" }); } catch (e) { // Expected to fail as server shuts down; ignore error } setIsShuttingDown(false); setShutdownOpen(false); }; useEffect(() => { const handleClickOutside = (e) => { if (menuRef.current && !menuRef.current.contains(e.target)) { setIsOpen(false); } }; if (isOpen) { document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); } }, [isOpen]); const close = () => setIsOpen(false); return ( <>
{isOpen && (
{ close(); setChangelogOpen(true); }} /> { toggleTheme(); close(); }} /> { close(); setShutdownOpen(true); }} /> { close(); onLogout(); }} />
)}
setChangelogOpen(false)} /> setShutdownOpen(false)} onConfirm={handleShutdown} title="Close Proxy" message="Are you sure you want to close the proxy server?" confirmText="Close" cancelText="Cancel" variant="danger" loading={isShuttingDown} /> ); } HeaderMenu.propTypes = { onLogout: PropTypes.func.isRequired, };