Spaces:
Runtime error
Runtime error
| import { useState } from "react"; | |
| import { Button } from "@/components/ui/button"; | |
| import { SquarePen, Brain, Send, StopCircle, Zap, Cpu } from "lucide-react"; | |
| import { Textarea } from "@/components/ui/textarea"; | |
| import { | |
| Select, | |
| SelectContent, | |
| SelectItem, | |
| SelectTrigger, | |
| SelectValue, | |
| } from "@/components/ui/select"; | |
| // Updated InputFormProps | |
| interface InputFormProps { | |
| onSubmit: (inputValue: string, effort: string, model: string) => void; | |
| onCancel: () => void; | |
| isLoading: boolean; | |
| hasHistory: boolean; | |
| } | |
| export const InputForm: React.FC<InputFormProps> = ({ | |
| onSubmit, | |
| onCancel, | |
| isLoading, | |
| hasHistory, | |
| }) => { | |
| const [internalInputValue, setInternalInputValue] = useState(""); | |
| const [effort, setEffort] = useState("medium"); | |
| const [model, setModel] = useState("gemini-2.5-flash-preview-04-17"); | |
| const handleInternalSubmit = (e?: React.FormEvent) => { | |
| if (e) e.preventDefault(); | |
| if (!internalInputValue.trim()) return; | |
| onSubmit(internalInputValue, effort, model); | |
| setInternalInputValue(""); | |
| }; | |
| const handleInternalKeyDown = ( | |
| e: React.KeyboardEvent<HTMLTextAreaElement> | |
| ) => { | |
| if (e.key === "Enter" && !e.shiftKey) { | |
| e.preventDefault(); | |
| handleInternalSubmit(); | |
| } | |
| }; | |
| const isSubmitDisabled = !internalInputValue.trim() || isLoading; | |
| return ( | |
| <form | |
| onSubmit={handleInternalSubmit} | |
| className={`flex flex-col gap-2 p-3 `} | |
| > | |
| <div | |
| className={`flex flex-row items-center justify-between text-white rounded-3xl rounded-bl-sm ${ | |
| hasHistory ? "rounded-br-sm" : "" | |
| } break-words min-h-7 bg-neutral-700 px-4 pt-3 `} | |
| > | |
| <Textarea | |
| value={internalInputValue} | |
| onChange={(e) => setInternalInputValue(e.target.value)} | |
| onKeyDown={handleInternalKeyDown} | |
| placeholder="Who won the Euro 2024 and scored the most goals?" | |
| className={`w-full text-neutral-100 placeholder-neutral-500 resize-none border-0 focus:outline-none focus:ring-0 outline-none focus-visible:ring-0 shadow-none | |
| md:text-base min-h-[56px] max-h-[200px]`} | |
| rows={1} | |
| /> | |
| <div className="-mt-3"> | |
| {isLoading ? ( | |
| <Button | |
| type="button" | |
| variant="ghost" | |
| size="icon" | |
| className="text-red-500 hover:text-red-400 hover:bg-red-500/10 p-2 cursor-pointer rounded-full transition-all duration-200" | |
| onClick={onCancel} | |
| > | |
| <StopCircle className="h-5 w-5" /> | |
| </Button> | |
| ) : ( | |
| <Button | |
| type="submit" | |
| variant="ghost" | |
| className={`${ | |
| isSubmitDisabled | |
| ? "text-neutral-500" | |
| : "text-blue-500 hover:text-blue-400 hover:bg-blue-500/10" | |
| } p-2 cursor-pointer rounded-full transition-all duration-200 text-base`} | |
| disabled={isSubmitDisabled} | |
| > | |
| Search | |
| <Send className="h-5 w-5" /> | |
| </Button> | |
| )} | |
| </div> | |
| </div> | |
| <div className="flex items-center justify-between"> | |
| <div className="flex flex-row gap-2"> | |
| <div className="flex flex-row gap-2 bg-neutral-700 border-neutral-600 text-neutral-300 focus:ring-neutral-500 rounded-xl rounded-t-sm pl-2 max-w-[100%] sm:max-w-[90%]"> | |
| <div className="flex flex-row items-center text-sm"> | |
| <Brain className="h-4 w-4 mr-2" /> | |
| Effort | |
| </div> | |
| <Select value={effort} onValueChange={setEffort}> | |
| <SelectTrigger className="w-[120px] bg-transparent border-none cursor-pointer"> | |
| <SelectValue placeholder="Effort" /> | |
| </SelectTrigger> | |
| <SelectContent className="bg-neutral-700 border-neutral-600 text-neutral-300 cursor-pointer"> | |
| <SelectItem | |
| value="low" | |
| className="hover:bg-neutral-600 focus:bg-neutral-600 cursor-pointer" | |
| > | |
| Low | |
| </SelectItem> | |
| <SelectItem | |
| value="medium" | |
| className="hover:bg-neutral-600 focus:bg-neutral-600 cursor-pointer" | |
| > | |
| Medium | |
| </SelectItem> | |
| <SelectItem | |
| value="high" | |
| className="hover:bg-neutral-600 focus:bg-neutral-600 cursor-pointer" | |
| > | |
| High | |
| </SelectItem> | |
| </SelectContent> | |
| </Select> | |
| </div> | |
| <div className="flex flex-row gap-2 bg-neutral-700 border-neutral-600 text-neutral-300 focus:ring-neutral-500 rounded-xl rounded-t-sm pl-2 max-w-[100%] sm:max-w-[90%]"> | |
| <div className="flex flex-row items-center text-sm ml-2"> | |
| <Cpu className="h-4 w-4 mr-2" /> | |
| Model | |
| </div> | |
| <Select value={model} onValueChange={setModel}> | |
| <SelectTrigger className="w-[150px] bg-transparent border-none cursor-pointer"> | |
| <SelectValue placeholder="Model" /> | |
| </SelectTrigger> | |
| <SelectContent className="bg-neutral-700 border-neutral-600 text-neutral-300 cursor-pointer"> | |
| <SelectItem | |
| value="gemini-2.0-flash" | |
| className="hover:bg-neutral-600 focus:bg-neutral-600 cursor-pointer" | |
| > | |
| <div className="flex items-center"> | |
| <Zap className="h-4 w-4 mr-2 text-yellow-400" /> 2.0 Flash | |
| </div> | |
| </SelectItem> | |
| <SelectItem | |
| value="gemini-2.5-flash-preview-04-17" | |
| className="hover:bg-neutral-600 focus:bg-neutral-600 cursor-pointer" | |
| > | |
| <div className="flex items-center"> | |
| <Zap className="h-4 w-4 mr-2 text-orange-400" /> 2.5 Flash | |
| </div> | |
| </SelectItem> | |
| <SelectItem | |
| value="gemini-2.5-pro-preview-05-06" | |
| className="hover:bg-neutral-600 focus:bg-neutral-600 cursor-pointer" | |
| > | |
| <div className="flex items-center"> | |
| <Cpu className="h-4 w-4 mr-2 text-purple-400" /> 2.5 Pro | |
| </div> | |
| </SelectItem> | |
| </SelectContent> | |
| </Select> | |
| </div> | |
| </div> | |
| {hasHistory && ( | |
| <Button | |
| className="bg-neutral-700 border-neutral-600 text-neutral-300 cursor-pointer rounded-xl rounded-t-sm pl-2 " | |
| variant="default" | |
| onClick={() => window.location.reload()} | |
| > | |
| <SquarePen size={16} /> | |
| New Search | |
| </Button> | |
| )} | |
| </div> | |
| </form> | |
| ); | |
| }; | |