chatbot-template/components/prompt-form.tsx

98 lines
2.8 KiB
TypeScript
Raw Normal View History

2023-06-07 16:17:59 +04:00
import * as React from 'react'
import Link from 'next/link'
2023-06-02 15:33:48 -04:00
import Textarea from 'react-textarea-autosize'
2023-05-19 12:33:56 -04:00
import { useEnterSubmit } from '@/lib/hooks/use-enter-submit'
2023-06-02 15:33:48 -04:00
import { cn } from '@/lib/utils'
import { Button, buttonVariants } from '@/components/ui/button'
2023-06-07 16:17:59 +04:00
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger
} from '@/components/ui/tooltip'
2023-06-13 16:02:07 +04:00
import { IconArrowElbow, IconPlus } from '@/components/ui/icons'
import { UseChatHelpers } from 'ai-connector'
2023-05-19 12:33:56 -04:00
export interface PromptProps
extends Pick<UseChatHelpers, 'input' | 'setInput'> {
2023-06-02 15:33:48 -04:00
onSubmit: (value: string) => void
isLoading: boolean
2023-05-19 12:33:56 -04:00
}
export function PromptForm({
onSubmit,
input,
setInput,
isLoading
}: PromptProps) {
const { formRef, onKeyDown } = useEnterSubmit()
2023-06-07 16:17:59 +04:00
const inputRef = React.useRef<HTMLTextAreaElement>(null)
React.useEffect(() => {
if (inputRef.current) {
inputRef.current.focus()
}
}, [])
2023-05-19 12:33:56 -04:00
return (
<form
2023-06-02 15:33:48 -04:00
onSubmit={async e => {
e.preventDefault()
if (input === '') {
return
}
2023-06-02 15:33:48 -04:00
setInput('')
await onSubmit(input)
2023-05-19 12:33:56 -04:00
}}
ref={formRef}
>
<TooltipProvider>
2023-06-11 22:58:00 +04:00
<div className="relative flex w-full grow flex-col overflow-hidden bg-background px-8 sm:rounded-md sm:border sm:px-12">
<Tooltip>
<TooltipTrigger asChild>
<Link
href="/"
className={cn(
buttonVariants({ size: 'sm', variant: 'outline' }),
2023-06-11 22:58:00 +04:00
'absolute left-0 top-4 h-8 w-8 rounded-full bg-background p-0 sm:left-4'
)}
2023-05-19 12:33:56 -04:00
>
2023-06-13 16:02:07 +04:00
<IconPlus />
<span className="sr-only">New Chat</span>
</Link>
</TooltipTrigger>
<TooltipContent>New Chat</TooltipContent>
</Tooltip>
<Textarea
ref={inputRef}
tabIndex={0}
onKeyDown={onKeyDown}
rows={1}
value={input}
onChange={e => setInput(e.target.value)}
placeholder="Send a message."
spellCheck={false}
2023-06-11 22:58:00 +04:00
className="min-h-[60px] w-full resize-none bg-transparent px-4 py-[1.3rem] focus-within:outline-none sm:text-sm"
/>
2023-06-11 22:58:00 +04:00
<div className="absolute right-0 top-4 sm:right-4">
<Tooltip>
<TooltipTrigger asChild>
<Button
type="submit"
size="icon"
disabled={isLoading || input === ''}
>
2023-06-13 16:02:07 +04:00
<IconArrowElbow />
<span className="sr-only">Send message</span>
</Button>
</TooltipTrigger>
<TooltipContent>Send message</TooltipContent>
</Tooltip>
2023-06-07 16:17:59 +04:00
</div>
</div>
</TooltipProvider>
2023-05-19 12:33:56 -04:00
</form>
2023-06-02 15:33:48 -04:00
)
2023-05-19 12:33:56 -04:00
}