import type { MouseEvent, RefObject } from "react"; import { useTranslation } from "react-i18next"; import { useClickOutsideElement } from "#/hooks/use-click-outside-element"; import { ContextMenu } from "#/ui/context-menu"; import { I18nKey } from "#/i18n/declaration"; import StopCircleIcon from "#/icons/stop-circle.svg?react"; import PlayCircleIcon from "#/icons/play-circle.svg?react"; import { ServerStatusContextMenuIconText } from "./server-status-context-menu-icon-text"; import { ServerStatus } from "./server-status"; import { Divider } from "#/ui/divider"; import { cn } from "#/utils/utils"; import { ExecutionStatus } from "#/types/agent-server/core/base/common"; import { isExecutionActive, isExecutionPaused } from "#/utils/status"; interface ServerStatusContextMenuProps { onClose: () => void; onStopServer?: (event: MouseEvent) => void; onStartServer?: (event: MouseEvent) => void; executionStatus: ExecutionStatus | null; position?: "top" | "bottom"; className?: string; isPausing?: boolean; ignoreOutsideClickRef?: RefObject; } export function ServerStatusContextMenu({ onClose, onStopServer, onStartServer, executionStatus, position = "top", className = "", isPausing = false, ignoreOutsideClickRef, }: ServerStatusContextMenuProps) { const { t } = useTranslation("openhands"); const ref = useClickOutsideElement( onClose, ignoreOutsideClickRef, ); const isActive = isExecutionActive(executionStatus); const isPaused = isExecutionPaused(executionStatus); const shouldActionShown = isActive || isPaused; return ( {shouldActionShown && ( <> {isActive && onStopServer && ( } text={t(I18nKey.COMMON$STOP_RUNTIME)} onClick={onStopServer} testId="stop-server-button" /> )} {isPaused && onStartServer && ( } text={t(I18nKey.COMMON$START_RUNTIME)} onClick={onStartServer} testId="start-server-button" /> )} )} ); }