scira-chat / components /textarea.tsx
victor's picture
victor HF Staff
fix: Resolve TypeScript errors and update dependencies
4359c33
raw
history blame
2 kB
import { ModelID } from "@/lib/models";
import { Textarea as ShadcnTextarea } from "@/components/ui/textarea";
import { ArrowUp, Loader2 } from "lucide-react";
import { ModelPicker } from "./model-picker";
interface InputProps {
input: string;
handleInputChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;
isLoading: boolean;
status: string;
stop: () => void;
selectedModel: ModelID;
setSelectedModel: (model: ModelID) => void;
}
export const Textarea = ({
input,
handleInputChange,
isLoading,
status,
stop,
selectedModel,
setSelectedModel,
}: InputProps) => {
const isStreaming = status === "streaming" || status === "submitted";
return (
<div className="relative w-full">
<ShadcnTextarea
className="resize-none bg-background/50 dark:bg-muted/50 backdrop-blur-sm w-full rounded-2xl pr-12 pt-4 pb-16 border-input focus-visible:ring-ring placeholder:text-muted-foreground"
value={input}
autoFocus
placeholder="Send a message..."
onChange={handleInputChange}
onKeyDown={(e) => {
if (e.key === "Enter" && !e.shiftKey && !isLoading && input.trim()) {
e.preventDefault();
e.currentTarget.form?.requestSubmit();
}
}}
/>
<ModelPicker
setSelectedModel={setSelectedModel}
selectedModel={selectedModel}
/>
<button
type={isStreaming ? "button" : "submit"}
onClick={isStreaming ? stop : undefined}
disabled={(!isStreaming && !input.trim()) || (isStreaming && status === "submitted")}
className="absolute right-2 bottom-2 rounded-full p-2 bg-primary hover:bg-primary/90 disabled:bg-muted disabled:cursor-not-allowed transition-all duration-200"
>
{isStreaming ? (
<Loader2 className="h-4 w-4 text-primary-foreground animate-spin" />
) : (
<ArrowUp className="h-4 w-4 text-primary-foreground" />
)}
</button>
</div>
);
};