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 ? (
) :
edit ? (
{/*
*/}
{text}
) : (
{/*
*/}
{!isCreatedByUser ? wrapText(text) : text}
{blinker && █}
)}
enterEdit()}/>
);
}