File size: 2,352 Bytes
f0743f4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | 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)),
[],
);
// return an object or an array based on branches and recursive option
// messageId is used to get siblindIdx from recoil snapshot
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;
}
|