LibreChat/src/components/main/TextChat.jsx

137 lines
4.9 KiB
React
Raw Normal View History

2023-02-05 15:29:35 -05:00
import React, { useState } from 'react';
2023-02-06 21:17:46 -05:00
import SubmitButton from './SubmitButton';
import Regenerate from './Regenerate';
import ModelMenu from './ModelMenu';
2023-02-11 12:54:02 -05:00
import Footer from './Footer';
2023-02-06 13:27:28 -05:00
import TextareaAutosize from 'react-textarea-autosize';
import handleSubmit from '~/utils/handleSubmit';
2023-02-07 00:05:00 -05:00
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';
2023-02-05 15:29:35 -05:00
export default function TextChat({ messages }) {
const [errorMessage, setErrorMessage] = useState('');
2023-02-07 00:05:00 -05:00
const dispatch = useDispatch();
2023-02-07 09:41:54 -05:00
const convo = useSelector((state) => state.convo);
const { isSubmitting } = useSelector((state) => state.submit);
const { text } = useSelector((state) => state.text);
const { error } = convo;
2023-02-07 00:05:00 -05:00
2023-02-06 21:17:46 -05:00
const submitMessage = () => {
if (!!error) {
dispatch(setError(false));
}
if (!!isSubmitting || text.trim() === '') {
return;
}
dispatch(setSubmitState(true));
2023-02-06 21:17:46 -05:00
const payload = text.trim();
const currentMsg = { sender: 'user', text: payload, current: true };
const initialResponse = { sender: 'GPT', text: '' };
dispatch(setMessages([...messages, currentMsg, initialResponse]));
dispatch(setText(''));
2023-02-06 21:17:46 -05:00
const messageHandler = (data) => {
2023-02-07 00:05:00 -05:00
dispatch(setMessages([...messages, currentMsg, { sender: 'GPT', text: data }]));
};
2023-02-06 21:17:46 -05:00
const convoHandler = (data) => {
2023-02-12 22:57:59 -05:00
console.log('in convo handler');
2023-02-06 21:17:46 -05:00
if (convo.conversationId === null && convo.parentMessageId === null) {
const { title, conversationId, id } = data;
2023-02-12 22:57:59 -05:00
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);
2023-02-06 21:17:46 -05:00
}
2023-02-05 15:29:35 -05:00
dispatch(setSubmitState(false));
2023-02-06 21:17:46 -05:00
};
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(payload));
dispatch(setError(true));
return;
};
2023-02-06 21:17:46 -05:00
console.log('User Input:', payload);
handleSubmit({ text: payload, messageHandler, convo, convoHandler, errorHandler });
2023-02-05 15:29:35 -05:00
};
const handleKeyDown = (e) => {
if (e.key === 'Enter' && !e.shiftKey) {
e.preventDefault();
}
};
const handleKeyUp = (e) => {
2023-02-04 20:48:33 -05:00
if (e.key === 'Enter' && e.shiftKey) {
console.log('Enter + Shift');
}
if (e.key === 'Enter' && !e.shiftKey) {
if (!!isSubmitting) {
return;
}
2023-02-06 21:17:46 -05:00
submitMessage();
2023-02-04 20:48:33 -05:00
}
};
const changeHandler = (e) => {
const { value } = e.target;
if (isSubmitting && (value === '' || value === '\n')) {
return;
}
dispatch(setText(value));
};
const tryAgain = (e) => {
e.preventDefault();
dispatch(setError(false));
};
2023-02-04 20:48:33 -05:00
return (
<div className="md:bg-vert-light-gradient dark:md:bg-vert-dark-gradient absolute bottom-0 left-0 w-full border-t bg-white dark:border-white/20 dark:bg-gray-800 md:border-t-0 md:border-transparent md:!bg-transparent md:dark:border-transparent">
2023-02-06 13:27:28 -05:00
<form className="stretch mx-2 flex flex-row gap-3 pt-2 last:mb-2 md:last:mb-6 lg:mx-auto lg:max-w-3xl lg:pt-6">
<div className="relative flex h-full flex-1 md:flex-col">
<div className="ml-1 mt-1.5 flex justify-center gap-0 md:m-auto md:mb-2 md:w-full md:gap-2" />
{!!error ? (
<Regenerate
submitMessage={submitMessage}
tryAgain={tryAgain}
errorMessage={errorMessage}
/>
) : (
<div className="relative flex w-full flex-grow flex-col rounded-md border border-black/10 bg-white py-2 shadow-[0_0_10px_rgba(0,0,0,0.10)] dark:border-gray-900/50 dark:bg-gray-700 dark:text-white dark:shadow-[0_0_15px_rgba(0,0,0,0.10)] md:py-3 md:pl-4">
<ModelMenu />
<TextareaAutosize
tabIndex="0"
// style={{maxHeight: '200px', height: '24px', overflowY: 'hidden'}}
rows="1"
value={text}
onKeyUp={handleKeyUp}
onKeyDown={handleKeyDown}
onChange={changeHandler}
placeholder=""
2023-02-13 18:02:29 -05:00
className="m-0 h-auto max-h-52 resize-none overflow-auto border-0 bg-transparent p-0 pl-9 pr-7 leading-6 focus:outline-none focus:ring-0 focus-visible:ring-0 dark:bg-transparent md:pl-8"
/>
<SubmitButton submitMessage={submitMessage} />
</div>
)}
2023-02-06 13:27:28 -05:00
</div>
</form>
2023-02-11 12:54:02 -05:00
<Footer />
2023-02-06 13:27:28 -05:00
</div>
2023-02-04 20:48:33 -05:00
);
}