File size: 2,159 Bytes
aa2e6af | 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: TMessage | null;
messages: TMessage[] | null;
branches?: boolean;
recursive?: boolean;
}): Promise<TMessage | TMessage[]> => {
let children: TMessage[] = [];
if (messages?.length) {
if (branches) {
for (const message of messages) {
children.push(
(await buildMessageTree({
messageId: message?.messageId,
message: message,
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,
messages: message?.children || [],
branches,
recursive,
})) as TMessage,
];
}
}
if (recursive && message) {
return { ...message, children: children };
} else {
let ret: TMessage[] = [];
if (message) {
const _message = { ...message };
delete _message.children;
ret = [_message];
}
for (const child of children) {
ret = ret.concat(child);
}
return ret;
}
};
return buildMessageTree;
}
|