2024-08-21 18:18:45 -04:00
|
|
|
import throttle from 'lodash/throttle';
|
2024-06-25 03:02:38 -04:00
|
|
|
import { useRecoilValue } from 'recoil';
|
2024-07-20 01:51:59 -04:00
|
|
|
import { Constants } from 'librechat-data-provider';
|
2024-06-25 03:02:38 -04:00
|
|
|
import { useEffect, useRef, useCallback, useMemo, useState } from 'react';
|
|
|
|
|
import type { TMessage } from 'librechat-data-provider';
|
2025-10-10 11:22:16 +03:00
|
|
|
import { getTextKey, TEXT_KEY_DIVIDER, logger } from '~/utils';
|
2025-09-17 13:07:56 -04:00
|
|
|
import { useMessagesViewContext } from '~/Providers';
|
2024-06-25 03:02:38 -04:00
|
|
|
import store from '~/store';
|
|
|
|
|
|
|
|
|
|
export default function useMessageProcess({ message }: { message?: TMessage | null }) {
|
|
|
|
|
const latestText = useRef<string | number>('');
|
|
|
|
|
const [siblingMessage, setSiblingMessage] = useState<TMessage | null>(null);
|
2024-08-21 18:18:45 -04:00
|
|
|
const hasNoChildren = useMemo(() => (message?.children?.length ?? 0) === 0, [message]);
|
2024-06-25 03:02:38 -04:00
|
|
|
|
|
|
|
|
const {
|
|
|
|
|
index,
|
|
|
|
|
conversation,
|
|
|
|
|
latestMessage,
|
|
|
|
|
setAbortScroll,
|
|
|
|
|
setLatestMessage,
|
2025-09-17 13:07:56 -04:00
|
|
|
isSubmittingFamily,
|
|
|
|
|
} = useMessagesViewContext();
|
2024-06-25 03:02:38 -04:00
|
|
|
const latestMultiMessage = useRecoilValue(store.latestMessageFamily(index + 1));
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
2024-07-20 01:51:59 -04:00
|
|
|
const convoId = conversation?.conversationId;
|
|
|
|
|
if (convoId === Constants.NEW_CONVO) {
|
2024-06-25 03:02:38 -04:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!message) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!hasNoChildren) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-20 01:51:59 -04:00
|
|
|
const textKey = getTextKey(message, convoId);
|
2024-06-25 03:02:38 -04:00
|
|
|
|
2024-07-20 01:51:59 -04:00
|
|
|
// Check for text/conversation change
|
|
|
|
|
const logInfo = {
|
|
|
|
|
textKey,
|
|
|
|
|
'latestText.current': latestText.current,
|
2024-08-21 18:18:45 -04:00
|
|
|
messageId: message.messageId,
|
2024-07-20 01:51:59 -04:00
|
|
|
convoId,
|
|
|
|
|
};
|
2025-10-10 11:22:16 +03:00
|
|
|
|
|
|
|
|
/* Extracted convoId from previous textKey (format: messageId|||length|||lastChars|||convoId) */
|
|
|
|
|
let previousConvoId: string | null = null;
|
|
|
|
|
if (
|
|
|
|
|
latestText.current &&
|
|
|
|
|
typeof latestText.current === 'string' &&
|
|
|
|
|
latestText.current.length > 0
|
|
|
|
|
) {
|
|
|
|
|
const parts = latestText.current.split(TEXT_KEY_DIVIDER);
|
|
|
|
|
previousConvoId = parts[parts.length - 1] || null;
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-20 01:51:59 -04:00
|
|
|
if (
|
|
|
|
|
textKey !== latestText.current ||
|
2025-10-10 11:22:16 +03:00
|
|
|
(convoId != null && previousConvoId != null && convoId !== previousConvoId)
|
2024-07-20 01:51:59 -04:00
|
|
|
) {
|
2025-01-09 15:40:10 -05:00
|
|
|
logger.log('latest_message', '[useMessageProcess] Setting latest message; logInfo:', logInfo);
|
2024-07-20 01:51:59 -04:00
|
|
|
latestText.current = textKey;
|
|
|
|
|
setLatestMessage({ ...message });
|
|
|
|
|
} else {
|
2025-01-09 15:40:10 -05:00
|
|
|
logger.log('latest_message', 'No change in latest message; logInfo', logInfo);
|
2024-06-25 03:02:38 -04:00
|
|
|
}
|
|
|
|
|
}, [hasNoChildren, message, setLatestMessage, conversation?.conversationId]);
|
|
|
|
|
|
2024-08-21 18:18:45 -04:00
|
|
|
const handleScroll = useCallback(
|
|
|
|
|
(event: unknown | TouchEvent | WheelEvent) => {
|
|
|
|
|
throttle(() => {
|
|
|
|
|
logger.log(
|
|
|
|
|
'message_scrolling',
|
|
|
|
|
`useMessageProcess: setting abort scroll to ${isSubmittingFamily}, handleScroll event`,
|
|
|
|
|
event,
|
|
|
|
|
);
|
|
|
|
|
if (isSubmittingFamily) {
|
|
|
|
|
setAbortScroll(true);
|
|
|
|
|
} else {
|
|
|
|
|
setAbortScroll(false);
|
|
|
|
|
}
|
|
|
|
|
}, 500)();
|
|
|
|
|
},
|
|
|
|
|
[isSubmittingFamily, setAbortScroll],
|
|
|
|
|
);
|
2024-06-25 03:02:38 -04:00
|
|
|
|
|
|
|
|
const showSibling = useMemo(
|
|
|
|
|
() =>
|
2024-08-21 18:18:45 -04:00
|
|
|
(hasNoChildren && latestMultiMessage && (latestMultiMessage.children?.length ?? 0) === 0) ||
|
|
|
|
|
!!siblingMessage,
|
2024-06-25 03:02:38 -04:00
|
|
|
[hasNoChildren, latestMultiMessage, siblingMessage],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (
|
|
|
|
|
hasNoChildren &&
|
|
|
|
|
latestMultiMessage &&
|
|
|
|
|
latestMultiMessage.conversationId === message?.conversationId
|
|
|
|
|
) {
|
|
|
|
|
const newSibling = Object.assign({}, latestMultiMessage, {
|
2024-08-21 18:18:45 -04:00
|
|
|
parentMessageId: message.parentMessageId,
|
|
|
|
|
depth: message.depth,
|
2024-06-25 03:02:38 -04:00
|
|
|
});
|
|
|
|
|
setSiblingMessage(newSibling);
|
|
|
|
|
}
|
|
|
|
|
}, [hasNoChildren, latestMultiMessage, message, setSiblingMessage, latestMessage]);
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
showSibling,
|
|
|
|
|
handleScroll,
|
|
|
|
|
conversation,
|
|
|
|
|
siblingMessage,
|
|
|
|
|
setSiblingMessage,
|
|
|
|
|
isSubmittingFamily,
|
|
|
|
|
latestMultiMessage,
|
|
|
|
|
};
|
|
|
|
|
}
|