Spaces:
Sleeping
Sleeping
| 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> | |
| ); | |
| }; | |