Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Fixed an issue where the first message would be displayed when sending the second message #2625 #2626

Merged
merged 7 commits into from
Sep 27, 2024
Next Next commit
fix: Fixed the chat message confusion issue
  • Loading branch information
cike8899 committed Sep 25, 2024
commit 436585a533538d6d0978faa17038e076cbe11278
2 changes: 1 addition & 1 deletion web/.umirc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export default defineConfig({
copy: ['src/conf.json'],
proxy: {
'/v1': {
target: 'http://127.0.0.1:9456/',
target: 'http://127.0.0.1:9380/',
changeOrigin: true,
ws: true,
logger: console,
Expand Down
1 change: 1 addition & 0 deletions web/src/constants/chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export enum SharedFrom {
export enum ChatSearchParams {
DialogId = 'dialogId',
ConversationId = 'conversationId',
isNew = 'isNew',
}

export const EmptyConversationId = 'empty';
28 changes: 15 additions & 13 deletions web/src/hooks/chat-hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,11 @@ import {
import i18n from '@/locales/config';
import { IClientConversation } from '@/pages/chat/interface';
import chatService from '@/services/chat-service';
import { buildMessageListWithUuid, isConversationIdExist } from '@/utils/chat';
import {
buildMessageListWithUuid,
getConversationId,
isConversationIdExist,
} from '@/utils/chat';
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { message } from 'antd';
import dayjs, { Dayjs } from 'dayjs';
Expand Down Expand Up @@ -51,6 +55,7 @@ export const useGetChatSearchParams = () => {
dialogId: currentQueryParameters.get(ChatSearchParams.DialogId) || '',
conversationId:
currentQueryParameters.get(ChatSearchParams.ConversationId) || '',
isNew: currentQueryParameters.get(ChatSearchParams.isNew) || '',
};
};

Expand Down Expand Up @@ -202,7 +207,7 @@ export const useFetchNextConversationList = () => {
};

export const useFetchNextConversation = () => {
const { conversationId } = useGetChatSearchParams();
const { isNew, conversationId } = useGetChatSearchParams();
const {
data,
isFetching: loading,
Expand All @@ -214,17 +219,9 @@ export const useFetchNextConversation = () => {
gcTime: 0,
refetchOnWindowFocus: false,
queryFn: async () => {
if (isConversationIdExist(conversationId)) {
if (isNew !== 'true' && isConversationIdExist(conversationId)) {
const { data } = await chatService.getConversation({ conversationId });
// if (data.retcode === 0 && needToBeSaved) {
// yield put({
// type: 'kFModel/fetch_document_thumbnails',
// payload: {
// doc_ids: getDocumentIdsFromConversionReference(data.data),
// },
// });
// yield put({ type: 'setCurrentConversation', payload: data.data });
// }

const conversation = data?.data ?? {};

const messageList = buildMessageListWithUuid(conversation?.message);
Expand Down Expand Up @@ -265,7 +262,12 @@ export const useUpdateNextConversation = () => {
} = useMutation({
mutationKey: ['updateConversation'],
mutationFn: async (params: Record<string, any>) => {
const { data } = await chatService.setConversation(params);
const { data } = await chatService.setConversation({
...params,
conversation_id: params.conversation_id
? params.conversation_id
: getConversationId(),
});
if (data.retcode === 0) {
queryClient.invalidateQueries({ queryKey: ['fetchConversationList'] });
}
Expand Down
5 changes: 0 additions & 5 deletions web/src/pages/chat/constants.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1 @@
export enum ChatSearchParams {
DialogId = 'dialogId',
ConversationId = 'conversationId',
}

export const EmptyConversationId = 'empty';
166 changes: 103 additions & 63 deletions web/src/pages/chat/hooks.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { MessageType } from '@/constants/chat';
import { ChatSearchParams, MessageType } from '@/constants/chat';
import { fileIconMap } from '@/constants/common';
import {
useFetchManualConversation,
Expand All @@ -24,6 +24,7 @@ import {
} from '@/hooks/logic-hooks';
import { IConversation, IDialog, Message } from '@/interfaces/database/chat';
import { getFileExtension } from '@/utils';
import { getConversationId } from '@/utils/chat';
import { useMutationState } from '@tanstack/react-query';
import { get } from 'lodash';
import trim from 'lodash/trim';
Expand All @@ -32,18 +33,75 @@ import {
useCallback,
useEffect,
useMemo,
useRef,
useState,
} from 'react';
import { useSearchParams } from 'umi';
import { v4 as uuid } from 'uuid';
import { ChatSearchParams } from './constants';
import {
IClientConversation,
IMessage,
VariableTableDataType,
} from './interface';

export const useClickConversationCard = () => {
const [currentQueryParameters, setSearchParams] = useSearchParams();
const newQueryParameters: URLSearchParams = useMemo(
() => new URLSearchParams(currentQueryParameters.toString()),
[currentQueryParameters],
);

const handleClickConversation = useCallback(
(conversationId: string) => {
newQueryParameters.set(ChatSearchParams.ConversationId, conversationId);
setSearchParams(newQueryParameters);
},
[newQueryParameters, setSearchParams],
);

return { handleClickConversation };
};

export const useSetChatRouteParams = () => {
const [currentQueryParameters, setSearchParams] = useSearchParams();
const newQueryParameters: URLSearchParams = useMemo(
() => new URLSearchParams(currentQueryParameters.toString()),
[currentQueryParameters],
);

const setConversationIsNew = useCallback(
(value: string) => {
newQueryParameters.set(ChatSearchParams.isNew, value);
setSearchParams(newQueryParameters);
},
[newQueryParameters, setSearchParams],
);

const getConversationIsNew = useCallback(() => {
return newQueryParameters.get(ChatSearchParams.isNew);
}, [newQueryParameters]);

return { setConversationIsNew, getConversationIsNew };
};

export const useSetNewConversationRouteParams = () => {
const [currentQueryParameters, setSearchParams] = useSearchParams();
const newQueryParameters: URLSearchParams = useMemo(
() => new URLSearchParams(currentQueryParameters.toString()),
[currentQueryParameters],
);

const setNewConversationRouteParams = useCallback(
(conversationId: string, isNew: string) => {
newQueryParameters.set(ChatSearchParams.ConversationId, conversationId);
newQueryParameters.set(ChatSearchParams.isNew, isNew);
setSearchParams(newQueryParameters);
},
[newQueryParameters, setSearchParams],
);

return { setNewConversationRouteParams };
};

export const useSelectCurrentDialog = () => {
const data = useMutationState({
filters: { mutationKey: ['fetchDialog'] },
Expand Down Expand Up @@ -169,13 +227,16 @@ export const useSelectDerivedConversationList = () => {
const { data: conversationList, loading } = useFetchNextConversationList();
const { dialogId } = useGetChatSearchParams();
const prologue = currentDialog?.prompt_config?.prologue ?? '';
const { setNewConversationRouteParams } = useSetNewConversationRouteParams();

const addTemporaryConversation = useCallback(() => {
const conversationId = getConversationId();
setList((pre) => {
if (dialogId) {
setNewConversationRouteParams(conversationId, 'true');
const nextList = [
{
id: '',
id: conversationId,
name: t('newConversation'),
dialog_id: dialogId,
message: [
Expand All @@ -192,42 +253,30 @@ export const useSelectDerivedConversationList = () => {

return pre;
});
}, [conversationList, dialogId, prologue, t]);
}, [conversationList, dialogId, prologue, t, setNewConversationRouteParams]);

useEffect(() => {
addTemporaryConversation();
}, [addTemporaryConversation]);
setList([...conversationList]);
}, [conversationList]);

return { list, addTemporaryConversation, loading };
};

export const useClickConversationCard = () => {
const [currentQueryParameters, setSearchParams] = useSearchParams();
const newQueryParameters: URLSearchParams = useMemo(
() => new URLSearchParams(currentQueryParameters.toString()),
[currentQueryParameters],
);

const handleClickConversation = useCallback(
(conversationId: string) => {
newQueryParameters.set(ChatSearchParams.ConversationId, conversationId);
setSearchParams(newQueryParameters);
},
[newQueryParameters, setSearchParams],
);
// useEffect(() => {
// addTemporaryConversation();
// }, [addTemporaryConversation]);

return { handleClickConversation };
return { list, addTemporaryConversation, loading };
};

export const useSetConversation = () => {
const { dialogId } = useGetChatSearchParams();
const { updateConversation } = useUpdateNextConversation();

const setConversation = useCallback(
(message: string) => {
(message: string, isNew: boolean = false, conversationId?: string) => {
return updateConversation({
dialog_id: dialogId,
name: message,
is_new: isNew,
conversation_id: conversationId,
message: [
{
role: MessageType.Assistant,
Expand All @@ -242,22 +291,6 @@ export const useSetConversation = () => {
return { setConversation };
};

// export const useScrollToBottom = (currentConversation: IClientConversation) => {
// const ref = useRef<HTMLDivElement>(null);

// const scrollToBottom = useCallback(() => {
// if (currentConversation.id) {
// ref.current?.scrollIntoView({ behavior: 'instant' });
// }
// }, [currentConversation]);

// useEffect(() => {
// scrollToBottom();
// }, [scrollToBottom]);

// return ref;
// };

export const useSelectNextMessages = () => {
const {
ref,
Expand Down Expand Up @@ -329,7 +362,7 @@ export const useSendNextMessage = () => {
const { setConversation } = useSetConversation();
const { conversationId } = useGetChatSearchParams();
const { handleInputChange, value, setValue } = useHandleMessageInputChange();
const { handleClickConversation } = useClickConversationCard();
// const { handleClickConversation } = useClickConversationCard();
const { send, answer, done, setDone, resetAnswer } = useSendMessageWithSse();
const {
ref,
Expand All @@ -342,15 +375,17 @@ export const useSendNextMessage = () => {
removeMessagesAfterCurrentMessage,
} = useSelectNextMessages();
const { data: dialog } = useFetchNextDialog();
const currentConversationIdRef = useRef<string>('');
// const currentConversationIdRef = useRef<string>('');
const { setConversationIsNew, getConversationIsNew } =
useSetChatRouteParams();

const redirectToNewConversation = useCallback(
(isPlaying: boolean) => {
if (!conversationId && dialog?.prompt_config?.tts && !isPlaying) {
handleClickConversation(currentConversationIdRef.current);
// handleClickConversation(currentConversationIdRef.current);
}
},
[dialog, handleClickConversation, conversationId],
[dialog, conversationId],
);

const sendMessage = useCallback(
Expand All @@ -377,35 +412,33 @@ export const useSendNextMessage = () => {
if (currentConversationId) {
console.info('111');
// new conversation
if (!dialog?.prompt_config?.tts) {
handleClickConversation(currentConversationId);
}
// if (!dialog?.prompt_config?.tts) {
// handleClickConversation(currentConversationId);
// }
} else {
console.info('222');
// fetchConversation(conversationId);
}
}
},
[
dialog,
derivedMessages,
conversationId,
handleClickConversation,
removeLatestMessage,
setValue,
send,
],
[derivedMessages, conversationId, removeLatestMessage, setValue, send],
);

const handleSendMessage = useCallback(
async (message: Message) => {
if (conversationId !== '') {
const isNew = getConversationIsNew();
if (isNew !== 'true') {
sendMessage({ message });
} else {
const data = await setConversation(message.content);
const data = await setConversation(
message.content,
true,
conversationId,
);
if (data.retcode === 0) {
setConversationIsNew('');
const id = data.data.id;
currentConversationIdRef.current = id;
// currentConversationIdRef.current = id;
sendMessage({
message,
currentConversationId: id,
Expand All @@ -414,7 +447,13 @@ export const useSendNextMessage = () => {
}
}
},
[conversationId, setConversation, sendMessage],
[
setConversation,
sendMessage,
setConversationIsNew,
getConversationIsNew,
conversationId,
],
);

const { regenerateMessage } = useRegenerateMessage({
Expand Down Expand Up @@ -531,6 +570,7 @@ export const useRenameConversation = () => {
...conversation,
conversation_id: conversation.id,
name,
is_new: false,
});

if (ret.retcode === 0) {
Expand Down Expand Up @@ -579,7 +619,7 @@ export const useCreateConversationBeforeUploadDocument = () => {

const createConversationBeforeUploadDocument = useCallback(
async (message: string) => {
const data = await setConversation(message);
const data = await setConversation(message, true);
if (data.retcode === 0) {
const id = data.data.id;
handleClickConversation(id);
Expand Down
4 changes: 4 additions & 0 deletions web/src/utils/chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,7 @@ export const buildMessageListWithUuid = (messages?: Message[]) => {
})) ?? []
);
};

export const getConversationId = () => {
return uuid().replace(/-/g, '');
};