@droppii-org/chat-mobile 0.2.37 → 0.2.38
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/lib/module/components/messages/linkMessage/index.js +1 -10
- package/lib/module/components/messages/linkMessage/index.js.map +1 -1
- package/lib/module/components/messages/quotedMessage/index.js +173 -0
- package/lib/module/components/messages/quotedMessage/index.js.map +1 -0
- package/lib/module/context/ChatContext.js +26 -22
- package/lib/module/context/ChatContext.js.map +1 -1
- package/lib/module/context/ChatDetailContext.js +7 -4
- package/lib/module/context/ChatDetailContext.js.map +1 -1
- package/lib/module/core/useChatListener.js +0 -1
- package/lib/module/core/useChatListener.js.map +1 -1
- package/lib/module/core/useUserListener.js +12 -21
- package/lib/module/core/useUserListener.js.map +1 -1
- package/lib/module/hooks/message/useSendMessage.js +26 -4
- package/lib/module/hooks/message/useSendMessage.js.map +1 -1
- package/lib/module/hooks/useChatMessages.js.map +1 -1
- package/lib/module/index.js +0 -7
- package/lib/module/index.js.map +1 -1
- package/lib/module/screens/chat-detail/ChatComposer.js +2 -1
- package/lib/module/screens/chat-detail/ChatComposer.js.map +1 -1
- package/lib/module/screens/chat-detail/ChatCurrentQuotedMessage.js +142 -0
- package/lib/module/screens/chat-detail/ChatCurrentQuotedMessage.js.map +1 -0
- package/lib/module/screens/chat-detail/ChatDetail.js.map +1 -1
- package/lib/module/screens/chat-detail/ChatListLegend.js.map +1 -1
- package/lib/module/screens/chat-detail/PinnedMessageBar.js.map +1 -1
- package/lib/module/screens/chat-detail/PinnedMessagesSheet.js.map +1 -1
- package/lib/module/screens/chat-detail/legend/LegendChatMessage.js +2 -1
- package/lib/module/screens/chat-detail/legend/LegendChatMessage.js.map +1 -1
- package/lib/module/screens/chat-detail/messageToolbox/MessageToolboxMenu.js +9 -1
- package/lib/module/screens/chat-detail/messageToolbox/MessageToolboxMenu.js.map +1 -1
- package/lib/module/screens/chat-detail/messageToolbox/MessageToolboxOverlay.js +11 -1
- package/lib/module/screens/chat-detail/messageToolbox/MessageToolboxOverlay.js.map +1 -1
- package/lib/module/screens/chat-detail/messageToolbox/messageToolbox.utils.js +5 -2
- package/lib/module/screens/chat-detail/messageToolbox/messageToolbox.utils.js.map +1 -1
- package/lib/module/screens/inbox/Inbox.js +1 -5
- package/lib/module/screens/inbox/Inbox.js.map +1 -1
- package/lib/module/services/apis.js +0 -3
- package/lib/module/services/apis.js.map +1 -1
- package/lib/module/services/message.js.map +1 -1
- package/lib/module/store/message.js.map +1 -1
- package/lib/module/store/pinnedMessage.js.map +1 -1
- package/lib/module/store/user.js +2 -3
- package/lib/module/store/user.js.map +1 -1
- package/lib/module/translation/resources/i18n.js +5 -1
- package/lib/module/translation/resources/i18n.js.map +1 -1
- package/lib/module/types/auth.js +0 -7
- package/lib/module/types/auth.js.map +1 -1
- package/lib/module/types/chat.js +12 -0
- package/lib/module/types/chat.js.map +1 -1
- package/lib/module/utils/legendListMessage.js +1 -0
- package/lib/module/utils/legendListMessage.js.map +1 -1
- package/lib/module/utils/message.js.map +1 -1
- package/lib/module/utils/messageUtils.js +18 -1
- package/lib/module/utils/messageUtils.js.map +1 -1
- package/lib/typescript/src/components/messages/linkMessage/index.d.ts.map +1 -1
- package/lib/typescript/src/components/messages/quotedMessage/index.d.ts +7 -0
- package/lib/typescript/src/components/messages/quotedMessage/index.d.ts.map +1 -0
- package/lib/typescript/src/components/messages/types.d.ts +2 -2
- package/lib/typescript/src/components/messages/types.d.ts.map +1 -1
- package/lib/typescript/src/context/ChatContext.d.ts.map +1 -1
- package/lib/typescript/src/context/ChatDetailContext.d.ts.map +1 -1
- package/lib/typescript/src/core/useChatListener.d.ts.map +1 -1
- package/lib/typescript/src/core/useUserListener.d.ts.map +1 -1
- package/lib/typescript/src/hooks/message/usePinMessage.d.ts +1 -1
- package/lib/typescript/src/hooks/message/useSendMessage.d.ts +2 -1
- package/lib/typescript/src/hooks/message/useSendMessage.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useChatMessages.d.ts +2 -2
- package/lib/typescript/src/hooks/useChatMessages.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/screens/chat-detail/ChatComposer.d.ts.map +1 -1
- package/lib/typescript/src/screens/chat-detail/ChatCurrentQuotedMessage.d.ts +2 -0
- package/lib/typescript/src/screens/chat-detail/ChatCurrentQuotedMessage.d.ts.map +1 -0
- package/lib/typescript/src/screens/chat-detail/ChatDetail.d.ts.map +1 -1
- package/lib/typescript/src/screens/chat-detail/PinnedMessageBar.d.ts +2 -2
- package/lib/typescript/src/screens/chat-detail/PinnedMessageBar.d.ts.map +1 -1
- package/lib/typescript/src/screens/chat-detail/PinnedMessagesSheet.d.ts +1 -2
- package/lib/typescript/src/screens/chat-detail/PinnedMessagesSheet.d.ts.map +1 -1
- package/lib/typescript/src/screens/chat-detail/legend/LegendChatMessage.d.ts +2 -3
- package/lib/typescript/src/screens/chat-detail/legend/LegendChatMessage.d.ts.map +1 -1
- package/lib/typescript/src/screens/chat-detail/messageToolbox/MessageToolboxMenu.d.ts +6 -4
- package/lib/typescript/src/screens/chat-detail/messageToolbox/MessageToolboxMenu.d.ts.map +1 -1
- package/lib/typescript/src/screens/chat-detail/messageToolbox/MessageToolboxOverlay.d.ts +4 -4
- package/lib/typescript/src/screens/chat-detail/messageToolbox/MessageToolboxOverlay.d.ts.map +1 -1
- package/lib/typescript/src/screens/chat-detail/messageToolbox/messageToolbox.utils.d.ts +5 -3
- package/lib/typescript/src/screens/chat-detail/messageToolbox/messageToolbox.utils.d.ts.map +1 -1
- package/lib/typescript/src/screens/chat-detail/messageToolbox/types.d.ts +2 -2
- package/lib/typescript/src/screens/chat-detail/messageToolbox/types.d.ts.map +1 -1
- package/lib/typescript/src/screens/chat-detail/types.d.ts +5 -5
- package/lib/typescript/src/screens/chat-detail/types.d.ts.map +1 -1
- package/lib/typescript/src/screens/inbox/Inbox.d.ts.map +1 -1
- package/lib/typescript/src/services/apis.d.ts +0 -1
- package/lib/typescript/src/services/apis.d.ts.map +1 -1
- package/lib/typescript/src/services/message.d.ts +1 -2
- package/lib/typescript/src/services/message.d.ts.map +1 -1
- package/lib/typescript/src/store/message.d.ts.map +1 -1
- package/lib/typescript/src/store/pinnedMessage.d.ts +4 -4
- package/lib/typescript/src/store/pinnedMessage.d.ts.map +1 -1
- package/lib/typescript/src/store/user.d.ts +4 -4
- package/lib/typescript/src/store/user.d.ts.map +1 -1
- package/lib/typescript/src/translation/resources/i18n.d.ts.map +1 -1
- package/lib/typescript/src/types/auth.d.ts +0 -5
- package/lib/typescript/src/types/auth.d.ts.map +1 -1
- package/lib/typescript/src/types/chat.d.ts +16 -36
- package/lib/typescript/src/types/chat.d.ts.map +1 -1
- package/lib/typescript/src/utils/legendListMessage.d.ts +4 -4
- package/lib/typescript/src/utils/legendListMessage.d.ts.map +1 -1
- package/lib/typescript/src/utils/message.d.ts +4 -5
- package/lib/typescript/src/utils/message.d.ts.map +1 -1
- package/lib/typescript/src/utils/messageUtils.d.ts +9 -7
- package/lib/typescript/src/utils/messageUtils.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/components/messages/linkMessage/index.tsx +1 -11
- package/src/components/messages/quotedMessage/index.tsx +197 -0
- package/src/components/messages/types.ts +2 -2
- package/src/context/ChatContext.tsx +30 -25
- package/src/context/ChatDetailContext.tsx +9 -3
- package/src/core/useChatListener.ts +0 -1
- package/src/core/useUserListener.ts +9 -25
- package/src/hooks/message/useSendMessage.ts +25 -4
- package/src/hooks/useChatMessages.ts +4 -6
- package/src/index.tsx +5 -6
- package/src/screens/chat-detail/ChatComposer.tsx +2 -0
- package/src/screens/chat-detail/ChatCurrentQuotedMessage.tsx +150 -0
- package/src/screens/chat-detail/ChatDetail.tsx +3 -2
- package/src/screens/chat-detail/ChatListLegend.tsx +3 -3
- package/src/screens/chat-detail/PinnedMessageBar.tsx +44 -46
- package/src/screens/chat-detail/PinnedMessagesSheet.tsx +7 -8
- package/src/screens/chat-detail/legend/LegendChatMessage.tsx +4 -4
- package/src/screens/chat-detail/messageToolbox/MessageToolboxMenu.tsx +15 -3
- package/src/screens/chat-detail/messageToolbox/MessageToolboxOverlay.tsx +15 -6
- package/src/screens/chat-detail/messageToolbox/messageToolbox.utils.ts +21 -12
- package/src/screens/chat-detail/messageToolbox/types.ts +2 -2
- package/src/screens/chat-detail/types.ts +5 -5
- package/src/screens/inbox/Inbox.tsx +1 -5
- package/src/services/apis.ts +0 -4
- package/src/services/message.ts +1 -2
- package/src/store/message.ts +3 -3
- package/src/store/pinnedMessage.ts +4 -4
- package/src/store/user.ts +5 -5
- package/src/translation/resources/i18n.ts +4 -0
- package/src/types/auth.ts +0 -6
- package/src/types/chat.ts +18 -40
- package/src/utils/legendListMessage.ts +4 -5
- package/src/utils/message.ts +10 -11
- package/src/utils/messageUtils.ts +37 -9
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
2
|
import type { MediaItem } from '../../hooks/useMediaViewer';
|
|
3
|
-
import type { DMessageItem } from '../../types/chat';
|
|
4
3
|
import type { MeasuredRect } from './messageToolbox/types';
|
|
4
|
+
import type { MessageItem } from '@droppii/openim-rn-client-sdk';
|
|
5
5
|
|
|
6
6
|
export type DChatActionIconProvider = 'MaterialCommunityIcons' | 'DroppiiNew';
|
|
7
7
|
|
|
@@ -70,9 +70,9 @@ export interface ChatComposerProps {
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
export interface ChatListProps {
|
|
73
|
-
messages?:
|
|
73
|
+
messages?: MessageItem[];
|
|
74
74
|
currentUserId?: string;
|
|
75
|
-
customMessageItemFactory?: (item:
|
|
75
|
+
customMessageItemFactory?: (item: MessageItem) => ReactNode;
|
|
76
76
|
onLoadEarlier?: () => void;
|
|
77
77
|
isLoading?: boolean;
|
|
78
78
|
isLoadingEarlier?: boolean;
|
|
@@ -82,7 +82,7 @@ export interface ChatListProps {
|
|
|
82
82
|
hasMoreNewer?: boolean;
|
|
83
83
|
onMediaPress?: (items: MediaItem[], index?: number) => void;
|
|
84
84
|
onPressUrl?: (url: string) => void;
|
|
85
|
-
onLongPress?: (message:
|
|
85
|
+
onLongPress?: (message: MessageItem, rect: MeasuredRect) => void;
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
export interface ChatDetailProps extends Omit<
|
|
@@ -96,6 +96,6 @@ export interface ChatDetailProps extends Omit<
|
|
|
96
96
|
enabled?: boolean;
|
|
97
97
|
showAddMember?: boolean;
|
|
98
98
|
onPressUrl?: (url: string) => void;
|
|
99
|
-
customMessageItemFactory?: (item:
|
|
99
|
+
customMessageItemFactory?: (item: MessageItem) => ReactNode;
|
|
100
100
|
pannelActions?: DChatPannelAction[];
|
|
101
101
|
}
|
|
@@ -3,8 +3,6 @@ import { StyleSheet } from 'react-native';
|
|
|
3
3
|
import { TabView } from 'react-native-tab-view';
|
|
4
4
|
import { KContainer, KImage, KLabel, KColors } from '@droppii/libs';
|
|
5
5
|
import { MessagesTab } from './MessagesTab';
|
|
6
|
-
import { useUserStore } from '../../store';
|
|
7
|
-
import { LoginStatus } from '@droppii/openim-rn-client-sdk';
|
|
8
6
|
|
|
9
7
|
interface InboxProps {
|
|
10
8
|
onPressThread?: (item: string) => void;
|
|
@@ -17,7 +15,6 @@ type TabRoute = { key: string; title: string };
|
|
|
17
15
|
|
|
18
16
|
const Inbox = memo(
|
|
19
17
|
({ onPressThread, onPressSearch, onPressEdit, onPressGroup }: InboxProps) => {
|
|
20
|
-
const connectStatus = useUserStore((state) => state.connectStatus);
|
|
21
18
|
const [index, setIndex] = useState(0);
|
|
22
19
|
const [routes] = useState<TabRoute[]>([
|
|
23
20
|
{ key: 'messages', title: 'Tin nhắn' },
|
|
@@ -25,13 +22,12 @@ const Inbox = memo(
|
|
|
25
22
|
|
|
26
23
|
const renderScene = useCallback(
|
|
27
24
|
({ route }: { route: TabRoute }) => {
|
|
28
|
-
if (connectStatus !== LoginStatus.Logged) return null;
|
|
29
25
|
if (route.key === 'messages') {
|
|
30
26
|
return <MessagesTab onPressThread={onPressThread} />;
|
|
31
27
|
}
|
|
32
28
|
return null;
|
|
33
29
|
},
|
|
34
|
-
[onPressThread
|
|
30
|
+
[onPressThread]
|
|
35
31
|
);
|
|
36
32
|
|
|
37
33
|
const renderTabBar = useCallback(
|
package/src/services/apis.ts
CHANGED
package/src/services/message.ts
CHANGED
|
@@ -3,7 +3,6 @@ import OpenIMSDK, {
|
|
|
3
3
|
type AdvancedGetMessageResult,
|
|
4
4
|
type MessageItem,
|
|
5
5
|
} from '@droppii/openim-rn-client-sdk';
|
|
6
|
-
import type { DMessageItem } from '../types/chat';
|
|
7
6
|
import { useConversationStore } from '../store';
|
|
8
7
|
import { getReceiverId } from '../utils/message';
|
|
9
8
|
|
|
@@ -34,7 +33,7 @@ export namespace ChatMessageAPI {
|
|
|
34
33
|
|
|
35
34
|
export async function sendTextMessage(params: {
|
|
36
35
|
text: string;
|
|
37
|
-
}): Promise<
|
|
36
|
+
}): Promise<MessageItem> {
|
|
38
37
|
const currentConversation = useConversationStore
|
|
39
38
|
.getState()
|
|
40
39
|
.getCurrentConversation();
|
package/src/store/message.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { create } from 'zustand';
|
|
2
2
|
import { MessageType } from '@droppii/openim-rn-client-sdk';
|
|
3
3
|
import type { MessageItem } from '@droppii/openim-rn-client-sdk';
|
|
4
|
-
import type {
|
|
4
|
+
import type { MessageStore } from '../types/chat';
|
|
5
5
|
import { mergeMessages } from '../utils/message';
|
|
6
6
|
|
|
7
7
|
export const useMessageStore = create<MessageStore>()((set, get) => ({
|
|
@@ -15,7 +15,7 @@ export const useMessageStore = create<MessageStore>()((set, get) => ({
|
|
|
15
15
|
|
|
16
16
|
pushNewMessage: (message: MessageItem) => {
|
|
17
17
|
set((state) => ({
|
|
18
|
-
messages: mergeMessages(state.messages, [message
|
|
18
|
+
messages: mergeMessages(state.messages, [message]),
|
|
19
19
|
}));
|
|
20
20
|
},
|
|
21
21
|
|
|
@@ -25,7 +25,7 @@ export const useMessageStore = create<MessageStore>()((set, get) => ({
|
|
|
25
25
|
(msg) => msg.clientMsgID === message.clientMsgID
|
|
26
26
|
);
|
|
27
27
|
if (idx < 0) return;
|
|
28
|
-
tmpList[idx] = { ...tmpList[idx]!, ...message }
|
|
28
|
+
tmpList[idx] = { ...tmpList[idx]!, ...message };
|
|
29
29
|
set({ messages: tmpList });
|
|
30
30
|
},
|
|
31
31
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import type { MessageItem } from '@droppii/openim-rn-client-sdk';
|
|
1
2
|
import { create } from 'zustand';
|
|
2
|
-
import type { DMessageItem } from '../types/chat';
|
|
3
3
|
|
|
4
4
|
export interface PinnedMessageStore {
|
|
5
|
-
messages:
|
|
5
|
+
messages: MessageItem[];
|
|
6
6
|
totalCount: number;
|
|
7
|
-
setMessages: (messages:
|
|
8
|
-
addMessage: (message:
|
|
7
|
+
setMessages: (messages: MessageItem[], totalCount: number) => void;
|
|
8
|
+
addMessage: (message: MessageItem) => void;
|
|
9
9
|
removeMessage: (clientMsgID: string) => void;
|
|
10
10
|
reset: () => void;
|
|
11
11
|
}
|
package/src/store/user.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { create } from 'zustand';
|
|
2
|
-
import {
|
|
3
|
-
import { SyncStatus } from '../types/
|
|
2
|
+
import { type SelfUserInfo } from '@droppii/openim-rn-client-sdk';
|
|
3
|
+
import { ConnectStatus, SyncStatus } from '../types/chat';
|
|
4
4
|
|
|
5
5
|
export interface UserStore {
|
|
6
6
|
user?: SelfUserInfo;
|
|
7
7
|
setUser: (user: SelfUserInfo) => void;
|
|
8
|
-
connectStatus:
|
|
9
|
-
updateConnectStatus: (status:
|
|
8
|
+
connectStatus: ConnectStatus;
|
|
9
|
+
updateConnectStatus: (status: ConnectStatus) => void;
|
|
10
10
|
syncStatus: SyncStatus;
|
|
11
11
|
updateSyncStatus: (status: SyncStatus) => void;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export const useUserStore = create<UserStore>()((set) => ({
|
|
15
|
-
connectStatus:
|
|
15
|
+
connectStatus: ConnectStatus.Disconnected,
|
|
16
16
|
syncStatus: SyncStatus.Loading,
|
|
17
17
|
setUser(user) {
|
|
18
18
|
set({ user });
|
|
@@ -76,6 +76,10 @@ const i18nKey: Record<string, string> = {
|
|
|
76
76
|
'send_order': 'Gửi đơn hàng',
|
|
77
77
|
'send_product': 'Gửi sản phẩm',
|
|
78
78
|
'create_appointment': 'Tạo lịch hẹn',
|
|
79
|
+
'chat:reply_message': 'Trả lời',
|
|
80
|
+
'chat:reply_to': 'Trả lời {{name}}',
|
|
81
|
+
'yourself': 'chính mình',
|
|
82
|
+
'you': 'Bạn',
|
|
79
83
|
};
|
|
80
84
|
|
|
81
85
|
export default {
|
package/src/types/auth.ts
CHANGED
package/src/types/chat.ts
CHANGED
|
@@ -37,6 +37,7 @@ export interface ChatContextType {
|
|
|
37
37
|
onPressFlashMessage?: (message: ConversationItem) => void;
|
|
38
38
|
isShowFLashMessage: boolean;
|
|
39
39
|
setIsShowFLashMessage: (value: boolean) => void;
|
|
40
|
+
handleLoginSdk: () => void;
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
export type ChatProviderProps = PropsWithChildren<{
|
|
@@ -98,6 +99,18 @@ export interface DBotStatus {
|
|
|
98
99
|
botSupportPlatform: unknown | null;
|
|
99
100
|
}
|
|
100
101
|
|
|
102
|
+
export enum SyncStatus {
|
|
103
|
+
Loading = 0,
|
|
104
|
+
Success = 1,
|
|
105
|
+
Failed = 2,
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export enum ConnectStatus {
|
|
109
|
+
Disconnected = 0,
|
|
110
|
+
Connected = 1,
|
|
111
|
+
Connecting = 2,
|
|
112
|
+
}
|
|
113
|
+
|
|
101
114
|
export interface DConversationPeerUser {
|
|
102
115
|
id: string;
|
|
103
116
|
username?: string;
|
|
@@ -119,42 +132,6 @@ export interface DConversationQueryParams {
|
|
|
119
132
|
pageSize: number;
|
|
120
133
|
}
|
|
121
134
|
|
|
122
|
-
export interface DMessageItem extends MessageItem {
|
|
123
|
-
isInternal?: boolean;
|
|
124
|
-
atUserIDList?: unknown;
|
|
125
|
-
attachedInfo?: 'null';
|
|
126
|
-
options?: DMessageOption;
|
|
127
|
-
isPinned?: boolean;
|
|
128
|
-
pinnedByUserID?: string;
|
|
129
|
-
pinnedTime?: number;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
export interface DMessageOption {
|
|
133
|
-
conversationUpdate: boolean;
|
|
134
|
-
offlinePush: boolean;
|
|
135
|
-
senderConversationUpdate: boolean;
|
|
136
|
-
unreadCount: boolean;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
export interface DMessagePushInfo {
|
|
140
|
-
title: string;
|
|
141
|
-
desc: string;
|
|
142
|
-
/**
|
|
143
|
-
* @instance DMessagePushInfoEx
|
|
144
|
-
*/
|
|
145
|
-
ex: string;
|
|
146
|
-
signalInfo: string;
|
|
147
|
-
iospushSound: 'default';
|
|
148
|
-
iosbadgeCount: boolean;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
export interface DMessagePushInfoEx {
|
|
152
|
-
icon: string; // url
|
|
153
|
-
conversationId: string;
|
|
154
|
-
title: string;
|
|
155
|
-
desc: string;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
135
|
export interface IMessageItemEx {
|
|
159
136
|
applicationType: DChatApplicationType;
|
|
160
137
|
sessionId?: string;
|
|
@@ -168,13 +145,13 @@ export interface IMessageItemEx {
|
|
|
168
145
|
}
|
|
169
146
|
|
|
170
147
|
export interface MessageStore {
|
|
171
|
-
messages:
|
|
148
|
+
messages: MessageItem[];
|
|
172
149
|
hasMoreEarlier: boolean;
|
|
173
150
|
hasMoreNewer: boolean;
|
|
174
|
-
setMessages: (messages:
|
|
151
|
+
setMessages: (messages: MessageItem[], hasMore: boolean) => void;
|
|
175
152
|
pushNewMessage: (message: MessageItem) => void;
|
|
176
153
|
updateOneMessage: (
|
|
177
|
-
message: Partial<
|
|
154
|
+
message: Partial<MessageItem> & Pick<MessageItem, 'clientMsgID'>
|
|
178
155
|
) => void;
|
|
179
156
|
deleteOneMessage: (clientMsgID: string) => void;
|
|
180
157
|
reset: () => void;
|
|
@@ -182,12 +159,13 @@ export interface MessageStore {
|
|
|
182
159
|
|
|
183
160
|
export interface ChatDetailContextType {
|
|
184
161
|
conversationFlow?: IConversationFlow;
|
|
185
|
-
refetchConversationFlow: () => void;
|
|
186
162
|
isBotConversation: boolean;
|
|
187
163
|
setConverationFlowStep: (step?: IConversationFlowStep) => void;
|
|
188
164
|
flowState?: DFlowState;
|
|
189
165
|
runButtonContext: (stringContext: DFlowContext) => Promise<boolean>;
|
|
190
166
|
conversation?: ConversationItem;
|
|
167
|
+
quotedMessage?: MessageItem;
|
|
168
|
+
setQuotedMessage: (item?: MessageItem) => void;
|
|
191
169
|
}
|
|
192
170
|
|
|
193
171
|
export interface ChatDetailProviderProps extends PropsWithChildren {}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { MessageType } from '@droppii/openim-rn-client-sdk';
|
|
2
|
-
import type { DMessageItem } from '../types/chat';
|
|
1
|
+
import { MessageType, type MessageItem } from '@droppii/openim-rn-client-sdk';
|
|
3
2
|
|
|
4
3
|
/**
|
|
5
4
|
* Extract message text based on content type
|
|
6
5
|
*/
|
|
7
|
-
export const getMessageText = (message:
|
|
6
|
+
export const getMessageText = (message: MessageItem): string => {
|
|
8
7
|
switch (message.contentType) {
|
|
9
8
|
case MessageType.TextMessage:
|
|
10
9
|
return message.textElem?.content ?? message.content;
|
|
@@ -49,7 +48,7 @@ export interface PrecomputedMessageData {
|
|
|
49
48
|
* Returns: Map of messageId -> {dayStart, messageType, createdAt}
|
|
50
49
|
*/
|
|
51
50
|
export const precomputeLegendListData = (
|
|
52
|
-
messages:
|
|
51
|
+
messages: MessageItem[]
|
|
53
52
|
): Map<string, PrecomputedMessageData> => {
|
|
54
53
|
const dataMap = new Map<string, PrecomputedMessageData>();
|
|
55
54
|
let lastDay: number | null = null;
|
|
@@ -81,7 +80,7 @@ export const precomputeLegendListData = (
|
|
|
81
80
|
* Kept for backward compatibility
|
|
82
81
|
*/
|
|
83
82
|
export const computeDayStarts = (
|
|
84
|
-
messages:
|
|
83
|
+
messages: MessageItem[]
|
|
85
84
|
): Map<string, boolean> => {
|
|
86
85
|
const dayStartMap = new Map<string, boolean>();
|
|
87
86
|
let lastDay: number | null = null;
|
package/src/utils/message.ts
CHANGED
|
@@ -4,20 +4,19 @@ import {
|
|
|
4
4
|
type ConversationItem,
|
|
5
5
|
type MessageItem,
|
|
6
6
|
} from '@droppii/openim-rn-client-sdk';
|
|
7
|
-
import { type DMessageItem } from '../types/chat';
|
|
8
7
|
import { getConversationID } from './conversation';
|
|
9
8
|
|
|
10
|
-
const getMessageTime = (message:
|
|
9
|
+
const getMessageTime = (message: MessageItem) =>
|
|
11
10
|
message.sendTime || message.createTime || 0;
|
|
12
11
|
|
|
13
|
-
const getMessageKey = (message:
|
|
12
|
+
const getMessageKey = (message: MessageItem) =>
|
|
14
13
|
message.clientMsgID || message.serverMsgID;
|
|
15
14
|
|
|
16
15
|
export const mergeMessages = (
|
|
17
|
-
current:
|
|
18
|
-
incoming:
|
|
19
|
-
):
|
|
20
|
-
const map = new Map<string,
|
|
16
|
+
current: MessageItem[],
|
|
17
|
+
incoming: MessageItem[]
|
|
18
|
+
): MessageItem[] => {
|
|
19
|
+
const map = new Map<string, MessageItem>();
|
|
21
20
|
|
|
22
21
|
for (const message of [...current, ...incoming]) {
|
|
23
22
|
const key = getMessageKey(message);
|
|
@@ -54,7 +53,7 @@ export type HistoryPaginationAnchor = {
|
|
|
54
53
|
|
|
55
54
|
export const resolveHistoryLastMinSeq = (
|
|
56
55
|
history: { lastMinSeq?: number },
|
|
57
|
-
fallbackMessage?:
|
|
56
|
+
fallbackMessage?: MessageItem
|
|
58
57
|
): number => {
|
|
59
58
|
if (history.lastMinSeq != null) {
|
|
60
59
|
return history.lastMinSeq;
|
|
@@ -64,7 +63,7 @@ export const resolveHistoryLastMinSeq = (
|
|
|
64
63
|
};
|
|
65
64
|
|
|
66
65
|
export const getHistoryPaginationAnchor = (
|
|
67
|
-
messages:
|
|
66
|
+
messages: MessageItem[]
|
|
68
67
|
): HistoryPaginationAnchor | null => {
|
|
69
68
|
if (!messages.length) {
|
|
70
69
|
return null;
|
|
@@ -86,8 +85,8 @@ export const getHistoryPaginationAnchor = (
|
|
|
86
85
|
};
|
|
87
86
|
|
|
88
87
|
export const hasNewHistoryMessages = (
|
|
89
|
-
current:
|
|
90
|
-
incoming:
|
|
88
|
+
current: MessageItem[],
|
|
89
|
+
incoming: MessageItem[]
|
|
91
90
|
): boolean => {
|
|
92
91
|
const currentKeys = new Set(
|
|
93
92
|
current.map((message) => getMessageKey(message)).filter(Boolean)
|
|
@@ -6,17 +6,17 @@ import {
|
|
|
6
6
|
MessageType,
|
|
7
7
|
PeerType,
|
|
8
8
|
type ConversationItem,
|
|
9
|
+
type MessageItem,
|
|
9
10
|
} from '@droppii/openim-rn-client-sdk';
|
|
10
|
-
import { type DMessageItem } from '../types/chat';
|
|
11
|
-
import type { IUrlMetadata } from '../types/common';
|
|
12
11
|
import { formatDuration } from './dateTimeUtils';
|
|
13
12
|
import { getFileIcon, getMimeType } from './imageUtils';
|
|
14
13
|
import { trans } from '../translation';
|
|
14
|
+
import type { IUrlMetadata } from '../types/common';
|
|
15
15
|
|
|
16
|
-
export const isMessageRevoked = (message:
|
|
16
|
+
export const isMessageRevoked = (message: MessageItem): boolean =>
|
|
17
17
|
message.contentType === MessageType.RevokeMessage;
|
|
18
18
|
|
|
19
|
-
export const extractTextContent = (message:
|
|
19
|
+
export const extractTextContent = (message: MessageItem): string => {
|
|
20
20
|
if (message.textElem?.content) return message.textElem.content;
|
|
21
21
|
try {
|
|
22
22
|
const parsed = JSON.parse(message.content) as { content?: string };
|
|
@@ -26,7 +26,8 @@ export const extractTextContent = (message: DMessageItem): string => {
|
|
|
26
26
|
}
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
-
export const getMessagePreview = (message
|
|
29
|
+
export const getMessagePreview = (message?: MessageItem): string => {
|
|
30
|
+
if (!message) return '';
|
|
30
31
|
// Handle standard message types
|
|
31
32
|
switch (message.contentType) {
|
|
32
33
|
case MessageType.TextMessage:
|
|
@@ -78,9 +79,11 @@ export const getMessagePreview = (message: DMessageItem): string => {
|
|
|
78
79
|
return urlText ? urlText : '';
|
|
79
80
|
|
|
80
81
|
case MessageType.AtTextMessage:
|
|
81
|
-
case MessageType.QuoteMessage:
|
|
82
82
|
return extractTextContent(message);
|
|
83
83
|
|
|
84
|
+
case MessageType.QuoteMessage:
|
|
85
|
+
return message?.quoteElem?.text || '';
|
|
86
|
+
|
|
84
87
|
case MessageType.RevokeMessage:
|
|
85
88
|
return trans('msg_type_revoke');
|
|
86
89
|
|
|
@@ -110,7 +113,7 @@ const getImageUrl = (pictureElem: any): string | undefined =>
|
|
|
110
113
|
|
|
111
114
|
// Link messages carry their rich-preview metadata (title/description/image)
|
|
112
115
|
// as a JSON string in `ex`, set by useSendMessage's IMessageItemEx payload.
|
|
113
|
-
const getUrlMetadata = (message:
|
|
116
|
+
const getUrlMetadata = (message: MessageItem): IUrlMetadata | undefined => {
|
|
114
117
|
if (!message.ex) return undefined;
|
|
115
118
|
try {
|
|
116
119
|
const parsed = JSON.parse(message.ex) as { urlMetadata?: IUrlMetadata };
|
|
@@ -121,7 +124,7 @@ const getUrlMetadata = (message: DMessageItem): IUrlMetadata | undefined => {
|
|
|
121
124
|
};
|
|
122
125
|
|
|
123
126
|
export const getPinnedMessagePreview = (
|
|
124
|
-
message:
|
|
127
|
+
message: MessageItem
|
|
125
128
|
): PinnedMessagePreview => {
|
|
126
129
|
switch (message.contentType) {
|
|
127
130
|
case MessageType.PictureMessage: {
|
|
@@ -183,7 +186,7 @@ export const getPinnedMessagePreview = (
|
|
|
183
186
|
};
|
|
184
187
|
|
|
185
188
|
export const getLastMessageText = (
|
|
186
|
-
message:
|
|
189
|
+
message: MessageItem | undefined,
|
|
187
190
|
currentUserId?: string,
|
|
188
191
|
conversation?: ConversationItem
|
|
189
192
|
): string => {
|
|
@@ -205,3 +208,28 @@ export const getLastMessageText = (
|
|
|
205
208
|
? trans('chat:revoked_by_sender', { sender })
|
|
206
209
|
: `${sender}: ${preview}`;
|
|
207
210
|
};
|
|
211
|
+
|
|
212
|
+
export const getReplySenderName = (
|
|
213
|
+
message?: MessageItem,
|
|
214
|
+
currentUserId?: string,
|
|
215
|
+
conversation?: ConversationItem,
|
|
216
|
+
isSent?: boolean
|
|
217
|
+
): string => {
|
|
218
|
+
if (!message) return '';
|
|
219
|
+
if (currentUserId && message.sendID === currentUserId)
|
|
220
|
+
return trans(isSent ? 'you' : 'yourself');
|
|
221
|
+
return conversation?.peerType === PeerType.Bot
|
|
222
|
+
? conversation?.showName || ''
|
|
223
|
+
: message?.senderNickname || '';
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
export const parseUrlMetadata = (ex?: string): IUrlMetadata | undefined => {
|
|
227
|
+
if (!ex) return undefined;
|
|
228
|
+
try {
|
|
229
|
+
const parsed = JSON.parse(ex) as any;
|
|
230
|
+
// Handle nested urlMetadata structure
|
|
231
|
+
return parsed?.urlMetadata || undefined;
|
|
232
|
+
} catch {
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
};
|