import { cn } from '@/lib/utils'; import { ArrowUp } from 'lucide-react'; import { useEffect, useRef, useState } from 'react'; import TextareaAutosize from 'react-textarea-autosize'; import Attach from './MessageInputActions/Attach'; import CopilotToggle from './MessageInputActions/Copilot'; import { File } from './ChatWindow'; import AttachSmall from './MessageInputActions/AttachSmall'; const MessageInput = ({ sendMessage, loading, fileIds, setFileIds, files, setFiles, }: { sendMessage: (message: string) => void; loading: boolean; fileIds: string[]; setFileIds: (fileIds: string[]) => void; files: File[]; setFiles: (files: File[]) => void; }) => { const [copilotEnabled, setCopilotEnabled] = useState(false); const [message, setMessage] = useState(''); const [textareaRows, setTextareaRows] = useState(1); const [mode, setMode] = useState<'multi' | 'single'>('single'); useEffect(() => { if (textareaRows >= 2 && message && mode === 'single') { setMode('multi'); } else if (!message && mode === 'multi') { setMode('single'); } }, [textareaRows, mode, message]); const inputRef = useRef(null); useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { const activeElement = document.activeElement; const isInputFocused = activeElement?.tagName === 'INPUT' || activeElement?.tagName === 'TEXTAREA' || activeElement?.hasAttribute('contenteditable'); if (e.key === '/' && !isInputFocused) { e.preventDefault(); inputRef.current?.focus(); } }; document.addEventListener('keydown', handleKeyDown); return () => { document.removeEventListener('keydown', handleKeyDown); }; }, []); return (
{ if (loading) return; e.preventDefault(); sendMessage(message); setMessage(''); }} onKeyDown={(e) => { if (e.key === 'Enter' && !e.shiftKey && !loading) { e.preventDefault(); sendMessage(message); setMessage(''); } }} className={cn( 'bg-light-secondary dark:bg-dark-secondary p-4 flex items-center overflow-hidden border border-light-200 dark:border-dark-200', mode === 'multi' ? 'flex-col rounded-lg' : 'flex-row rounded-full', )} > {mode === 'single' && ( )} setMessage(e.target.value)} onHeightChange={(height, props) => { setTextareaRows(Math.ceil(height / props.rowHeight)); }} className="transition bg-transparent dark:placeholder:text-white/50 placeholder:text-sm text-sm dark:text-white resize-none focus:outline-none w-full px-2 max-h-24 lg:max-h-36 xl:max-h-48 flex-grow flex-shrink" placeholder="Ask a follow-up" /> {mode === 'single' && (
)} {mode === 'multi' && (
)} ); }; export default MessageInput;