@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.
- package/LICENSE +20 -0
- package/README.md +101 -0
- package/lib/module/assets/images/icon_bot.png +0 -0
- package/lib/module/assets/images/index.js +9 -0
- package/lib/module/assets/images/index.js.map +1 -0
- package/lib/module/assets/images/tag_bot.png +0 -0
- package/lib/module/assets/images/tag_mall.png +0 -0
- package/lib/module/build-ignore.d.js +2 -0
- package/lib/module/build-ignore.d.js.map +1 -0
- package/lib/module/components/Avatar/Avatar.js +81 -0
- package/lib/module/components/Avatar/Avatar.js.map +1 -0
- package/lib/module/components/Avatar/Avatar.types.js +2 -0
- package/lib/module/components/Avatar/Avatar.types.js.map +1 -0
- package/lib/module/components/Avatar/Avatar.utils.js +44 -0
- package/lib/module/components/Avatar/Avatar.utils.js.map +1 -0
- package/lib/module/components/Avatar/AvatarBadge.js +28 -0
- package/lib/module/components/Avatar/AvatarBadge.js.map +1 -0
- package/lib/module/components/Avatar/DoubleAvatar.js +74 -0
- package/lib/module/components/Avatar/DoubleAvatar.js.map +1 -0
- package/lib/module/components/Avatar/SingleAvatar.js +53 -0
- package/lib/module/components/Avatar/SingleAvatar.js.map +1 -0
- package/lib/module/components/Avatar/index.js +7 -0
- package/lib/module/components/Avatar/index.js.map +1 -0
- package/lib/module/components/ThreadCard/AvatarSection.js +37 -0
- package/lib/module/components/ThreadCard/AvatarSection.js.map +1 -0
- package/lib/module/components/ThreadCard/NamePrefixIcon.js +36 -0
- package/lib/module/components/ThreadCard/NamePrefixIcon.js.map +1 -0
- package/lib/module/components/ThreadCard/ThreadCard.js +132 -0
- package/lib/module/components/ThreadCard/ThreadCard.js.map +1 -0
- package/lib/module/components/ThreadCard/UnreadBadge.js +35 -0
- package/lib/module/components/ThreadCard/UnreadBadge.js.map +1 -0
- package/lib/module/components/ThreadCard/index.js +7 -0
- package/lib/module/components/ThreadCard/index.js.map +1 -0
- package/lib/module/components/ThreadCard/thread-card.utils.js +51 -0
- package/lib/module/components/ThreadCard/thread-card.utils.js.map +1 -0
- package/lib/module/core/index.js +11 -0
- package/lib/module/core/index.js.map +1 -0
- package/lib/module/core/useChatListener.js +62 -0
- package/lib/module/core/useChatListener.js.map +1 -0
- package/lib/module/core/useUserListener.js +72 -0
- package/lib/module/core/useUserListener.js.map +1 -0
- package/lib/module/hooks/query-keys.js +10 -0
- package/lib/module/hooks/query-keys.js.map +1 -0
- package/lib/module/hooks/useChatMessages.js +163 -0
- package/lib/module/hooks/useChatMessages.js.map +1 -0
- package/lib/module/hooks/useConversationList.js +51 -0
- package/lib/module/hooks/useConversationList.js.map +1 -0
- package/lib/module/index.js +14 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/screens/chat-detail/ChatAttachmentPanel.js +106 -0
- package/lib/module/screens/chat-detail/ChatAttachmentPanel.js.map +1 -0
- package/lib/module/screens/chat-detail/ChatComposer.js +288 -0
- package/lib/module/screens/chat-detail/ChatComposer.js.map +1 -0
- package/lib/module/screens/chat-detail/ChatDay.js +65 -0
- package/lib/module/screens/chat-detail/ChatDay.js.map +1 -0
- package/lib/module/screens/chat-detail/ChatDetail.js +104 -0
- package/lib/module/screens/chat-detail/ChatDetail.js.map +1 -0
- package/lib/module/screens/chat-detail/ChatDetailHeader.js +92 -0
- package/lib/module/screens/chat-detail/ChatDetailHeader.js.map +1 -0
- package/lib/module/screens/chat-detail/ChatList.js +145 -0
- package/lib/module/screens/chat-detail/ChatList.js.map +1 -0
- package/lib/module/screens/chat-detail/ChatLoadEarlier.js +23 -0
- package/lib/module/screens/chat-detail/ChatLoadEarlier.js.map +1 -0
- package/lib/module/screens/chat-detail/ChatQuickActions.js +85 -0
- package/lib/module/screens/chat-detail/ChatQuickActions.js.map +1 -0
- package/lib/module/screens/chat-detail/ChatScrollToBottom.js +12 -0
- package/lib/module/screens/chat-detail/ChatScrollToBottom.js.map +1 -0
- package/lib/module/screens/chat-detail/ChatTextBubble.js +62 -0
- package/lib/module/screens/chat-detail/ChatTextBubble.js.map +1 -0
- package/lib/module/screens/chat-detail/constants.js +59 -0
- package/lib/module/screens/chat-detail/constants.js.map +1 -0
- package/lib/module/screens/chat-detail/index.js +12 -0
- package/lib/module/screens/chat-detail/index.js.map +1 -0
- package/lib/module/screens/chat-detail/messages/ChatMessageBubble.js +24 -0
- package/lib/module/screens/chat-detail/messages/ChatMessageBubble.js.map +1 -0
- package/lib/module/screens/chat-detail/messages/types.js +4 -0
- package/lib/module/screens/chat-detail/messages/types.js.map +1 -0
- package/lib/module/screens/chat-detail/types.js +4 -0
- package/lib/module/screens/chat-detail/types.js.map +1 -0
- package/lib/module/screens/chat-detail/useChatActionPress.js +11 -0
- package/lib/module/screens/chat-detail/useChatActionPress.js.map +1 -0
- package/lib/module/screens/inbox/Inbox.js +134 -0
- package/lib/module/screens/inbox/Inbox.js.map +1 -0
- package/lib/module/screens/inbox/MessagesTab.js +58 -0
- package/lib/module/screens/inbox/MessagesTab.js.map +1 -0
- package/lib/module/screens/inbox/index.js +5 -0
- package/lib/module/screens/inbox/index.js.map +1 -0
- package/lib/module/services/apis.js +41 -0
- package/lib/module/services/apis.js.map +1 -0
- package/lib/module/services/index.js +5 -0
- package/lib/module/services/index.js.map +1 -0
- package/lib/module/services/message.js +38 -0
- package/lib/module/services/message.js.map +1 -0
- package/lib/module/store/conversation.js +89 -0
- package/lib/module/store/conversation.js.map +1 -0
- package/lib/module/store/index.js +6 -0
- package/lib/module/store/index.js.map +1 -0
- package/lib/module/store/storeConfig.js +19 -0
- package/lib/module/store/storeConfig.js.map +1 -0
- package/lib/module/store/user.js +25 -0
- package/lib/module/store/user.js.map +1 -0
- package/lib/module/translation/index.js +24 -0
- package/lib/module/translation/index.js.map +1 -0
- package/lib/module/translation/resources/i18n.js +10 -0
- package/lib/module/translation/resources/i18n.js.map +1 -0
- package/lib/module/types/auth.js +9 -0
- package/lib/module/types/auth.js.map +1 -0
- package/lib/module/types/chat.js +26 -0
- package/lib/module/types/chat.js.map +1 -0
- package/lib/module/types/message.js +16 -0
- package/lib/module/types/message.js.map +1 -0
- package/lib/module/utils/conversation.js +61 -0
- package/lib/module/utils/conversation.js.map +1 -0
- package/lib/module/utils/giftedChatMessage.js +90 -0
- package/lib/module/utils/giftedChatMessage.js.map +1 -0
- package/lib/module/utils/message.js +68 -0
- package/lib/module/utils/message.js.map +1 -0
- package/lib/module/utils/resolveMessageType.js +44 -0
- package/lib/module/utils/resolveMessageType.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/assets/images/index.d.ts +7 -0
- package/lib/typescript/src/assets/images/index.d.ts.map +1 -0
- package/lib/typescript/src/components/Avatar/Avatar.d.ts +4 -0
- package/lib/typescript/src/components/Avatar/Avatar.d.ts.map +1 -0
- package/lib/typescript/src/components/Avatar/Avatar.types.d.ts +18 -0
- package/lib/typescript/src/components/Avatar/Avatar.types.d.ts.map +1 -0
- package/lib/typescript/src/components/Avatar/Avatar.utils.d.ts +14 -0
- package/lib/typescript/src/components/Avatar/Avatar.utils.d.ts.map +1 -0
- package/lib/typescript/src/components/Avatar/AvatarBadge.d.ts +7 -0
- package/lib/typescript/src/components/Avatar/AvatarBadge.d.ts.map +1 -0
- package/lib/typescript/src/components/Avatar/DoubleAvatar.d.ts +13 -0
- package/lib/typescript/src/components/Avatar/DoubleAvatar.d.ts.map +1 -0
- package/lib/typescript/src/components/Avatar/SingleAvatar.d.ts +12 -0
- package/lib/typescript/src/components/Avatar/SingleAvatar.d.ts.map +1 -0
- package/lib/typescript/src/components/Avatar/index.d.ts +6 -0
- package/lib/typescript/src/components/Avatar/index.d.ts.map +1 -0
- package/lib/typescript/src/components/ThreadCard/AvatarSection.d.ts +8 -0
- package/lib/typescript/src/components/ThreadCard/AvatarSection.d.ts.map +1 -0
- package/lib/typescript/src/components/ThreadCard/NamePrefixIcon.d.ts +8 -0
- package/lib/typescript/src/components/ThreadCard/NamePrefixIcon.d.ts.map +1 -0
- package/lib/typescript/src/components/ThreadCard/ThreadCard.d.ts +11 -0
- package/lib/typescript/src/components/ThreadCard/ThreadCard.d.ts.map +1 -0
- package/lib/typescript/src/components/ThreadCard/UnreadBadge.d.ts +6 -0
- package/lib/typescript/src/components/ThreadCard/UnreadBadge.d.ts.map +1 -0
- package/lib/typescript/src/components/ThreadCard/index.d.ts +5 -0
- package/lib/typescript/src/components/ThreadCard/index.d.ts.map +1 -0
- package/lib/typescript/src/components/ThreadCard/thread-card.utils.d.ts +4 -0
- package/lib/typescript/src/components/ThreadCard/thread-card.utils.d.ts.map +1 -0
- package/lib/typescript/src/core/index.d.ts +3 -0
- package/lib/typescript/src/core/index.d.ts.map +1 -0
- package/lib/typescript/src/core/useChatListener.d.ts +2 -0
- package/lib/typescript/src/core/useChatListener.d.ts.map +1 -0
- package/lib/typescript/src/core/useUserListener.d.ts +2 -0
- package/lib/typescript/src/core/useUserListener.d.ts.map +1 -0
- package/lib/typescript/src/hooks/query-keys.d.ts +9 -0
- package/lib/typescript/src/hooks/query-keys.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useChatMessages.d.ts +21 -0
- package/lib/typescript/src/hooks/useChatMessages.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useConversationList.d.ts +8 -0
- package/lib/typescript/src/hooks/useConversationList.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +14 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/ChatAttachmentPanel.d.ts +3 -0
- package/lib/typescript/src/screens/chat-detail/ChatAttachmentPanel.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/ChatComposer.d.ts +3 -0
- package/lib/typescript/src/screens/chat-detail/ChatComposer.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/ChatDay.d.ts +3 -0
- package/lib/typescript/src/screens/chat-detail/ChatDay.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/ChatDetail.d.ts +4 -0
- package/lib/typescript/src/screens/chat-detail/ChatDetail.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/ChatDetailHeader.d.ts +4 -0
- package/lib/typescript/src/screens/chat-detail/ChatDetailHeader.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/ChatList.d.ts +3 -0
- package/lib/typescript/src/screens/chat-detail/ChatList.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/ChatLoadEarlier.d.ts +3 -0
- package/lib/typescript/src/screens/chat-detail/ChatLoadEarlier.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/ChatQuickActions.d.ts +3 -0
- package/lib/typescript/src/screens/chat-detail/ChatQuickActions.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/ChatScrollToBottom.d.ts +2 -0
- package/lib/typescript/src/screens/chat-detail/ChatScrollToBottom.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/ChatTextBubble.d.ts +3 -0
- package/lib/typescript/src/screens/chat-detail/ChatTextBubble.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/constants.d.ts +17 -0
- package/lib/typescript/src/screens/chat-detail/constants.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/index.d.ts +13 -0
- package/lib/typescript/src/screens/chat-detail/index.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/messages/ChatMessageBubble.d.ts +3 -0
- package/lib/typescript/src/screens/chat-detail/messages/ChatMessageBubble.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/messages/types.d.ts +13 -0
- package/lib/typescript/src/screens/chat-detail/messages/types.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/types.d.ts +86 -0
- package/lib/typescript/src/screens/chat-detail/types.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/useChatActionPress.d.ts +3 -0
- package/lib/typescript/src/screens/chat-detail/useChatActionPress.d.ts.map +1 -0
- package/lib/typescript/src/screens/inbox/Inbox.d.ts +10 -0
- package/lib/typescript/src/screens/inbox/Inbox.d.ts.map +1 -0
- package/lib/typescript/src/screens/inbox/MessagesTab.d.ts +7 -0
- package/lib/typescript/src/screens/inbox/MessagesTab.d.ts.map +1 -0
- package/lib/typescript/src/screens/inbox/index.d.ts +3 -0
- package/lib/typescript/src/screens/inbox/index.d.ts.map +1 -0
- package/lib/typescript/src/services/apis.d.ts +12 -0
- package/lib/typescript/src/services/apis.d.ts.map +1 -0
- package/lib/typescript/src/services/index.d.ts +3 -0
- package/lib/typescript/src/services/index.d.ts.map +1 -0
- package/lib/typescript/src/services/message.d.ts +21 -0
- package/lib/typescript/src/services/message.d.ts.map +1 -0
- package/lib/typescript/src/store/conversation.d.ts +24 -0
- package/lib/typescript/src/store/conversation.d.ts.map +1 -0
- package/lib/typescript/src/store/index.d.ts +4 -0
- package/lib/typescript/src/store/index.d.ts.map +1 -0
- package/lib/typescript/src/store/storeConfig.d.ts +4 -0
- package/lib/typescript/src/store/storeConfig.d.ts.map +1 -0
- package/lib/typescript/src/store/user.d.ts +12 -0
- package/lib/typescript/src/store/user.d.ts.map +1 -0
- package/lib/typescript/src/translation/index.d.ts +4 -0
- package/lib/typescript/src/translation/index.d.ts.map +1 -0
- package/lib/typescript/src/translation/resources/i18n.d.ts +5 -0
- package/lib/typescript/src/translation/resources/i18n.d.ts.map +1 -0
- package/lib/typescript/src/types/auth.d.ts +24 -0
- package/lib/typescript/src/types/auth.d.ts.map +1 -0
- package/lib/typescript/src/types/chat.d.ts +99 -0
- package/lib/typescript/src/types/chat.d.ts.map +1 -0
- package/lib/typescript/src/types/message.d.ts +15 -0
- package/lib/typescript/src/types/message.d.ts.map +1 -0
- package/lib/typescript/src/utils/conversation.d.ts +10 -0
- package/lib/typescript/src/utils/conversation.d.ts.map +1 -0
- package/lib/typescript/src/utils/giftedChatMessage.d.ts +10 -0
- package/lib/typescript/src/utils/giftedChatMessage.d.ts.map +1 -0
- package/lib/typescript/src/utils/message.d.ts +15 -0
- package/lib/typescript/src/utils/message.d.ts.map +1 -0
- package/lib/typescript/src/utils/resolveMessageType.d.ts +4 -0
- package/lib/typescript/src/utils/resolveMessageType.d.ts.map +1 -0
- package/package.json +209 -0
- package/src/assets/images/icon_bot.png +0 -0
- package/src/assets/images/index.ts +7 -0
- package/src/assets/images/tag_bot.png +0 -0
- package/src/assets/images/tag_mall.png +0 -0
- package/src/build-ignore.d.ts +24 -0
- package/src/components/Avatar/Avatar.tsx +105 -0
- package/src/components/Avatar/Avatar.types.ts +17 -0
- package/src/components/Avatar/Avatar.utils.ts +49 -0
- package/src/components/Avatar/AvatarBadge.tsx +29 -0
- package/src/components/Avatar/DoubleAvatar.tsx +89 -0
- package/src/components/Avatar/SingleAvatar.tsx +74 -0
- package/src/components/Avatar/index.ts +5 -0
- package/src/components/ThreadCard/AvatarSection.tsx +42 -0
- package/src/components/ThreadCard/NamePrefixIcon.tsx +45 -0
- package/src/components/ThreadCard/ThreadCard.tsx +145 -0
- package/src/components/ThreadCard/UnreadBadge.tsx +35 -0
- package/src/components/ThreadCard/index.ts +4 -0
- package/src/components/ThreadCard/thread-card.utils.ts +68 -0
- package/src/core/index.ts +10 -0
- package/src/core/useChatListener.ts +85 -0
- package/src/core/useUserListener.ts +86 -0
- package/src/hooks/query-keys.ts +11 -0
- package/src/hooks/useChatMessages.ts +243 -0
- package/src/hooks/useConversationList.ts +57 -0
- package/src/index.tsx +36 -0
- package/src/screens/chat-detail/ChatAttachmentPanel.tsx +142 -0
- package/src/screens/chat-detail/ChatComposer.tsx +412 -0
- package/src/screens/chat-detail/ChatDay.tsx +73 -0
- package/src/screens/chat-detail/ChatDetail.tsx +118 -0
- package/src/screens/chat-detail/ChatDetailHeader.tsx +114 -0
- package/src/screens/chat-detail/ChatList.tsx +187 -0
- package/src/screens/chat-detail/ChatLoadEarlier.tsx +20 -0
- package/src/screens/chat-detail/ChatQuickActions.tsx +108 -0
- package/src/screens/chat-detail/ChatScrollToBottom.tsx +8 -0
- package/src/screens/chat-detail/ChatTextBubble.tsx +73 -0
- package/src/screens/chat-detail/constants.ts +76 -0
- package/src/screens/chat-detail/index.ts +33 -0
- package/src/screens/chat-detail/messages/ChatMessageBubble.tsx +24 -0
- package/src/screens/chat-detail/messages/types.ts +14 -0
- package/src/screens/chat-detail/types.ts +97 -0
- package/src/screens/chat-detail/useChatActionPress.ts +17 -0
- package/src/screens/inbox/Inbox.tsx +164 -0
- package/src/screens/inbox/MessagesTab.tsx +62 -0
- package/src/screens/inbox/index.ts +2 -0
- package/src/services/apis.ts +60 -0
- package/src/services/index.ts +2 -0
- package/src/services/message.ts +61 -0
- package/src/store/conversation.ts +116 -0
- package/src/store/index.ts +3 -0
- package/src/store/storeConfig.ts +19 -0
- package/src/store/user.ts +26 -0
- package/src/translation/index.ts +30 -0
- package/src/translation/resources/i18n.ts +8 -0
- package/src/types/auth.ts +25 -0
- package/src/types/chat.ts +118 -0
- package/src/types/message.ts +17 -0
- package/src/utils/conversation.ts +106 -0
- package/src/utils/giftedChatMessage.ts +137 -0
- package/src/utils/message.ts +136 -0
- 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
|
+
};
|