import React, { useState } from 'react'; import SubmitButton from './SubmitButton'; import Regenerate from './Regenerate'; import ModelMenu from './ModelMenu'; import Footer from './Footer'; import TextareaAutosize from 'react-textarea-autosize'; import handleSubmit from '~/utils/handleSubmit'; import { useSelector, useDispatch } from 'react-redux'; import { setConversation, setError } from '~/store/convoSlice'; import { setMessages } from '~/store/messageSlice'; import { setSubmitState } from '~/store/submitSlice'; import { setText } from '~/store/textSlice'; export default function TextChat({ messages }) { const [errorMessage, setErrorMessage] = useState(''); const dispatch = useDispatch(); const convo = useSelector((state) => state.convo); const { isSubmitting, model } = useSelector((state) => state.submit); const { text } = useSelector((state) => state.text); const { error } = convo; const submitMessage = () => { if (!!error) { dispatch(setError(false)); } if (!!isSubmitting || text.trim() === '') { return; } dispatch(setSubmitState(true)); const message = text.trim(); const currentMsg = { sender: 'User', text: message, current: true }; const initialResponse = { sender: model, text: '' }; dispatch(setMessages([...messages, currentMsg, initialResponse])); dispatch(setText('')); const messageHandler = (data) => { dispatch(setMessages([...messages, currentMsg, { sender: model, text: data }])); }; const convoHandler = (data) => { console.log('in convo handler'); if (convo.conversationId === null && convo.parentMessageId === null) { const { title, conversationId, id } = data; console.log('convo is null'); console.log('title, convoId, id', title, conversationId, id); dispatch(setConversation({ title, conversationId, parentMessageId: id })); console.log('convo after dispatch', convo); } dispatch(setSubmitState(false)); }; const errorHandler = (event) => { console.log('Error:', event); const errorResponse = { ...initialResponse, text: `An error occurred. Please try again in a few moments.\n\nError message: ${event.data}`, error: true }; setErrorMessage(event.data); dispatch(setSubmitState(false)); dispatch(setMessages([...messages.slice(0, -2), currentMsg, errorResponse])); dispatch(setText(message)); dispatch(setError(true)); return; }; const submission = { model, text: message, convo, messageHandler, convoHandler, errorHandler }; console.log('User Input:', message); handleSubmit(submission); }; const handleKeyDown = (e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); } }; const handleKeyUp = (e) => { if (e.key === 'Enter' && e.shiftKey) { console.log('Enter + Shift'); } if (e.key === 'Enter' && !e.shiftKey) { if (!!isSubmitting) { return; } submitMessage(); } }; const changeHandler = (e) => { const { value } = e.target; if (isSubmitting && (value === '' || value === '\n')) { return; } dispatch(setText(value)); }; const tryAgain = (e) => { e.preventDefault(); dispatch(setError(false)); }; return (
{!!error ? ( ) : (
)}
); }