balibabu
commited on
Commit
·
7d8f5e6
1
Parent(s):
cf772f7
feat: Delete message by id #2088 (#2155)
Browse files### What problem does this PR solve?
feat: Delete message by id #2088
### Type of change
- [x] New Feature (non-breaking change which adds functionality)
- web/src/components/message-item/group-button.tsx +14 -5
- web/src/components/message-item/hooks.ts +21 -1
- web/src/components/message-item/index.tsx +4 -1
- web/src/hooks/chat-hooks.ts +4 -0
- web/src/hooks/logic-hooks.ts +30 -0
- web/src/pages/chat/chat-container/index.tsx +2 -0
- web/src/pages/chat/hooks.ts +9 -2
web/src/components/message-item/group-button.tsx
CHANGED
|
@@ -1,5 +1,6 @@
|
|
| 1 |
import CopyToClipboard from '@/components/copy-to-clipboard';
|
| 2 |
import { useSetModalState } from '@/hooks/common-hooks';
|
|
|
|
| 3 |
import {
|
| 4 |
DeleteOutlined,
|
| 5 |
DislikeOutlined,
|
|
@@ -11,7 +12,7 @@ import { Radio } from 'antd';
|
|
| 11 |
import { useCallback } from 'react';
|
| 12 |
import SvgIcon from '../svg-icon';
|
| 13 |
import FeedbackModal from './feedback-modal';
|
| 14 |
-
import { useSendFeedback } from './hooks';
|
| 15 |
import PromptModal from './prompt-modal';
|
| 16 |
|
| 17 |
interface IProps {
|
|
@@ -77,12 +78,20 @@ export const AssistantGroupButton = ({
|
|
| 77 |
);
|
| 78 |
};
|
| 79 |
|
| 80 |
-
interface UserGroupButtonProps {
|
| 81 |
messageId: string;
|
| 82 |
content: string;
|
| 83 |
}
|
| 84 |
|
| 85 |
-
export const UserGroupButton = ({
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
return (
|
| 87 |
<Radio.Group size="small">
|
| 88 |
<Radio.Button value="a">
|
|
@@ -91,8 +100,8 @@ export const UserGroupButton = ({ content }: UserGroupButtonProps) => {
|
|
| 91 |
<Radio.Button value="b">
|
| 92 |
<SyncOutlined />
|
| 93 |
</Radio.Button>
|
| 94 |
-
<Radio.Button value="c">
|
| 95 |
-
<DeleteOutlined />
|
| 96 |
</Radio.Button>
|
| 97 |
</Radio.Group>
|
| 98 |
);
|
|
|
|
| 1 |
import CopyToClipboard from '@/components/copy-to-clipboard';
|
| 2 |
import { useSetModalState } from '@/hooks/common-hooks';
|
| 3 |
+
import { IRemoveMessageById } from '@/hooks/logic-hooks';
|
| 4 |
import {
|
| 5 |
DeleteOutlined,
|
| 6 |
DislikeOutlined,
|
|
|
|
| 12 |
import { useCallback } from 'react';
|
| 13 |
import SvgIcon from '../svg-icon';
|
| 14 |
import FeedbackModal from './feedback-modal';
|
| 15 |
+
import { useRemoveMessage, useSendFeedback } from './hooks';
|
| 16 |
import PromptModal from './prompt-modal';
|
| 17 |
|
| 18 |
interface IProps {
|
|
|
|
| 78 |
);
|
| 79 |
};
|
| 80 |
|
| 81 |
+
interface UserGroupButtonProps extends IRemoveMessageById {
|
| 82 |
messageId: string;
|
| 83 |
content: string;
|
| 84 |
}
|
| 85 |
|
| 86 |
+
export const UserGroupButton = ({
|
| 87 |
+
content,
|
| 88 |
+
messageId,
|
| 89 |
+
removeMessageById,
|
| 90 |
+
}: UserGroupButtonProps) => {
|
| 91 |
+
const { onRemoveMessage, loading } = useRemoveMessage(
|
| 92 |
+
messageId,
|
| 93 |
+
removeMessageById,
|
| 94 |
+
);
|
| 95 |
return (
|
| 96 |
<Radio.Group size="small">
|
| 97 |
<Radio.Button value="a">
|
|
|
|
| 100 |
<Radio.Button value="b">
|
| 101 |
<SyncOutlined />
|
| 102 |
</Radio.Button>
|
| 103 |
+
<Radio.Button value="c" onClick={onRemoveMessage} disabled={loading}>
|
| 104 |
+
<DeleteOutlined spin={loading} />
|
| 105 |
</Radio.Button>
|
| 106 |
</Radio.Group>
|
| 107 |
);
|
web/src/components/message-item/hooks.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
| 1 |
-
import { useFeedback } from '@/hooks/chat-hooks';
|
| 2 |
import { useSetModalState } from '@/hooks/common-hooks';
|
|
|
|
| 3 |
import { IFeedbackRequestBody } from '@/interfaces/request/chat';
|
| 4 |
import { getMessagePureId } from '@/utils/chat';
|
| 5 |
import { useCallback } from 'react';
|
|
@@ -30,3 +31,22 @@ export const useSendFeedback = (messageId: string) => {
|
|
| 30 |
showModal,
|
| 31 |
};
|
| 32 |
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { useDeleteMessage, useFeedback } from '@/hooks/chat-hooks';
|
| 2 |
import { useSetModalState } from '@/hooks/common-hooks';
|
| 3 |
+
import { IRemoveMessageById } from '@/hooks/logic-hooks';
|
| 4 |
import { IFeedbackRequestBody } from '@/interfaces/request/chat';
|
| 5 |
import { getMessagePureId } from '@/utils/chat';
|
| 6 |
import { useCallback } from 'react';
|
|
|
|
| 31 |
showModal,
|
| 32 |
};
|
| 33 |
};
|
| 34 |
+
|
| 35 |
+
export const useRemoveMessage = (
|
| 36 |
+
messageId: string,
|
| 37 |
+
removeMessageById: IRemoveMessageById['removeMessageById'],
|
| 38 |
+
) => {
|
| 39 |
+
const { deleteMessage, loading } = useDeleteMessage();
|
| 40 |
+
|
| 41 |
+
const onRemoveMessage = useCallback(async () => {
|
| 42 |
+
const pureId = getMessagePureId(messageId);
|
| 43 |
+
if (pureId) {
|
| 44 |
+
const retcode = await deleteMessage(pureId);
|
| 45 |
+
if (retcode === 0) {
|
| 46 |
+
removeMessageById(messageId);
|
| 47 |
+
}
|
| 48 |
+
}
|
| 49 |
+
}, [deleteMessage, messageId, removeMessageById]);
|
| 50 |
+
|
| 51 |
+
return { onRemoveMessage, loading };
|
| 52 |
+
};
|
web/src/components/message-item/index.tsx
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
| 11 |
useFetchDocumentInfosByIds,
|
| 12 |
useFetchDocumentThumbnailsByIds,
|
| 13 |
} from '@/hooks/document-hooks';
|
|
|
|
| 14 |
import { IMessage } from '@/pages/chat/interface';
|
| 15 |
import MarkdownContent from '@/pages/chat/markdown-content';
|
| 16 |
import { getExtension, isImage } from '@/utils/document-util';
|
|
@@ -23,7 +24,7 @@ import styles from './index.less';
|
|
| 23 |
|
| 24 |
const { Text } = Typography;
|
| 25 |
|
| 26 |
-
interface IProps {
|
| 27 |
item: IMessage;
|
| 28 |
reference: IReference;
|
| 29 |
loading?: boolean;
|
|
@@ -40,6 +41,7 @@ const MessageItem = ({
|
|
| 40 |
avatar = '',
|
| 41 |
clickDocumentButton,
|
| 42 |
index,
|
|
|
|
| 43 |
}: IProps) => {
|
| 44 |
const isAssistant = item.role === MessageType.Assistant;
|
| 45 |
const isUser = item.role === MessageType.User;
|
|
@@ -125,6 +127,7 @@ const MessageItem = ({
|
|
| 125 |
<UserGroupButton
|
| 126 |
content={item.content}
|
| 127 |
messageId={item.id}
|
|
|
|
| 128 |
></UserGroupButton>
|
| 129 |
)}
|
| 130 |
|
|
|
|
| 11 |
useFetchDocumentInfosByIds,
|
| 12 |
useFetchDocumentThumbnailsByIds,
|
| 13 |
} from '@/hooks/document-hooks';
|
| 14 |
+
import { IRemoveMessageById } from '@/hooks/logic-hooks';
|
| 15 |
import { IMessage } from '@/pages/chat/interface';
|
| 16 |
import MarkdownContent from '@/pages/chat/markdown-content';
|
| 17 |
import { getExtension, isImage } from '@/utils/document-util';
|
|
|
|
| 24 |
|
| 25 |
const { Text } = Typography;
|
| 26 |
|
| 27 |
+
interface IProps extends IRemoveMessageById {
|
| 28 |
item: IMessage;
|
| 29 |
reference: IReference;
|
| 30 |
loading?: boolean;
|
|
|
|
| 41 |
avatar = '',
|
| 42 |
clickDocumentButton,
|
| 43 |
index,
|
| 44 |
+
removeMessageById,
|
| 45 |
}: IProps) => {
|
| 46 |
const isAssistant = item.role === MessageType.Assistant;
|
| 47 |
const isUser = item.role === MessageType.User;
|
|
|
|
| 127 |
<UserGroupButton
|
| 128 |
content={item.content}
|
| 129 |
messageId={item.id}
|
| 130 |
+
removeMessageById={removeMessageById}
|
| 131 |
></UserGroupButton>
|
| 132 |
)}
|
| 133 |
|
web/src/hooks/chat-hooks.ts
CHANGED
|
@@ -314,6 +314,10 @@ export const useDeleteMessage = () => {
|
|
| 314 |
conversationId,
|
| 315 |
});
|
| 316 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 317 |
return data.retcode;
|
| 318 |
},
|
| 319 |
});
|
|
|
|
| 314 |
conversationId,
|
| 315 |
});
|
| 316 |
|
| 317 |
+
if (data.retcode === 0) {
|
| 318 |
+
message.success(i18n.t(`message.deleted`));
|
| 319 |
+
}
|
| 320 |
+
|
| 321 |
return data.retcode;
|
| 322 |
},
|
| 323 |
});
|
web/src/hooks/logic-hooks.ts
CHANGED
|
@@ -5,8 +5,10 @@ import { ResponseType } from '@/interfaces/database/base';
|
|
| 5 |
import { IAnswer } from '@/interfaces/database/chat';
|
| 6 |
import { IKnowledgeFile } from '@/interfaces/database/knowledge';
|
| 7 |
import { IChangeParserConfigRequestBody } from '@/interfaces/request/document';
|
|
|
|
| 8 |
import api from '@/utils/api';
|
| 9 |
import { getAuthorization } from '@/utils/authorization-util';
|
|
|
|
| 10 |
import { PaginationProps } from 'antd';
|
| 11 |
import { FormInstance } from 'antd/lib';
|
| 12 |
import axios from 'axios';
|
|
@@ -306,6 +308,34 @@ export const useHandleMessageInputChange = () => {
|
|
| 306 |
};
|
| 307 |
};
|
| 308 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 309 |
// #endregion
|
| 310 |
|
| 311 |
/**
|
|
|
|
| 5 |
import { IAnswer } from '@/interfaces/database/chat';
|
| 6 |
import { IKnowledgeFile } from '@/interfaces/database/knowledge';
|
| 7 |
import { IChangeParserConfigRequestBody } from '@/interfaces/request/document';
|
| 8 |
+
import { IClientConversation } from '@/pages/chat/interface';
|
| 9 |
import api from '@/utils/api';
|
| 10 |
import { getAuthorization } from '@/utils/authorization-util';
|
| 11 |
+
import { getMessagePureId } from '@/utils/chat';
|
| 12 |
import { PaginationProps } from 'antd';
|
| 13 |
import { FormInstance } from 'antd/lib';
|
| 14 |
import axios from 'axios';
|
|
|
|
| 308 |
};
|
| 309 |
};
|
| 310 |
|
| 311 |
+
export interface IRemoveMessageById {
|
| 312 |
+
removeMessageById(messageId: string): void;
|
| 313 |
+
}
|
| 314 |
+
|
| 315 |
+
export const useRemoveMessageById = (
|
| 316 |
+
setCurrentConversation: (
|
| 317 |
+
callback: (state: IClientConversation) => IClientConversation,
|
| 318 |
+
) => void,
|
| 319 |
+
) => {
|
| 320 |
+
const removeMessageById = useCallback(
|
| 321 |
+
(messageId: string) => {
|
| 322 |
+
setCurrentConversation((pre) => {
|
| 323 |
+
const nextMessages =
|
| 324 |
+
pre.message?.filter(
|
| 325 |
+
(x) => getMessagePureId(x.id) !== getMessagePureId(messageId),
|
| 326 |
+
) ?? [];
|
| 327 |
+
return {
|
| 328 |
+
...pre,
|
| 329 |
+
message: nextMessages,
|
| 330 |
+
};
|
| 331 |
+
});
|
| 332 |
+
},
|
| 333 |
+
[setCurrentConversation],
|
| 334 |
+
);
|
| 335 |
+
|
| 336 |
+
return { removeMessageById };
|
| 337 |
+
};
|
| 338 |
+
|
| 339 |
// #endregion
|
| 340 |
|
| 341 |
/**
|
web/src/pages/chat/chat-container/index.tsx
CHANGED
|
@@ -27,6 +27,7 @@ const ChatContainer = () => {
|
|
| 27 |
addNewestAnswer,
|
| 28 |
conversationId,
|
| 29 |
loading,
|
|
|
|
| 30 |
} = useFetchConversationOnMount();
|
| 31 |
const {
|
| 32 |
handleInputChange,
|
|
@@ -69,6 +70,7 @@ const ChatContainer = () => {
|
|
| 69 |
reference={buildMessageItemReference(conversation, message)}
|
| 70 |
clickDocumentButton={clickDocumentButton}
|
| 71 |
index={i}
|
|
|
|
| 72 |
></MessageItem>
|
| 73 |
);
|
| 74 |
})}
|
|
|
|
| 27 |
addNewestAnswer,
|
| 28 |
conversationId,
|
| 29 |
loading,
|
| 30 |
+
removeMessageById,
|
| 31 |
} = useFetchConversationOnMount();
|
| 32 |
const {
|
| 33 |
handleInputChange,
|
|
|
|
| 70 |
reference={buildMessageItemReference(conversation, message)}
|
| 71 |
clickDocumentButton={clickDocumentButton}
|
| 72 |
index={i}
|
| 73 |
+
removeMessageById={removeMessageById}
|
| 74 |
></MessageItem>
|
| 75 |
);
|
| 76 |
})}
|
web/src/pages/chat/hooks.ts
CHANGED
|
@@ -17,7 +17,10 @@ import {
|
|
| 17 |
useShowDeleteConfirm,
|
| 18 |
useTranslate,
|
| 19 |
} from '@/hooks/common-hooks';
|
| 20 |
-
import {
|
|
|
|
|
|
|
|
|
|
| 21 |
import {
|
| 22 |
IAnswer,
|
| 23 |
IConversation,
|
|
@@ -251,6 +254,7 @@ export const useSelectCurrentConversation = () => {
|
|
| 251 |
const { data: conversation, loading } = useFetchNextConversation();
|
| 252 |
const { data: dialog } = useFetchNextDialog();
|
| 253 |
const { conversationId, dialogId } = useGetChatSearchParams();
|
|
|
|
| 254 |
|
| 255 |
// Show the entered message in the conversation immediately after sending the message
|
| 256 |
const addNewestConversation = useCallback(
|
|
@@ -348,6 +352,7 @@ export const useSelectCurrentConversation = () => {
|
|
| 348 |
addNewestConversation,
|
| 349 |
removeLatestMessage,
|
| 350 |
addNewestAnswer,
|
|
|
|
| 351 |
loading,
|
| 352 |
};
|
| 353 |
};
|
|
@@ -376,6 +381,7 @@ export const useFetchConversationOnMount = () => {
|
|
| 376 |
removeLatestMessage,
|
| 377 |
addNewestAnswer,
|
| 378 |
loading,
|
|
|
|
| 379 |
} = useSelectCurrentConversation();
|
| 380 |
const ref = useScrollToBottom(currentConversation);
|
| 381 |
|
|
@@ -387,6 +393,7 @@ export const useFetchConversationOnMount = () => {
|
|
| 387 |
addNewestAnswer,
|
| 388 |
conversationId,
|
| 389 |
loading,
|
|
|
|
| 390 |
};
|
| 391 |
};
|
| 392 |
|
|
@@ -408,7 +415,7 @@ export const useHandleMessageInputChange = () => {
|
|
| 408 |
|
| 409 |
export const useSendMessage = (
|
| 410 |
conversation: IClientConversation,
|
| 411 |
-
addNewestConversation: (message:
|
| 412 |
removeLatestMessage: () => void,
|
| 413 |
addNewestAnswer: (answer: IAnswer) => void,
|
| 414 |
) => {
|
|
|
|
| 17 |
useShowDeleteConfirm,
|
| 18 |
useTranslate,
|
| 19 |
} from '@/hooks/common-hooks';
|
| 20 |
+
import {
|
| 21 |
+
useRemoveMessageById,
|
| 22 |
+
useSendMessageWithSse,
|
| 23 |
+
} from '@/hooks/logic-hooks';
|
| 24 |
import {
|
| 25 |
IAnswer,
|
| 26 |
IConversation,
|
|
|
|
| 254 |
const { data: conversation, loading } = useFetchNextConversation();
|
| 255 |
const { data: dialog } = useFetchNextDialog();
|
| 256 |
const { conversationId, dialogId } = useGetChatSearchParams();
|
| 257 |
+
const { removeMessageById } = useRemoveMessageById(setCurrentConversation);
|
| 258 |
|
| 259 |
// Show the entered message in the conversation immediately after sending the message
|
| 260 |
const addNewestConversation = useCallback(
|
|
|
|
| 352 |
addNewestConversation,
|
| 353 |
removeLatestMessage,
|
| 354 |
addNewestAnswer,
|
| 355 |
+
removeMessageById,
|
| 356 |
loading,
|
| 357 |
};
|
| 358 |
};
|
|
|
|
| 381 |
removeLatestMessage,
|
| 382 |
addNewestAnswer,
|
| 383 |
loading,
|
| 384 |
+
removeMessageById,
|
| 385 |
} = useSelectCurrentConversation();
|
| 386 |
const ref = useScrollToBottom(currentConversation);
|
| 387 |
|
|
|
|
| 393 |
addNewestAnswer,
|
| 394 |
conversationId,
|
| 395 |
loading,
|
| 396 |
+
removeMessageById,
|
| 397 |
};
|
| 398 |
};
|
| 399 |
|
|
|
|
| 415 |
|
| 416 |
export const useSendMessage = (
|
| 417 |
conversation: IClientConversation,
|
| 418 |
+
addNewestConversation: (message: Message, answer?: string) => void,
|
| 419 |
removeLatestMessage: () => void,
|
| 420 |
addNewestAnswer: (answer: IAnswer) => void,
|
| 421 |
) => {
|