UNPKG

@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
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]); };