@droppii-org/chat-mobile 0.2.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 (294) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +101 -0
  3. package/lib/module/assets/images/icon_bot.png +0 -0
  4. package/lib/module/assets/images/index.js +9 -0
  5. package/lib/module/assets/images/index.js.map +1 -0
  6. package/lib/module/assets/images/tag_bot.png +0 -0
  7. package/lib/module/assets/images/tag_mall.png +0 -0
  8. package/lib/module/build-ignore.d.js +2 -0
  9. package/lib/module/build-ignore.d.js.map +1 -0
  10. package/lib/module/components/Avatar/Avatar.js +81 -0
  11. package/lib/module/components/Avatar/Avatar.js.map +1 -0
  12. package/lib/module/components/Avatar/Avatar.types.js +2 -0
  13. package/lib/module/components/Avatar/Avatar.types.js.map +1 -0
  14. package/lib/module/components/Avatar/Avatar.utils.js +44 -0
  15. package/lib/module/components/Avatar/Avatar.utils.js.map +1 -0
  16. package/lib/module/components/Avatar/AvatarBadge.js +28 -0
  17. package/lib/module/components/Avatar/AvatarBadge.js.map +1 -0
  18. package/lib/module/components/Avatar/DoubleAvatar.js +74 -0
  19. package/lib/module/components/Avatar/DoubleAvatar.js.map +1 -0
  20. package/lib/module/components/Avatar/SingleAvatar.js +53 -0
  21. package/lib/module/components/Avatar/SingleAvatar.js.map +1 -0
  22. package/lib/module/components/Avatar/index.js +7 -0
  23. package/lib/module/components/Avatar/index.js.map +1 -0
  24. package/lib/module/components/ThreadCard/AvatarSection.js +37 -0
  25. package/lib/module/components/ThreadCard/AvatarSection.js.map +1 -0
  26. package/lib/module/components/ThreadCard/NamePrefixIcon.js +36 -0
  27. package/lib/module/components/ThreadCard/NamePrefixIcon.js.map +1 -0
  28. package/lib/module/components/ThreadCard/ThreadCard.js +132 -0
  29. package/lib/module/components/ThreadCard/ThreadCard.js.map +1 -0
  30. package/lib/module/components/ThreadCard/UnreadBadge.js +35 -0
  31. package/lib/module/components/ThreadCard/UnreadBadge.js.map +1 -0
  32. package/lib/module/components/ThreadCard/index.js +7 -0
  33. package/lib/module/components/ThreadCard/index.js.map +1 -0
  34. package/lib/module/components/ThreadCard/thread-card.utils.js +51 -0
  35. package/lib/module/components/ThreadCard/thread-card.utils.js.map +1 -0
  36. package/lib/module/core/index.js +11 -0
  37. package/lib/module/core/index.js.map +1 -0
  38. package/lib/module/core/useChatListener.js +62 -0
  39. package/lib/module/core/useChatListener.js.map +1 -0
  40. package/lib/module/core/useUserListener.js +72 -0
  41. package/lib/module/core/useUserListener.js.map +1 -0
  42. package/lib/module/hooks/query-keys.js +10 -0
  43. package/lib/module/hooks/query-keys.js.map +1 -0
  44. package/lib/module/hooks/useChatMessages.js +163 -0
  45. package/lib/module/hooks/useChatMessages.js.map +1 -0
  46. package/lib/module/hooks/useConversationList.js +51 -0
  47. package/lib/module/hooks/useConversationList.js.map +1 -0
  48. package/lib/module/index.js +14 -0
  49. package/lib/module/index.js.map +1 -0
  50. package/lib/module/package.json +1 -0
  51. package/lib/module/screens/chat-detail/ChatAttachmentPanel.js +106 -0
  52. package/lib/module/screens/chat-detail/ChatAttachmentPanel.js.map +1 -0
  53. package/lib/module/screens/chat-detail/ChatComposer.js +288 -0
  54. package/lib/module/screens/chat-detail/ChatComposer.js.map +1 -0
  55. package/lib/module/screens/chat-detail/ChatDay.js +65 -0
  56. package/lib/module/screens/chat-detail/ChatDay.js.map +1 -0
  57. package/lib/module/screens/chat-detail/ChatDetail.js +104 -0
  58. package/lib/module/screens/chat-detail/ChatDetail.js.map +1 -0
  59. package/lib/module/screens/chat-detail/ChatDetailHeader.js +92 -0
  60. package/lib/module/screens/chat-detail/ChatDetailHeader.js.map +1 -0
  61. package/lib/module/screens/chat-detail/ChatList.js +145 -0
  62. package/lib/module/screens/chat-detail/ChatList.js.map +1 -0
  63. package/lib/module/screens/chat-detail/ChatLoadEarlier.js +23 -0
  64. package/lib/module/screens/chat-detail/ChatLoadEarlier.js.map +1 -0
  65. package/lib/module/screens/chat-detail/ChatQuickActions.js +85 -0
  66. package/lib/module/screens/chat-detail/ChatQuickActions.js.map +1 -0
  67. package/lib/module/screens/chat-detail/ChatScrollToBottom.js +12 -0
  68. package/lib/module/screens/chat-detail/ChatScrollToBottom.js.map +1 -0
  69. package/lib/module/screens/chat-detail/ChatTextBubble.js +62 -0
  70. package/lib/module/screens/chat-detail/ChatTextBubble.js.map +1 -0
  71. package/lib/module/screens/chat-detail/constants.js +59 -0
  72. package/lib/module/screens/chat-detail/constants.js.map +1 -0
  73. package/lib/module/screens/chat-detail/index.js +12 -0
  74. package/lib/module/screens/chat-detail/index.js.map +1 -0
  75. package/lib/module/screens/chat-detail/messages/ChatMessageBubble.js +24 -0
  76. package/lib/module/screens/chat-detail/messages/ChatMessageBubble.js.map +1 -0
  77. package/lib/module/screens/chat-detail/messages/types.js +4 -0
  78. package/lib/module/screens/chat-detail/messages/types.js.map +1 -0
  79. package/lib/module/screens/chat-detail/types.js +4 -0
  80. package/lib/module/screens/chat-detail/types.js.map +1 -0
  81. package/lib/module/screens/chat-detail/useChatActionPress.js +11 -0
  82. package/lib/module/screens/chat-detail/useChatActionPress.js.map +1 -0
  83. package/lib/module/screens/inbox/Inbox.js +134 -0
  84. package/lib/module/screens/inbox/Inbox.js.map +1 -0
  85. package/lib/module/screens/inbox/MessagesTab.js +58 -0
  86. package/lib/module/screens/inbox/MessagesTab.js.map +1 -0
  87. package/lib/module/screens/inbox/index.js +5 -0
  88. package/lib/module/screens/inbox/index.js.map +1 -0
  89. package/lib/module/services/apis.js +41 -0
  90. package/lib/module/services/apis.js.map +1 -0
  91. package/lib/module/services/index.js +5 -0
  92. package/lib/module/services/index.js.map +1 -0
  93. package/lib/module/services/message.js +38 -0
  94. package/lib/module/services/message.js.map +1 -0
  95. package/lib/module/store/conversation.js +89 -0
  96. package/lib/module/store/conversation.js.map +1 -0
  97. package/lib/module/store/index.js +6 -0
  98. package/lib/module/store/index.js.map +1 -0
  99. package/lib/module/store/storeConfig.js +19 -0
  100. package/lib/module/store/storeConfig.js.map +1 -0
  101. package/lib/module/store/user.js +25 -0
  102. package/lib/module/store/user.js.map +1 -0
  103. package/lib/module/translation/index.js +24 -0
  104. package/lib/module/translation/index.js.map +1 -0
  105. package/lib/module/translation/resources/i18n.js +10 -0
  106. package/lib/module/translation/resources/i18n.js.map +1 -0
  107. package/lib/module/types/auth.js +9 -0
  108. package/lib/module/types/auth.js.map +1 -0
  109. package/lib/module/types/chat.js +26 -0
  110. package/lib/module/types/chat.js.map +1 -0
  111. package/lib/module/types/message.js +16 -0
  112. package/lib/module/types/message.js.map +1 -0
  113. package/lib/module/utils/conversation.js +61 -0
  114. package/lib/module/utils/conversation.js.map +1 -0
  115. package/lib/module/utils/giftedChatMessage.js +90 -0
  116. package/lib/module/utils/giftedChatMessage.js.map +1 -0
  117. package/lib/module/utils/message.js +68 -0
  118. package/lib/module/utils/message.js.map +1 -0
  119. package/lib/module/utils/resolveMessageType.js +44 -0
  120. package/lib/module/utils/resolveMessageType.js.map +1 -0
  121. package/lib/typescript/package.json +1 -0
  122. package/lib/typescript/src/assets/images/index.d.ts +7 -0
  123. package/lib/typescript/src/assets/images/index.d.ts.map +1 -0
  124. package/lib/typescript/src/components/Avatar/Avatar.d.ts +4 -0
  125. package/lib/typescript/src/components/Avatar/Avatar.d.ts.map +1 -0
  126. package/lib/typescript/src/components/Avatar/Avatar.types.d.ts +18 -0
  127. package/lib/typescript/src/components/Avatar/Avatar.types.d.ts.map +1 -0
  128. package/lib/typescript/src/components/Avatar/Avatar.utils.d.ts +14 -0
  129. package/lib/typescript/src/components/Avatar/Avatar.utils.d.ts.map +1 -0
  130. package/lib/typescript/src/components/Avatar/AvatarBadge.d.ts +7 -0
  131. package/lib/typescript/src/components/Avatar/AvatarBadge.d.ts.map +1 -0
  132. package/lib/typescript/src/components/Avatar/DoubleAvatar.d.ts +13 -0
  133. package/lib/typescript/src/components/Avatar/DoubleAvatar.d.ts.map +1 -0
  134. package/lib/typescript/src/components/Avatar/SingleAvatar.d.ts +12 -0
  135. package/lib/typescript/src/components/Avatar/SingleAvatar.d.ts.map +1 -0
  136. package/lib/typescript/src/components/Avatar/index.d.ts +6 -0
  137. package/lib/typescript/src/components/Avatar/index.d.ts.map +1 -0
  138. package/lib/typescript/src/components/ThreadCard/AvatarSection.d.ts +8 -0
  139. package/lib/typescript/src/components/ThreadCard/AvatarSection.d.ts.map +1 -0
  140. package/lib/typescript/src/components/ThreadCard/NamePrefixIcon.d.ts +8 -0
  141. package/lib/typescript/src/components/ThreadCard/NamePrefixIcon.d.ts.map +1 -0
  142. package/lib/typescript/src/components/ThreadCard/ThreadCard.d.ts +11 -0
  143. package/lib/typescript/src/components/ThreadCard/ThreadCard.d.ts.map +1 -0
  144. package/lib/typescript/src/components/ThreadCard/UnreadBadge.d.ts +6 -0
  145. package/lib/typescript/src/components/ThreadCard/UnreadBadge.d.ts.map +1 -0
  146. package/lib/typescript/src/components/ThreadCard/index.d.ts +5 -0
  147. package/lib/typescript/src/components/ThreadCard/index.d.ts.map +1 -0
  148. package/lib/typescript/src/components/ThreadCard/thread-card.utils.d.ts +4 -0
  149. package/lib/typescript/src/components/ThreadCard/thread-card.utils.d.ts.map +1 -0
  150. package/lib/typescript/src/core/index.d.ts +3 -0
  151. package/lib/typescript/src/core/index.d.ts.map +1 -0
  152. package/lib/typescript/src/core/useChatListener.d.ts +2 -0
  153. package/lib/typescript/src/core/useChatListener.d.ts.map +1 -0
  154. package/lib/typescript/src/core/useUserListener.d.ts +2 -0
  155. package/lib/typescript/src/core/useUserListener.d.ts.map +1 -0
  156. package/lib/typescript/src/hooks/query-keys.d.ts +9 -0
  157. package/lib/typescript/src/hooks/query-keys.d.ts.map +1 -0
  158. package/lib/typescript/src/hooks/useChatMessages.d.ts +21 -0
  159. package/lib/typescript/src/hooks/useChatMessages.d.ts.map +1 -0
  160. package/lib/typescript/src/hooks/useConversationList.d.ts +8 -0
  161. package/lib/typescript/src/hooks/useConversationList.d.ts.map +1 -0
  162. package/lib/typescript/src/index.d.ts +14 -0
  163. package/lib/typescript/src/index.d.ts.map +1 -0
  164. package/lib/typescript/src/screens/chat-detail/ChatAttachmentPanel.d.ts +3 -0
  165. package/lib/typescript/src/screens/chat-detail/ChatAttachmentPanel.d.ts.map +1 -0
  166. package/lib/typescript/src/screens/chat-detail/ChatComposer.d.ts +3 -0
  167. package/lib/typescript/src/screens/chat-detail/ChatComposer.d.ts.map +1 -0
  168. package/lib/typescript/src/screens/chat-detail/ChatDay.d.ts +3 -0
  169. package/lib/typescript/src/screens/chat-detail/ChatDay.d.ts.map +1 -0
  170. package/lib/typescript/src/screens/chat-detail/ChatDetail.d.ts +4 -0
  171. package/lib/typescript/src/screens/chat-detail/ChatDetail.d.ts.map +1 -0
  172. package/lib/typescript/src/screens/chat-detail/ChatDetailHeader.d.ts +4 -0
  173. package/lib/typescript/src/screens/chat-detail/ChatDetailHeader.d.ts.map +1 -0
  174. package/lib/typescript/src/screens/chat-detail/ChatList.d.ts +3 -0
  175. package/lib/typescript/src/screens/chat-detail/ChatList.d.ts.map +1 -0
  176. package/lib/typescript/src/screens/chat-detail/ChatLoadEarlier.d.ts +3 -0
  177. package/lib/typescript/src/screens/chat-detail/ChatLoadEarlier.d.ts.map +1 -0
  178. package/lib/typescript/src/screens/chat-detail/ChatQuickActions.d.ts +3 -0
  179. package/lib/typescript/src/screens/chat-detail/ChatQuickActions.d.ts.map +1 -0
  180. package/lib/typescript/src/screens/chat-detail/ChatScrollToBottom.d.ts +2 -0
  181. package/lib/typescript/src/screens/chat-detail/ChatScrollToBottom.d.ts.map +1 -0
  182. package/lib/typescript/src/screens/chat-detail/ChatTextBubble.d.ts +3 -0
  183. package/lib/typescript/src/screens/chat-detail/ChatTextBubble.d.ts.map +1 -0
  184. package/lib/typescript/src/screens/chat-detail/constants.d.ts +17 -0
  185. package/lib/typescript/src/screens/chat-detail/constants.d.ts.map +1 -0
  186. package/lib/typescript/src/screens/chat-detail/index.d.ts +13 -0
  187. package/lib/typescript/src/screens/chat-detail/index.d.ts.map +1 -0
  188. package/lib/typescript/src/screens/chat-detail/messages/ChatMessageBubble.d.ts +3 -0
  189. package/lib/typescript/src/screens/chat-detail/messages/ChatMessageBubble.d.ts.map +1 -0
  190. package/lib/typescript/src/screens/chat-detail/messages/types.d.ts +13 -0
  191. package/lib/typescript/src/screens/chat-detail/messages/types.d.ts.map +1 -0
  192. package/lib/typescript/src/screens/chat-detail/types.d.ts +86 -0
  193. package/lib/typescript/src/screens/chat-detail/types.d.ts.map +1 -0
  194. package/lib/typescript/src/screens/chat-detail/useChatActionPress.d.ts +3 -0
  195. package/lib/typescript/src/screens/chat-detail/useChatActionPress.d.ts.map +1 -0
  196. package/lib/typescript/src/screens/inbox/Inbox.d.ts +10 -0
  197. package/lib/typescript/src/screens/inbox/Inbox.d.ts.map +1 -0
  198. package/lib/typescript/src/screens/inbox/MessagesTab.d.ts +7 -0
  199. package/lib/typescript/src/screens/inbox/MessagesTab.d.ts.map +1 -0
  200. package/lib/typescript/src/screens/inbox/index.d.ts +3 -0
  201. package/lib/typescript/src/screens/inbox/index.d.ts.map +1 -0
  202. package/lib/typescript/src/services/apis.d.ts +12 -0
  203. package/lib/typescript/src/services/apis.d.ts.map +1 -0
  204. package/lib/typescript/src/services/index.d.ts +3 -0
  205. package/lib/typescript/src/services/index.d.ts.map +1 -0
  206. package/lib/typescript/src/services/message.d.ts +21 -0
  207. package/lib/typescript/src/services/message.d.ts.map +1 -0
  208. package/lib/typescript/src/store/conversation.d.ts +24 -0
  209. package/lib/typescript/src/store/conversation.d.ts.map +1 -0
  210. package/lib/typescript/src/store/index.d.ts +4 -0
  211. package/lib/typescript/src/store/index.d.ts.map +1 -0
  212. package/lib/typescript/src/store/storeConfig.d.ts +4 -0
  213. package/lib/typescript/src/store/storeConfig.d.ts.map +1 -0
  214. package/lib/typescript/src/store/user.d.ts +12 -0
  215. package/lib/typescript/src/store/user.d.ts.map +1 -0
  216. package/lib/typescript/src/translation/index.d.ts +4 -0
  217. package/lib/typescript/src/translation/index.d.ts.map +1 -0
  218. package/lib/typescript/src/translation/resources/i18n.d.ts +5 -0
  219. package/lib/typescript/src/translation/resources/i18n.d.ts.map +1 -0
  220. package/lib/typescript/src/types/auth.d.ts +24 -0
  221. package/lib/typescript/src/types/auth.d.ts.map +1 -0
  222. package/lib/typescript/src/types/chat.d.ts +99 -0
  223. package/lib/typescript/src/types/chat.d.ts.map +1 -0
  224. package/lib/typescript/src/types/message.d.ts +15 -0
  225. package/lib/typescript/src/types/message.d.ts.map +1 -0
  226. package/lib/typescript/src/utils/conversation.d.ts +10 -0
  227. package/lib/typescript/src/utils/conversation.d.ts.map +1 -0
  228. package/lib/typescript/src/utils/giftedChatMessage.d.ts +10 -0
  229. package/lib/typescript/src/utils/giftedChatMessage.d.ts.map +1 -0
  230. package/lib/typescript/src/utils/message.d.ts +15 -0
  231. package/lib/typescript/src/utils/message.d.ts.map +1 -0
  232. package/lib/typescript/src/utils/resolveMessageType.d.ts +4 -0
  233. package/lib/typescript/src/utils/resolveMessageType.d.ts.map +1 -0
  234. package/package.json +209 -0
  235. package/src/assets/images/icon_bot.png +0 -0
  236. package/src/assets/images/index.ts +7 -0
  237. package/src/assets/images/tag_bot.png +0 -0
  238. package/src/assets/images/tag_mall.png +0 -0
  239. package/src/build-ignore.d.ts +24 -0
  240. package/src/components/Avatar/Avatar.tsx +105 -0
  241. package/src/components/Avatar/Avatar.types.ts +17 -0
  242. package/src/components/Avatar/Avatar.utils.ts +49 -0
  243. package/src/components/Avatar/AvatarBadge.tsx +29 -0
  244. package/src/components/Avatar/DoubleAvatar.tsx +89 -0
  245. package/src/components/Avatar/SingleAvatar.tsx +74 -0
  246. package/src/components/Avatar/index.ts +5 -0
  247. package/src/components/ThreadCard/AvatarSection.tsx +42 -0
  248. package/src/components/ThreadCard/NamePrefixIcon.tsx +45 -0
  249. package/src/components/ThreadCard/ThreadCard.tsx +145 -0
  250. package/src/components/ThreadCard/UnreadBadge.tsx +35 -0
  251. package/src/components/ThreadCard/index.ts +4 -0
  252. package/src/components/ThreadCard/thread-card.utils.ts +68 -0
  253. package/src/core/index.ts +10 -0
  254. package/src/core/useChatListener.ts +85 -0
  255. package/src/core/useUserListener.ts +86 -0
  256. package/src/hooks/query-keys.ts +11 -0
  257. package/src/hooks/useChatMessages.ts +243 -0
  258. package/src/hooks/useConversationList.ts +57 -0
  259. package/src/index.tsx +36 -0
  260. package/src/screens/chat-detail/ChatAttachmentPanel.tsx +142 -0
  261. package/src/screens/chat-detail/ChatComposer.tsx +412 -0
  262. package/src/screens/chat-detail/ChatDay.tsx +73 -0
  263. package/src/screens/chat-detail/ChatDetail.tsx +118 -0
  264. package/src/screens/chat-detail/ChatDetailHeader.tsx +114 -0
  265. package/src/screens/chat-detail/ChatList.tsx +187 -0
  266. package/src/screens/chat-detail/ChatLoadEarlier.tsx +20 -0
  267. package/src/screens/chat-detail/ChatQuickActions.tsx +108 -0
  268. package/src/screens/chat-detail/ChatScrollToBottom.tsx +8 -0
  269. package/src/screens/chat-detail/ChatTextBubble.tsx +73 -0
  270. package/src/screens/chat-detail/constants.ts +76 -0
  271. package/src/screens/chat-detail/index.ts +33 -0
  272. package/src/screens/chat-detail/messages/ChatMessageBubble.tsx +24 -0
  273. package/src/screens/chat-detail/messages/types.ts +14 -0
  274. package/src/screens/chat-detail/types.ts +97 -0
  275. package/src/screens/chat-detail/useChatActionPress.ts +17 -0
  276. package/src/screens/inbox/Inbox.tsx +164 -0
  277. package/src/screens/inbox/MessagesTab.tsx +62 -0
  278. package/src/screens/inbox/index.ts +2 -0
  279. package/src/services/apis.ts +60 -0
  280. package/src/services/index.ts +2 -0
  281. package/src/services/message.ts +61 -0
  282. package/src/store/conversation.ts +116 -0
  283. package/src/store/index.ts +3 -0
  284. package/src/store/storeConfig.ts +19 -0
  285. package/src/store/user.ts +26 -0
  286. package/src/translation/index.ts +30 -0
  287. package/src/translation/resources/i18n.ts +8 -0
  288. package/src/types/auth.ts +25 -0
  289. package/src/types/chat.ts +118 -0
  290. package/src/types/message.ts +17 -0
  291. package/src/utils/conversation.ts +106 -0
  292. package/src/utils/giftedChatMessage.ts +137 -0
  293. package/src/utils/message.ts +136 -0
  294. package/src/utils/resolveMessageType.ts +49 -0
@@ -0,0 +1,118 @@
1
+ import {
2
+ type MessageItem,
3
+ type SessionType,
4
+ type MessageReceiveOptType,
5
+ type GroupAtType,
6
+ } from '@droppii/openim-rn-client-sdk';
7
+
8
+ export interface ChatProviderProps {
9
+ children: React.ReactNode;
10
+ }
11
+
12
+ export enum DChatApplicationType {
13
+ BIZ = 'BIZ',
14
+ MALL = 'MALL',
15
+ }
16
+
17
+ export enum DChatCategory {
18
+ BIZ_BIZ = 'BIZ_BIZ',
19
+ BIZ_MALL = 'BIZ_MALL',
20
+ GROUP = 'GROUP',
21
+ BIZ_BOT_PDP = 'BIZ_BOT_PDP',
22
+ BIZ_BOT_CRM = 'BIZ_BOT_CRM',
23
+ }
24
+
25
+ export enum DChatType {
26
+ SINGLE = 'SINGLE',
27
+ GROUP = 'GROUP',
28
+ }
29
+
30
+ export enum DMemberRole {
31
+ AGENT = 'AGENT',
32
+ MEMBER = 'MEMBER',
33
+ }
34
+
35
+ export interface DConversationPeerUser {
36
+ id: string;
37
+ username?: string;
38
+ fullName?: string;
39
+ avatar?: string;
40
+ type: string;
41
+ botName?: string;
42
+ }
43
+
44
+ export interface DConversationPeer {
45
+ type: 'USER' | 'GROUP';
46
+ user: DConversationPeerUser | null;
47
+ group: null; // to be defined when group is implemented
48
+ }
49
+
50
+ export interface DConversationItem {
51
+ // Droppii API fields
52
+ conversationId: string;
53
+ chatCategory: DChatCategory;
54
+ chatType: DChatType;
55
+ applicationType: string;
56
+ memberRole: DMemberRole;
57
+ pinnedAt: string | null;
58
+ isMuted: boolean;
59
+ peer: DConversationPeerUser;
60
+ // Merged from OpenIM (available after getConversationListSplit merge)
61
+ lastMessage?: DMessageItem;
62
+ unreadCount?: number;
63
+ conversationType?: SessionType;
64
+ userID?: string;
65
+ groupID?: string;
66
+ showName?: string;
67
+ faceURL?: string;
68
+ recvMsgOpt?: MessageReceiveOptType;
69
+ groupAtType?: GroupAtType;
70
+ latestMsgSendTime?: number;
71
+ draftText?: string;
72
+ draftTextTime?: number;
73
+ isPinned?: boolean;
74
+ isNotInGroup?: boolean;
75
+ isPrivateChat?: boolean;
76
+ isMsgDestruct?: boolean;
77
+ attachedInfo?: string;
78
+ ex?: string;
79
+ }
80
+
81
+ export interface DConversationQueryParams {
82
+ applicationType: string;
83
+ page: number;
84
+ pageSize: number;
85
+ }
86
+
87
+ export interface DMessageItem extends MessageItem {
88
+ isInternal?: boolean;
89
+ atUserIDList?: unknown;
90
+ attachedInfo?: 'null';
91
+ options?: DMessageOption;
92
+ }
93
+
94
+ export interface DMessageOption {
95
+ conversationUpdate: boolean;
96
+ offlinePush: boolean;
97
+ senderConversationUpdate: boolean;
98
+ unreadCount: boolean;
99
+ }
100
+
101
+ export interface DMessagePushInfo {
102
+ title: string;
103
+ desc: string;
104
+ /**
105
+ * @instance DMessagePushInfoEx
106
+ */
107
+ ex: string;
108
+ signalInfo: string;
109
+ iospushSound: 'default';
110
+ iosbadgeCount: boolean;
111
+ }
112
+
113
+ export interface DMessagePushInfoEx {
114
+ icon: string; // url
115
+ conversationId: string;
116
+ title: string;
117
+ desc: string;
118
+ }
@@ -0,0 +1,17 @@
1
+ export const DChatMessageType = {
2
+ Text: 'TEXT',
3
+ Link: 'LINK',
4
+ Image: 'IMAGE',
5
+ Video: 'VIDEO',
6
+ File: 'FILE',
7
+ Order: 'ORDER',
8
+ Unsupported: 'UNSUPPORTED',
9
+ } as const;
10
+
11
+ export type DChatMessageType =
12
+ (typeof DChatMessageType)[keyof typeof DChatMessageType];
13
+
14
+ export const CUSTOM_MESSAGE_DATA_TYPE = {
15
+ LINK: 'LINK',
16
+ ORDER: 'ORDER',
17
+ } as const;
@@ -0,0 +1,106 @@
1
+ import {
2
+ SessionType,
3
+ type ConversationItem,
4
+ } from '@droppii/openim-rn-client-sdk';
5
+ import {
6
+ type DConversationItem,
7
+ type DMessageItem,
8
+ DChatCategory,
9
+ } from '../types/chat';
10
+
11
+ export const conversationCompare = (
12
+ a: ConversationItem,
13
+ b: ConversationItem
14
+ ) => {
15
+ if (a.isPinned !== b.isPinned) return a.isPinned ? -1 : 1;
16
+
17
+ const aCompare =
18
+ a.draftTextTime > a.latestMsgSendTime
19
+ ? a.draftTextTime
20
+ : a.latestMsgSendTime;
21
+ const bCompare =
22
+ b.draftTextTime > b.latestMsgSendTime
23
+ ? b.draftTextTime
24
+ : b.latestMsgSendTime;
25
+
26
+ return bCompare - aCompare;
27
+ };
28
+
29
+ export const dConversationCompare = (
30
+ a: DConversationItem,
31
+ b: DConversationItem
32
+ ) => {
33
+ const aIsPinned = a.pinnedAt != null;
34
+ const bIsPinned = b.pinnedAt != null;
35
+
36
+ if (aIsPinned !== bIsPinned) return aIsPinned ? -1 : 1;
37
+
38
+ const aCreateTime = a.lastMessage?.createTime ?? 0;
39
+ const bCreateTime = b.lastMessage?.createTime ?? 0;
40
+
41
+ return bCreateTime - aCreateTime;
42
+ };
43
+
44
+ export const mergeOpenIMIntoConversation = (
45
+ droppii: DConversationItem,
46
+ openim: ConversationItem
47
+ ): DConversationItem => {
48
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
49
+ const { latestMsg, conversationID, ...openimRest } = openim;
50
+
51
+ let lastMessage: DMessageItem | undefined = droppii.lastMessage;
52
+ if (latestMsg) {
53
+ try {
54
+ lastMessage = JSON.parse(latestMsg) as DMessageItem;
55
+ } catch {
56
+ // keep droppii lastMessage if parse fails
57
+ }
58
+ }
59
+
60
+ return {
61
+ ...droppii,
62
+ ...openimRest,
63
+ lastMessage,
64
+ };
65
+ };
66
+
67
+ export const getConversationID = (
68
+ sessionType: SessionType,
69
+ senderID?: string,
70
+ receiverID?: string
71
+ ) => {
72
+ const prefix =
73
+ sessionType === SessionType.Single
74
+ ? 'si'
75
+ : sessionType === SessionType.Notification
76
+ ? 'sn'
77
+ : 'sg';
78
+
79
+ return [prefix, senderID, receiverID].filter(Boolean).join('_');
80
+ };
81
+
82
+ export const isBotCrmChat = (chatCategory: DChatCategory) =>
83
+ chatCategory === DChatCategory.BIZ_BOT_CRM ||
84
+ chatCategory === DChatCategory.BIZ_BOT_PDP;
85
+
86
+ export const resolveDisplayName = (
87
+ item: DConversationItem,
88
+ t: (key: string) => string
89
+ ) => {
90
+ if (isBotCrmChat(item.chatCategory)) {
91
+ const botName = item.peer.botName?.trim();
92
+ if (botName) return botName;
93
+ return t('thread_card_bot_crm_name');
94
+ }
95
+
96
+ const fullName = item.peer.fullName?.trim();
97
+ if (fullName) return fullName;
98
+ const username = item.peer.username?.trim();
99
+ if (username) return username;
100
+ return t('thread_card_fallback_name');
101
+ };
102
+
103
+ export const resolveAvatarUrl = (item: DConversationItem) => {
104
+ if (isBotCrmChat(item.chatCategory)) return null;
105
+ return item.peer.avatar;
106
+ };
@@ -0,0 +1,137 @@
1
+ import { MessageStatus, MessageType } from '@droppii/openim-rn-client-sdk';
2
+ import type { IMessage } from 'react-native-gifted-chat';
3
+ import type { DChatMessageType } from '../types/message';
4
+ import type { DMessageItem } from '../types/chat';
5
+ import { resolveChatMessageType } from './resolveMessageType';
6
+
7
+ export type DGiftedChatMessage = IMessage & {
8
+ openIMMessage: DMessageItem;
9
+ messageType: DChatMessageType;
10
+ };
11
+
12
+ const SYSTEM_MESSAGE_TYPES = new Set<MessageType>([
13
+ MessageType.FriendAdded,
14
+ MessageType.OANotification,
15
+ MessageType.GroupCreated,
16
+ MessageType.GroupInfoUpdated,
17
+ MessageType.MemberQuit,
18
+ MessageType.GroupOwnerTransferred,
19
+ MessageType.MemberKicked,
20
+ MessageType.MemberInvited,
21
+ MessageType.MemberEnter,
22
+ MessageType.GroupDismissed,
23
+ MessageType.GroupMemberMuted,
24
+ MessageType.GroupMemberCancelMuted,
25
+ MessageType.GroupMuted,
26
+ MessageType.GroupCancelMuted,
27
+ MessageType.GroupAnnouncementUpdated,
28
+ MessageType.GroupNameUpdated,
29
+ MessageType.RevokeMessage,
30
+ ]);
31
+
32
+ const getMessageText = (message: DMessageItem): string => {
33
+ switch (message.contentType) {
34
+ case MessageType.TextMessage:
35
+ return message.textElem?.content ?? message.content;
36
+ case MessageType.AtTextMessage:
37
+ return message.atTextElem?.text ?? message.content;
38
+ case MessageType.QuoteMessage:
39
+ return message.quoteElem?.text ?? message.content;
40
+ case MessageType.PictureMessage:
41
+ return '';
42
+ case MessageType.VoiceMessage:
43
+ return message.soundElem?.sourceUrl ? '' : '[Tin nhắn thoại]';
44
+ case MessageType.VideoMessage:
45
+ return message.videoElem?.videoUrl ? '' : '[Video]';
46
+ case MessageType.FileMessage:
47
+ return message.fileElem?.fileName ?? message.content;
48
+ case MessageType.CardMessage:
49
+ return message.cardElem?.nickname ?? message.content;
50
+ case MessageType.LocationMessage:
51
+ return message.locationElem?.description ?? message.content;
52
+ case MessageType.CustomMessage:
53
+ return message.customElem?.description ?? message.content;
54
+ case MessageType.FaceMessage:
55
+ return '[Sticker]';
56
+ default:
57
+ if (message.notificationElem?.detail) {
58
+ return message.notificationElem.detail;
59
+ }
60
+ return message.content || '';
61
+ }
62
+ };
63
+
64
+ const mapMessageStatus = (
65
+ message: DMessageItem
66
+ ): Pick<IMessage, 'pending' | 'sent' | 'received'> => {
67
+ switch (message.status) {
68
+ case MessageStatus.Sending:
69
+ return { pending: true };
70
+ case MessageStatus.Succeed:
71
+ return { sent: true, received: message.isRead };
72
+ case MessageStatus.Failed:
73
+ return { pending: true };
74
+ default:
75
+ return {};
76
+ }
77
+ };
78
+
79
+ export const mapOpenIMMessageToGiftedChat = (
80
+ message: DMessageItem
81
+ ): DGiftedChatMessage => {
82
+ const gifted: DGiftedChatMessage = {
83
+ _id: message.clientMsgID || message.serverMsgID,
84
+ text: getMessageText(message),
85
+ createdAt: new Date(message.sendTime || message.createTime),
86
+ user: {
87
+ _id: String(message.sendID),
88
+ name: message.senderNickname,
89
+ avatar: message.senderFaceUrl || undefined,
90
+ },
91
+ openIMMessage: message,
92
+ messageType: resolveChatMessageType(message),
93
+ ...mapMessageStatus(message),
94
+ };
95
+
96
+ if (SYSTEM_MESSAGE_TYPES.has(message.contentType)) {
97
+ gifted.system = true;
98
+ }
99
+
100
+ if (message.contentType === MessageType.PictureMessage) {
101
+ const imageUrl =
102
+ message.pictureElem?.snapshotPicture?.url ||
103
+ message.pictureElem?.bigPicture?.url ||
104
+ message.pictureElem?.sourcePicture?.url;
105
+
106
+ if (imageUrl) {
107
+ gifted.image = imageUrl;
108
+ }
109
+ }
110
+
111
+ if (
112
+ message.contentType === MessageType.VideoMessage &&
113
+ message.videoElem?.videoUrl
114
+ ) {
115
+ gifted.video = message.videoElem.videoUrl;
116
+ }
117
+
118
+ if (
119
+ message.contentType === MessageType.VoiceMessage &&
120
+ message.soundElem?.sourceUrl
121
+ ) {
122
+ gifted.audio = message.soundElem.sourceUrl;
123
+ }
124
+
125
+ return gifted;
126
+ };
127
+
128
+ export const mapOpenIMMessagesToGiftedChat = (
129
+ messages: DMessageItem[]
130
+ ): DGiftedChatMessage[] => {
131
+ return messages
132
+ .map(mapOpenIMMessageToGiftedChat)
133
+ .sort(
134
+ (a, b) =>
135
+ new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()
136
+ );
137
+ };
@@ -0,0 +1,136 @@
1
+ import { SessionType, type MessageItem } from '@droppii/openim-rn-client-sdk';
2
+ import type { DMessageItem } from '../types/chat';
3
+ import { getConversationID } from './conversation';
4
+
5
+ const getMessageTime = (message: DMessageItem) =>
6
+ message.sendTime || message.createTime || 0;
7
+
8
+ const getMessageKey = (message: DMessageItem) =>
9
+ message.clientMsgID || message.serverMsgID;
10
+
11
+ export const mergeMessages = (
12
+ current: DMessageItem[],
13
+ incoming: DMessageItem[]
14
+ ): DMessageItem[] => {
15
+ const map = new Map<string, DMessageItem>();
16
+
17
+ for (const message of [...current, ...incoming]) {
18
+ const key = getMessageKey(message);
19
+ if (key) {
20
+ map.set(key, message);
21
+ }
22
+ }
23
+
24
+ return Array.from(map.values()).sort(
25
+ (a, b) => getMessageTime(a) - getMessageTime(b)
26
+ );
27
+ };
28
+
29
+ export const normalizeCreatedMessage = (
30
+ message: MessageItem | string
31
+ ): MessageItem => {
32
+ let normalized: unknown = message;
33
+
34
+ while (typeof normalized === 'string') {
35
+ normalized = JSON.parse(normalized);
36
+ }
37
+
38
+ if (normalized == null || typeof normalized !== 'object') {
39
+ throw new Error('Invalid OpenIM message payload');
40
+ }
41
+
42
+ return normalized as MessageItem;
43
+ };
44
+
45
+ export type HistoryPaginationAnchor = {
46
+ clientMsgID: string;
47
+ lastMinSeq?: number;
48
+ };
49
+
50
+ export const resolveHistoryLastMinSeq = (
51
+ history: { lastMinSeq?: number },
52
+ fallbackMessage?: DMessageItem
53
+ ): number => {
54
+ if (history.lastMinSeq != null) {
55
+ return history.lastMinSeq;
56
+ }
57
+
58
+ return fallbackMessage?.seq ?? 0;
59
+ };
60
+
61
+ export const getHistoryPaginationAnchor = (
62
+ messages: DMessageItem[]
63
+ ): HistoryPaginationAnchor | null => {
64
+ if (!messages.length) {
65
+ return null;
66
+ }
67
+
68
+ const oldest = messages.reduce(
69
+ (prev, curr) => (getMessageTime(curr) < getMessageTime(prev) ? curr : prev),
70
+ messages[0]!
71
+ );
72
+
73
+ if (!oldest?.clientMsgID) {
74
+ return null;
75
+ }
76
+
77
+ return {
78
+ clientMsgID: oldest.clientMsgID,
79
+ // lastMinSeq: oldest.seq ?? 0,
80
+ };
81
+ };
82
+
83
+ export const hasNewHistoryMessages = (
84
+ current: DMessageItem[],
85
+ incoming: DMessageItem[]
86
+ ): boolean => {
87
+ const currentKeys = new Set(
88
+ current.map((message) => getMessageKey(message)).filter(Boolean)
89
+ );
90
+
91
+ return incoming.some((message) => {
92
+ const key = getMessageKey(message);
93
+ return !!key && !currentKeys.has(key);
94
+ });
95
+ };
96
+
97
+ export const belongsToConversation = (
98
+ message: MessageItem,
99
+ conversationId: string,
100
+ groupID?: string
101
+ ): boolean => {
102
+ const runtimeConversationId = (
103
+ message as MessageItem & {
104
+ conversationID?: string;
105
+ }
106
+ ).conversationID;
107
+
108
+ if (runtimeConversationId === conversationId) {
109
+ return true;
110
+ }
111
+
112
+ if (groupID) {
113
+ return (
114
+ message.groupID === groupID ||
115
+ conversationId === `sg_${groupID}` ||
116
+ conversationId.endsWith(`_${groupID}`)
117
+ );
118
+ }
119
+
120
+ if (message.sessionType !== SessionType.Single) {
121
+ return false;
122
+ }
123
+
124
+ const forwardId = getConversationID(
125
+ message.sessionType,
126
+ message.sendID,
127
+ message.recvID
128
+ );
129
+ const reverseId = getConversationID(
130
+ message.sessionType,
131
+ message.recvID,
132
+ message.sendID
133
+ );
134
+
135
+ return conversationId === forwardId || conversationId === reverseId;
136
+ };
@@ -0,0 +1,49 @@
1
+ import { MessageType } from '@droppii/openim-rn-client-sdk';
2
+ import type { DMessageItem } from '../types/chat';
3
+ import { CUSTOM_MESSAGE_DATA_TYPE, DChatMessageType } from '../types/message';
4
+
5
+ const parseCustomDataType = (message: DMessageItem): string | undefined => {
6
+ const data = message.customElem?.data;
7
+ if (!data) {
8
+ return undefined;
9
+ }
10
+
11
+ try {
12
+ const parsed = JSON.parse(data) as { type?: string; messageType?: string };
13
+ return parsed.type ?? parsed.messageType;
14
+ } catch {
15
+ return undefined;
16
+ }
17
+ };
18
+
19
+ export const resolveChatMessageType = (
20
+ message: DMessageItem
21
+ ): DChatMessageType => {
22
+ switch (message.contentType) {
23
+ case MessageType.TextMessage:
24
+ case MessageType.AtTextMessage:
25
+ case MessageType.QuoteMessage:
26
+ return DChatMessageType.Text;
27
+ case MessageType.PictureMessage:
28
+ return DChatMessageType.Image;
29
+ case MessageType.VideoMessage:
30
+ return DChatMessageType.Video;
31
+ case MessageType.FileMessage:
32
+ return DChatMessageType.File;
33
+ case MessageType.CustomMessage: {
34
+ const customType = parseCustomDataType(message);
35
+
36
+ if (customType === CUSTOM_MESSAGE_DATA_TYPE.ORDER) {
37
+ return DChatMessageType.Order;
38
+ }
39
+
40
+ if (customType === CUSTOM_MESSAGE_DATA_TYPE.LINK) {
41
+ return DChatMessageType.Link;
42
+ }
43
+
44
+ return DChatMessageType.Unsupported;
45
+ }
46
+ default:
47
+ return DChatMessageType.Unsupported;
48
+ }
49
+ };