@tencentcloud/chat-uikit-react 1.2.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/.eslintrc.js +2 -1
  2. package/CHANGELOG.md +8 -2
  3. package/dist/cjs/components/ConversationCreate/ConversationCreatGroupDetail.js +1 -1
  4. package/dist/cjs/components/ConversationCreate/ConversationCreateUserSelectList.js +1 -1
  5. package/dist/cjs/components/ConversationCreate/hooks/useConversationCreate.js +1 -1
  6. package/dist/cjs/components/ConversationPreview/ConversationPreview.d.ts +2 -0
  7. package/dist/cjs/components/ConversationPreview/ConversationPreview.js +1 -1
  8. package/dist/cjs/components/ConversationPreview/ConversationPreviewContent.js +1 -1
  9. package/dist/cjs/components/ConversationPreview/utils.js +1 -1
  10. package/dist/cjs/components/ConversationSearch/ConversationSearchResult.js +1 -1
  11. package/dist/cjs/components/Icon/config.js +1 -1
  12. package/dist/cjs/components/Icon/images/chats-selected.svg.js +1 -0
  13. package/dist/cjs/components/Icon/images/chats.svg.js +1 -0
  14. package/dist/cjs/components/Icon/images/contacts-selected.svg.js +1 -0
  15. package/dist/cjs/components/Icon/images/contacts.svg.js +1 -0
  16. package/dist/cjs/components/Icon/images/files.png.js +1 -0
  17. package/dist/cjs/components/Icon/images/image.png.js +1 -1
  18. package/dist/cjs/components/Icon/images/video.png.js +1 -1
  19. package/dist/cjs/components/TUIChat/TUIChat.d.ts +5 -0
  20. package/dist/cjs/components/TUIChat/TUIChat.js +1 -1
  21. package/dist/cjs/components/TUIChat/TUIChatState.js +1 -1
  22. package/dist/cjs/components/TUIChat/hooks/useHandleMessage.js +1 -1
  23. package/dist/cjs/components/TUIChat/hooks/useHandleMessageList.js +1 -1
  24. package/dist/cjs/components/TUIChat/unitls.js +1 -1
  25. package/dist/cjs/components/TUIChatHeader/TUIChatHeaderDefault.js +1 -1
  26. package/dist/cjs/components/TUIContact/TUIContactInfo/friendInfo.js +1 -1
  27. package/dist/cjs/components/TUIContact/TUIContactList/TUIContactList.js +1 -1
  28. package/dist/cjs/components/TUIConversation/TUIConversation.js +1 -1
  29. package/dist/cjs/components/TUIConversationList/TUIConversationList.d.ts +1 -0
  30. package/dist/cjs/components/TUIConversationList/TUIConversationList.js +1 -1
  31. package/dist/cjs/components/TUIKit/TUIKit.js +1 -1
  32. package/dist/cjs/components/TUIManage/TUIManage.js +1 -1
  33. package/dist/cjs/components/TUIMessage/MessageBubble.js +1 -1
  34. package/dist/cjs/components/TUIMessage/MessageContext.js +1 -1
  35. package/dist/cjs/components/TUIMessage/MessageCustom.js +1 -1
  36. package/dist/cjs/components/TUIMessage/MessageImage.js +1 -1
  37. package/dist/cjs/components/TUIMessage/MessageName.js +1 -1
  38. package/dist/cjs/components/TUIMessage/MessagePlugins.js +1 -1
  39. package/dist/cjs/components/TUIMessage/MessageRevoke.js +1 -1
  40. package/dist/cjs/components/TUIMessage/MessageSystem.js +1 -1
  41. package/dist/cjs/components/TUIMessage/MessageText.js +1 -1
  42. package/dist/cjs/components/TUIMessage/MessageTip.js +1 -1
  43. package/dist/cjs/components/TUIMessage/MessageVideo.js +1 -1
  44. package/dist/cjs/components/TUIMessage/TUIMessage.js +1 -1
  45. package/dist/cjs/components/TUIMessage/hooks/useMessageHandler.js +1 -1
  46. package/dist/cjs/components/TUIMessage/utils/index.js +1 -1
  47. package/dist/cjs/components/TUIMessageInput/TUIForward.js +1 -1
  48. package/dist/cjs/components/TUIMessageInput/TUIMessageInput.js +1 -1
  49. package/dist/cjs/components/TUIMessageInput/TUIMessageInputDefault.js +1 -1
  50. package/dist/cjs/components/TUIMessageInput/hooks/useEmojiPicker.js +1 -1
  51. package/dist/cjs/components/TUIMessageInput/hooks/useHandleForwardMessage.js +1 -1
  52. package/dist/cjs/components/TUIMessageInput/hooks/useMessageInputText.js +1 -1
  53. package/dist/cjs/components/TUIMessageInput/hooks/useUploadPicker.js +1 -1
  54. package/dist/cjs/components/TUIMessageList/TUIMessageList.js +1 -1
  55. package/dist/cjs/components/TUIProfile/TUIProfileDefault.js +1 -1
  56. package/dist/cjs/components/untils.js +1 -1
  57. package/dist/cjs/constants.js +1 -1
  58. package/dist/cjs/context/ComponentContext.d.ts +2 -0
  59. package/dist/cjs/context/TUIChatActionContext.d.ts +3 -14
  60. package/dist/cjs/context/TUIChatStateContext.d.ts +2 -0
  61. package/dist/cjs/context/TUIConversationContext.js +1 -1
  62. package/dist/cjs/index.css +1 -1
  63. package/dist/cjs/index.d.css +240 -12
  64. package/dist/cjs/index.js +1 -1
  65. package/dist/cjs/locales/en/TUIChat.js +1 -1
  66. package/dist/cjs/locales/en/TUIContact.js +1 -1
  67. package/dist/cjs/locales/en/TUIProfile.js +1 -1
  68. package/dist/cjs/locales/index.js +1 -1
  69. package/dist/cjs/locales/zh_cn/TUIChat.js +1 -1
  70. package/dist/cjs/locales/zh_cn/TUIContact.js +1 -1
  71. package/dist/cjs/locales/zh_cn/TUIProfile.js +1 -1
  72. package/dist/cjs/server.js +1 -0
  73. package/dist/cjs/utils/env.js +1 -0
  74. package/dist/esm/components/ConversationCreate/ConversationCreatGroupDetail.js +1 -1
  75. package/dist/esm/components/ConversationCreate/ConversationCreateUserSelectList.js +1 -1
  76. package/dist/esm/components/ConversationCreate/hooks/useConversationCreate.js +1 -1
  77. package/dist/esm/components/ConversationPreview/ConversationPreview.d.ts +2 -0
  78. package/dist/esm/components/ConversationPreview/ConversationPreview.js +1 -1
  79. package/dist/esm/components/ConversationPreview/ConversationPreviewContent.js +1 -1
  80. package/dist/esm/components/ConversationPreview/utils.js +1 -1
  81. package/dist/esm/components/ConversationSearch/ConversationSearchResult.js +1 -1
  82. package/dist/esm/components/Icon/config.js +1 -1
  83. package/dist/esm/components/Icon/images/chats-selected.svg.js +1 -0
  84. package/dist/esm/components/Icon/images/chats.svg.js +1 -0
  85. package/dist/esm/components/Icon/images/contacts-selected.svg.js +1 -0
  86. package/dist/esm/components/Icon/images/contacts.svg.js +1 -0
  87. package/dist/esm/components/Icon/images/files.png.js +1 -0
  88. package/dist/esm/components/Icon/images/image.png.js +1 -1
  89. package/dist/esm/components/Icon/images/video.png.js +1 -1
  90. package/dist/esm/components/TUIChat/TUIChat.d.ts +5 -0
  91. package/dist/esm/components/TUIChat/TUIChat.js +1 -1
  92. package/dist/esm/components/TUIChat/TUIChatState.js +1 -1
  93. package/dist/esm/components/TUIChat/hooks/useHandleMessage.js +1 -1
  94. package/dist/esm/components/TUIChat/hooks/useHandleMessageList.js +1 -1
  95. package/dist/esm/components/TUIChat/unitls.js +1 -1
  96. package/dist/esm/components/TUIChatHeader/TUIChatHeaderDefault.js +1 -1
  97. package/dist/esm/components/TUIContact/TUIContactInfo/friendInfo.js +1 -1
  98. package/dist/esm/components/TUIContact/TUIContactList/TUIContactList.js +1 -1
  99. package/dist/esm/components/TUIConversation/TUIConversation.js +1 -1
  100. package/dist/esm/components/TUIConversationList/TUIConversationList.d.ts +1 -0
  101. package/dist/esm/components/TUIConversationList/TUIConversationList.js +1 -1
  102. package/dist/esm/components/TUIKit/TUIKit.js +1 -1
  103. package/dist/esm/components/TUIManage/TUIManage.js +1 -1
  104. package/dist/esm/components/TUIMessage/MessageBubble.js +1 -1
  105. package/dist/esm/components/TUIMessage/MessageContext.js +1 -1
  106. package/dist/esm/components/TUIMessage/MessageCustom.js +1 -1
  107. package/dist/esm/components/TUIMessage/MessageImage.js +1 -1
  108. package/dist/esm/components/TUIMessage/MessageName.js +1 -1
  109. package/dist/esm/components/TUIMessage/MessagePlugins.js +1 -1
  110. package/dist/esm/components/TUIMessage/MessageRevoke.js +1 -1
  111. package/dist/esm/components/TUIMessage/MessageSystem.js +1 -1
  112. package/dist/esm/components/TUIMessage/MessageText.js +1 -1
  113. package/dist/esm/components/TUIMessage/MessageTip.js +1 -1
  114. package/dist/esm/components/TUIMessage/MessageVideo.js +1 -1
  115. package/dist/esm/components/TUIMessage/TUIMessage.js +1 -1
  116. package/dist/esm/components/TUIMessage/hooks/useMessageHandler.js +1 -1
  117. package/dist/esm/components/TUIMessage/utils/index.js +1 -1
  118. package/dist/esm/components/TUIMessageInput/TUIForward.js +1 -1
  119. package/dist/esm/components/TUIMessageInput/TUIMessageInput.js +1 -1
  120. package/dist/esm/components/TUIMessageInput/TUIMessageInputDefault.js +1 -1
  121. package/dist/esm/components/TUIMessageInput/hooks/useEmojiPicker.js +1 -1
  122. package/dist/esm/components/TUIMessageInput/hooks/useHandleForwardMessage.js +1 -1
  123. package/dist/esm/components/TUIMessageInput/hooks/useMessageInputText.js +1 -1
  124. package/dist/esm/components/TUIMessageInput/hooks/useUploadPicker.js +1 -1
  125. package/dist/esm/components/TUIMessageList/TUIMessageList.js +1 -1
  126. package/dist/esm/components/TUIProfile/TUIProfileDefault.js +1 -1
  127. package/dist/esm/components/untils.js +1 -1
  128. package/dist/esm/constants.js +1 -1
  129. package/dist/esm/context/ComponentContext.d.ts +2 -0
  130. package/dist/esm/context/TUIChatActionContext.d.ts +3 -14
  131. package/dist/esm/context/TUIChatStateContext.d.ts +2 -0
  132. package/dist/esm/context/TUIConversationContext.js +1 -1
  133. package/dist/esm/index.css +1 -1
  134. package/dist/esm/index.d.css +240 -12
  135. package/dist/esm/index.js +1 -1
  136. package/dist/esm/locales/en/TUIChat.js +1 -1
  137. package/dist/esm/locales/en/TUIContact.js +1 -1
  138. package/dist/esm/locales/en/TUIProfile.js +1 -1
  139. package/dist/esm/locales/index.js +1 -1
  140. package/dist/esm/locales/zh_cn/TUIChat.js +1 -1
  141. package/dist/esm/locales/zh_cn/TUIContact.js +1 -1
  142. package/dist/esm/locales/zh_cn/TUIProfile.js +1 -1
  143. package/dist/esm/server.js +1 -0
  144. package/dist/esm/utils/env.js +1 -0
  145. package/package.json +7 -6
  146. package/rollup.config.js +0 -1
  147. package/scripts/publish-github.js +60 -0
  148. package/scripts/publish-intl-demo.js +14 -0
  149. package/scripts/publish-npm.js +22 -0
  150. package/src/components/Avatar/styles/index.scss +1 -0
  151. package/src/components/ConversationCreate/ConversationCreatGroupDetail.tsx +6 -3
  152. package/src/components/ConversationCreate/ConversationCreateUserSelectList.tsx +5 -1
  153. package/src/components/ConversationCreate/hooks/useConversationCreate.tsx +7 -2
  154. package/src/components/ConversationCreate/styles/conversationGroupTypeInfo.scss +1 -0
  155. package/src/components/ConversationCreate/styles/index.scss +2 -0
  156. package/src/components/ConversationPreview/ConversationPreview.tsx +2 -0
  157. package/src/components/ConversationPreview/ConversationPreviewContent.tsx +57 -9
  158. package/src/components/ConversationPreview/styles/index.scss +4 -2
  159. package/src/components/ConversationPreview/utils.tsx +5 -1
  160. package/src/components/DivWithEdit/styles/index.scss +2 -1
  161. package/src/components/Icon/config.ts +1 -1
  162. package/src/components/Icon/images/chats-selected.svg +6 -0
  163. package/src/components/Icon/images/chats.svg +9 -0
  164. package/src/components/Icon/images/contacts-selected.svg +3 -0
  165. package/src/components/Icon/images/contacts.svg +6 -0
  166. package/src/components/Icon/images/files.png +0 -0
  167. package/src/components/Icon/images/image.png +0 -0
  168. package/src/components/Icon/images/language.svg +3 -0
  169. package/src/components/Icon/images/video.png +0 -0
  170. package/src/components/Model/styles/layout.scss +1 -1
  171. package/src/components/Profile/styles/index.scss +4 -0
  172. package/src/components/TUIChat/TUIChat.tsx +74 -120
  173. package/src/components/TUIChat/TUIChatState.tsx +18 -45
  174. package/src/components/TUIChat/hooks/useHandleMessage.tsx +8 -0
  175. package/src/components/TUIChat/hooks/useHandleMessageList.tsx +2 -41
  176. package/src/components/TUIChat/unitls.ts +0 -29
  177. package/src/components/TUIChatHeader/TUIChatHeaderDefault.tsx +7 -1
  178. package/src/components/TUIContact/TUIContactInfo/friendInfo.tsx +4 -1
  179. package/src/components/TUIContact/TUIContactList/TUIContactList.tsx +1 -1
  180. package/src/components/TUIConversation/TUIConversation.tsx +1 -4
  181. package/src/components/TUIConversationList/TUIConversationList.tsx +91 -65
  182. package/src/components/TUIConversationList/index.scss +5 -0
  183. package/src/components/TUIKit/TUIKit.tsx +133 -9
  184. package/src/components/TUIKit/styles/h5.scss +34 -0
  185. package/src/components/TUIKit/styles/index.scss +103 -0
  186. package/src/components/TUIKit/styles/reset.scss +20 -0
  187. package/src/components/TUIManage/TUIManage.tsx +59 -35
  188. package/src/components/TUIManage/styles/index.scss +15 -1
  189. package/src/components/TUIMessage/MessageBubble.tsx +20 -3
  190. package/src/components/TUIMessage/MessageCustom.tsx +11 -2
  191. package/src/components/TUIMessage/MessageImage.tsx +2 -1
  192. package/src/components/TUIMessage/MessageName.tsx +1 -1
  193. package/src/components/TUIMessage/MessagePlugins.tsx +4 -2
  194. package/src/components/TUIMessage/MessageRevoke.tsx +2 -2
  195. package/src/components/TUIMessage/MessageText.tsx +25 -3
  196. package/src/components/TUIMessage/MessageVideo.tsx +8 -5
  197. package/src/components/TUIMessage/hooks/useMessageHandler.ts +13 -33
  198. package/src/components/TUIMessage/styles/color.scss +1 -0
  199. package/src/components/TUIMessage/styles/layout.scss +33 -6
  200. package/src/components/TUIMessage/utils/index.ts +1 -1
  201. package/src/components/TUIMessageInput/TUIMessageInputDefault.tsx +2 -2
  202. package/src/components/TUIMessageInput/hooks/useEmojiPicker.tsx +2 -6
  203. package/src/components/TUIMessageInput/hooks/useHandleForwardMessage.tsx +4 -3
  204. package/src/components/TUIMessageInput/hooks/useMessageInputText.tsx +10 -3
  205. package/src/components/TUIMessageInput/hooks/useUploadPicker.tsx +10 -14
  206. package/src/components/TUIMessageInput/styles/color.scss +1 -1
  207. package/src/components/TUIMessageInput/styles/layout.scss +7 -2
  208. package/src/components/TUIMessageList/TUIMessageList.tsx +9 -13
  209. package/src/components/TUIMessageList/index.ts +0 -1
  210. package/src/components/TUIProfile/TUIProfileDefault.tsx +65 -51
  211. package/src/components/TUIProfile/styles/layout.scss +6 -0
  212. package/src/components/untils.ts +9 -0
  213. package/src/constants.ts +4 -1
  214. package/src/context/ComponentContext.tsx +2 -0
  215. package/src/context/TUIChatActionContext.tsx +3 -23
  216. package/src/context/TUIChatStateContext.tsx +2 -0
  217. package/src/context/TUIKitContext.tsx +0 -1
  218. package/src/index.ts +3 -0
  219. package/src/locales/en/TUIChat.ts +2 -1
  220. package/src/locales/en/TUIContact.ts +1 -1
  221. package/src/locales/en/TUIProfile.ts +5 -4
  222. package/src/locales/index.ts +1 -1
  223. package/src/locales/zh_cn/TUIChat.ts +1 -0
  224. package/src/locales/zh_cn/TUIContact.ts +1 -1
  225. package/src/locales/zh_cn/TUIProfile.ts +1 -0
  226. package/src/server.ts +44 -0
  227. package/src/utils/env.ts +5 -0
  228. package/tsconfig.json +1 -0
  229. package/dist/cjs/components/Icon/images/document.png.js +0 -1
  230. package/dist/cjs/components/TUIChat/hooks/useCreateMessage.d.ts +0 -59
  231. package/dist/cjs/components/TUIChat/hooks/useCreateMessage.js +0 -1
  232. package/dist/cjs/components/TUIChat/hooks/useMessageReceviedListener.js +0 -1
  233. package/dist/cjs/components/TUIMessageList/hooks/useEnrichedMessageList.js +0 -1
  234. package/dist/esm/components/Icon/images/document.png.js +0 -1
  235. package/dist/esm/components/TUIChat/hooks/useCreateMessage.d.ts +0 -59
  236. package/dist/esm/components/TUIChat/hooks/useCreateMessage.js +0 -1
  237. package/dist/esm/components/TUIChat/hooks/useMessageReceviedListener.js +0 -1
  238. package/dist/esm/components/TUIMessageList/hooks/useEnrichedMessageList.js +0 -1
  239. package/src/components/TUIChat/hooks/useCreateMessage.tsx +0 -198
  240. package/src/components/TUIChat/hooks/useMessageReceviedListener.tsx +0 -26
  241. package/src/components/TUIMessageList/hooks/useEnrichedMessageList.tsx +0 -16
@@ -13,7 +13,7 @@
13
13
  align-items: center;
14
14
  padding: 24px 20px;
15
15
  span {
16
- margin-left: 10px;
16
+ margin-right: 10px;
17
17
  font-weight: 700;
18
18
  font-size: 14px;
19
19
  font-family: PingFangSC-Medium;
@@ -69,3 +69,17 @@
69
69
  }
70
70
  }
71
71
  }
72
+
73
+ .tui-manage.tui-h5-manage {
74
+ border-left: 1px solid #f9fafb;
75
+ display: flex;
76
+ flex-direction: column;
77
+ position: absolute;
78
+ top: 0;
79
+ bottom: 0;
80
+ width: 100%;
81
+ max-width: 100%;
82
+ min-width: 100%;
83
+ z-index: 1;
84
+ background: #fff;
85
+ }
@@ -1,11 +1,12 @@
1
1
  import React, {
2
2
  PropsWithChildren,
3
3
  ReactNode,
4
+ useEffect,
4
5
  useState,
5
6
  } from 'react';
6
7
  import TencentCloudChat, { Message } from '@tencentcloud/chat';
7
8
  import { MESSAGE_STATUS } from '../../constants';
8
- import { useTUIChatActionContext } from '../../context';
9
+ import { useTUIChatActionContext, useTUIChatStateContext } from '../../context';
9
10
  import { Icon, IconTypes } from '../Icon';
10
11
  import { useMessageReply } from './hooks/useMessageReply';
11
12
  import { MessageProgress } from './MessageProgress';
@@ -36,7 +37,8 @@ function MessageBubbleWithContext <T extends MessageBubbleProps>(
36
37
  sender,
37
38
  } = useMessageReply({ message });
38
39
 
39
- const { setHighlightedMessageId } = useTUIChatActionContext('MessageBubbleWithContext');
40
+ const { setHighlightedMessageId, setActiveMessageID } = useTUIChatActionContext('MessageBubbleWithContext');
41
+ const { activeMessageID } = useTUIChatStateContext('MessageBubbleWithContext');
40
42
 
41
43
  const handleLoading = () => !!((
42
44
  message?.type === TencentCloudChat.TYPES.MSG_IMAGE
@@ -45,12 +47,24 @@ function MessageBubbleWithContext <T extends MessageBubbleProps>(
45
47
  ) && message?.status === MESSAGE_STATUS.UNSEND);
46
48
 
47
49
  const handleMouseEnter = () => {
50
+ setActiveMessageID(message.ID);
48
51
  setPluginsShow(true);
49
52
  };
50
53
  const handleMouseLeave = () => {
54
+ setActiveMessageID(message.ID);
51
55
  setPluginsShow(false);
52
56
  };
53
57
 
58
+ const activeMessage = () => {
59
+ setActiveMessageID(message.ID);
60
+ };
61
+
62
+ useEffect(() => {
63
+ if (activeMessageID !== message.ID) {
64
+ setPluginsShow(false);
65
+ }
66
+ }, [activeMessageID]);
67
+
54
68
  const handleReplyMessage = () => {
55
69
  setHighlightedMessageId(replyMessage?.ID);
56
70
  };
@@ -59,8 +73,11 @@ function MessageBubbleWithContext <T extends MessageBubbleProps>(
59
73
  <div className="meesage-bubble">
60
74
  <div
61
75
  className={`meesage-bubble-context ${message?.flow}`}
76
+ role="button"
77
+ tabIndex={0}
62
78
  onMouseEnter={handleMouseEnter}
63
79
  onMouseLeave={handleMouseLeave}
80
+ onClick={activeMessage}
64
81
  >
65
82
  <div
66
83
  className={
@@ -88,7 +105,7 @@ function MessageBubbleWithContext <T extends MessageBubbleProps>(
88
105
  {
89
106
  Plugins && (
90
107
  <div className="message-plugin">
91
- {PluginsShow && <Plugins />}
108
+ {PluginsShow && <Plugins message={message} />}
92
109
  </div>
93
110
  )
94
111
  }
@@ -1,7 +1,9 @@
1
1
  import React, { PropsWithChildren } from 'react';
2
2
  import TencentCloudChat from '@tencentcloud/chat';
3
+ import { useTranslation } from 'react-i18next';
3
4
  import { JSONStringToParse } from '../untils';
4
5
  import type { MessageContextProps } from './MessageText';
6
+ import { useComponentContext } from '../../context';
5
7
 
6
8
  function MessageCustomWithContext <T extends MessageContextProps>(
7
9
  props: PropsWithChildren<T>,
@@ -11,7 +13,8 @@ function MessageCustomWithContext <T extends MessageContextProps>(
11
13
  message,
12
14
  children,
13
15
  } = props;
14
-
16
+ const { t } = useTranslation();
17
+ const { MessageCustomPlugins } = useComponentContext('MessageCustom');
15
18
  const handleContext = (data) => {
16
19
  if (data.data === 'Hyperlink') {
17
20
  const extension = JSONStringToParse(data?.extension);
@@ -32,7 +35,13 @@ function MessageCustomWithContext <T extends MessageContextProps>(
32
35
  if (data.data === 'group_create') {
33
36
  return `${message?.nick || message?.from} Create a group`;
34
37
  }
35
- return data.extension;
38
+ const botMessage = JSONStringToParse(data.data);
39
+ if (botMessage?.chatbotPlugin === 1 && botMessage?.src === 15 && (botMessage?.subtype === 'welcome_msg' || botMessage?.subtype === 'clarify_msg')) {
40
+ return (
41
+ <MessageCustomPlugins data={JSONStringToParse(data.data).content} />
42
+ );
43
+ }
44
+ return `[${t('TUIChat.Custom message')}]`;
36
45
  };
37
46
 
38
47
  return (
@@ -1,5 +1,6 @@
1
1
  import React, { PropsWithChildren, useState } from 'react';
2
2
  import TencentCloudChat from '@tencentcloud/chat';
3
+ import { isH5 } from '../../utils/env';
3
4
  import { Model } from '../Model';
4
5
  import type { MessageContextProps } from './MessageText';
5
6
 
@@ -19,7 +20,7 @@ function MessageImageWithContext <T extends MessageContextProps>(
19
20
  return (
20
21
  <div className="message-image">
21
22
  <div role="button" tabIndex={0} onClick={() => { setShow(true); }}>
22
- <img className={`img bubble-${message.flow} ${message?.conversationType === TencentCloudChat.TYPES.CONV_GROUP ? 'group' : ''}`} src={context.url} alt="" />
23
+ <img className={`img ${isH5 ? 'img-h5' : ''} bubble-${message.flow} ${message?.conversationType === TencentCloudChat.TYPES.CONV_GROUP ? 'group' : ''}`} src={context.url} alt="" />
23
24
  </div>
24
25
  {children}
25
26
  {
@@ -34,7 +34,7 @@ export function MessageName <T extends MessageNameProps>(
34
34
  }
35
35
 
36
36
  return (
37
- <label htmlFor="content" className="name">
37
+ <label htmlFor="content" className="text-ellipsis name">
38
38
  {message?.nick || message?.from}
39
39
  </label>
40
40
  );
@@ -90,10 +90,12 @@ export function MessagePlugins <T extends MessagePluginsProps>(
90
90
 
91
91
  const handleVisible = (data) => {
92
92
  if (data.x && data.y) {
93
+ const isTop = data.y < data.height ? true : data.top;
94
+ const isLeft = data.x < data.width ? true : data.left;
93
95
  setPopStyle({
94
96
  position: 'fixed',
95
- left: `${!data.left ? (data.x - data.width) : data.x}px`,
96
- top: `${!data.top ? (data.y - data.height) : data.y}px`,
97
+ left: `${isLeft ? data.x : (data.x - data.width)}px`,
98
+ top: `${isTop ? data.y : (data.y - data.height)}px`,
97
99
  });
98
100
  }
99
101
  };
@@ -26,9 +26,9 @@ function MessageRevokeWithContext <T extends MessageContextProps>(
26
26
  message?.flow === MESSAGE_FLOW.IN && <span>{message?.nick || message?.from}</span>
27
27
  }
28
28
  {
29
- message?.flow !== MESSAGE_FLOW.IN && <span>{t('TUIChat.You')}</span>
29
+ message?.flow !== MESSAGE_FLOW.IN && <span style={{ marginRight: '5px' }}>{t('TUIChat.You')}</span>
30
30
  }
31
- <span>{t('TUIChat.recalled a message')}</span>
31
+ <span style={{ marginRight: '5px' }}>{t('TUIChat.recalled a message')}</span>
32
32
  {
33
33
  message?.flow === MESSAGE_FLOW.OUT
34
34
  && message?.type === TencentCloudChat.TYPES.MSG_TEXT
@@ -1,6 +1,6 @@
1
1
  import React, { PropsWithChildren } from 'react';
2
2
  import TencentCloudChat, { Message } from '@tencentcloud/chat';
3
- import { UnknowPorps } from '../../context';
3
+ import { UnknowPorps, useTUIChatStateContext, useComponentContext } from '../../context';
4
4
 
5
5
  export interface MessageContextProps {
6
6
  context?: UnknowPorps,
@@ -16,14 +16,36 @@ function MessageTextWithContext <T extends MessageContextProps>(
16
16
  message,
17
17
  children,
18
18
  } = props;
19
-
19
+ const { MessageTextPlugins } = useComponentContext('MessageText');
20
+ const { firstSendMessage } = useTUIChatStateContext('MessageText');
21
+ if (MessageTextPlugins && message.flow === 'in' && (firstSendMessage?.time <= message?.time)) {
22
+ return (
23
+ <div className={`bubble message-text bubble-${message.flow} ${message?.conversationType === TencentCloudChat.TYPES.CONV_GROUP ? 'group' : ''}`}>
24
+ <MessageTextPlugins data={message} />
25
+ </div>
26
+ );
27
+ }
28
+ const urlToLink = function (text: string) {
29
+ if (!text) {
30
+ return text;
31
+ }
32
+ // eslint-disable-next-line no-useless-escape
33
+ const urlRegex = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
34
+ return text.replace(urlRegex, (website) => `<a class='website' href='${website}' target='_blank'>${website}</a>`);
35
+ };
20
36
  return (
21
37
  <div className={`bubble message-text bubble-${message.flow} ${message?.conversationType === TencentCloudChat.TYPES.CONV_GROUP ? 'group' : ''}`}>
22
38
  <div className="message-text-content">
23
39
  {context.text.map((item, index) => {
24
40
  const key = message.ID + index;
25
41
  if (item.name === 'text') {
26
- return <p className="message-text-content-p" key={item.src + key}>{item.text}</p>;
42
+ return (
43
+ <p
44
+ className="message-text-content-p"
45
+ key={item.src + key}
46
+ dangerouslySetInnerHTML={{ __html: urlToLink(item.text) }}
47
+ />
48
+ );
27
49
  }
28
50
  return <img className="text-img" key={item.src + key} src={item.src} alt="" />;
29
51
  })}
@@ -1,5 +1,6 @@
1
- import React, { PropsWithChildren, useState } from 'react';
1
+ import React, { PropsWithChildren, useEffect, useState } from 'react';
2
2
  import { MESSAGE_STATUS } from '../../constants';
3
+ import { isH5, isPC } from '../../utils/env';
3
4
  import { Model } from '../Model';
4
5
  import type { MessageContextProps } from './MessageText';
5
6
 
@@ -13,18 +14,20 @@ function MessageVideoWithContext <T extends MessageContextProps>(
13
14
  } = props;
14
15
 
15
16
  const [show, setShow] = useState(false);
17
+ const transparentPosterUrl = 'https://web.sdk.qcloud.com/im/assets/images/transparent.png';
16
18
 
17
19
  return (
18
- <div className="message-video">
20
+ <div className={`message-video ${isH5 ? 'message-video-h5' : ''}`}>
19
21
  <div className={`${message?.status === MESSAGE_STATUS.SUCCESS ? 'snap-video' : ''}`} role="button" tabIndex={0} onClick={() => { setShow(true); }}>
20
- <video muted controls={false} src={context.url} />
22
+ {isPC && (<video muted controls={false} src={context.url} />)}
23
+ {isH5 && (<img src={message.payload.snapshotUrl || transparentPosterUrl} style={{ maxHeight: '200px', maxWidth: '200px', borderRadius: '10px' }} />)}
21
24
  </div>
22
25
 
23
26
  {children}
24
27
  {
25
28
  show && (
26
- <Model onClick={() => { setShow(false); }}>
27
- <video className="play-video" muted controls src={context.url} />
29
+ <Model onClick={(e) => { e.stopPropagation(); setShow(false); }}>
30
+ <video className="play-video" autoPlay controls src={context.url} />
28
31
  </Model>
29
32
  )
30
33
  }
@@ -1,7 +1,9 @@
1
1
  import { useCallback } from 'react';
2
2
  import { useTranslation } from 'react-i18next';
3
3
  import { Message } from '@tencentcloud/chat';
4
- import { MESSAGE_FLOW, MESSAGE_OPERATE } from '../../../constants';
4
+ import { TUIStore } from '@tencentcloud/chat-uikit-engine';
5
+ import { CONSTANT_DISPATCH_TYPE, MESSAGE_FLOW, MESSAGE_OPERATE } from '../../../constants';
6
+ import { enableSampleTaskStatus } from '../../untils';
5
7
  import { useTUIChatActionContext, useTUIKitContext } from '../../../context';
6
8
  import { Toast } from '../../Toast';
7
9
 
@@ -17,7 +19,6 @@ export const useMessageHandler = (props?: MessageHandlerProps) => {
17
19
  } = props;
18
20
 
19
21
  const {
20
- removeMessage,
21
22
  editLocalMessage,
22
23
  operateMessage,
23
24
  revokeMessage,
@@ -27,40 +28,19 @@ export const useMessageHandler = (props?: MessageHandlerProps) => {
27
28
 
28
29
  const handleDelMessage = useCallback(async (event?) => {
29
30
  event.preventDefault();
30
- if (!message?.ID || !chat || !removeMessage) {
31
- return;
32
- }
33
-
34
- try {
35
- await chat.deleteMessage([message]);
36
- removeMessage(message);
37
- } catch (error) {
38
- if (handleError) {
39
- handleError({
40
- functionName: 'deleteMessage',
41
- error,
42
- });
43
- } else {
44
- Toast({ text: t('TUIChat.Error deleting message'), type: 'error' });
45
- throw new Error(error);
46
- }
47
- }
31
+ if (!message) return;
32
+ const messageModel = TUIStore.getMessageModel(message?.ID);
33
+ messageModel.deleteMessage();
48
34
  }, [message]);
49
35
 
50
36
  const handleRevokeMessage = useCallback(async (event?) => {
51
37
  event.preventDefault();
52
- if (!message?.ID || !chat || !editLocalMessage) {
53
- return;
54
- }
55
-
56
- try {
57
- if (revokeMessage) {
58
- await revokeMessage(message);
59
- } else {
60
- await chat.revokeMessage(message);
61
- }
38
+ if (!message) return;
39
+ const messageModel = TUIStore.getMessageModel(message?.ID);
40
+ messageModel.revokeMessage().then(() => {
62
41
  editLocalMessage(message);
63
- } catch (error) {
42
+ enableSampleTaskStatus('revokeMessage');
43
+ }).catch((error: any) => {
64
44
  if (handleError) {
65
45
  handleError({
66
46
  functionName: 'revokeMessage',
@@ -71,7 +51,7 @@ export const useMessageHandler = (props?: MessageHandlerProps) => {
71
51
  Toast({ text, type: 'error' });
72
52
  throw new Error(error);
73
53
  }
74
- }
54
+ });
75
55
  }, [message]);
76
56
 
77
57
  const handleReplyMessage = useCallback((event?) => {
@@ -110,7 +90,7 @@ export const useMessageHandler = (props?: MessageHandlerProps) => {
110
90
  try {
111
91
  const res = await chat.resendMessage(message);
112
92
  editLocalMessage(res?.data?.message);
113
- } catch (error) {
93
+ } catch (error: any) {
114
94
  if (handleError) {
115
95
  handleError({
116
96
  functionName: 'resendMessage',
@@ -27,6 +27,7 @@
27
27
  .bubble {
28
28
  .edit {
29
29
  color: #147aff;
30
+ padding: 3px;
30
31
  }
31
32
  }
32
33
  }
@@ -23,6 +23,7 @@
23
23
  .name {
24
24
  display: inline-block;
25
25
  padding-bottom: 3px;
26
+ max-width: 60%;
26
27
  }
27
28
  }
28
29
  }
@@ -57,7 +58,7 @@
57
58
  .bubble {
58
59
  padding: 8px 16px;
59
60
  &-in {
60
- border-radius: 16px 16px 16px 0;
61
+ border-radius: 0px 16px 16px 16px;
61
62
  &.group {
62
63
  border-radius: 0px 16px 16px 16px;
63
64
  }
@@ -104,8 +105,9 @@
104
105
  font-style: normal;
105
106
  font-weight: 500;
106
107
  font-size: 14px;
107
- line-height: 17px;
108
+ line-height: 24px;
108
109
  &-p {
110
+ white-space: pre-wrap;
109
111
  display: inline;
110
112
  vertical-align: middle;
111
113
  }
@@ -136,9 +138,13 @@
136
138
  img {
137
139
  max-width: 300px;
138
140
  }
141
+ .img-h5 {
142
+ max-width: 200px;
143
+ max-height: 200px;
144
+ }
139
145
  .big-image {
140
- max-width: 95%;
141
- max-height: 95%;
146
+ max-width: 90%;
147
+ max-height: 90%;
142
148
  }
143
149
  }
144
150
 
@@ -146,6 +152,8 @@
146
152
  max-width: 300px;
147
153
  .snap-video {
148
154
  position: relative;
155
+ height: 100%;
156
+ border-radius: 10px;
149
157
  &::before {
150
158
  position: absolute;
151
159
  z-index: 1;
@@ -163,14 +171,18 @@
163
171
  }
164
172
  video {
165
173
  width: 100%;
174
+ height: 100%;
166
175
  border-radius: 10px;
167
176
  }
168
177
  .play-video {
169
178
  max-width: 95%;
170
- max-height: 95%;
179
+ max-height: 65%;
171
180
  }
172
181
  }
173
-
182
+ .message-video.message-video-h5 {
183
+ max-width: 200px;
184
+ max-height: 200px;
185
+ }
174
186
  .message-file {
175
187
  display: flex;
176
188
  flex-direction: column;
@@ -317,6 +329,13 @@
317
329
  max-width: 300px;
318
330
  border-radius: 10px;
319
331
  }
332
+ .img-h5, .video-h5{
333
+ min-width: 60px;
334
+ min-height: 60px;
335
+ max-width: 200px;
336
+ max-height: 200px;
337
+ border-radius: 10px;
338
+ }
320
339
  &::before {
321
340
  position: absolute;
322
341
  content: "";
@@ -358,6 +377,7 @@
358
377
  .plugin-popup-box{
359
378
  bottom: auto;
360
379
  top: 100%;
380
+ overflow: hidden;
361
381
  }
362
382
 
363
383
  &-box {
@@ -449,17 +469,20 @@
449
469
  @keyframes highLightedAnimation {
450
470
  0% {
451
471
  opacity: 1;
472
+ color: #ff9c19;
452
473
  }
453
474
  25% {
454
475
  opacity: 0.3;
455
476
  }
456
477
  50% {
478
+ color: #ff9c19;
457
479
  opacity: 1;
458
480
  }
459
481
  75% {
460
482
  opacity: 0.3;
461
483
  }
462
484
  100% {
485
+ color: #ff9c19;
463
486
  opacity: 1;
464
487
  }
465
488
  }
@@ -478,3 +501,7 @@
478
501
  box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.25);
479
502
  }
480
503
  }
504
+
505
+ .website {
506
+ color: #147aff !important;
507
+ }
@@ -127,7 +127,7 @@ export function handleTipMessageShowContext(message: Message) {
127
127
  options.text = `${t('message.tip.member')}:${userName} ${t('message.tip.quit group')}`;
128
128
  break;
129
129
  case TencentCloudChat.TYPES.GRP_TIP_MBR_KICKED_OUT:
130
- options.text = `${t('message.tip.member')}:${userName} ${t('message.tip.by')}${message.payload.operatorID}${t(
130
+ options.text = `${t('message.tip.member')}:${userName} ${t('message.tip.by')} ${message.payload.operatorID} ${t(
131
131
  'message.tip.kicked out of group',
132
132
  )}`;
133
133
  break;
@@ -2,7 +2,7 @@ import React, { useEffect, useRef, useState } from 'react';
2
2
  import { useTranslation } from 'react-i18next';
3
3
  import { MESSAGE_OPERATE } from '../../constants';
4
4
  import { useTUIChatStateContext } from '../../context';
5
-
5
+ import { isPC } from '../../utils/env';
6
6
  import { useTUIMessageInputContext } from '../../context/TUIMessageInputContext';
7
7
  import { formatEmojiString } from '../TUIMessage/utils/emojiMap';
8
8
 
@@ -34,7 +34,7 @@ export function TUIMessageInputDefault():React.ReactElement {
34
34
  useEffect(() => {
35
35
  if (focus && textareaRef.current) {
36
36
  textareaRef.current.autofocus = true;
37
- textareaRef?.current?.focus();
37
+ isPC && textareaRef?.current?.focus();
38
38
  textareaRef?.current?.addEventListener('paste', handlePasete);
39
39
  }
40
40
  return () => {
@@ -4,7 +4,7 @@ import {
4
4
  useCallback,
5
5
  } from 'react';
6
6
  import { useTranslation } from 'react-i18next';
7
- import { useTUIChatActionContext } from '../../../context';
7
+ import { TUIChatService } from '@tencentcloud/chat-uikit-engine';
8
8
  import { emojiEnKey } from '../../TUIMessage/utils/emojiMap';
9
9
  import type { IbaseStateProps } from './useMessageInputState';
10
10
 
@@ -25,7 +25,6 @@ export function useEmojiPicker<T extends useEmojiPickerProps>(props:PropsWithChi
25
25
  } = props;
26
26
 
27
27
  const { i18n } = useTranslation();
28
- const { sendMessage, createFaceMessage } = useTUIChatActionContext('useEmojiPicker');
29
28
 
30
29
  const onSelectEmoji = (emoji:EmojiData) => {
31
30
  if (i18n.language === 'zh') {
@@ -36,10 +35,7 @@ export function useEmojiPicker<T extends useEmojiPickerProps>(props:PropsWithChi
36
35
  };
37
36
 
38
37
  const sendFaceMessage = useCallback((emoji:EmojiData) => {
39
- const message = createFaceMessage({
40
- payload: emoji,
41
- });
42
- sendMessage(message);
38
+ TUIChatService.sendFaceMessage({ payload: emoji });
43
39
  }, []);
44
40
 
45
41
  return {
@@ -1,5 +1,8 @@
1
1
  import { useEffect, useState } from 'react';
2
2
  import TencentCloudChat, { Conversation, Message } from '@tencentcloud/chat';
3
+ import {
4
+ TUIChatService,
5
+ } from '@tencentcloud/chat-uikit-engine';
3
6
  import { MESSAGE_OPERATE } from '../../../constants';
4
7
  import {
5
8
  useTUIChatActionContext, useTUIChatStateContext, useTUIKitContext,
@@ -11,15 +14,13 @@ export function useHandleForwardMessage(msg?:Message) {
11
14
  } = useTUIChatStateContext('TUIMessageInputDefault');
12
15
 
13
16
  const [conversationList, setConversationList] = useState([]);
14
- const { sendMessage, createForwardMessage } = useTUIChatActionContext('useHandleForwardMessage');
15
17
  const { chat } = useTUIKitContext('TUIChat');
16
18
 
17
19
  const message = msg || operateData[MESSAGE_OPERATE.FORWARD];
18
20
 
19
21
  const sendForwardMessage = (list:Array<Conversation>) => {
20
22
  list.map((item:Conversation) => {
21
- const forwardMessage = createForwardMessage({ conversation: item, message });
22
- sendMessage(forwardMessage);
23
+ TUIChatService.sendForwardMessage([item], [message]);
23
24
  return item;
24
25
  });
25
26
  };
@@ -3,11 +3,15 @@ import React, {
3
3
  ChangeEventHandler,
4
4
  MutableRefObject,
5
5
  } from 'react';
6
+ import {
7
+ TUIChatService,
8
+ } from '@tencentcloud/chat-uikit-engine';
6
9
  import { CONSTANT_DISPATCH_TYPE, MESSAGE_OPERATE, MESSAGE_TYPE_NAME } from '../../../constants';
7
10
  import {
8
11
  useTUIChatActionContext,
9
12
  useTUIKitContext,
10
13
  } from '../../../context';
14
+ import { enableSampleTaskStatus } from '../../untils';
11
15
  import { formatEmojiString } from '../../TUIMessage/utils/emojiMap';
12
16
  import { useHandleQuoteMessage } from './useHandleQuoteMessage';
13
17
  import type { IbaseStateProps, ICursorPos } from './useMessageInputState';
@@ -29,7 +33,7 @@ export const useMessageInputText = (props:useMessageInputTextProps) => {
29
33
  } = props;
30
34
 
31
35
  const { chat } = useTUIKitContext('useMessageInputText');
32
- const { sendMessage, createTextMessage, operateMessage } = useTUIChatActionContext('TUIMessageInput');
36
+ const { operateMessage, setFirstSendMessage } = useTUIChatActionContext('TUIMessageInput');
33
37
 
34
38
  const { cloudCustomData } = useHandleQuoteMessage();
35
39
 
@@ -64,8 +68,11 @@ export const useMessageInputText = (props:useMessageInputTextProps) => {
64
68
  if (cloudCustomData.messageReply) {
65
69
  options.cloudCustomData = JSON.stringify(cloudCustomData);
66
70
  }
67
- const message = createTextMessage(options);
68
- await sendMessage(message);
71
+ TUIChatService.sendTextMessage(options).then((res: any) => {
72
+ const { message } = res.data;
73
+ setFirstSendMessage(message);
74
+ });
75
+ enableSampleTaskStatus('sendMessage');
69
76
  dispatch({
70
77
  getNewText: (text:string) => '',
71
78
  type: CONSTANT_DISPATCH_TYPE.SET_TEXT,
@@ -2,7 +2,11 @@ import {
2
2
  PropsWithChildren,
3
3
  useCallback,
4
4
  } from 'react';
5
+ import {
6
+ TUIChatService,
7
+ } from '@tencentcloud/chat-uikit-engine';
5
8
  import { MESSAGE_TYPE_NAME } from '../../../constants';
9
+ import { enableSampleTaskStatus } from '../../untils';
6
10
  import { useTUIChatActionContext } from '../../../context';
7
11
  import type { IbaseStateProps } from './useMessageInputState';
8
12
 
@@ -12,29 +16,21 @@ export interface filesData {
12
16
 
13
17
  export function useUploadPicker<T extends IbaseStateProps>(props:PropsWithChildren<T>) {
14
18
  const {
15
- sendMessage,
16
- createImageMessage,
17
- createVideoMessage,
18
- createFileMessage,
19
19
  updateUploadPendingMessageList,
20
20
  } = useTUIChatActionContext('useUploadPicker');
21
21
 
22
22
  const creatUploadMessage = {
23
- [MESSAGE_TYPE_NAME.IMAGE]: createImageMessage,
24
- [MESSAGE_TYPE_NAME.VIDEO]: createVideoMessage,
25
- [MESSAGE_TYPE_NAME.FILE]: createFileMessage,
23
+ [MESSAGE_TYPE_NAME.IMAGE]: TUIChatService.sendImageMessage,
24
+ [MESSAGE_TYPE_NAME.VIDEO]: TUIChatService.sendVideoMessage,
25
+ [MESSAGE_TYPE_NAME.FILE]: TUIChatService.sendFileMessage,
26
26
  };
27
27
 
28
28
  const sendUploadMessage = useCallback((file: filesData, type:MESSAGE_TYPE_NAME) => {
29
- const message = creatUploadMessage[type]({
29
+ creatUploadMessage[type]({
30
30
  payload: file,
31
- onProgress(num:number) {
32
- message.progress = num;
33
- updateUploadPendingMessageList(message);
34
- },
35
31
  });
36
- sendMessage(message);
37
- }, [sendMessage]);
32
+ enableSampleTaskStatus('sendMessage');
33
+ }, []);
38
34
 
39
35
  return {
40
36
  sendUploadMessage,
@@ -10,7 +10,7 @@
10
10
 
11
11
  .input-plugin-popup {
12
12
  &-box {
13
- background: rgba(249, 249, 249, 0.94);
13
+ background: #FFFFFF;
14
14
  box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.25);
15
15
  border-radius: 16px;
16
16
  }