| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- 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?.code !== 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.code === 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'),
- };
- };
|