"use client"; import { memo, useCallback, useRef, useState } from "react"; import { IconCheck, IconChevronDown } from "@tabler/icons-react"; import { Button } from "@kandev/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger, } from "@kandev/ui/dropdown-menu"; import { Tooltip, TooltipContent, TooltipTrigger } from "@kandev/ui/tooltip"; import { useAppStore } from "@/components/state-provider"; import { setSessionMode } from "@/lib/api/domains/session-api"; type ModeSelectorProps = { sessionId: string | null; }; export const ModeSelector = memo(function ModeSelector({ sessionId }: ModeSelectorProps) { const modeState = useAppStore((state) => sessionId ? state.sessionMode.bySessionId[sessionId] : undefined, ); const [dropdownOpen, setDropdownOpen] = useState(false); const [tooltipOpen, setTooltipOpen] = useState(false); const recentlyClosedRef = useRef(false); const handleModeChange = useCallback( async (modeId: string) => { if (!sessionId) return; try { await setSessionMode(sessionId, modeId); } catch (err) { console.error("[ModeSelector] set-mode API failed:", err); } }, [sessionId], ); const handleDropdownOpenChange = useCallback((open: boolean) => { setDropdownOpen(open); if (!open) { recentlyClosedRef.current = true; setTooltipOpen(false); setTimeout(() => { recentlyClosedRef.current = false; }, 200); } }, []); const handleTooltipOpenChange = useCallback( (open: boolean) => { if (open && (dropdownOpen || recentlyClosedRef.current)) return; setTooltipOpen(open); }, [dropdownOpen], ); if ( !sessionId || !modeState || !modeState.availableModes || modeState.availableModes.length <= 1 ) { return null; } const currentMode = modeState.availableModes.find((m) => m.id === modeState.currentModeId); const displayName = currentMode?.name || modeState.currentModeId || "Mode"; return ( Agent permission mode Available Modes {modeState.availableModes.map((mode) => ( handleModeChange(mode.id)} className={`cursor-pointer relative pr-7 ${mode.id === modeState.currentModeId ? "bg-muted" : ""}`} >
{mode.name}
{mode.description && (
{mode.description}
)}
{mode.id === modeState.currentModeId && ( )}
))}
); });