import { useRef, type ReactNode } from "react"; import { Button, Dropdown, Tooltip } from "antd"; import { ArrowUp, Check, ChevronUp, Cpu, Hand, ImagePlus, LoaderCircle, RefreshCw, ShieldAlert, ShieldCheck, ShieldOff, Square, X } from "lucide-react"; import { Select, SelectContent, SelectItem, SelectTrigger } from "@/components/ui/select"; import { canvasThemes } from "@/lib/canvas-theme"; import { isPlainEnterKey } from "@/lib/keyboard-event"; import type { AgentModel, AgentPermissionMode, AgentReasoningEffort } from "@/stores/use-agent-store"; import type { AgentChatAttachment } from "./agent-chat-message"; export function AgentChatComposer({ prompt, attachments = [], disabled, sending, placeholder, theme, onPromptChange, onSubmit, onStop, onAddFiles, onRemoveAttachment, confirmTools, onConfirmToolsChange, permissionMode, onPermissionModeChange, models, model, reasoningEffort, onModelChange, onReasoningEffortChange, left, }: { prompt: string; attachments?: AgentChatAttachment[]; disabled?: boolean; sending?: boolean; placeholder: string; theme: (typeof canvasThemes)[keyof typeof canvasThemes]; onPromptChange: (value: string) => void; onSubmit: () => void; onStop?: () => void; onAddFiles?: (files: FileList | File[] | null) => void | Promise; onRemoveAttachment?: (id: string) => void; confirmTools?: boolean; onConfirmToolsChange?: (confirmTools: boolean) => void; permissionMode?: AgentPermissionMode; onPermissionModeChange?: (permissionMode: AgentPermissionMode) => void; models?: AgentModel[]; model?: string; reasoningEffort?: AgentReasoningEffort | ""; onModelChange?: (model: string) => void; onReasoningEffortChange?: (effort: AgentReasoningEffort) => void; left?: ReactNode; }) { const fileInputRef = useRef(null); const canSubmit = !disabled && !sending && Boolean(prompt.trim() || attachments.length); return (
event.stopPropagation()}>
{attachments.length ? (
{attachments.map((item) => (
{item.name} {onRemoveAttachment ? ( ) : null}
))}
) : null}