196 lines
5.6 KiB
TypeScript
196 lines
5.6 KiB
TypeScript
'use client'
|
|
|
|
import { useRouter } from 'next/navigation'
|
|
import { useEffect, useRef } from 'react'
|
|
|
|
import Textarea from 'react-textarea-autosize'
|
|
|
|
import { useEnterSubmit } from '@/lib/hooks/use-enter-submit'
|
|
import { cn } from '@/lib/utils'
|
|
import { Button, buttonVariants } from '@/components/ui/button'
|
|
import {
|
|
Tooltip,
|
|
TooltipContent,
|
|
TooltipTrigger
|
|
} from '@/components/ui/tooltip'
|
|
import { IconArrowElbow, IconHome } from '@/components/ui/icons'
|
|
// import { UseChatHelpers } from '@aigxion/isdk/react'
|
|
import { useTranslation } from 'react-i18next'
|
|
import { PrefetchKind } from 'next/dist/client/components/router-reducer/router-reducer-types'
|
|
import { UseChatHelpers } from '@aigxion/isdk/react'
|
|
|
|
export interface PromptProps
|
|
extends Pick<UseChatHelpers, 'input' | 'setInput'> {
|
|
onSubmit: (value: string) => void
|
|
isLoading: boolean
|
|
}
|
|
|
|
export function PromptForm({
|
|
onSubmit,
|
|
input,
|
|
setInput,
|
|
isLoading
|
|
}: PromptProps) {
|
|
const router = useRouter()
|
|
const { t } = useTranslation();
|
|
|
|
const { formRef, onKeyDown } = useEnterSubmit()
|
|
const inputRef = useRef<HTMLTextAreaElement>(null)
|
|
|
|
useEffect(() => {
|
|
if (inputRef.current) {
|
|
inputRef.current.focus()
|
|
}
|
|
}, [])
|
|
|
|
return (
|
|
<form
|
|
onSubmit={async e => {
|
|
e.preventDefault()
|
|
if (!input?.trim() || isLoading) {
|
|
return
|
|
}
|
|
setInput('')
|
|
await onSubmit(input)
|
|
}}
|
|
ref={formRef}
|
|
>
|
|
|
|
<div className="relative flex w-full grow flex-col overflow-hidden px-8 sm:rounded-full sm:border-none sm:px-4 bg-[#b2b2b233]" >
|
|
<Tooltip>
|
|
<TooltipTrigger asChild>
|
|
{/* <Button
|
|
onClick={() => {
|
|
router.push(`/`, { shallow: false })
|
|
}}
|
|
className={cn(
|
|
buttonVariants({ size: 'sm', variant: 'secondary' }),
|
|
'absolute left-0 top-4 h-8 w-8 rounded-full border p-0 sm:left-4'
|
|
)}
|
|
>
|
|
<IconHome />
|
|
<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={t("chat.describe_your_intent")}
|
|
spellCheck={false}
|
|
className="min-h-[50px] w-full border-none resize-none bg-transparent px-0 py-[1rem] focus-within:outline-none sm:text-sm placeholder:text-[#666666]"
|
|
/>
|
|
<div className="absolute right-0 top-1 sm:right-2 ">
|
|
<Tooltip>
|
|
<TooltipTrigger asChild>
|
|
<Button
|
|
className="bg-baclbtn h-11 sm:rounded-full px-6 disabled:bg-[#666666] disabled:opacity-100 text-[1.125rem]"
|
|
type="submit"
|
|
// size="icon"
|
|
disabled={isLoading || !input?.trim()}
|
|
>
|
|
{/* <IconArrowElbow className="fill-white" /> */}
|
|
<span >{t("chat.send")}</span>
|
|
</Button>
|
|
</TooltipTrigger>
|
|
<TooltipContent>{t("chat.send_message")}</TooltipContent>
|
|
</Tooltip>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
)
|
|
}
|
|
|
|
|
|
export interface PromptIndexProps {
|
|
onSubmit?: (value: string) => void
|
|
isLoading?: boolean
|
|
id: string
|
|
}
|
|
|
|
|
|
export function PromptForm_bak({
|
|
onSubmit,
|
|
input,
|
|
setInput,
|
|
isLoading
|
|
}: PromptProps) {
|
|
const router = useRouter()
|
|
const { formRef, onKeyDown } = useEnterSubmit()
|
|
const inputRef = useRef<HTMLTextAreaElement>(null)
|
|
|
|
useEffect(() => {
|
|
if (inputRef.current) {
|
|
inputRef.current.focus()
|
|
}
|
|
}, [])
|
|
|
|
return (
|
|
<form
|
|
onSubmit={async e => {
|
|
e.preventDefault()
|
|
if (!input?.trim() || isLoading) {
|
|
return
|
|
}
|
|
setInput('')
|
|
await onSubmit(input)
|
|
}}
|
|
ref={formRef}
|
|
>
|
|
|
|
<div className="relative flex w-full grow flex-col overflow-hidden px-8 sm:rounded-md sm:border sm:px-12">
|
|
<Tooltip>
|
|
<TooltipTrigger asChild>
|
|
<Button
|
|
onClick={() => {
|
|
router.push(`/`, {
|
|
// shallow: false
|
|
})
|
|
}}
|
|
className={cn(
|
|
buttonVariants({ size: 'sm', variant: 'secondary' }),
|
|
'absolute left-0 top-4 h-8 w-8 rounded-full border p-0 sm:left-4'
|
|
)}
|
|
>
|
|
<IconHome />
|
|
<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="Send a message."
|
|
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?.trim()}
|
|
>
|
|
<IconArrowElbow className="fill-white" />
|
|
<span className="sr-only">Send message</span>
|
|
</Button>
|
|
</TooltipTrigger>
|
|
<TooltipContent>Send message</TooltipContent>
|
|
</Tooltip>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
)
|
|
}
|