vision-agent / components /chat /PromptForm.tsx
MingruiZhang's picture
done (#4)
f80b091 unverified
raw
history blame
2.94 kB
import * as React from 'react';
import Textarea from 'react-textarea-autosize';
import { UseChatHelpers } from 'ai/react';
import { useEnterSubmit } from '@/lib/hooks/useEnterSubmit';
import { cn } from '@/lib/utils';
import { Button, buttonVariants } from '@/components/ui/Button';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/Tooltip';
import { IconArrowElbow, IconPlus } from '@/components/ui/Icons';
import { useRouter } from 'next/navigation';
export interface PromptProps
extends Pick<UseChatHelpers, 'input' | 'setInput'> {
onSubmit: (value: string) => void;
isLoading: boolean;
}
export function PromptForm({
onSubmit,
input,
setInput,
isLoading,
}: PromptProps) {
const { formRef, onKeyDown } = useEnterSubmit();
const inputRef = React.useRef<HTMLTextAreaElement>(null);
const router = useRouter();
React.useEffect(() => {
if (inputRef.current) {
inputRef.current.focus();
}
}, []);
return (
<form
onSubmit={async e => {
e.preventDefault();
if (!input?.trim()) {
return;
}
setInput('');
await onSubmit(input);
}}
ref={formRef}
>
<div className="relative flex flex-col w-full px-8 pl-2 overflow-hidden max-h-60 grow bg-background sm:rounded-md sm:border sm:px-12 sm:pl-2">
{/* <Tooltip>
<TooltipTrigger asChild>
<button
onClick={e => {
e.preventDefault()
router.refresh()
router.push('/')
}}
className={cn(
buttonVariants({ size: 'sm', variant: 'outline' }),
'absolute left-0 top-4 size-8 rounded-full bg-background p-0 sm:left-4'
)}
>
<IconPlus />
<span className="sr-only">New Chat</span>
</button>
</TooltipTrigger>
<TooltipContent>New Chat</TooltipContent>
</Tooltip> */}
<Textarea
ref={inputRef}
tabIndex={0}
onKeyDown={onKeyDown}
rows={1}
value={input}
onChange={e => setInput(e.target.value)}
placeholder="Ask questions about the images."
spellCheck={false}
className="min-h-[60px] w-full resize-none bg-transparent px-4 py-[1.3rem] focus-within:outline-none sm:text-sm"
/>
<div className="absolute right-0 top-4 sm:right-4">
<Tooltip>
<TooltipTrigger asChild>
<Button
type="submit"
size="icon"
disabled={isLoading || input === ''}
>
<IconArrowElbow />
<span className="sr-only">Send message</span>
</Button>
</TooltipTrigger>
<TooltipContent>Send message</TooltipContent>
</Tooltip>
</div>
</div>
</form>
);
}