| import { useRecoilCallback } from 'recoil'; |
| import type { TMessage } from 'librechat-data-provider'; |
| import store from '~/store'; |
|
|
| export default function useBuildMessageTree() { |
| const getSiblingIdx = useRecoilCallback( |
| ({ snapshot }) => |
| async (messageId: string | null | undefined) => |
| await snapshot.getPromise(store.messagesSiblingIdxFamily(messageId)), |
| [], |
| ); |
|
|
| |
| |
| const buildMessageTree = async ({ |
| messageId, |
| message, |
| messages, |
| branches = false, |
| recursive = false, |
| }: { |
| messageId: string | null | undefined; |
| message: Partial<TMessage> | null; |
| messages: Array<Partial<TMessage> | undefined> | null; |
| branches?: boolean; |
| recursive?: boolean; |
| }): Promise<TMessage | Array<Partial<TMessage> | undefined>> => { |
| let children: Array<Partial<TMessage> | undefined> = []; |
| if (messages?.length != null && messages.length > 0) { |
| if (branches) { |
| for (const message of messages) { |
| children.push( |
| (await buildMessageTree({ |
| messageId: message?.messageId, |
| message: message as TMessage, |
| messages: message?.children || [], |
| branches, |
| recursive, |
| })) as TMessage, |
| ); |
| } |
| } else { |
| let message = messages[0]; |
| if (messages.length > 1) { |
| const siblingIdx = await getSiblingIdx(messageId); |
| message = messages[messages.length - siblingIdx - 1]; |
| } |
|
|
| children = [ |
| (await buildMessageTree({ |
| messageId: message?.messageId, |
| message: message as TMessage, |
| messages: message?.children || [], |
| branches, |
| recursive, |
| })) as TMessage, |
| ]; |
| } |
| } |
|
|
| if (recursive && message) { |
| return { ...(message as TMessage), children: children as TMessage[] }; |
| } else { |
| let ret: TMessage[] = []; |
| if (message) { |
| const _message = { ...message }; |
| delete _message.children; |
| ret = [_message as TMessage]; |
| } |
| for (const child of children) { |
| ret = ret.concat(child as TMessage); |
| } |
| return ret; |
| } |
| }; |
|
|
| return buildMessageTree; |
| } |
|
|