import React, { useState, useEffect, useRef } from 'react'; import TextWrapper from './TextWrapper'; import { useSelector, useDispatch } from 'react-redux'; import GPTIcon from '../svg/GPTIcon'; import BingIcon from '../svg/BingIcon'; import HoverButtons from './HoverButtons'; import Spinner from '../svg/Spinner'; import { setError } from '~/store/convoSlice'; import { setMessages } from '~/store/messageSlice'; import { setSubmitState, setSubmission } from '~/store/submitSlice'; import { setText } from '~/store/textSlice'; export default function Message({ message, messages, last = false, scrollToBottom, edit, currentEditIdx, enterEdit }) { const { isSubmitting, model, chatGptLabel, promptPrefix } = useSelector((state) => state.submit); const [abortScroll, setAbort] = useState(false); const { sender, text, isCreatedByUser, error } = message const textEditor = useRef(null) const convo = useSelector((state) => state.convo); const { initial } = useSelector((state) => state.models); const { error: convoError } = convo; const dispatch = useDispatch(); // const notUser = !isCreatedByUser; // sender.toLowerCase() !== 'user'; const blinker = isSubmitting && last && !isCreatedByUser; useEffect(() => { if (blinker && !abortScroll) { scrollToBottom(); } }, [isSubmitting, text, blinker, scrollToBottom, abortScroll]); if (sender === '') { return ; } const handleWheel = () => { if (blinker) { setAbort(true); } else { setAbort(false); } }; const props = { className: 'w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 bg-white dark:text-gray-100 group dark:bg-gray-800' }; const bgColors = { chatgpt: 'rgb(16, 163, 127)', chatgptBrowser: 'rgb(25, 207, 207)', bingai: '', sydney: '' }; const isBing = sender === 'bingai' || sender === 'sydney'; let icon = `${sender}:`; let backgroundColor = bgColors[sender]; if (!isCreatedByUser) { props.className = 'w-full border-b border-black/10 bg-gray-50 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-100 dark:bg-[#444654]'; } if ((!isCreatedByUser && backgroundColor) || isBing) { icon = (
{isBing ? : } {error && ( ! )}
); } const wrapText = (text) => ; const resubmitMessage = () => { const text = textEditor.current.innerText if (convoError) { dispatch(setError(false)); } if (!!isSubmitting || text.trim() === '') { return; } const isCustomModel = model === 'chatgptCustom' || !initial[model]; const currentMsg = { ...message, sender: 'User', text: text.trim(), current: true, isCreatedByUser: true }; console.log(model) const sender = model === 'chatgptCustom' ? chatGptLabel : model; const initialResponse = { sender, text: '' }; dispatch(setSubmitState(true)); dispatch(setMessages([...messages.slice(0, currentEditIdx), currentMsg, initialResponse])); dispatch(setText('')); const submission = { isCustomModel, message: { ...message, text: text.trim(), model, chatGptLabel, promptPrefix, }, messages: messages.slice(0, currentEditIdx), currentMsg, initialResponse, sender, }; console.log('User Input:', message); // handleSubmit(submission); dispatch(setSubmission(submission)); enterEdit(true); }; return (
{typeof icon === 'string' && icon.match(/[^\u0000-\u007F]+/) ? ( {icon} ) : ( icon )}
{error ? (
{text}
) : edit ? (
{/*
*/}
{text}
) : (
{/*
*/}
{!isCreatedByUser ? wrapText(text) : text} {blinker && }
)}
enterEdit()}/>
); }