import { useMemo } from "react"; import { SearchableSelect } from "@/components/SearchableSelect"; import { buildReusableExecutionWorkspaceOptionGroups, reusableWorkspaceOptionMatches, scoreReusableWorkspaceOptionMatch, type ReusableExecutionWorkspaceLike, type ReusableWorkspaceOption, } from "@/lib/reusable-execution-workspaces"; import { cn } from "@/lib/utils"; const COMPACT_TRIGGER_CLASS = "h-8 px-2 py-1.5 text-xs font-normal"; interface ReusableExecutionWorkspaceSelectProps { value: string; workspaces: readonly TWorkspace[]; onValueChange: (workspaceId: string, option: ReusableWorkspaceOption) => void; placeholder?: string; loading?: boolean; error?: boolean; disabled?: boolean; className?: string; triggerClassName?: string; disablePortal?: boolean; } export function ReusableExecutionWorkspaceSelect({ value, workspaces, onValueChange, placeholder = "Choose an existing workspace", loading = false, error = false, disabled = false, className, triggerClassName, disablePortal, }: ReusableExecutionWorkspaceSelectProps) { const groups = useMemo(() => buildReusableExecutionWorkspaceOptionGroups(workspaces), [workspaces]); return ( > value={value} groups={groups} onValueChange={onValueChange} placeholder={placeholder} searchPlaceholder="Search workspaces..." emptyMessage={error ? "Workspaces failed to load." : "No matching workspaces."} loadingMessage="Loading workspaces..." loading={loading} disabled={disabled} className={className} triggerClassName={cn(COMPACT_TRIGGER_CLASS, triggerClassName)} filterOption={reusableWorkspaceOptionMatches} scoreOption={scoreReusableWorkspaceOptionMatch} disablePortal={disablePortal} renderOption={(option, { selected }) => ( {option.label} {option.workspace.status ? `${option.workspace.status} - ` : ""} {option.description} )} /> ); }