import { useEffect, useRef, useState } from 'react' import { TextArea, Button, useMediaQuery } from '@janhq/joi' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { StopCircle, SettingsIcon, ChevronUpIcon, Settings2Icon, } from 'lucide-react' import { twMerge } from 'tailwind-merge' import ModelDropdown from '@/containers/ModelDropdown' import { currentPromptAtom } from '@/containers/Providers/Jotai' import { showRightPanelAtom } from '@/helpers/atoms/App.atom' import { getCurrentChatMessagesAtom } from '@/helpers/atoms/ChatMessage.atom' import { spellCheckAtom } from '@/helpers/atoms/Setting.atom' import { activeThreadAtom, getActiveThreadIdAtom, isGeneratingResponseAtom, waitingToSendMessage, } from '@/helpers/atoms/Thread.atom' import { activeTabThreadRightPanelAtom } from '@/helpers/atoms/ThreadRightPanel.atom' type Props = { sendMessage: (message: string) => void stopInference: () => void } const ChatInput: React.FC = ({ sendMessage, stopInference }) => { const activeThread = useAtomValue(activeThreadAtom) const messages = useAtomValue(getCurrentChatMessagesAtom) const [activeSetting, setActiveSetting] = useState(false) const spellCheck = useAtomValue(spellCheckAtom) const [currentPrompt, setCurrentPrompt] = useAtom(currentPromptAtom) const activeThreadId = useAtomValue(getActiveThreadIdAtom) const [isWaitingToSend, setIsWaitingToSend] = useAtom(waitingToSendMessage) // const [fileUpload, setFileUpload] = useAtom(fileUploadAtom) const textareaRef = useRef(null) const isGeneratingResponse = useAtomValue(isGeneratingResponseAtom) const setActiveTabThreadRightPanel = useSetAtom(activeTabThreadRightPanelAtom) const onPromptChange = (e: React.ChangeEvent) => { setCurrentPrompt(e.target.value) } const [showRightPanel, setShowRightPanel] = useAtom(showRightPanelAtom) const matches = useMediaQuery('(max-width: 880px)') useEffect(() => { if (isWaitingToSend && activeThreadId) { setIsWaitingToSend(false) sendMessage(currentPrompt) } }, [ activeThreadId, isWaitingToSend, currentPrompt, setIsWaitingToSend, sendMessage, ]) useEffect(() => { if (textareaRef.current) { textareaRef.current.focus() } }, [activeThreadId]) useEffect(() => { if (textareaRef.current?.clientHeight) { textareaRef.current.style.height = activeSetting ? '100px' : '40px' textareaRef.current.style.height = textareaRef.current.scrollHeight + 'px' textareaRef.current.style.overflow = textareaRef.current.clientHeight >= 390 ? 'auto' : 'hidden' } }, [textareaRef.current?.clientHeight, currentPrompt, activeSetting]) const onKeyDown = async (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) { e.preventDefault() if (isGeneratingResponse) return if (messages[messages.length - 1]?.status !== 'in_progress') sendMessage(currentPrompt) else stopInference() } } /** * Handles the change event of the extension file input element by setting the file name state. * Its to be used to display the extension file name of the selected file. * @param event - The change event object. */ // const handleFileChange = (event: React.ChangeEvent) => { // const file = event.target.files?.[0] // if (!file) return // setFileUpload([{ file: file, type: 'pdf' }]) // } // const handleImageChange = (event: React.ChangeEvent) => { // const file = event.target.files?.[0] // if (!file) return // setFileUpload([{ file: file, type: 'image' }]) // } // const renderPreview = (fileUpload: any) => { // if (fileUpload.length > 0) { // if (fileUpload[0].type === 'image') { // return // } else { // return // } // } // } return (
{/* {renderPreview(fileUpload)} */}