import { Button } from "@code/ui/components/button"; import { LoaderCircle, Send, X } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import type { ComposerMode } from "@/hooks/work-os/use-work-os"; interface WorkOsComposerProps { readonly mode: ComposerMode; readonly onModeChange: (mode: ComposerMode) => void; readonly onSend: (message: string) => Promise; readonly busy: boolean; readonly error?: Error; readonly workUnitTitle?: string; readonly placeholder?: string; } export const WorkOsComposer = ({ busy, error, mode, onModeChange, onSend, placeholder, workUnitTitle, }: WorkOsComposerProps) => { const [draft, setDraft] = useState(""); const textareaRef = useRef(null); const canSend = draft.trim().length > 0 && !busy; useEffect(() => { if (!busy) { textareaRef.current?.focus(); } }, [busy, mode]); const handleSubmit = async () => { const message = draft.trim(); if (!message || busy) { return; } setDraft(""); try { await onSend(message); } finally { textareaRef.current?.focus(); } }; const handleKeyDown = (event: React.KeyboardEvent) => { if ( event.key === "Enter" && !event.shiftKey && !event.nativeEvent.isComposing ) { event.preventDefault(); void handleSubmit(); } }; const scopeLabel = mode === "project" ? "Project" : (workUnitTitle ?? "Work Unit"); return (
{/* Mode switcher */}
{mode === "work-unit" && workUnitTitle ? ( onModeChange("project")} /> {workUnitTitle} ) : null} {scopeLabel}
{error ? (

{error.message || "Message failed to send"}

) : null}