import { ArrowRight, ArrowUp, Square } from 'lucide-react'; import { useEffect, useRef, useState } from 'react'; import TextareaAutosize from 'react-textarea-autosize'; import { File } from './ChatWindow'; import Attach from './MessageInputActions/Attach'; import Focus from './MessageInputActions/Focus'; import ModelSelector from './MessageInputActions/ModelSelector'; import Optimization from './MessageInputActions/Optimization'; const MessageInput = ({ sendMessage, loading, fileIds, setFileIds, files, setFiles, optimizationMode, setOptimizationMode, focusMode, setFocusMode, firstMessage, onCancel, }: { sendMessage: (message: string) => void; loading: boolean; fileIds: string[]; setFileIds: (fileIds: string[]) => void; files: File[]; setFiles: (files: File[]) => void; optimizationMode: string; setOptimizationMode: (mode: string) => void; focusMode: string; setFocusMode: (mode: string) => void; firstMessage: boolean; onCancel?: () => void; }) => { const [message, setMessage] = useState(''); const [selectedModel, setSelectedModel] = useState<{ provider: string; model: string; } | null>(null); useEffect(() => { // Load saved model preferences from localStorage const chatModelProvider = localStorage.getItem('chatModelProvider'); const chatModel = localStorage.getItem('chatModel'); if (chatModelProvider && chatModel) { setSelectedModel({ provider: chatModelProvider, model: chatModel, }); } }, []); 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); }; }, []); // Function to handle message submission const handleSubmitMessage = () => { // Only submit if we have a non-empty message and not currently loading if (loading || message.trim().length === 0) return; // Make sure the selected model is used when sending a message if (selectedModel) { localStorage.setItem('chatModelProvider', selectedModel.provider); localStorage.setItem('chatModel', selectedModel.model); } sendMessage(message); setMessage(''); }; return (
{ e.preventDefault(); handleSubmitMessage(); }} onKeyDown={(e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSubmitMessage(); } }} className="w-full" >
setMessage(e.target.value)} minRows={2} className="bg-transparent placeholder:text-black/50 dark:placeholder:text-white/50 text-sm text-black dark:text-white resize-none focus:outline-none w-full max-h-24 lg:max-h-36 xl:max-h-48" placeholder={firstMessage ? 'Ask anything...' : 'Ask a follow-up'} />
{loading ? ( ) : ( )}
); }; export default MessageInput;