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';
|
|
|
|
|
import { useChatContext, useAddedChatContext } from '~/Providers';
|
2024-07-20 01:51:59 -04:00
|
|
|
import { getTextKey, logger } from '~/utils';
|
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,
|
|
|
|
|
isSubmitting: isSubmittingRoot,
|
|
|
|
|
} = useChatContext();
|
|
|
|
|
const { isSubmitting: isSubmittingAdditional } = useAddedChatContext();
|
|
|
|
|
const latestMultiMessage = useRecoilValue(store.latestMessageFamily(index + 1));
|
|
|
|
|
const isSubmittingFamily = useMemo(
|
|
|
|
|
() => isSubmittingRoot || isSubmittingAdditional,
|
|
|
|
|
[isSubmittingRoot, isSubmittingAdditional],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
};
|
|
|
|
|
if (
|
|
|
|
|
textKey !== latestText.current ||
|
2024-08-21 18:18:45 -04:00
|
|
|
(convoId != null &&
|
2024-07-20 01:51:59 -04:00
|
|
|
latestText.current &&
|
|
|
|
|
convoId !== latestText.current.split(Constants.COMMON_DIVIDER)[2])
|
|
|
|
|
) {
|
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,
|
|
|
|
|
};
|
|
|
|
|
}
|