import { Clock3, LoaderCircle, Monitor, MoreHorizontal, RefreshCw, Square, X, } from "lucide-react"; import { BROWSER_USE_IDLE_MS, BROWSER_USE_VIEWPORT_PRESETS, type BrowserUseViewportPreset, type BrowserUseControl, type TaskBrowser, } from "@paperclipai/shared"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, } from "@/components/ui/dropdown-menu"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; /** Session controls stay below the viewport; the countdown appears only near expiry. */ export function TaskBrowserFooter({ browser, now, disabled = false, onControl, onReconnect, viewport = "fit", controlledElsewhere = false, resizing = false, resizeAvailable = true, onResize, }: { browser: TaskBrowser; now: number; disabled?: boolean; onControl: (action: BrowserUseControl) => void; onReconnect: () => void; viewport?: BrowserUseViewportPreset; controlledElsewhere?: boolean; resizing?: boolean; resizeAvailable?: boolean; onResize: (preset: BrowserUseViewportPreset) => void; }) { const live = browser.status === "running" || browser.status === "idle"; const expiry = browser.expiresAt ? Date.parse(browser.expiresAt) : Infinity; const idleDeadline = browser.idleDeadline ? Date.parse(browser.idleDeadline) : Infinity; const deadline = Math.min(idleDeadline, expiry); const seconds = Math.max(0, Math.ceil((deadline - now) / 1000)); const closingSoon = browser.status === "idle" && seconds <= 5 * 60; const canExtend = browser.status === "idle" && expiry > idleDeadline && deadline > now; const countdown = `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, "0")}`; const sizeLabel = viewport === "fit" ? "Fit to pane" : (BROWSER_USE_VIEWPORT_PRESETS.find((p) => p.id === viewport)?.label ?? "Default"); if (!live) return null; return ( ); }