@droppii-org/chat-mobile 0.2.41 → 0.2.43

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 (78) hide show
  1. package/lib/module/components/messages/quotedMessage/index.js +6 -4
  2. package/lib/module/components/messages/quotedMessage/index.js.map +1 -1
  3. package/lib/module/context/ChatContext.js +5 -0
  4. package/lib/module/context/ChatContext.js.map +1 -1
  5. package/lib/module/core/useChatListener.js +12 -3
  6. package/lib/module/core/useChatListener.js.map +1 -1
  7. package/lib/module/hooks/message/useMessages.js +65 -0
  8. package/lib/module/hooks/message/useMessages.js.map +1 -0
  9. package/lib/module/hooks/message/useSendMessage.js +10 -2
  10. package/lib/module/hooks/message/useSendMessage.js.map +1 -1
  11. package/lib/module/index.js +0 -1
  12. package/lib/module/index.js.map +1 -1
  13. package/lib/module/screens/chat-detail/ChatDetail.js +35 -30
  14. package/lib/module/screens/chat-detail/ChatDetail.js.map +1 -1
  15. package/lib/module/screens/chat-detail/ChatListLegend.js +83 -84
  16. package/lib/module/screens/chat-detail/ChatListLegend.js.map +1 -1
  17. package/lib/module/screens/chat-detail/PinnedMessagesSheet.js +9 -9
  18. package/lib/module/screens/chat-detail/PinnedMessagesSheet.js.map +1 -1
  19. package/lib/module/screens/chat-detail/legend/LegendChatMessage.js +9 -3
  20. package/lib/module/screens/chat-detail/legend/LegendChatMessage.js.map +1 -1
  21. package/lib/module/services/attachmentOrchestrator.js +4 -0
  22. package/lib/module/services/attachmentOrchestrator.js.map +1 -1
  23. package/lib/module/store/message.js +148 -6
  24. package/lib/module/store/message.js.map +1 -1
  25. package/lib/module/types/chat.js.map +1 -1
  26. package/lib/module/types/events.js +8 -0
  27. package/lib/module/types/events.js.map +1 -0
  28. package/lib/module/utils/conversation.js +13 -1
  29. package/lib/module/utils/conversation.js.map +1 -1
  30. package/lib/typescript/src/components/messages/quotedMessage/index.d.ts +0 -1
  31. package/lib/typescript/src/components/messages/quotedMessage/index.d.ts.map +1 -1
  32. package/lib/typescript/src/context/ChatContext.d.ts.map +1 -1
  33. package/lib/typescript/src/core/useChatListener.d.ts.map +1 -1
  34. package/lib/typescript/src/hooks/message/useMessages.d.ts +16 -0
  35. package/lib/typescript/src/hooks/message/useMessages.d.ts.map +1 -0
  36. package/lib/typescript/src/hooks/message/useSendMessage.d.ts.map +1 -1
  37. package/lib/typescript/src/index.d.ts +0 -1
  38. package/lib/typescript/src/index.d.ts.map +1 -1
  39. package/lib/typescript/src/screens/chat-detail/ChatDetail.d.ts +1 -1
  40. package/lib/typescript/src/screens/chat-detail/ChatDetail.d.ts.map +1 -1
  41. package/lib/typescript/src/screens/chat-detail/ChatListLegend.d.ts +1 -1
  42. package/lib/typescript/src/screens/chat-detail/ChatListLegend.d.ts.map +1 -1
  43. package/lib/typescript/src/screens/chat-detail/PinnedMessagesSheet.d.ts +2 -1
  44. package/lib/typescript/src/screens/chat-detail/PinnedMessagesSheet.d.ts.map +1 -1
  45. package/lib/typescript/src/screens/chat-detail/legend/LegendChatMessage.d.ts +1 -1
  46. package/lib/typescript/src/screens/chat-detail/legend/LegendChatMessage.d.ts.map +1 -1
  47. package/lib/typescript/src/screens/chat-detail/types.d.ts +7 -7
  48. package/lib/typescript/src/screens/chat-detail/types.d.ts.map +1 -1
  49. package/lib/typescript/src/services/attachmentOrchestrator.d.ts.map +1 -1
  50. package/lib/typescript/src/store/message.d.ts.map +1 -1
  51. package/lib/typescript/src/types/chat.d.ts +18 -2
  52. package/lib/typescript/src/types/chat.d.ts.map +1 -1
  53. package/lib/typescript/src/types/events.d.ts +8 -0
  54. package/lib/typescript/src/types/events.d.ts.map +1 -0
  55. package/lib/typescript/src/utils/conversation.d.ts +1 -0
  56. package/lib/typescript/src/utils/conversation.d.ts.map +1 -1
  57. package/package.json +3 -4
  58. package/src/components/messages/quotedMessage/index.tsx +8 -8
  59. package/src/context/ChatContext.tsx +5 -0
  60. package/src/core/useChatListener.ts +18 -2
  61. package/src/hooks/message/useMessages.ts +82 -0
  62. package/src/hooks/message/useSendMessage.ts +13 -2
  63. package/src/index.tsx +0 -1
  64. package/src/screens/chat-detail/ChatDetail.tsx +37 -28
  65. package/src/screens/chat-detail/ChatListLegend.tsx +96 -90
  66. package/src/screens/chat-detail/PinnedMessagesSheet.tsx +12 -7
  67. package/src/screens/chat-detail/legend/LegendChatMessage.tsx +11 -3
  68. package/src/screens/chat-detail/types.ts +7 -7
  69. package/src/services/attachmentOrchestrator.ts +5 -0
  70. package/src/store/message.ts +174 -8
  71. package/src/types/chat.ts +20 -2
  72. package/src/types/events.ts +8 -0
  73. package/src/utils/conversation.ts +14 -0
  74. package/lib/module/hooks/useChatMessages.js +0 -155
  75. package/lib/module/hooks/useChatMessages.js.map +0 -1
  76. package/lib/typescript/src/hooks/useChatMessages.d.ts +0 -21
  77. package/lib/typescript/src/hooks/useChatMessages.d.ts.map +0 -1
  78. package/src/hooks/useChatMessages.ts +0 -246
@@ -1,246 +0,0 @@
1
- import OpenIMSDK, {
2
- OpenIMEvent,
3
- type MessageItem,
4
- } from '@droppii/openim-rn-client-sdk';
5
- import { useCallback, useEffect, useRef, useState } from 'react';
6
- import { ChatMessageAPI } from '../services/message';
7
- import {
8
- belongsToConversation,
9
- hasNewHistoryMessages,
10
- mergeMessages,
11
- } from '../utils/message';
12
- import { useMessageStore } from '../store/message';
13
- import { useUserStore } from '../store/user';
14
- import { useChatContext } from '../context';
15
- import { allSettled } from '../utils/promise';
16
- import { useSetIsShowFLashMessage } from '../context/global';
17
-
18
- type UseChatMessagesOptions = {
19
- conversationId: string;
20
- enabled?: boolean;
21
- pageSize?: number;
22
- };
23
-
24
- export function useChatMessages({
25
- conversationId,
26
- enabled = true,
27
- pageSize = 20,
28
- }: UseChatMessagesOptions) {
29
- const messages = useMessageStore((s) => s.messages);
30
- const hasMoreEarlier = useMessageStore((s) => s.hasMoreEarlier);
31
- const hasMoreNewer = useMessageStore((s) => s.hasMoreNewer);
32
- const setMessages = useMessageStore((s) => s.setMessages);
33
- const pushNewMessage = useMessageStore((s) => s.pushNewMessage);
34
- const reset = useMessageStore((s) => s.reset);
35
-
36
- const { applicationType } = useChatContext();
37
- const cachedUserId = useUserStore((s) => s.user?.userID);
38
- const [currentUserId, setCurrentUserId] = useState<string | undefined>(
39
- cachedUserId
40
- );
41
- const [isLoading, setIsLoading] = useState(false);
42
- const [isLoadingEarlier, setIsLoadingEarlier] = useState(false);
43
- const [isLoadingNewer, setIsLoadingNewer] = useState(false);
44
- const [error, setError] = useState<Error | null>(null);
45
-
46
- const conversationIdRef = useRef(conversationId);
47
- conversationIdRef.current = conversationId;
48
-
49
- const setIsShowFlashMessage = useSetIsShowFLashMessage();
50
-
51
- const fetchInitial = useCallback(async () => {
52
- if (!conversationId) return;
53
-
54
- setIsLoading(true);
55
- setError(null);
56
-
57
- try {
58
- // Fetch userId and history independently so an offline SDK state
59
- // doesn't block reading local SQLite history.
60
- const [historyResult, userIdResult] = await allSettled([
61
- ChatMessageAPI.fetchHistoryMessages(conversationId, {
62
- count: pageSize,
63
- applicationType,
64
- }),
65
- ChatMessageAPI.getCurrentUserId(),
66
- ]);
67
-
68
- if (userIdResult.status === 'fulfilled') {
69
- setCurrentUserId(userIdResult.value);
70
- }
71
-
72
- if (historyResult.status === 'fulfilled') {
73
- const initialMessages = historyResult.value.messageList;
74
- setMessages(
75
- mergeMessages([], initialMessages),
76
- !historyResult.value.isEnd
77
- );
78
- ChatMessageAPI.markConversationAsRead(conversationId).catch(
79
- () => undefined
80
- );
81
- } else {
82
- // Fallback: try searchLocalMessages to verify local SQLite is accessible offline
83
- console.warn(
84
- '[useChatMessages] getAdvancedHistoryMessageList failed, trying searchLocalMessages fallback:',
85
- historyResult.reason
86
- );
87
- const localResult = await ChatMessageAPI.searchLocalMessages(
88
- conversationId,
89
- { count: pageSize }
90
- );
91
- const localMessages = (localResult?.searchResultItems ?? []).flatMap(
92
- (item: any) => item.messageList ?? []
93
- );
94
- console.log(
95
- '[useChatMessages] searchLocalMessages fallback result:',
96
- localMessages.length,
97
- 'messages'
98
- );
99
- if (localMessages.length > 0) {
100
- setMessages(mergeMessages([], localMessages), false);
101
- } else {
102
- throw historyResult.reason;
103
- }
104
- }
105
- } catch (err) {
106
- setError(err instanceof Error ? err : new Error(String(err)));
107
- } finally {
108
- setIsLoading(false);
109
- }
110
- }, [applicationType, conversationId, pageSize, setMessages]);
111
-
112
- const onLoadEarlier = useCallback(async () => {
113
- if (isLoadingEarlier || !hasMoreEarlier || !messages.length) return;
114
-
115
- setIsLoadingEarlier(true);
116
- setError(null);
117
-
118
- try {
119
- const history = await ChatMessageAPI.fetchHistoryMessages(
120
- conversationId,
121
- {
122
- count: pageSize,
123
- startClientMsgID: messages[0]!.clientMsgID,
124
- }
125
- );
126
-
127
- const incoming = history.messageList;
128
- const hasNew = hasNewHistoryMessages(messages, incoming);
129
-
130
- if (hasNew) {
131
- setMessages(
132
- mergeMessages(messages, incoming),
133
- !history.isEnd && hasNew
134
- );
135
- } else {
136
- setMessages(messages, false);
137
- }
138
- } catch (err) {
139
- setError(err instanceof Error ? err : new Error(String(err)));
140
- } finally {
141
- setIsLoadingEarlier(false);
142
- }
143
- }, [
144
- conversationId,
145
- hasMoreEarlier,
146
- isLoadingEarlier,
147
- messages,
148
- pageSize,
149
- setMessages,
150
- ]);
151
-
152
- const onLoadNewer = useCallback(async () => {
153
- if (isLoadingNewer || !hasMoreNewer || !messages.length) return;
154
-
155
- setIsLoadingNewer(true);
156
- setError(null);
157
-
158
- try {
159
- const history = await ChatMessageAPI.fetchHistoryMessages(
160
- conversationId,
161
- {
162
- count: pageSize,
163
- startClientMsgID: messages[messages.length - 1]!.clientMsgID,
164
- }
165
- );
166
-
167
- const incoming = history.messageList;
168
- const hasNew = incoming.length > 0;
169
-
170
- if (hasNew) {
171
- setMessages(
172
- mergeMessages(messages, incoming),
173
- !history.isEnd && hasNew
174
- );
175
- }
176
- } catch (err) {
177
- setError(err instanceof Error ? err : new Error(String(err)));
178
- } finally {
179
- setIsLoadingNewer(false);
180
- }
181
- }, [
182
- conversationId,
183
- hasMoreNewer,
184
- isLoadingNewer,
185
- messages,
186
- pageSize,
187
- setMessages,
188
- ]);
189
-
190
- const appendIncomingMessages = useCallback(
191
- (incoming: MessageItem[]) => {
192
- console.log('[Listener] OnRecvNewMessages', {
193
- total: incoming.length,
194
- conversationId: conversationIdRef.current,
195
- clientMsgIDs: incoming.map((m) => m.clientMsgID),
196
- });
197
- const relevant = incoming.filter((message) =>
198
- belongsToConversation(message, conversationIdRef.current)
199
- );
200
-
201
- if (!relevant.length) return;
202
-
203
- relevant.forEach((msg) => pushNewMessage(msg));
204
- ChatMessageAPI.markConversationAsRead(conversationIdRef.current).catch(
205
- () => undefined
206
- );
207
- },
208
- [pushNewMessage]
209
- );
210
-
211
- useEffect(() => {
212
- reset();
213
-
214
- if (!enabled || !conversationId) return;
215
-
216
- fetchInitial();
217
- }, [conversationId, enabled, fetchInitial, reset]);
218
-
219
- useEffect(() => {
220
- if (!enabled || !conversationId) return;
221
- setIsShowFlashMessage(false);
222
- const handleNewMessages = (incoming: MessageItem[]) =>
223
- appendIncomingMessages(incoming);
224
-
225
- OpenIMSDK.on(OpenIMEvent.OnRecvNewMessages, handleNewMessages);
226
-
227
- return () => {
228
- setIsShowFlashMessage(true);
229
- OpenIMSDK.off(OpenIMEvent.OnRecvNewMessages, handleNewMessages);
230
- };
231
- }, [appendIncomingMessages, conversationId, enabled, setIsShowFlashMessage]);
232
-
233
- return {
234
- messages,
235
- currentUserId,
236
- isLoading,
237
- isLoadingEarlier,
238
- hasMoreEarlier,
239
- isLoadingNewer,
240
- hasMoreNewer,
241
- error,
242
- onLoadEarlier,
243
- onLoadNewer,
244
- refresh: fetchInitial,
245
- };
246
- }