@messenger-box/platform-mobile 10.0.3-alpha.19 → 10.0.3-alpha.20

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 (23) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/lib/screens/inbox/components/DialogsListItem.js +423 -50
  3. package/lib/screens/inbox/components/DialogsListItem.js.map +1 -1
  4. package/lib/screens/inbox/components/ServiceDialogsListItem.js +375 -51
  5. package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +1 -1
  6. package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js +175 -0
  7. package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js.map +1 -0
  8. package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js +191 -0
  9. package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js.map +1 -0
  10. package/lib/screens/inbox/containers/Dialogs.js +536 -66
  11. package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
  12. package/lib/screens/inbox/containers/ThreadConversationView.js +95 -23
  13. package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
  14. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js +211 -0
  15. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js.map +1 -0
  16. package/package.json +2 -2
  17. package/src/screens/inbox/components/DialogsListItem.tsx +624 -107
  18. package/src/screens/inbox/components/ServiceDialogsListItem.tsx +506 -114
  19. package/src/screens/inbox/components/SupportServiceDialogsListItem.tsx +35 -17
  20. package/src/screens/inbox/components/workflow/dialogs-list-item-xstate.ts +145 -0
  21. package/src/screens/inbox/components/workflow/service-dialogs-list-item-xstate.ts +159 -0
  22. package/src/screens/inbox/containers/Dialogs.tsx +711 -169
  23. package/src/screens/inbox/containers/ThreadConversationView.tsx +151 -35
package/CHANGELOG.md CHANGED
@@ -3,6 +3,10 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [10.0.3-alpha.20](https://github.com/CDEBase/messenger-box/compare/v10.0.3-alpha.19...v10.0.3-alpha.20) (2025-04-12)
7
+
8
+ **Note:** Version bump only for package @messenger-box/platform-mobile
9
+
6
10
  ## [10.0.3-alpha.19](https://github.com/CDEBase/messenger-box/compare/v10.0.3-alpha.18...v10.0.3-alpha.19) (2025-04-10)
7
11
 
8
12
  **Note:** Version bump only for package @messenger-box/platform-mobile
@@ -1,4 +1,4 @@
1
- import React__default,{useState,useMemo}from'react';import {Pressable,HStack,Box,AvatarGroup,Avatar,AvatarFallbackText,AvatarBadge,Text,AvatarImage}from'@admin-layout/gluestack-ui-mobile';import {isToday,isYesterday,format}from'date-fns';import {useFocusEffect}from'@react-navigation/native';import {useMessagesQuery,useOnChatMessageAddedSubscription,OnChatMessageAddedDocument}from'common/graphql';import {startCase}from'lodash-es';import colors from'tailwindcss/colors';var __defProp = Object.defineProperty;
1
+ import React__default,{useRef,useCallback,useEffect,useMemo,useState}from'react';import {Pressable,HStack,Box,AvatarGroup,Avatar,AvatarFallbackText,AvatarBadge,Text,AvatarImage}from'@admin-layout/gluestack-ui-mobile';import {isToday,isYesterday,format}from'date-fns';import {useFocusEffect}from'@react-navigation/native';import {useMessagesQuery,useOnChatMessageAddedSubscription,OnChatMessageAddedDocument}from'common/graphql';import {startCase}from'lodash-es';import colors from'tailwindcss/colors';import {Actions,BaseState}from'./workflow/dialogs-list-item-xstate.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -27,15 +27,202 @@ const createdAtText = (value) => {
27
27
  return "Yesterday";
28
28
  return format(new Date(value), "MMM dd, yyyy");
29
29
  };
30
+ function useSafeMachine(machine) {
31
+ const [state, setState] = useState({
32
+ context: {
33
+ channelId: null,
34
+ currentUser: null,
35
+ messages: [],
36
+ loading: false,
37
+ error: null,
38
+ title: "",
39
+ channelMembers: [],
40
+ lastMessage: null
41
+ },
42
+ value: BaseState.Idle,
43
+ matches: (stateValue) => stateValue === BaseState.Idle
44
+ });
45
+ const send = useCallback((event) => {
46
+ try {
47
+ if (event.type === Actions.INITIAL_CONTEXT) {
48
+ setState((prev) => {
49
+ var _a, _b;
50
+ return __spreadProps(__spreadValues({}, prev), {
51
+ context: __spreadProps(__spreadValues({}, prev.context), {
52
+ channelId: ((_a = event.data) == null ? void 0 : _a.channelId) || null,
53
+ currentUser: ((_b = event.data) == null ? void 0 : _b.currentUser) || null,
54
+ loading: true
55
+ }),
56
+ value: BaseState.FetchingMessages
57
+ });
58
+ });
59
+ } else if (event.type === Actions.UPDATE_MESSAGES) {
60
+ setState((prev) => {
61
+ var _a, _b, _c, _d, _e, _f;
62
+ if ((_a = event.data) == null ? void 0 : _a.messages) {
63
+ const messages = event.data.messages;
64
+ if ((_b = event.data) == null ? void 0 : _b.directLastMessage) {
65
+ console.log("Using direct last message from event:", {
66
+ id: event.data.directLastMessage.id,
67
+ message: ((_c = event.data.directLastMessage.message) == null ? void 0 : _c.substring(0, 20)) + "..."
68
+ });
69
+ return __spreadProps(__spreadValues({}, prev), {
70
+ context: __spreadProps(__spreadValues({}, prev.context), {
71
+ messages,
72
+ lastMessage: event.data.directLastMessage,
73
+ loading: false
74
+ })
75
+ });
76
+ }
77
+ const sortedMessages = [...messages].sort((a, b) => new Date((b == null ? void 0 : b.updatedAt) || (b == null ? void 0 : b.createdAt)).getTime() - new Date((a == null ? void 0 : a.updatedAt) || (a == null ? void 0 : a.createdAt)).getTime());
78
+ const newLastMessage = sortedMessages.length > 0 ? sortedMessages[0] : null;
79
+ if (newLastMessage) {
80
+ console.log("Setting last message from bulk update:", {
81
+ id: newLastMessage.id,
82
+ message: ((_d = newLastMessage.message) == null ? void 0 : _d.substring(0, 20)) + "...",
83
+ date: newLastMessage.updatedAt || newLastMessage.createdAt
84
+ });
85
+ }
86
+ return __spreadProps(__spreadValues({}, prev), {
87
+ context: __spreadProps(__spreadValues({}, prev.context), {
88
+ messages,
89
+ lastMessage: newLastMessage,
90
+ loading: false
91
+ })
92
+ });
93
+ } else if ((_e = event.data) == null ? void 0 : _e.message) {
94
+ const newMessage = event.data.message;
95
+ const updatedMessages = [...prev.context.messages, newMessage];
96
+ console.log("Setting new message as lastMessage from subscription:", {
97
+ id: newMessage.id,
98
+ message: ((_f = newMessage.message) == null ? void 0 : _f.substring(0, 20)) + "...",
99
+ date: newMessage.createdAt || newMessage.updatedAt
100
+ });
101
+ return __spreadProps(__spreadValues({}, prev), {
102
+ context: __spreadProps(__spreadValues({}, prev.context), {
103
+ messages: updatedMessages,
104
+ lastMessage: newMessage,
105
+ loading: false
106
+ })
107
+ });
108
+ }
109
+ return prev;
110
+ });
111
+ } else if (event.type === Actions.SET_TITLE) {
112
+ setState((prev) => {
113
+ var _a;
114
+ return __spreadProps(__spreadValues({}, prev), {
115
+ context: __spreadProps(__spreadValues({}, prev.context), {
116
+ title: ((_a = event.data) == null ? void 0 : _a.title) || ""
117
+ })
118
+ });
119
+ });
120
+ } else if (event.type === Actions.START_LOADING) {
121
+ setState((prev) => __spreadProps(__spreadValues({}, prev), {
122
+ context: __spreadProps(__spreadValues({}, prev.context), {
123
+ loading: true
124
+ })
125
+ }));
126
+ } else if (event.type === Actions.STOP_LOADING) {
127
+ setState((prev) => __spreadProps(__spreadValues({}, prev), {
128
+ context: __spreadProps(__spreadValues({}, prev.context), {
129
+ loading: false
130
+ })
131
+ }));
132
+ }
133
+ } catch (error) {
134
+ console.error("Error sending event to state machine:", error);
135
+ }
136
+ }, []);
137
+ const stateWithMatches = useMemo(() => {
138
+ return __spreadProps(__spreadValues({}, state), {
139
+ matches: (stateValue) => {
140
+ try {
141
+ return state.value === stateValue;
142
+ } catch (error) {
143
+ console.error(`Error in matches function:`, error);
144
+ return false;
145
+ }
146
+ }
147
+ });
148
+ }, [state]);
149
+ return [stateWithMatches, send];
150
+ }
151
+ const LastMessageComponent = ({
152
+ subscribeToNewMessages,
153
+ title,
154
+ lastMessage,
155
+ channelId
156
+ }) => {
157
+ var _a, _b;
158
+ React__default.useEffect(() => {
159
+ const unsubscribe = subscribeToNewMessages();
160
+ return () => {
161
+ if (unsubscribe && typeof unsubscribe === "function") {
162
+ unsubscribe();
163
+ }
164
+ };
165
+ }, [channelId, subscribeToNewMessages]);
166
+ React__default.useEffect(() => {
167
+ var _a2, _b2, _c, _d;
168
+ console.log(`LastMessageComponent rendered for channel ${channelId}:`, {
169
+ hasLastMessage: !!lastMessage,
170
+ messageId: lastMessage == null ? void 0 : lastMessage.id,
171
+ messageText: ((_a2 = lastMessage == null ? void 0 : lastMessage.message) == null ? void 0 : _a2.substring(0, 20)) + (((_b2 = lastMessage == null ? void 0 : lastMessage.message) == null ? void 0 : _b2.length) > 20 ? "..." : ""),
172
+ date: (lastMessage == null ? void 0 : lastMessage.createdAt) ? new Date(lastMessage.createdAt).toISOString() : "none",
173
+ hasFiles: ((_d = (_c = lastMessage == null ? void 0 : lastMessage.files) == null ? void 0 : _c.data) == null ? void 0 : _d.length) > 0
174
+ });
175
+ }, [lastMessage, channelId]);
176
+ const count = 30;
177
+ const channelTitle = (title == null ? void 0 : title.slice(0, count)) + ((title == null ? void 0 : title.length) > count ? "..." : "") || "";
178
+ let displayMessage = "No messages yet";
179
+ if (lastMessage) {
180
+ if (lastMessage.message && lastMessage.message.trim() !== "") {
181
+ displayMessage = lastMessage.message;
182
+ } else if (((_b = (_a = lastMessage.files) == null ? void 0 : _a.data) == null ? void 0 : _b.length) > 0) {
183
+ displayMessage = "\u{1F4CE} File attachment";
184
+ } else {
185
+ displayMessage = "(Empty message)";
186
+ }
187
+ }
188
+ const displayDate = (lastMessage == null ? void 0 : lastMessage.createdAt) ? createdAtText(lastMessage.createdAt) : (lastMessage == null ? void 0 : lastMessage.updatedAt) ? createdAtText(lastMessage.updatedAt) : "";
189
+ return /* @__PURE__ */ React__default.createElement(HStack, { space: "sm", className: "flex-1 justify-between" }, /* @__PURE__ */ React__default.createElement(Box, { className: "flex-[0.8]" }, /* @__PURE__ */ React__default.createElement(Text, { color: colors.gray[600], className: "text-base text-wrap flex-wrap font-semibold" }, channelTitle), /* @__PURE__ */ React__default.createElement(Text, { color: colors.gray[600], numberOfLines: 1 }, displayMessage)), /* @__PURE__ */ React__default.createElement(Box, { className: "flex-[0.2]" }, /* @__PURE__ */ React__default.createElement(Text, { color: colors.gray[500] }, displayDate)));
190
+ };
30
191
  const DialogsListItemComponent = function DialogsListItem2({
31
192
  currentUser,
32
193
  selectedChannelId,
33
194
  channel,
34
- onOpen
195
+ onOpen,
196
+ forceRefresh
35
197
  }) {
36
- var _a, _b, _c;
198
+ var _a, _b, _c, _d, _e;
199
+ const isMountedRef = useRef(true);
37
200
  const parentId = null;
38
- const [messages, setMessages] = useState([]);
201
+ const [state, send] = useSafeMachine();
202
+ useCallback(() => {
203
+ try {
204
+ return (state == null ? void 0 : state.context) || {};
205
+ } catch (error) {
206
+ console.error("Error accessing state.context:", error);
207
+ return {};
208
+ }
209
+ }, [state]);
210
+ const safeContextProperty = useCallback((property, defaultValue = null) => {
211
+ var _a2, _b2;
212
+ try {
213
+ return (_b2 = (_a2 = state == null ? void 0 : state.context) == null ? void 0 : _a2[property]) != null ? _b2 : defaultValue;
214
+ } catch (error) {
215
+ console.error(`Error accessing state.context.${property}:`, error);
216
+ return defaultValue;
217
+ }
218
+ }, [state]);
219
+ const safeSend = useCallback((event) => {
220
+ try {
221
+ send(event);
222
+ } catch (error) {
223
+ console.error("Error sending event to state machine:", error, event);
224
+ }
225
+ }, [send]);
39
226
  const {
40
227
  data: messagesQuery,
41
228
  loading: messageLoading,
@@ -48,7 +235,15 @@ const DialogsListItemComponent = function DialogsListItem2({
48
235
  limit: 10
49
236
  },
50
237
  fetchPolicy: "cache-and-network",
51
- refetchWritePolicy: "merge"
238
+ refetchWritePolicy: "overwrite",
239
+ nextFetchPolicy: "network-only",
240
+ onCompleted: (data) => {
241
+ var _a2, _b2;
242
+ console.log(`Completed message query for channel ${channel == null ? void 0 : channel.id}:`, ((_b2 = (_a2 = data == null ? void 0 : data.messages) == null ? void 0 : _a2.data) == null ? void 0 : _b2.length) ? "Has messages" : "No messages");
243
+ },
244
+ onError: (error) => {
245
+ console.error(`Error fetching messages for channel ${channel == null ? void 0 : channel.id}:`, error);
246
+ }
52
247
  });
53
248
  const {
54
249
  data: newMessage,
@@ -59,37 +254,184 @@ const DialogsListItemComponent = function DialogsListItem2({
59
254
  channelId: (_b = channel == null ? void 0 : channel.id) == null ? void 0 : _b.toString()
60
255
  }
61
256
  });
62
- useFocusEffect(React__default.useCallback(() => {
257
+ useEffect(() => {
258
+ if (channel == null ? void 0 : channel.id) {
259
+ safeSend({
260
+ type: Actions.INITIAL_CONTEXT,
261
+ data: {
262
+ channelId: channel.id,
263
+ currentUser
264
+ }
265
+ });
266
+ }
267
+ return () => {
268
+ isMountedRef.current = false;
269
+ };
270
+ }, [channel == null ? void 0 : channel.id, currentUser, safeSend]);
271
+ const refreshDialogState = useCallback(() => {
63
272
  var _a2;
64
- refetchMessages({
65
- channelId: (_a2 = channel == null ? void 0 : channel.id) == null ? void 0 : _a2.toString(),
66
- parentId,
67
- limit: 10
273
+ if ((channel == null ? void 0 : channel.id) && isMountedRef.current) {
274
+ console.log("Forcing dialog state refresh for channel:", channel == null ? void 0 : channel.id);
275
+ safeSend({
276
+ type: Actions.START_LOADING
277
+ });
278
+ const options = {
279
+ channelId: (_a2 = channel == null ? void 0 : channel.id) == null ? void 0 : _a2.toString(),
280
+ parentId,
281
+ limit: 10
282
+ };
283
+ refetchMessages(options).then((result) => {
284
+ var _a3, _b2, _c2;
285
+ if (((_b2 = (_a3 = result.data) == null ? void 0 : _a3.messages) == null ? void 0 : _b2.data) && isMountedRef.current) {
286
+ console.log(`Refreshed ${result.data.messages.data.length} messages for channel ${channel == null ? void 0 : channel.id}`);
287
+ const sortedMessages = [...result.data.messages.data].sort((a, b) => new Date((b == null ? void 0 : b.updatedAt) || (b == null ? void 0 : b.createdAt)).getTime() - new Date((a == null ? void 0 : a.updatedAt) || (a == null ? void 0 : a.createdAt)).getTime());
288
+ const latestMessage = sortedMessages.length > 0 ? sortedMessages[0] : null;
289
+ if (latestMessage) {
290
+ console.log("Latest message after refresh:", {
291
+ id: latestMessage.id,
292
+ message: ((_c2 = latestMessage.message) == null ? void 0 : _c2.substring(0, 20)) + "...",
293
+ date: latestMessage.createdAt || latestMessage.updatedAt
294
+ });
295
+ }
296
+ safeSend({
297
+ type: Actions.UPDATE_MESSAGES,
298
+ data: {
299
+ messages: result.data.messages.data
300
+ }
301
+ });
302
+ }
303
+ safeSend({
304
+ type: Actions.STOP_LOADING
305
+ });
306
+ }).catch((err) => {
307
+ console.error("Error refreshing dialog state:", err);
308
+ safeSend({
309
+ type: Actions.STOP_LOADING
310
+ });
311
+ });
312
+ }
313
+ }, [channel == null ? void 0 : channel.id, refetchMessages, safeSend, isMountedRef, parentId]);
314
+ const firstRenderRef = useRef(true);
315
+ useRef(0);
316
+ useFocusEffect(React__default.useCallback(() => {
317
+ if (!(channel == null ? void 0 : channel.id))
318
+ return;
319
+ console.log("DialogsListItem focused for channel:", channel == null ? void 0 : channel.id);
320
+ if (firstRenderRef.current) {
321
+ console.log("Skipping initial focus refresh for channel:", channel == null ? void 0 : channel.id);
322
+ firstRenderRef.current = false;
323
+ return;
324
+ }
325
+ console.log("FOCUS EFFECT: Force refetching messages on navigation back for channel:", channel == null ? void 0 : channel.id);
326
+ safeSend({
327
+ type: Actions.START_LOADING
68
328
  });
329
+ const fetchFreshData = async () => {
330
+ var _a2, _b2, _c2, _d2, _e2, _f;
331
+ try {
332
+ const options = {
333
+ channelId: (_a2 = channel == null ? void 0 : channel.id) == null ? void 0 : _a2.toString(),
334
+ parentId,
335
+ limit: 10
336
+ };
337
+ const result = await refetchMessages(options);
338
+ console.log(`FOCUS EFFECT: Refetched ${((_d2 = (_c2 = (_b2 = result == null ? void 0 : result.data) == null ? void 0 : _b2.messages) == null ? void 0 : _c2.data) == null ? void 0 : _d2.length) || 0} messages for channel ${channel == null ? void 0 : channel.id}`);
339
+ if (((_f = (_e2 = result == null ? void 0 : result.data) == null ? void 0 : _e2.messages) == null ? void 0 : _f.data) && isMountedRef.current) {
340
+ const currentMessages = safeContextProperty("messages", []);
341
+ const fetchedMessages = result.data.messages.data;
342
+ console.log("Data comparison:", {
343
+ currentCount: currentMessages.length,
344
+ fetchedCount: fetchedMessages.length,
345
+ isDifferent: JSON.stringify(currentMessages) !== JSON.stringify(fetchedMessages)
346
+ });
347
+ safeSend({
348
+ type: Actions.UPDATE_MESSAGES,
349
+ data: {
350
+ messages: fetchedMessages
351
+ }
352
+ });
353
+ }
354
+ } catch (error) {
355
+ console.error("Error refetching messages on focus:", error);
356
+ } finally {
357
+ if (isMountedRef.current) {
358
+ safeSend({
359
+ type: Actions.STOP_LOADING
360
+ });
361
+ }
362
+ }
363
+ };
364
+ fetchFreshData();
69
365
  return () => {
70
366
  };
71
- }, []));
367
+ }, [channel == null ? void 0 : channel.id, refetchMessages, safeSend, parentId, isMountedRef]));
72
368
  React__default.useEffect(() => {
73
- var _a2, _b2, _c2;
74
- if (messagesQuery) {
75
- if ((_b2 = (_a2 = messagesQuery == null ? void 0 : messagesQuery.messages) == null ? void 0 : _a2.data) == null ? void 0 : _b2.length) {
76
- const msg = (_c2 = messagesQuery == null ? void 0 : messagesQuery.messages) == null ? void 0 : _c2.data;
77
- setMessages((pre) => [...pre, ...msg]);
369
+ var _a2, _b2, _c2, _d2, _e2;
370
+ if (((_a2 = messagesQuery == null ? void 0 : messagesQuery.messages) == null ? void 0 : _a2.data) && isMountedRef.current) {
371
+ const messages = messagesQuery.messages.data;
372
+ const messagesWithFiles = messages.filter((msg) => {
373
+ var _a3, _b3;
374
+ return ((_b3 = (_a3 = msg == null ? void 0 : msg.files) == null ? void 0 : _a3.data) == null ? void 0 : _b3.length) > 0;
375
+ });
376
+ console.log(`Updating messages for channel ${channel == null ? void 0 : channel.id}, count:`, messages.length, `(${messagesWithFiles.length} with files)`);
377
+ if (messages.length > 0) {
378
+ console.log("First message sample:", {
379
+ id: messages[0].id,
380
+ message: ((_b2 = messages[0].message) == null ? void 0 : _b2.substring(0, 20)) + "...",
381
+ createdAt: messages[0].createdAt,
382
+ hasFiles: ((_e2 = (_d2 = (_c2 = messages[0]) == null ? void 0 : _c2.files) == null ? void 0 : _d2.data) == null ? void 0 : _e2.length) > 0
383
+ });
78
384
  }
385
+ safeSend({
386
+ type: Actions.UPDATE_MESSAGES,
387
+ data: {
388
+ messages
389
+ }
390
+ });
79
391
  }
80
- }, [messagesQuery]);
81
- const lastMessage = useMemo(() => {
82
- var _a2;
83
- if (!(messages == null ? void 0 : messages.length)) {
84
- return null;
392
+ }, [messagesQuery, safeSend, channel == null ? void 0 : channel.id, isMountedRef]);
393
+ useEffect(() => {
394
+ if ((channel == null ? void 0 : channel.id) && isMountedRef.current) {
395
+ const timer = setTimeout(() => {
396
+ if (isMountedRef.current) {
397
+ console.log("Initial data refresh for channel:", channel.id);
398
+ refreshDialogState();
399
+ }
400
+ }, 100);
401
+ return () => {
402
+ clearTimeout(timer);
403
+ };
404
+ }
405
+ }, [channel == null ? void 0 : channel.id, refreshDialogState, isMountedRef]);
406
+ useEffect(() => {
407
+ if (forceRefresh && (channel == null ? void 0 : channel.id) && isMountedRef.current) {
408
+ console.log(`Force refreshing messages for channel ${channel == null ? void 0 : channel.id} due to forceRefresh prop`);
409
+ const timer = setTimeout(() => {
410
+ var _a2;
411
+ if (isMountedRef.current && refetchMessages) {
412
+ refetchMessages({
413
+ channelId: (_a2 = channel == null ? void 0 : channel.id) == null ? void 0 : _a2.toString(),
414
+ parentId,
415
+ limit: 10
416
+ }).then((result) => {
417
+ var _a3, _b2;
418
+ if (((_b2 = (_a3 = result == null ? void 0 : result.data) == null ? void 0 : _a3.messages) == null ? void 0 : _b2.data) && isMountedRef.current) {
419
+ console.log(`Force refresh completed for channel ${channel == null ? void 0 : channel.id} with ${result.data.messages.data.length} messages`);
420
+ safeSend({
421
+ type: Actions.UPDATE_MESSAGES,
422
+ data: {
423
+ messages: result.data.messages.data
424
+ }
425
+ });
426
+ }
427
+ }).catch((error) => {
428
+ console.error(`Error force refreshing channel ${channel == null ? void 0 : channel.id}:`, error);
429
+ });
430
+ }
431
+ }, 50);
432
+ return () => clearTimeout(timer);
85
433
  }
86
- const data = messages;
87
- const filteredData = data == null ? void 0 : data.filter((p) => (p == null ? void 0 : p.message) !== "");
88
- let filteredLastMessage = filteredData && (filteredData == null ? void 0 : filteredData.length) ? (_a2 = filteredData == null ? void 0 : filteredData.reduce((a, b) => {
89
- return new Date(a == null ? void 0 : a.updatedAt) > new Date(b == null ? void 0 : b.updatedAt) ? a : b;
90
- }, [])) != null ? _a2 : null : null;
91
- return filteredLastMessage;
92
- }, [messages]);
434
+ }, [channel == null ? void 0 : channel.id, forceRefresh, isMountedRef, refetchMessages, safeSend, parentId]);
93
435
  const channelMembers = useMemo(() => {
94
436
  var _a2, _b2, _c2;
95
437
  return (_c2 = (_b2 = (_a2 = channel == null ? void 0 : channel.members) == null ? void 0 : _a2.filter((ch) => {
@@ -97,21 +439,44 @@ const DialogsListItemComponent = function DialogsListItem2({
97
439
  return ((_a3 = ch == null ? void 0 : ch.user) == null ? void 0 : _a3.id) != (currentUser == null ? void 0 : currentUser.id) && ((_b3 = ch == null ? void 0 : ch.user) == null ? void 0 : _b3.__typename) == "UserAccount";
98
440
  })) == null ? void 0 : _b2.map((m) => m == null ? void 0 : m.user)) != null ? _c2 : null;
99
441
  }, [currentUser, channel]);
100
- const title = useMemo(() => {
442
+ useEffect(() => {
101
443
  var _a2, _b2, _c2;
102
- const titleString = (_c2 = (_b2 = (_a2 = channelMembers == null ? void 0 : channelMembers.map((u) => {
103
- var _a3;
104
- return (u == null ? void 0 : u.givenName) + " " + ((_a3 = u == null ? void 0 : u.familyName) != null ? _a3 : "");
105
- })) == null ? void 0 : _a2.filter((mu) => mu)) == null ? void 0 : _b2.join(", ")) != null ? _c2 : "";
444
+ if (channelMembers && isMountedRef.current) {
445
+ const titleString = (_c2 = (_b2 = (_a2 = channelMembers == null ? void 0 : channelMembers.map((u) => {
446
+ var _a3;
447
+ return (u == null ? void 0 : u.givenName) + " " + ((_a3 = u == null ? void 0 : u.familyName) != null ? _a3 : "");
448
+ })) == null ? void 0 : _a2.filter((mu) => mu)) == null ? void 0 : _b2.join(", ")) != null ? _c2 : "";
449
+ safeSend({
450
+ type: Actions.SET_TITLE,
451
+ data: {
452
+ title: titleString
453
+ }
454
+ });
455
+ }
456
+ }, [channelMembers, safeSend, isMountedRef]);
457
+ const title = useMemo(() => {
458
+ const titleString = safeContextProperty("title", "");
106
459
  const length = 30;
107
460
  return titleString.length > length ? titleString.substring(0, length - 3) + "..." : titleString;
108
- }, [channelMembers]);
109
- return /* @__PURE__ */ React__default.createElement(Pressable, { onPress: () => (channel == null ? void 0 : channel.id) !== selectedChannelId && onOpen(channel == null ? void 0 : channel.id, title), className: "flex-1 border-gray-200 rounded-md dark:border-gray-600 dark:bg-gray-700", style: {
461
+ }, [safeContextProperty]);
462
+ const lastMessage = useMemo(() => {
463
+ const message = safeContextProperty("lastMessage", null);
464
+ return message;
465
+ }, [safeContextProperty, (_d = (_c = state.context) == null ? void 0 : _c.messages) == null ? void 0 : _d.length]);
466
+ useEffect(() => {
467
+ var _a2, _b2;
468
+ console.log(`DialogsListItem for channel ${channel == null ? void 0 : channel.id}: `, {
469
+ hasLastMessage: !!lastMessage,
470
+ message: ((_a2 = lastMessage == null ? void 0 : lastMessage.message) == null ? void 0 : _a2.substring(0, 20)) + (((_b2 = lastMessage == null ? void 0 : lastMessage.message) == null ? void 0 : _b2.length) > 20 ? "..." : ""),
471
+ messagesCount: safeContextProperty("messages", []).length
472
+ });
473
+ }, [channel == null ? void 0 : channel.id, lastMessage, safeContextProperty]);
474
+ return /* @__PURE__ */ React__default.createElement(Pressable, { onPress: () => onOpen(channel == null ? void 0 : channel.id, title), className: "flex-1 border-gray-200 rounded-md dark:border-gray-600 dark:bg-gray-700", style: {
110
475
  borderBottomWidth: 1,
111
476
  borderColor: "#e5e7eb",
112
477
  marginVertical: 0,
113
478
  paddingHorizontal: 10
114
- } }, /* @__PURE__ */ React__default.createElement(HStack, { space: "md", className: "flex-1 w-[100%] py-3 items-center" }, /* @__PURE__ */ React__default.createElement(Box, { className: "flex-[0.1] items-start pl-3" }, /* @__PURE__ */ React__default.createElement(AvatarGroup, null, channelMembers && (channelMembers == null ? void 0 : channelMembers.length) > 0 && ((_c = channelMembers == null ? void 0 : channelMembers.slice(0, 1)) == null ? void 0 : _c.map((ch, i) => {
479
+ } }, /* @__PURE__ */ React__default.createElement(HStack, { space: "md", className: "flex-1 w-[100%] py-3 items-center" }, /* @__PURE__ */ React__default.createElement(Box, { className: "flex-[0.1] items-start pl-3" }, /* @__PURE__ */ React__default.createElement(AvatarGroup, null, channelMembers && (channelMembers == null ? void 0 : channelMembers.length) > 0 && ((_e = channelMembers == null ? void 0 : channelMembers.slice(0, 1)) == null ? void 0 : _e.map((ch, i) => {
115
480
  var _a2;
116
481
  return /* @__PURE__ */ React__default.createElement(Avatar, { key: "dialogs-list-" + i, size: "sm", className: `bg-transparent top-[${i == 1 ? "4" : "0"}] right-[${i == 1 ? "-2" : "0"}] z-[${i == 1 ? 5 : 1}]` }, /* @__PURE__ */ React__default.createElement(AvatarFallbackText, null, startCase((_a2 = ch == null ? void 0 : ch.username) == null ? void 0 : _a2.charAt(0))), (channelMembers == null ? void 0 : channelMembers.length) > 1 && /* @__PURE__ */ React__default.createElement(AvatarBadge, { style: {
117
482
  width: "100%",
@@ -132,7 +497,7 @@ const DialogsListItemComponent = function DialogsListItem2({
132
497
  width: 10,
133
498
  height: 10
134
499
  } })));
135
- })))), /* @__PURE__ */ React__default.createElement(Box, { className: "flex-1 bg-gray-400" }, /* @__PURE__ */ React__default.createElement(LastMessageComponent, { title, lastMessage, channelId: channel == null ? void 0 : channel.id, subscribeToNewMessages: () => {
500
+ })))), /* @__PURE__ */ React__default.createElement(Box, { className: "flex-1" }, /* @__PURE__ */ React__default.createElement(LastMessageComponent, { key: `last-msg-${(lastMessage == null ? void 0 : lastMessage.id) || "none"}-${safeContextProperty("messages", []).length}`, title, lastMessage, channelId: channel == null ? void 0 : channel.id, subscribeToNewMessages: () => {
136
501
  var _a2;
137
502
  return subscribeToMore({
138
503
  document: OnChatMessageAddedDocument,
@@ -142,10 +507,30 @@ const DialogsListItemComponent = function DialogsListItem2({
142
507
  updateQuery: (prev, {
143
508
  subscriptionData
144
509
  }) => {
145
- var _a3;
510
+ var _a3, _b2, _c2, _d2, _e2, _f;
146
511
  if (!subscriptionData.data)
147
512
  return prev;
148
513
  const newMessage2 = (_a3 = subscriptionData == null ? void 0 : subscriptionData.data) == null ? void 0 : _a3.chatMessageAdded;
514
+ console.log("New message added (subscription):", {
515
+ channelId: channel.id,
516
+ messageId: newMessage2.id,
517
+ message: ((_b2 = newMessage2.message) == null ? void 0 : _b2.substring(0, 20)) + "...",
518
+ hasFiles: ((_d2 = (_c2 = newMessage2 == null ? void 0 : newMessage2.files) == null ? void 0 : _c2.data) == null ? void 0 : _d2.length) > 0,
519
+ filesCount: ((_f = (_e2 = newMessage2 == null ? void 0 : newMessage2.files) == null ? void 0 : _e2.data) == null ? void 0 : _f.length) || 0,
520
+ timestamp: newMessage2.createdAt || newMessage2.updatedAt
521
+ });
522
+ if (isMountedRef.current) {
523
+ console.log("Updating messages with new subscription message");
524
+ const currentMessages = safeContextProperty("messages", []);
525
+ const updatedMessages = [...currentMessages, newMessage2];
526
+ safeSend({
527
+ type: Actions.UPDATE_MESSAGES,
528
+ data: {
529
+ messages: updatedMessages,
530
+ directLastMessage: newMessage2
531
+ }
532
+ });
533
+ }
149
534
  const existingMessages = prev == null ? void 0 : prev.messages;
150
535
  const previousData = (existingMessages == null ? void 0 : existingMessages.data) ? [...existingMessages.data, newMessage2] : [];
151
536
  const totalMsgCount = (existingMessages == null ? void 0 : existingMessages.totalCount) + 1;
@@ -160,16 +545,4 @@ const DialogsListItemComponent = function DialogsListItem2({
160
545
  });
161
546
  } }))));
162
547
  };
163
- const LastMessageComponent = ({
164
- subscribeToNewMessages,
165
- title,
166
- lastMessage,
167
- channelId
168
- }) => {
169
- var _a;
170
- React__default.useEffect(() => subscribeToNewMessages(), [channelId]);
171
- const count = 30;
172
- const channelTitle = title.slice(0, count) + (title.length > count ? "..." : "");
173
- return /* @__PURE__ */ React__default.createElement(HStack, { space: "sm", className: "flex-1 justify-between" }, /* @__PURE__ */ React__default.createElement(Box, { className: "flex-[0.8]" }, /* @__PURE__ */ React__default.createElement(Text, { color: colors.gray[600], className: "text-base text-wrap flex-wrap font-semibold" }, channelTitle), /* @__PURE__ */ React__default.createElement(Text, { color: colors.gray[600], numberOfLines: 1 }, (_a = lastMessage == null ? void 0 : lastMessage.message) != null ? _a : "")), /* @__PURE__ */ React__default.createElement(Box, { className: "flex-[0.2]" }, /* @__PURE__ */ React__default.createElement(Text, { color: colors.gray[500] }, lastMessage ? createdAtText(lastMessage == null ? void 0 : lastMessage.createdAt) : "")));
174
- };
175
548
  const DialogsListItem = React__default.memo(DialogsListItemComponent);export{DialogsListItem,DialogsListItemComponent};//# sourceMappingURL=DialogsListItem.js.map