2023-03-28 20:36:21 +08:00
|
|
|
// import resetConvo from './resetConvo';
|
|
|
|
|
// import { useSelector, useDispatch } from 'react-redux';
|
|
|
|
|
// import { setNewConvo } from '~/store/convoSlice';
|
|
|
|
|
// import { setMessages } from '~/store/messageSlice';
|
|
|
|
|
// import { setSubmitState, setSubmission } from '~/store/submitSlice';
|
|
|
|
|
// import { setText } from '~/store/textSlice';
|
|
|
|
|
// import { setError } from '~/store/convoSlice';
|
|
|
|
|
import { v4 } from 'uuid';
|
|
|
|
|
import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil';
|
|
|
|
|
|
|
|
|
|
import store from '~/store';
|
2023-03-17 01:49:09 +08:00
|
|
|
|
|
|
|
|
const useMessageHandler = () => {
|
2023-03-28 20:36:21 +08:00
|
|
|
// const dispatch = useDispatch();
|
|
|
|
|
// const convo = useSelector((state) => state.convo);
|
|
|
|
|
// const { initial } = useSelector((state) => state.models);
|
|
|
|
|
// const { messages } = useSelector((state) => state.messages);
|
|
|
|
|
// const { model, chatGptLabel, promptPrefix, isSubmitting } = useSelector((state) => state.submit);
|
|
|
|
|
// const { latestMessage, error } = convo;
|
|
|
|
|
|
|
|
|
|
const [currentConversation, setCurrentConversation] = useRecoilState(store.conversation) || {};
|
|
|
|
|
const setSubmission = useSetRecoilState(store.submission);
|
|
|
|
|
const isSubmitting = useRecoilValue(store.isSubmitting);
|
|
|
|
|
|
|
|
|
|
const latestMessage = useRecoilValue(store.latestMessage);
|
|
|
|
|
const { error } = currentConversation;
|
|
|
|
|
|
|
|
|
|
const [messages, setMessages] = useRecoilState(store.messages);
|
|
|
|
|
|
|
|
|
|
const ask = (
|
|
|
|
|
{ text, parentMessageId = null, conversationId = null, messageId = null },
|
|
|
|
|
{ isRegenerate = false } = {}
|
|
|
|
|
) => {
|
2023-03-17 01:49:09 +08:00
|
|
|
if (!!isSubmitting || text === '') {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2023-03-28 20:36:21 +08:00
|
|
|
|
|
|
|
|
// determine the model to be used
|
|
|
|
|
const { model = null, chatGptLabel = null, promptPrefix = null } = currentConversation;
|
|
|
|
|
|
|
|
|
|
// construct the query message
|
2023-03-17 01:49:09 +08:00
|
|
|
// this is not a real messageId, it is used as placeholder before real messageId returned
|
|
|
|
|
text = text.trim();
|
2023-03-20 01:51:07 -04:00
|
|
|
const fakeMessageId = v4();
|
2023-03-28 20:36:21 +08:00
|
|
|
// const isCustomModel = model === 'chatgptCustom' || !initial[model];
|
|
|
|
|
// const sender = model === 'chatgptCustom' ? chatGptLabel : model;
|
2023-03-17 01:49:09 +08:00
|
|
|
parentMessageId = parentMessageId || latestMessage?.messageId || '00000000-0000-0000-0000-000000000000';
|
|
|
|
|
let currentMessages = messages;
|
2023-03-28 20:36:21 +08:00
|
|
|
conversationId = conversationId || currentConversation?.conversationId;
|
|
|
|
|
if (conversationId == 'search') {
|
|
|
|
|
console.error('cannot send any message under search view!');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (conversationId == 'new') {
|
2023-03-17 01:49:09 +08:00
|
|
|
parentMessageId = '00000000-0000-0000-0000-000000000000';
|
|
|
|
|
currentMessages = [];
|
2023-03-28 20:36:21 +08:00
|
|
|
conversationId = null;
|
2023-03-17 01:49:09 +08:00
|
|
|
}
|
2023-03-28 20:36:21 +08:00
|
|
|
const currentMsg = {
|
|
|
|
|
sender: 'User',
|
|
|
|
|
text,
|
|
|
|
|
current: true,
|
|
|
|
|
isCreatedByUser: true,
|
|
|
|
|
parentMessageId,
|
|
|
|
|
conversationId,
|
|
|
|
|
messageId: fakeMessageId
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// construct the placeholder response message
|
|
|
|
|
const initialResponse = {
|
|
|
|
|
sender: chatGptLabel || model,
|
2023-03-28 15:32:22 -04:00
|
|
|
text: '<span className="result-streaming">█</span>',
|
2023-03-28 20:36:21 +08:00
|
|
|
parentMessageId: isRegenerate ? messageId : fakeMessageId,
|
|
|
|
|
messageId: (isRegenerate ? messageId : fakeMessageId) + '_',
|
|
|
|
|
conversationId,
|
|
|
|
|
submitting: true
|
|
|
|
|
};
|
2023-03-17 01:49:09 +08:00
|
|
|
|
|
|
|
|
const submission = {
|
2023-03-28 20:36:21 +08:00
|
|
|
conversation: {
|
|
|
|
|
...currentConversation,
|
|
|
|
|
conversationId,
|
|
|
|
|
model,
|
|
|
|
|
chatGptLabel,
|
|
|
|
|
promptPrefix
|
|
|
|
|
},
|
|
|
|
|
message: {
|
2023-03-17 01:49:09 +08:00
|
|
|
...currentMsg,
|
|
|
|
|
model,
|
|
|
|
|
chatGptLabel,
|
|
|
|
|
promptPrefix,
|
2023-03-28 20:36:21 +08:00
|
|
|
overrideParentMessageId: isRegenerate ? messageId : null
|
2023-03-17 01:49:09 +08:00
|
|
|
},
|
|
|
|
|
messages: currentMessages,
|
|
|
|
|
isRegenerate,
|
2023-03-28 20:36:21 +08:00
|
|
|
initialResponse
|
2023-03-17 01:49:09 +08:00
|
|
|
};
|
2023-03-18 01:00:38 +08:00
|
|
|
|
2023-03-17 01:49:09 +08:00
|
|
|
console.log('User Input:', text);
|
2023-03-18 01:00:38 +08:00
|
|
|
|
|
|
|
|
if (isRegenerate) {
|
2023-03-28 20:36:21 +08:00
|
|
|
setMessages([...currentMessages, initialResponse]);
|
2023-03-18 01:00:38 +08:00
|
|
|
} else {
|
2023-03-28 20:36:21 +08:00
|
|
|
setMessages([...currentMessages, currentMsg, initialResponse]);
|
2023-03-18 01:00:38 +08:00
|
|
|
}
|
2023-03-28 20:36:21 +08:00
|
|
|
setSubmission(submission);
|
|
|
|
|
};
|
2023-03-17 01:49:09 +08:00
|
|
|
|
|
|
|
|
const regenerate = ({ parentMessageId }) => {
|
|
|
|
|
const parentMessage = messages?.find(element => element.messageId == parentMessageId);
|
|
|
|
|
|
2023-03-28 20:36:21 +08:00
|
|
|
if (parentMessage && parentMessage.isCreatedByUser) ask({ ...parentMessage }, { isRegenerate: true });
|
|
|
|
|
else console.error('Failed to regenerate the message: parentMessage not found or not created by user.');
|
|
|
|
|
};
|
2023-03-17 01:49:09 +08:00
|
|
|
|
2023-03-17 03:13:42 +08:00
|
|
|
const stopGenerating = () => {
|
2023-03-28 20:36:21 +08:00
|
|
|
setSubmission(null);
|
|
|
|
|
};
|
2023-03-17 01:49:09 +08:00
|
|
|
|
2023-03-28 20:36:21 +08:00
|
|
|
return { ask, regenerate, stopGenerating };
|
|
|
|
|
};
|
2023-03-17 01:49:09 +08:00
|
|
|
|
|
|
|
|
export { useMessageHandler };
|