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 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 = ({ content }: UserGroupButtonProps) => {
 
 
 
 
 
 
 
 
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 { useSendMessageWithSse } from '@/hooks/logic-hooks';
 
 
 
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: Partial<Message>, answer?: string) => void,
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
  ) => {