mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-02-16 07:28:09 +01:00
84 lines
1.8 KiB
TypeScript
84 lines
1.8 KiB
TypeScript
|
|
import { useEffect } from 'react';
|
||
|
|
import copy from 'copy-to-clipboard';
|
||
|
|
import type { TMessage } from 'librechat-data-provider';
|
||
|
|
import type { TMessageProps } from '~/common';
|
||
|
|
import Icon from '~/components/Endpoints/Icon';
|
||
|
|
import { useChatContext } from '~/Providers';
|
||
|
|
|
||
|
|
export default function useMessageHelpers(props: TMessageProps) {
|
||
|
|
const { message, currentEditId, setCurrentEditId } = props;
|
||
|
|
|
||
|
|
const {
|
||
|
|
ask,
|
||
|
|
regenerate,
|
||
|
|
isSubmitting,
|
||
|
|
conversation,
|
||
|
|
latestMessage,
|
||
|
|
setAbortScroll,
|
||
|
|
handleContinue,
|
||
|
|
setLatestMessage,
|
||
|
|
} = useChatContext();
|
||
|
|
|
||
|
|
const { text, children, messageId = null, isCreatedByUser } = message ?? {};
|
||
|
|
const edit = messageId === currentEditId;
|
||
|
|
const isLast = !children?.length;
|
||
|
|
|
||
|
|
useEffect(() => {
|
||
|
|
if (!message) {
|
||
|
|
return;
|
||
|
|
} else if (isLast) {
|
||
|
|
setLatestMessage({ ...message });
|
||
|
|
}
|
||
|
|
}, [isLast, message, setLatestMessage]);
|
||
|
|
|
||
|
|
const enterEdit = (cancel?: boolean) =>
|
||
|
|
setCurrentEditId && setCurrentEditId(cancel ? -1 : messageId);
|
||
|
|
|
||
|
|
const handleScroll = () => {
|
||
|
|
if (isSubmitting) {
|
||
|
|
setAbortScroll(true);
|
||
|
|
} else {
|
||
|
|
setAbortScroll(false);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
const icon = Icon({
|
||
|
|
...conversation,
|
||
|
|
...(message as TMessage),
|
||
|
|
model: message?.model ?? conversation?.model,
|
||
|
|
size: 28.8,
|
||
|
|
});
|
||
|
|
|
||
|
|
const regenerateMessage = () => {
|
||
|
|
if ((isSubmitting && isCreatedByUser) || !message) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
regenerate(message);
|
||
|
|
};
|
||
|
|
|
||
|
|
const copyToClipboard = (setIsCopied: React.Dispatch<React.SetStateAction<boolean>>) => {
|
||
|
|
setIsCopied(true);
|
||
|
|
copy(text ?? '');
|
||
|
|
|
||
|
|
setTimeout(() => {
|
||
|
|
setIsCopied(false);
|
||
|
|
}, 3000);
|
||
|
|
};
|
||
|
|
|
||
|
|
return {
|
||
|
|
ask,
|
||
|
|
icon,
|
||
|
|
edit,
|
||
|
|
isLast,
|
||
|
|
enterEdit,
|
||
|
|
conversation,
|
||
|
|
isSubmitting,
|
||
|
|
handleScroll,
|
||
|
|
latestMessage,
|
||
|
|
handleContinue,
|
||
|
|
copyToClipboard,
|
||
|
|
regenerateMessage,
|
||
|
|
};
|
||
|
|
}
|