Feat: Users can chat directly without first creating a conversation. #11768 (#11769)

### What problem does this PR solve?

Feat: Users can chat directly without first creating a conversation.
#11768
### Type of change


- [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
balibabu
2025-12-05 17:34:41 +08:00
committed by GitHub
parent 885eb2eab9
commit ea38e12d42
20 changed files with 410 additions and 308 deletions

View File

@ -433,7 +433,7 @@ export const useSelectDerivedMessages = () => {
);
const addNewestQuestion = useCallback(
(message: Message, answer: string = '') => {
(message: IMessage, answer: string = '') => {
setDerivedMessages((pre) => {
return [
...pre,
@ -446,6 +446,7 @@ export const useSelectDerivedMessages = () => {
{
role: MessageType.Assistant,
content: answer,
conversationId: message.conversationId,
id: buildMessageUuid({ ...message, role: MessageType.Assistant }),
},
];

View File

@ -16,11 +16,11 @@ import { useGetSharedChatSearchParams } from '@/pages/next-chats/hooks/use-send-
import { isConversationIdExist } from '@/pages/next-chats/utils';
import chatService from '@/services/next-chat-service';
import api from '@/utils/api';
import { buildMessageListWithUuid, getConversationId } from '@/utils/chat';
import { buildMessageListWithUuid, generateConversationId } from '@/utils/chat';
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { useDebounce } from 'ahooks';
import { has } from 'lodash';
import { useCallback, useMemo, useRef } from 'react';
import { useCallback, useRef } from 'react';
import { useTranslation } from 'react-i18next';
import { useParams, useSearchParams } from 'umi';
import {
@ -36,6 +36,7 @@ export const enum ChatApiAction {
FetchDialog = 'fetchDialog',
FetchConversationList = 'fetchConversationList',
FetchConversation = 'fetchConversation',
FetchConversationManually = 'fetchConversationManually',
UpdateConversation = 'updateConversation',
RemoveConversation = 'removeConversation',
DeleteMessage = 'deleteMessage',
@ -59,29 +60,6 @@ export const useGetChatSearchParams = () => {
};
};
export const useClickDialogCard = () => {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const [_, setSearchParams] = useSearchParams();
const newQueryParameters: URLSearchParams = useMemo(() => {
return new URLSearchParams();
}, []);
const handleClickDialog = useCallback(
(dialogId: string) => {
newQueryParameters.set(ChatSearchParams.DialogId, dialogId);
// newQueryParameters.set(
// ChatSearchParams.ConversationId,
// EmptyConversationId,
// );
setSearchParams(newQueryParameters);
},
[newQueryParameters, setSearchParams],
);
return { handleClickDialog };
};
export const useFetchDialogList = () => {
const { searchString, handleInputChange } = useHandleSearchChange();
const { pagination, setPagination } = useGetPaginationWithRouter();
@ -222,28 +200,8 @@ export const useFetchDialog = () => {
//#region Conversation
export const useClickConversationCard = () => {
const [currentQueryParameters, setSearchParams] = useSearchParams();
const newQueryParameters: URLSearchParams = useMemo(
() => new URLSearchParams(currentQueryParameters.toString()),
[currentQueryParameters],
);
const handleClickConversation = useCallback(
(conversationId: string, isNew: string) => {
newQueryParameters.set(ChatSearchParams.ConversationId, conversationId);
newQueryParameters.set(ChatSearchParams.isNew, isNew);
setSearchParams(newQueryParameters);
},
[setSearchParams, newQueryParameters],
);
return { handleClickConversation };
};
export const useFetchConversationList = () => {
const { id } = useParams();
const { handleClickConversation } = useClickConversationCard();
const { searchString, handleInputChange } = useHandleSearchStrChange();
@ -267,13 +225,6 @@ export const useFetchConversationList = () => {
{ params: { dialog_id: id } },
true,
);
if (data.code === 0) {
if (data.data.length > 0) {
handleClickConversation(data.data[0].id, '');
} else {
handleClickConversation('', '');
}
}
return data?.data;
},
});
@ -281,45 +232,33 @@ export const useFetchConversationList = () => {
return { data, loading, refetch, searchString, handleInputChange };
};
export const useFetchConversation = () => {
const { isNew, conversationId } = useGetChatSearchParams();
const { sharedId } = useGetSharedChatSearchParams();
export function useFetchConversationManually() {
const {
data,
isFetching: loading,
refetch,
} = useQuery<IClientConversation>({
queryKey: [ChatApiAction.FetchConversation, conversationId],
initialData: {} as IClientConversation,
// enabled: isConversationIdExist(conversationId),
gcTime: 0,
refetchOnWindowFocus: false,
queryFn: async () => {
if (
isNew !== 'true' &&
isConversationIdExist(sharedId || conversationId)
) {
const { data } = await chatService.getConversation(
{
params: {
conversationId: conversationId || sharedId,
},
isPending: loading,
mutateAsync,
} = useMutation<IClientConversation, unknown, string>({
mutationKey: [ChatApiAction.FetchConversationManually],
mutationFn: async (conversationId) => {
const { data } = await chatService.getConversation(
{
params: {
conversationId,
},
true,
);
},
true,
);
const conversation = data?.data ?? {};
const conversation = data?.data ?? {};
const messageList = buildMessageListWithUuid(conversation?.message);
const messageList = buildMessageListWithUuid(conversation?.message);
return { ...conversation, message: messageList };
}
return { message: [] };
return { ...conversation, message: messageList };
},
});
return { data, loading, refetch };
};
return { data, loading, fetchConversationManually: mutateAsync };
}
export const useUpdateConversation = () => {
const { t } = useTranslation();
@ -335,7 +274,7 @@ export const useUpdateConversation = () => {
...params,
conversation_id: params.conversation_id
? params.conversation_id
: getConversationId(),
: generateConversationId(),
});
if (data.code === 0) {
queryClient.invalidateQueries({