import { LoaderCircle, Plus, RotateCcw, Send, X } from 'lucide-react'; import { useRef } from 'react'; import { Button } from '@/components/ui/button'; import { Textarea } from '@/components/ui/textarea'; import { cn } from '@/lib/utils'; import type { ConversationRunStatus } from '@/types/coding-conversation'; export interface CodingComposerProps { value: string; editable: boolean; canSend: boolean; preparing: boolean; recovering: boolean; runStatus: ConversationRunStatus; error: string | null; recoverableError: boolean; acceptedCount: number; attachments: Array<{ id: string; name: string; previewUrl: string }>; submitting: boolean; placeholder: string; onChange(value: string): void; onSubmit(): void; onRecover(): void; onAddFiles(files: File[]): void; onRemoveAttachment(id: string): void; } export function CodingComposer({ value, editable, canSend, preparing, recovering, runStatus, error, recoverableError, acceptedCount, attachments, submitting, placeholder, onChange, onSubmit, onRecover, onAddFiles, onRemoveAttachment, }: CodingComposerProps) { const fileInputRef = useRef(null); const running = ['queued', 'running', 'retrying', 'compacting', 'aborting'].includes(runStatus); return (
{ event.preventDefault(); if (canSend) onSubmit(); }} > {(preparing || recovering || submitting || error || acceptedCount > 0 || running) && (
{(preparing || recovering || submitting) &&
)} { onAddFiles(Array.from(event.target.files ?? [])); event.target.value = ''; }} />
{attachments.length > 0 && (
{attachments.map((attachment) => (
{attachment.name}
))}
)}