'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, IconImage, IconRefresh, IconStop, } from '@/components/ui/Icons'; import { cn } from '@/lib/utils'; import { generateInputImageMarkdown } from '@/lib/messageUtils'; import { Switch } from '../ui/Switch'; import Chip from '../ui/Chip'; export interface ComposerProps extends Pick< UseChatHelpers, 'append' | 'isLoading' | 'reload' | 'stop' | 'input' | 'setInput' > { id?: string; title?: string; messages: MessageBase[]; mediaUrl?: string; } export function Composer({ id, isLoading, append, input, setInput, mediaUrl, // isAtBottom, }: ComposerProps) { const { formRef, onKeyDown } = useEnterSubmit(); const inputRef = React.useRef(null); React.useEffect(() => { if (inputRef.current) { inputRef.current.focus(); } }, []); const mediaName = mediaUrl?.split('/').pop(); return (
{mediaUrl && (

{mediaName ?? 'media(0)'}

zoomed-in-image
)}
{ e.preventDefault(); if (!input?.trim()) { return; } setInput(''); await append({ id, content: input + (mediaUrl ? '\n\n' + generateInputImageMarkdown(mediaUrl) : ''), role: 'user', }); }} ref={formRef} className="h-full" > {/*
*/}