mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-08 20:42:30 +08:00
### What problem does this PR solve? feat: Select derived messages from backend #2088 ### Type of change - [x] New Feature (non-breaking change which adds functionality)
170 lines
4.3 KiB
TypeScript
170 lines
4.3 KiB
TypeScript
import { MessageType, SharedFrom } from '@/constants/chat';
|
|
import {
|
|
useCreateNextSharedConversation,
|
|
useFetchNextSharedConversation,
|
|
} from '@/hooks/chat-hooks';
|
|
import {
|
|
useSelectDerivedMessages,
|
|
useSendMessageWithSse,
|
|
} from '@/hooks/logic-hooks';
|
|
import { Message } from '@/interfaces/database/chat';
|
|
import api from '@/utils/api';
|
|
import trim from 'lodash/trim';
|
|
import { useCallback, useEffect, useState } from 'react';
|
|
import { useSearchParams } from 'umi';
|
|
import { v4 as uuid } from 'uuid';
|
|
import { useHandleMessageInputChange } from './hooks';
|
|
|
|
export const useCreateSharedConversationOnMount = () => {
|
|
const [currentQueryParameters] = useSearchParams();
|
|
const [conversationId, setConversationId] = useState('');
|
|
|
|
const { createSharedConversation: createConversation } =
|
|
useCreateNextSharedConversation();
|
|
const sharedId = currentQueryParameters.get('shared_id');
|
|
const userId = currentQueryParameters.get('user_id');
|
|
|
|
const setConversation = useCallback(async () => {
|
|
if (sharedId) {
|
|
const data = await createConversation(userId ?? undefined);
|
|
const id = data.data?.id;
|
|
if (id) {
|
|
setConversationId(id);
|
|
}
|
|
}
|
|
}, [createConversation, sharedId, userId]);
|
|
|
|
useEffect(() => {
|
|
setConversation();
|
|
}, [setConversation]);
|
|
|
|
return { conversationId };
|
|
};
|
|
|
|
export const useSelectNextSharedMessages = (conversationId: string) => {
|
|
const { data, loading } = useFetchNextSharedConversation(conversationId);
|
|
|
|
const {
|
|
derivedMessages,
|
|
ref,
|
|
setDerivedMessages,
|
|
addNewestAnswer,
|
|
addNewestQuestion,
|
|
removeLatestMessage,
|
|
} = useSelectDerivedMessages();
|
|
|
|
useEffect(() => {
|
|
setDerivedMessages(data?.data?.message);
|
|
}, [setDerivedMessages, data]);
|
|
|
|
return {
|
|
derivedMessages,
|
|
addNewestAnswer,
|
|
addNewestQuestion,
|
|
removeLatestMessage,
|
|
loading,
|
|
ref,
|
|
setDerivedMessages,
|
|
};
|
|
};
|
|
|
|
export const useSendButtonDisabled = (value: string) => {
|
|
return trim(value) === '';
|
|
};
|
|
|
|
export const useSendSharedMessage = (conversationId: string) => {
|
|
const { createSharedConversation: setConversation } =
|
|
useCreateNextSharedConversation();
|
|
const { handleInputChange, value, setValue } = useHandleMessageInputChange();
|
|
const { send, answer, done } = useSendMessageWithSse(
|
|
api.completeExternalConversation,
|
|
);
|
|
const {
|
|
derivedMessages,
|
|
ref,
|
|
removeLatestMessage,
|
|
addNewestAnswer,
|
|
addNewestQuestion,
|
|
loading,
|
|
} = useSelectNextSharedMessages(conversationId);
|
|
|
|
const sendMessage = useCallback(
|
|
async (message: Message, id?: string) => {
|
|
const res = await send({
|
|
conversation_id: id ?? conversationId,
|
|
quote: false,
|
|
messages: [...(derivedMessages ?? []), message],
|
|
});
|
|
|
|
if (res && (res?.response.status !== 200 || res?.data?.retcode !== 0)) {
|
|
// cancel loading
|
|
setValue(message.content);
|
|
removeLatestMessage();
|
|
}
|
|
},
|
|
[conversationId, derivedMessages, removeLatestMessage, setValue, send],
|
|
);
|
|
|
|
const handleSendMessage = useCallback(
|
|
async (message: Message) => {
|
|
if (conversationId !== '') {
|
|
sendMessage(message);
|
|
} else {
|
|
const data = await setConversation('user id');
|
|
if (data.retcode === 0) {
|
|
const id = data.data.id;
|
|
sendMessage(message, id);
|
|
}
|
|
}
|
|
},
|
|
[conversationId, setConversation, sendMessage],
|
|
);
|
|
|
|
useEffect(() => {
|
|
if (answer.answer) {
|
|
addNewestAnswer(answer);
|
|
}
|
|
}, [answer, addNewestAnswer]);
|
|
|
|
const handlePressEnter = useCallback(
|
|
(documentIds: string[]) => {
|
|
if (trim(value) === '') return;
|
|
const id = uuid();
|
|
if (done) {
|
|
setValue('');
|
|
addNewestQuestion({
|
|
content: value,
|
|
doc_ids: documentIds,
|
|
id,
|
|
role: MessageType.User,
|
|
});
|
|
handleSendMessage({
|
|
content: value.trim(),
|
|
id,
|
|
role: MessageType.User,
|
|
});
|
|
}
|
|
},
|
|
[addNewestQuestion, done, handleSendMessage, setValue, value],
|
|
);
|
|
|
|
return {
|
|
handlePressEnter,
|
|
handleInputChange,
|
|
value,
|
|
sendLoading: !done,
|
|
ref,
|
|
loading,
|
|
derivedMessages,
|
|
};
|
|
};
|
|
|
|
export const useGetSharedChatSearchParams = () => {
|
|
const [searchParams] = useSearchParams();
|
|
|
|
return {
|
|
from: searchParams.get('from') as SharedFrom,
|
|
sharedId: searchParams.get('shared_id'),
|
|
};
|
|
};
|