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'; import SystemPromptSelector from './MessageInputActions/SystemPromptSelector'; // Import new component const MessageInput = ({ sendMessage, loading, fileIds, setFileIds, files, setFiles, optimizationMode, setOptimizationMode, focusMode, setFocusMode, firstMessage, onCancel, systemPromptIds, setSystemPromptIds, }: { sendMessage: ( message: string, options?: { messageId?: string; // For rewrites/edits selectedSystemPromptIds?: 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; systemPromptIds: string[]; setSystemPromptIds: (ids: string[]) => 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 storedPromptIds = localStorage.getItem('selectedSystemPromptIds'); if (storedPromptIds) { try { const parsedIds = JSON.parse(storedPromptIds); if (Array.isArray(parsedIds)) { setSystemPromptIds(parsedIds); } } catch (e) { console.error( 'Failed to parse selectedSystemPromptIds from localStorage', e, ); localStorage.removeItem('selectedSystemPromptIds'); // Clear corrupted data } } }, [setSystemPromptIds]); useEffect(() => { if (systemPromptIds.length > 0) { localStorage.setItem( 'selectedSystemPromptIds', JSON.stringify(systemPromptIds), ); } else { // Remove from localStorage if no prompts are selected to keep it clean localStorage.removeItem('selectedSystemPromptIds'); } }, [systemPromptIds]); 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={1} className="mb-2 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'} /> { setOptimizationMode(optimizationMode); localStorage.setItem('optimizationMode', optimizationMode); }} />
{ setSelectedModel(selectedModel); localStorage.setItem( 'chatModelProvider', selectedModel.provider, ); localStorage.setItem('chatModel', selectedModel.model); }} /> {loading ? ( ) : ( )}
); }; export default MessageInput;