| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- import { MessageType, SharedFrom } from '@/constants/chat';
- import { useCreateNextSharedConversation } from '@/hooks/chat-hooks';
- import {
- useSelectDerivedMessages,
- useSendMessageWithSse,
- } from '@/hooks/logic-hooks';
- import { Message } from '@/interfaces/database/chat';
- import { message } from 'antd';
- import { get } from 'lodash';
- 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';
-
- const isCompletionError = (res: any) =>
- res && (res?.response.status !== 200 || res?.data?.code !== 0);
-
- export const useSendButtonDisabled = (value: string) => {
- return trim(value) === '';
- };
-
- export const useGetSharedChatSearchParams = () => {
- const [searchParams] = useSearchParams();
- const data_prefix = 'data_';
- const data = Object.fromEntries(
- searchParams
- .entries()
- .filter(([key, value]) => key.startsWith(data_prefix))
- .map(([key, value]) => [key.replace(data_prefix, ''), value]),
- );
- return {
- from: searchParams.get('from') as SharedFrom,
- sharedId: searchParams.get('shared_id'),
- locale: searchParams.get('locale'),
- data: data,
- visibleAvatar: searchParams.get('visible_avatar')
- ? searchParams.get('visible_avatar') !== '1'
- : true,
- };
- };
-
- export const useSendSharedMessage = () => {
- const {
- from,
- sharedId: conversationId,
- data: data,
- } = useGetSharedChatSearchParams();
- const { createSharedConversation: setConversation } =
- useCreateNextSharedConversation();
- const { handleInputChange, value, setValue } = useHandleMessageInputChange();
- const { send, answer, done } = useSendMessageWithSse(
- `/ss-ragflow-api/api/v1/${from === SharedFrom.Agent ? 'agentbots' : 'chatbots'}/${conversationId}/completions`,
- );
- const {
- derivedMessages,
- ref,
- removeLatestMessage,
- addNewestAnswer,
- addNewestQuestion,
- } = useSelectDerivedMessages();
- const [hasError, setHasError] = useState(false);
-
- const sendMessage = useCallback(
- async (message: Message, id?: string) => {
- const res = await send({
- conversation_id: id ?? conversationId,
- quote: true,
- question: message.content,
- session_id: get(derivedMessages, '0.session_id'),
- });
-
- if (isCompletionError(res)) {
- // cancel loading
- setValue(message.content);
- removeLatestMessage();
- }
- },
- [send, conversationId, derivedMessages, setValue, removeLatestMessage],
- );
-
- const handleSendMessage = useCallback(
- async (message: Message) => {
- if (conversationId !== '') {
- sendMessage(message);
- } else {
- const data = await setConversation('user id');
- if (data.code === 0) {
- const id = data.data.id;
- sendMessage(message, id);
- }
- }
- },
- [conversationId, setConversation, sendMessage],
- );
-
- const fetchSessionId = useCallback(async () => {
- const payload = { question: '' };
- const ret = await send({ ...payload, ...data });
- if (isCompletionError(ret)) {
- message.error(ret?.data.message);
- setHasError(true);
- }
- }, [send]);
-
- useEffect(() => {
- fetchSessionId();
- }, [fetchSessionId, send]);
-
- 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: false,
- derivedMessages,
- hasError,
- };
- };
|