import { Button } from "@openstatus/ui/components/ui/button"; import { InputGroup, InputGroupAddon, InputGroupTextarea, } from "@openstatus/ui/components/ui/input-group"; import { Spinner } from "@openstatus/ui/components/ui/spinner"; import { CornerDownLeftIcon, SquareIcon, XIcon } from "lucide-react"; import { type FormEvent, type KeyboardEvent, useCallback, useState, } from "react"; type ChatStatus = "submitted" | "streaming" | "ready" | "error"; type Props = { onSubmit: (text: string) => void; onStop?: () => void; status?: ChatStatus; }; export function ChatPromptInput({ onSubmit, onStop, status }: Props) { const [value, setValue] = useState(""); const isGenerating = status === "submitted" || status === "streaming"; const submit = useCallback(() => { const text = value.trim(); if (!text || isGenerating) return; onSubmit(text); setValue(""); }, [value, isGenerating, onSubmit]); const handleSubmit = useCallback( (e: FormEvent) => { e.preventDefault(); submit(); }, [submit], ); const handleKeyDown = useCallback( (e: KeyboardEvent) => { // IMEs (CJK input) finalize a candidate with Enter; don't submit mid-composition. if (e.nativeEvent.isComposing) return; if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); submit(); } }, [submit], ); const handleClick = useCallback(() => { if (isGenerating && onStop) { onStop(); } }, [isGenerating, onStop]); return (
setValue(e.target.value)} onKeyDown={handleKeyDown} // Override the workspace `min-h-16` so an empty input is one row tall. className="min-h-0" />

Powered by Claude. AI responses may contain errors, double-check results.

); }