'use client'; import * as React from 'react'; import { type UseChatHelpers } from 'ai/react'; import Textarea from 'react-textarea-autosize'; import { Button } from '@/components/ui/Button'; import { MessageBase } from '../../lib/types'; import { useEnterSubmit } from '@/lib/hooks/useEnterSubmit'; import Img from '../ui/Img'; import { Tooltip, TooltipContent, TooltipTrigger, } from '@/components/ui/Tooltip'; import { IconArrowDown, IconArrowElbow, IconRefresh, IconStop, } from '@/components/ui/Icons'; import { cn } from '@/lib/utils'; import { generateInputImageMarkdown } from '@/lib/messageUtils'; import { Switch } from '../ui/Switch'; export interface ComposerProps extends Pick< UseChatHelpers, 'append' | 'isLoading' | 'reload' | 'stop' | 'input' | 'setInput' > { id?: string; title?: string; messages: MessageBase[]; url?: string; isAtBottom: boolean; scrollToBottom: () => void; enableSelfReflection: boolean; setEnableSelfReflection: (value: boolean) => void; } export function Composer({ id, title, isLoading, stop, append, reload, input, setInput, messages, isAtBottom, scrollToBottom, enableSelfReflection, setEnableSelfReflection, url, }: ComposerProps) { const { formRef, onKeyDown } = useEnterSubmit(); const inputRef = React.useRef(null); React.useEffect(() => { if (inputRef.current) { inputRef.current.focus(); } }, []); return ( //
{ e.preventDefault(); if (!input?.trim()) { return; } setInput(''); await append({ id, content: input + (url ? '\n\n' + generateInputImageMarkdown(url) : ''), role: 'user', }); scrollToBottom(); }} ref={formRef} className="h-full" >
{url && (
preview-image zoomed-in-image
)}