@plteam/chat-ui
Version:
CUI Kit is a free and open-source library for creating AI assistant chat interfaces, built with React, Material UI, and TypeScript
63 lines (62 loc) • 3.17 kB
JavaScript
import * as React from 'react';
import { getThreadListeners } from '../utils/getThreadListeners';
import { useConversationBlockHeightCallback } from './useConversationBlockHeightCallback';
import { ChatMessageOwner } from '../../models';
import { arrayLast } from '../../utils/arrayUtils/arrayLast';
export const useThreadApiInitialization = (thread, apiManager, onMessageSend, onEditMessage, getConversationBlockHeightMin, contentRef) => {
const getConversationBlockHeight = useConversationBlockHeightCallback(contentRef, getConversationBlockHeightMin);
React.useMemo(() => {
apiManager.setMethod('sendUserMessage', onMessageSend);
apiManager.setPrivateMethod('onEditMessage', onEditMessage);
}, [onMessageSend]);
React.useMemo(() => {
if (!thread)
return;
const messages = thread.messages;
// Locate a message by id (current branch first, then all messages so that
// statuses can target messages from inactive branches), or the last message
// of the current branch when no id is given.
const findMessage = (messageId) => {
const currentMessages = messages.currentMessages.value;
if (messageId) {
return currentMessages.find((m) => m.id === messageId)
?? messages.allMessages.value.find((m) => m.id === messageId);
}
return arrayLast(currentMessages);
};
const setMessageText = (text, messageId) => {
const message = findMessage(messageId);
if (message?.texts?.value?.length) {
message.text = text;
}
};
const setMessageStatus = (status, isTyping, messageId) => {
const message = findMessage(messageId);
if (!message)
return;
message.status.value = status;
if (isTyping !== undefined) {
message.typing.value = isTyping;
thread.isTyping.value = isTyping;
}
// Clearing a restored waiting-status: drop the persisted initialStatus so it
// does not "resurrect" on the next load via getAllMessages().
if (!status && isTyping === false && message.data.role === ChatMessageOwner.ASSISTANT) {
message.data.initialStatus = undefined;
}
};
apiManager.setMethods({
getAllMessages: () => messages.allMessages.value.map(v => v.data),
getBranchMessages: () => messages.currentMessages.value.map(v => v.data),
handleChangeBranch: messages.handleChangeBranch,
setMessageText,
setMessageStatus,
});
apiManager.setPrivateMethod('allMessages', messages.allMessages);
apiManager.setPrivateMethod('branch', messages.currentMessages);
apiManager.setPrivateMethod('getListener', getThreadListeners(thread));
}, [thread]);
React.useMemo(() => {
apiManager.setPrivateMethod('getConversationBlockHeight', getConversationBlockHeight);
}, [getConversationBlockHeight]);
};