File size: 2,632 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 80 81 82 83 84 85 86 87 88 89 | import { useRecoilValue } from 'recoil';
import { useEffect, useRef, useCallback, useMemo, useState } from 'react';
import type { TMessage } from 'librechat-data-provider';
import { useChatContext, useAddedChatContext } from '~/Providers';
import { getLatestText, getLengthAndFirstFiveChars } from '~/utils';
import store from '~/store';
export default function useMessageProcess({ message }: { message?: TMessage | null }) {
const latestText = useRef<string | number>('');
const hasNoChildren = useMemo(() => !message?.children?.length, [message]);
const [siblingMessage, setSiblingMessage] = useState<TMessage | null>(null);
const {
index,
conversation,
latestMessage,
setAbortScroll,
setLatestMessage,
isSubmitting: isSubmittingRoot,
} = useChatContext();
const { isSubmitting: isSubmittingAdditional } = useAddedChatContext();
const latestMultiMessage = useRecoilValue(store.latestMessageFamily(index + 1));
const isSubmittingFamily = useMemo(
() => isSubmittingRoot || isSubmittingAdditional,
[isSubmittingRoot, isSubmittingAdditional],
);
useEffect(() => {
if (conversation?.conversationId === 'new') {
return;
}
if (!message) {
return;
}
if (!hasNoChildren) {
return;
}
const text = getLatestText(message);
const textKey = `${message?.messageId ?? ''}${getLengthAndFirstFiveChars(text)}`;
if (textKey === latestText.current) {
return;
}
latestText.current = textKey;
setLatestMessage({ ...message });
}, [hasNoChildren, message, setLatestMessage, conversation?.conversationId]);
const handleScroll = useCallback(() => {
if (isSubmittingFamily) {
setAbortScroll(true);
} else {
setAbortScroll(false);
}
}, [isSubmittingFamily, setAbortScroll]);
const showSibling = useMemo(
() =>
(hasNoChildren && latestMultiMessage && !latestMultiMessage?.children?.length) ||
siblingMessage,
[hasNoChildren, latestMultiMessage, siblingMessage],
);
useEffect(() => {
if (
hasNoChildren &&
latestMultiMessage &&
latestMultiMessage.conversationId === message?.conversationId
) {
const newSibling = Object.assign({}, latestMultiMessage, {
parentMessageId: message?.parentMessageId,
depth: message?.depth,
});
setSiblingMessage(newSibling);
}
}, [hasNoChildren, latestMultiMessage, message, setSiblingMessage, latestMessage]);
return {
showSibling,
handleScroll,
conversation,
siblingMessage,
setSiblingMessage,
isSubmittingFamily,
latestMultiMessage,
};
}
|