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

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 (26) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/lib/screens/inbox/components/CachedImage/index.js +0 -19
  3. package/lib/screens/inbox/components/CachedImage/index.js.map +1 -1
  4. package/lib/screens/inbox/components/DialogsListItem.js +423 -50
  5. package/lib/screens/inbox/components/DialogsListItem.js.map +1 -1
  6. package/lib/screens/inbox/components/ServiceDialogsListItem.js +375 -51
  7. package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +1 -1
  8. package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js +175 -0
  9. package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js.map +1 -0
  10. package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js +191 -0
  11. package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js.map +1 -0
  12. package/lib/screens/inbox/containers/Dialogs.js +536 -66
  13. package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
  14. package/lib/screens/inbox/containers/ThreadConversationView.js +95 -23
  15. package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
  16. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js +211 -0
  17. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js.map +1 -0
  18. package/package.json +2 -2
  19. package/src/screens/inbox/components/CachedImage/index.tsx +9 -9
  20. package/src/screens/inbox/components/DialogsListItem.tsx +624 -107
  21. package/src/screens/inbox/components/ServiceDialogsListItem.tsx +506 -114
  22. package/src/screens/inbox/components/SupportServiceDialogsListItem.tsx +35 -17
  23. package/src/screens/inbox/components/workflow/dialogs-list-item-xstate.ts +145 -0
  24. package/src/screens/inbox/components/workflow/service-dialogs-list-item-xstate.ts +159 -0
  25. package/src/screens/inbox/containers/Dialogs.tsx +711 -169
  26. package/src/screens/inbox/containers/ThreadConversationView.tsx +151 -35
@@ -1,4 +1,4 @@
1
- import React__default,{useMemo}from'react';import {HStack,Box,Text,Pressable,Avatar,AvatarFallbackText,AvatarImage}from'@admin-layout/gluestack-ui-mobile';import {isToday,isYesterday,format}from'date-fns';import {useFocusEffect}from'@react-navigation/native';import {useThreadMessagesQuery,OnThreadCreatedUpdatedDocument}from'common/graphql';import {startCase}from'lodash-es';import colors from'tailwindcss/colors';var __defProp = Object.defineProperty;
1
+ import React__default,{useRef,useCallback,useState,useMemo}from'react';import {HStack,Box,Text,Pressable,Avatar,AvatarFallbackText,AvatarImage}from'@admin-layout/gluestack-ui-mobile';import {isToday,isYesterday,format}from'date-fns';import {useFocusEffect}from'@react-navigation/native';import {useThreadMessagesQuery,OnThreadCreatedUpdatedDocument}from'common/graphql';import {startCase}from'lodash-es';import colors from'tailwindcss/colors';import {Actions,BaseState}from'./workflow/service-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;
@@ -17,16 +17,231 @@ var __spreadValues = (a, b) => {
17
17
  return a;
18
18
  };
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ const safeDate = (dateValue) => {
21
+ if (!dateValue)
22
+ return null;
23
+ try {
24
+ const date = new Date(dateValue);
25
+ if (isNaN(date.getTime())) {
26
+ console.warn("Invalid date value detected:", dateValue);
27
+ return null;
28
+ }
29
+ return date;
30
+ } catch (error) {
31
+ console.warn("Error creating date from value:", dateValue, error);
32
+ return null;
33
+ }
34
+ };
20
35
  const createdAtText = (value) => {
21
36
  if (!value)
22
37
  return "";
23
- let date = new Date(value);
38
+ const date = safeDate(value);
39
+ if (!date)
40
+ return "";
24
41
  if (isToday(date))
25
42
  return "Today";
26
43
  if (isYesterday(date))
27
44
  return "Yesterday";
28
- return format(new Date(value), "MMM dd, yyyy");
45
+ return format(date, "MMM dd, yyyy");
29
46
  };
47
+ function useSafeMachine(machine) {
48
+ const [state, setState] = useState({
49
+ context: {
50
+ channelId: null,
51
+ currentUser: null,
52
+ threadMessages: [],
53
+ loading: false,
54
+ error: null,
55
+ title: "",
56
+ role: "",
57
+ servicePostParentId: null,
58
+ lastMessage: null
59
+ },
60
+ value: BaseState.Idle,
61
+ matches: (stateValue) => stateValue === BaseState.Idle
62
+ });
63
+ const send = useCallback((event) => {
64
+ try {
65
+ if (event.type === Actions.INITIAL_CONTEXT) {
66
+ setState((prev) => {
67
+ var _a, _b, _c;
68
+ return __spreadProps(__spreadValues({}, prev), {
69
+ context: __spreadProps(__spreadValues({}, prev.context), {
70
+ channelId: ((_a = event.data) == null ? void 0 : _a.channelId) || null,
71
+ currentUser: ((_b = event.data) == null ? void 0 : _b.currentUser) || null,
72
+ role: ((_c = event.data) == null ? void 0 : _c.role) || null,
73
+ loading: true
74
+ }),
75
+ value: BaseState.FetchingThreadMessages
76
+ });
77
+ });
78
+ } else if (event.type === Actions.UPDATE_THREAD_MESSAGES) {
79
+ setState((prev) => {
80
+ var _a, _b, _c, _d, _e;
81
+ if ((_a = event.data) == null ? void 0 : _a.threadMessages) {
82
+ if ((_b = event.data) == null ? void 0 : _b.directLastMessage) {
83
+ console.log("Using direct last message from event:", {
84
+ id: event.data.directLastMessage.id,
85
+ message: ((_c = event.data.directLastMessage.message) == null ? void 0 : _c.substring(0, 20)) + "..."
86
+ });
87
+ return __spreadProps(__spreadValues({}, prev), {
88
+ context: __spreadProps(__spreadValues({}, prev.context), {
89
+ threadMessages: event.data.threadMessages,
90
+ lastMessage: event.data.directLastMessage,
91
+ loading: false
92
+ })
93
+ });
94
+ }
95
+ return __spreadProps(__spreadValues({}, prev), {
96
+ context: __spreadProps(__spreadValues({}, prev.context), {
97
+ threadMessages: event.data.threadMessages,
98
+ lastMessage: computeLastMessage(event.data.threadMessages),
99
+ loading: false
100
+ })
101
+ });
102
+ } else if ((_d = event.data) == null ? void 0 : _d.message) {
103
+ const newMessage = event.data.message;
104
+ const updatedMessages = [...prev.context.threadMessages, newMessage];
105
+ console.log("Setting new message as lastMessage from subscription:", {
106
+ id: newMessage.id,
107
+ message: ((_e = newMessage.message) == null ? void 0 : _e.substring(0, 20)) + "...",
108
+ date: newMessage.createdAt || newMessage.updatedAt
109
+ });
110
+ return __spreadProps(__spreadValues({}, prev), {
111
+ context: __spreadProps(__spreadValues({}, prev.context), {
112
+ threadMessages: updatedMessages,
113
+ lastMessage: newMessage,
114
+ loading: false
115
+ })
116
+ });
117
+ }
118
+ return prev;
119
+ });
120
+ } else if (event.type === Actions.SET_TITLE) {
121
+ setState((prev) => {
122
+ var _a;
123
+ return __spreadProps(__spreadValues({}, prev), {
124
+ context: __spreadProps(__spreadValues({}, prev.context), {
125
+ title: ((_a = event.data) == null ? void 0 : _a.title) || ""
126
+ })
127
+ });
128
+ });
129
+ } else if (event.type === Actions.SET_SERVICE_POST_PARENT_ID) {
130
+ setState((prev) => {
131
+ var _a;
132
+ return __spreadProps(__spreadValues({}, prev), {
133
+ context: __spreadProps(__spreadValues({}, prev.context), {
134
+ servicePostParentId: ((_a = event.data) == null ? void 0 : _a.servicePostParentId) || null
135
+ })
136
+ });
137
+ });
138
+ } else if (event.type === Actions.START_LOADING) {
139
+ setState((prev) => __spreadProps(__spreadValues({}, prev), {
140
+ context: __spreadProps(__spreadValues({}, prev.context), {
141
+ loading: true
142
+ })
143
+ }));
144
+ } else if (event.type === Actions.STOP_LOADING) {
145
+ setState((prev) => __spreadProps(__spreadValues({}, prev), {
146
+ context: __spreadProps(__spreadValues({}, prev.context), {
147
+ loading: false
148
+ })
149
+ }));
150
+ }
151
+ } catch (error) {
152
+ console.error("Error sending event to state machine:", error);
153
+ }
154
+ }, []);
155
+ const computeLastMessage = (threadMessages) => {
156
+ if (!threadMessages || !threadMessages.length)
157
+ return null;
158
+ let posts = [];
159
+ let replies = [];
160
+ const isTextMessage = (msg) => {
161
+ if (!msg)
162
+ return false;
163
+ if (!msg.message || msg.message === "")
164
+ return false;
165
+ const isImageMessage = msg.message.includes("<img") || msg.message.includes("[Image]") || msg.message.includes("![") || /\.(jpeg|jpg|gif|png|bmp|webp)/i.test(msg.message) && (msg.message.includes("http") || msg.message.includes("/images/"));
166
+ return !isImageMessage;
167
+ };
168
+ threadMessages.forEach((thread) => {
169
+ var _a;
170
+ if ((thread == null ? void 0 : thread.post) && isTextMessage(thread.post)) {
171
+ posts.push(thread.post);
172
+ }
173
+ if ((_a = thread == null ? void 0 : thread.replies) == null ? void 0 : _a.length) {
174
+ replies = [...replies, ...thread.replies.filter((r) => isTextMessage(r))];
175
+ }
176
+ });
177
+ const allMessages = [...posts, ...replies];
178
+ if (!allMessages.length)
179
+ return null;
180
+ return allMessages.reduce((a, b) => {
181
+ const dateA = safeDate(a == null ? void 0 : a.createdAt);
182
+ const dateB = safeDate(b == null ? void 0 : b.createdAt);
183
+ if (!dateA)
184
+ return b;
185
+ if (!dateB)
186
+ return a;
187
+ return dateA > dateB ? a : b;
188
+ }, allMessages[0]);
189
+ };
190
+ const stateWithMatches = useMemo(() => {
191
+ return __spreadProps(__spreadValues({}, state), {
192
+ matches: (stateValue) => {
193
+ try {
194
+ return state.value === stateValue;
195
+ } catch (error) {
196
+ console.error(`Error in matches function:`, error);
197
+ return false;
198
+ }
199
+ }
200
+ });
201
+ }, [state]);
202
+ return [stateWithMatches, send];
203
+ }
204
+ const ServiceChannelWithLastMessage = React__default.memo(({
205
+ channel,
206
+ lastMessage,
207
+ subscribeToNewMessages
208
+ }) => {
209
+ var _a, _b, _c, _d, _e;
210
+ React__default.useEffect(() => {
211
+ const unsubscribe = subscribeToNewMessages();
212
+ return () => {
213
+ if (unsubscribe && typeof unsubscribe === "function") {
214
+ unsubscribe();
215
+ }
216
+ };
217
+ }, [subscribeToNewMessages]);
218
+ React__default.useEffect(() => {
219
+ var _a2, _b2, _c2;
220
+ console.log(`ServiceChannelWithLastMessage rendered for channel ${channel == null ? void 0 : channel.id}:`, {
221
+ hasLastMessage: !!lastMessage,
222
+ messageId: lastMessage == null ? void 0 : lastMessage.id,
223
+ 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 ? "..." : ""),
224
+ date: (lastMessage == null ? void 0 : lastMessage.createdAt) ? (_c2 = safeDate(lastMessage.createdAt)) == null ? void 0 : _c2.toISOString() : "none"
225
+ });
226
+ }, [lastMessage, channel == null ? void 0 : channel.id]);
227
+ const count = 30;
228
+ const title = (channel == null ? void 0 : channel.title.slice(0, count)) + ((channel == null ? void 0 : channel.title.length) > count ? "..." : "");
229
+ let displayMessage = "No messages yet";
230
+ if (lastMessage) {
231
+ const hasFileAttachments = ((_b = (_a = lastMessage.files) == null ? void 0 : _a.data) == null ? void 0 : _b.length) > 0;
232
+ const isImageMessage = ((_c = lastMessage.message) == null ? void 0 : _c.includes("<img")) || ((_d = lastMessage.message) == null ? void 0 : _d.includes("[Image]")) || ((_e = lastMessage.message) == null ? void 0 : _e.includes("![")) || /\.(jpeg|jpg|gif|png|bmp|webp)/i.test(lastMessage.message || "") && ((lastMessage.message || "").includes("http") || (lastMessage.message || "").includes("/images/"));
233
+ if (hasFileAttachments) {
234
+ displayMessage = "\u{1F4CE} File attachment";
235
+ } else if (isImageMessage) {
236
+ displayMessage = "[Image]";
237
+ } else if (lastMessage.message && lastMessage.message.trim() !== "") {
238
+ displayMessage = lastMessage.message;
239
+ } else {
240
+ displayMessage = "(Empty message)";
241
+ }
242
+ }
243
+ 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" }, title), /* @__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] }, lastMessage ? createdAtText(lastMessage == null ? void 0 : lastMessage.createdAt) : "")));
244
+ });
30
245
  const ServiceDialogsListItemComponent = function DialogsListItem({
31
246
  currentUser,
32
247
  selectedChannelId,
@@ -36,7 +251,24 @@ const ServiceDialogsListItemComponent = function DialogsListItem({
36
251
  role
37
252
  }) {
38
253
  var _a, _b, _c, _d;
39
- const [servicePostParentId, setServicePostParentId] = React__default.useState(null);
254
+ const isMountedRef = useRef(true);
255
+ const [state, send] = useSafeMachine();
256
+ const safeContextProperty = useCallback((property, defaultValue = null) => {
257
+ var _a2, _b2;
258
+ try {
259
+ return (_b2 = (_a2 = state == null ? void 0 : state.context) == null ? void 0 : _a2[property]) != null ? _b2 : defaultValue;
260
+ } catch (error2) {
261
+ console.error(`Error accessing state.context.${property}:`, error2);
262
+ return defaultValue;
263
+ }
264
+ }, [state]);
265
+ const safeSend = useCallback((event) => {
266
+ try {
267
+ send(event);
268
+ } catch (error2) {
269
+ console.error("Error sending event to state machine:", error2, event);
270
+ }
271
+ }, [send]);
40
272
  const {
41
273
  data: threadMessages,
42
274
  loading: threadMessageLoading,
@@ -49,45 +281,62 @@ const ServiceDialogsListItemComponent = function DialogsListItem({
49
281
  role,
50
282
  limit: 2
51
283
  },
52
- fetchPolicy: "cache-and-network"
284
+ fetchPolicy: "cache-and-network",
285
+ onCompleted: (data) => {
286
+ var _a2, _b2;
287
+ console.log(`Completed thread messages query for channel ${channel == null ? void 0 : channel.id}:`, ((_b2 = (_a2 = data == null ? void 0 : data.threadMessages) == null ? void 0 : _a2.data) == null ? void 0 : _b2.length) ? "Has messages" : "No messages");
288
+ },
289
+ onError: (error2) => {
290
+ console.error(`Error fetching thread messages for channel ${channel == null ? void 0 : channel.id}:`, error2);
291
+ }
53
292
  });
54
- useFocusEffect(React__default.useCallback(() => {
293
+ React__default.useEffect(() => {
55
294
  var _a2;
56
- refetchThreadMessages({
57
- channelId: (_a2 = channel == null ? void 0 : channel.id) == null ? void 0 : _a2.toString(),
58
- role,
59
- limit: 2
60
- });
295
+ if (channel == null ? void 0 : channel.id) {
296
+ safeSend({
297
+ type: Actions.INITIAL_CONTEXT,
298
+ data: {
299
+ channelId: (_a2 = channel == null ? void 0 : channel.id) == null ? void 0 : _a2.toString(),
300
+ currentUser,
301
+ role
302
+ }
303
+ });
304
+ safeSend({
305
+ type: Actions.SET_TITLE,
306
+ data: {
307
+ title: (channel == null ? void 0 : channel.title) || ""
308
+ }
309
+ });
310
+ }
61
311
  return () => {
312
+ isMountedRef.current = false;
62
313
  };
63
- }, [refreshing]));
64
- const lastMessage = useMemo(() => {
65
- var _a2, _b2, _c2, _d2, _e, _f, _g;
66
- if (!((_b2 = (_a2 = threadMessages == null ? void 0 : threadMessages.threadMessages) == null ? void 0 : _a2.data) == null ? void 0 : _b2.length)) {
67
- return null;
68
- }
69
- const {
70
- data
71
- } = threadMessages.threadMessages;
72
- const replies = (_e = (_d2 = (_c2 = data == null ? void 0 : data.map((t) => t == null ? void 0 : t.replies)) == null ? void 0 : _c2.flat(1)) == null ? void 0 : _d2.filter((p) => (p == null ? void 0 : p.message) !== "")) != null ? _e : [];
73
- if (replies == null ? void 0 : replies.length) {
74
- return replies[0];
75
- } else {
76
- const post = (_g = (_f = data == null ? void 0 : data.find((t) => {
77
- var _a3;
78
- return ((_a3 = t == null ? void 0 : t.post) == null ? void 0 : _a3.message) !== "";
79
- })) != null ? _f : data == null ? void 0 : data.find((t) => {
80
- return t == null ? void 0 : t.post;
81
- })) != null ? _g : null;
82
- return post ? post == null ? void 0 : post.post : null;
314
+ }, [channel == null ? void 0 : channel.id, currentUser, role, safeSend]);
315
+ React__default.useEffect(() => {
316
+ var _a2, _b2, _c2;
317
+ if (threadMessages && isMountedRef.current) {
318
+ console.log(`Updating thread messages for channel ${channel == null ? void 0 : channel.id}, count:`, ((_b2 = (_a2 = threadMessages == null ? void 0 : threadMessages.threadMessages) == null ? void 0 : _a2.data) == null ? void 0 : _b2.length) || 0);
319
+ safeSend({
320
+ type: Actions.UPDATE_THREAD_MESSAGES,
321
+ data: {
322
+ threadMessages: ((_c2 = threadMessages == null ? void 0 : threadMessages.threadMessages) == null ? void 0 : _c2.data) || []
323
+ }
324
+ });
83
325
  }
84
- }, [threadMessages]);
326
+ }, [threadMessages, refreshing, channel == null ? void 0 : channel.id, safeSend]);
327
+ const lastMessage = safeContextProperty("lastMessage", null);
328
+ const servicePostParentId = safeContextProperty("servicePostParentId", null);
85
329
  React__default.useEffect(() => {
86
330
  if (lastMessage) {
87
331
  const sParentId = (lastMessage == null ? void 0 : lastMessage.parentId) ? lastMessage == null ? void 0 : lastMessage.parentId : lastMessage == null ? void 0 : lastMessage.id;
88
- setServicePostParentId(sParentId);
332
+ safeSend({
333
+ type: Actions.SET_SERVICE_POST_PARENT_ID,
334
+ data: {
335
+ servicePostParentId: sParentId
336
+ }
337
+ });
89
338
  }
90
- }, [lastMessage]);
339
+ }, [lastMessage, safeSend]);
91
340
  const creatorAndMembersId = React__default.useMemo(() => {
92
341
  var _a2, _b2, _c2, _d2, _e, _f;
93
342
  if (!(channel == null ? void 0 : channel.members))
@@ -102,13 +351,84 @@ const ServiceDialogsListItemComponent = function DialogsListItem({
102
351
  const creatorId = (_d2 = channel == null ? void 0 : channel.creator) == null ? void 0 : _d2.id;
103
352
  const mergedIds = (_e = [].concat(membersIds, creatorId)) != null ? _e : [];
104
353
  return (_f = mergedIds == null ? void 0 : mergedIds.filter((m, pos) => (mergedIds == null ? void 0 : mergedIds.indexOf(m)) === pos)) != null ? _f : [];
105
- }, [channel]);
354
+ }, [channel, currentUser]);
106
355
  const postParentId = React__default.useMemo(() => {
107
356
  var _a2;
108
357
  if (!(creatorAndMembersId == null ? void 0 : creatorAndMembersId.length))
109
358
  return null;
110
359
  return (creatorAndMembersId == null ? void 0 : creatorAndMembersId.length) && (creatorAndMembersId == null ? void 0 : creatorAndMembersId.includes(currentUser == null ? void 0 : currentUser.id)) ? null : (lastMessage == null ? void 0 : lastMessage.parentId) ? lastMessage == null ? void 0 : lastMessage.parentId : (_a2 = lastMessage == null ? void 0 : lastMessage.id) != null ? _a2 : 0;
111
- }, [creatorAndMembersId, lastMessage]);
360
+ }, [creatorAndMembersId, lastMessage, currentUser]);
361
+ useCallback(() => {
362
+ var _a2;
363
+ if ((channel == null ? void 0 : channel.id) && isMountedRef.current) {
364
+ console.log("Forcing thread state refresh for channel:", channel == null ? void 0 : channel.id);
365
+ safeSend({
366
+ type: Actions.START_LOADING
367
+ });
368
+ refetchThreadMessages({
369
+ channelId: (_a2 = channel == null ? void 0 : channel.id) == null ? void 0 : _a2.toString(),
370
+ role,
371
+ limit: 2
372
+ }).then((result) => {
373
+ var _a3, _b2;
374
+ if (((_b2 = (_a3 = result.data) == null ? void 0 : _a3.threadMessages) == null ? void 0 : _b2.data) && isMountedRef.current) {
375
+ console.log(`Refreshed ${result.data.threadMessages.data.length} thread messages for channel ${channel == null ? void 0 : channel.id}`);
376
+ safeSend({
377
+ type: Actions.UPDATE_THREAD_MESSAGES,
378
+ data: {
379
+ threadMessages: result.data.threadMessages.data
380
+ }
381
+ });
382
+ }
383
+ safeSend({
384
+ type: Actions.STOP_LOADING
385
+ });
386
+ }).catch((err) => {
387
+ console.error("Error refreshing thread state:", err);
388
+ safeSend({
389
+ type: Actions.STOP_LOADING
390
+ });
391
+ });
392
+ }
393
+ }, [channel == null ? void 0 : channel.id, refetchThreadMessages, safeSend, isMountedRef, role]);
394
+ useFocusEffect(React__default.useCallback(() => {
395
+ if (!(channel == null ? void 0 : channel.id))
396
+ return;
397
+ console.log("ServiceDialogsListItem focused for channel:", channel == null ? void 0 : channel.id);
398
+ safeSend({
399
+ type: Actions.START_LOADING
400
+ });
401
+ const fetchFreshData = async () => {
402
+ var _a2, _b2, _c2, _d2, _e, _f;
403
+ try {
404
+ const result = await refetchThreadMessages({
405
+ channelId: (_a2 = channel == null ? void 0 : channel.id) == null ? void 0 : _a2.toString(),
406
+ role,
407
+ limit: 2
408
+ });
409
+ console.log(`FOCUS EFFECT: Refetched ${((_d2 = (_c2 = (_b2 = result == null ? void 0 : result.data) == null ? void 0 : _b2.threadMessages) == null ? void 0 : _c2.data) == null ? void 0 : _d2.length) || 0} messages for channel ${channel == null ? void 0 : channel.id}`);
410
+ if (((_f = (_e = result == null ? void 0 : result.data) == null ? void 0 : _e.threadMessages) == null ? void 0 : _f.data) && isMountedRef.current) {
411
+ safeSend({
412
+ type: Actions.UPDATE_THREAD_MESSAGES,
413
+ data: {
414
+ threadMessages: result.data.threadMessages.data
415
+ }
416
+ });
417
+ }
418
+ } catch (error2) {
419
+ console.error("Error refetching thread messages on focus:", error2);
420
+ } finally {
421
+ if (isMountedRef.current) {
422
+ safeSend({
423
+ type: Actions.STOP_LOADING
424
+ });
425
+ }
426
+ }
427
+ };
428
+ fetchFreshData();
429
+ return () => {
430
+ };
431
+ }, [refreshing, channel == null ? void 0 : channel.id, refetchThreadMessages, safeSend, role, isMountedRef]));
112
432
  return /* @__PURE__ */ React__default.createElement(Pressable, { onPress: () => (channel == null ? void 0 : channel.id) !== selectedChannelId && onOpen(channel == null ? void 0 : channel.id, channel == null ? void 0 : channel.title, postParentId), className: "flex-1 rounded-md border-gray-200 dark:border-gray-600 dark:bg-gray-700", style: {
113
433
  borderBottomWidth: 1,
114
434
  borderColor: "#e5e7eb",
@@ -130,20 +450,35 @@ const ServiceDialogsListItemComponent = function DialogsListItem({
130
450
  updateQuery: (prev, {
131
451
  subscriptionData
132
452
  }) => {
133
- var _a3, _b2, _c2, _d2, _e, _f, _g, _h;
453
+ var _a3, _b2, _c2, _d2, _e, _f, _g, _h, _i;
134
454
  if (!subscriptionData.data)
135
455
  return prev;
136
456
  const newPostThreadData = (_b2 = (_a3 = subscriptionData == null ? void 0 : subscriptionData.data) == null ? void 0 : _a3.threadCreatedUpdated) == null ? void 0 : _b2.data;
137
457
  const newMessage = (_d2 = (_c2 = subscriptionData == null ? void 0 : subscriptionData.data) == null ? void 0 : _c2.threadCreatedUpdated) == null ? void 0 : _d2.lastMessage;
138
- const data = (_g = (_f = (_e = prev == null ? void 0 : prev.threadMessages) == null ? void 0 : _e.data) == null ? void 0 : _f.map((t) => t.id === (newPostThreadData == null ? void 0 : newPostThreadData.id) ? __spreadProps(__spreadValues({}, t), {
458
+ console.log("New thread message subscription update:", {
459
+ channelId: channel == null ? void 0 : channel.id,
460
+ threadId: newPostThreadData == null ? void 0 : newPostThreadData.id,
461
+ hasMessage: !!newMessage,
462
+ message: ((_e = newMessage == null ? void 0 : newMessage.message) == null ? void 0 : _e.substring(0, 20)) + "..."
463
+ });
464
+ const data = (_h = (_g = (_f = prev == null ? void 0 : prev.threadMessages) == null ? void 0 : _f.data) == null ? void 0 : _g.map((t) => t.id === (newPostThreadData == null ? void 0 : newPostThreadData.id) ? __spreadProps(__spreadValues({}, t), {
139
465
  replies: [...t == null ? void 0 : t.replies, newMessage],
140
466
  replyCount: newPostThreadData == null ? void 0 : newPostThreadData.replyCount,
141
467
  lastReplyAt: newPostThreadData == null ? void 0 : newPostThreadData.lastReplyAt,
142
468
  updatedAt: newPostThreadData == null ? void 0 : newPostThreadData.updatedAt
143
- }) : t)) != null ? _g : [];
469
+ }) : t)) != null ? _h : [];
470
+ if (isMountedRef.current) {
471
+ safeSend({
472
+ type: Actions.UPDATE_THREAD_MESSAGES,
473
+ data: {
474
+ threadMessages: (data == null ? void 0 : data.length) > 0 ? data : [newPostThreadData],
475
+ directLastMessage: newMessage
476
+ }
477
+ });
478
+ }
144
479
  return Object.assign({}, prev, {
145
480
  threadMessages: __spreadProps(__spreadValues({}, prev == null ? void 0 : prev.threadMessages), {
146
- totalCount: (_h = newPostThreadData == null ? void 0 : newPostThreadData.totalCount) != null ? _h : 0,
481
+ totalCount: (_i = newPostThreadData == null ? void 0 : newPostThreadData.totalCount) != null ? _i : 0,
147
482
  data: (data == null ? void 0 : data.length) > 0 ? data : [newPostThreadData]
148
483
  })
149
484
  });
@@ -151,15 +486,4 @@ const ServiceDialogsListItemComponent = function DialogsListItem({
151
486
  });
152
487
  } }))));
153
488
  };
154
- const ServiceChannelWithLastMessage = React__default.memo(({
155
- channel,
156
- lastMessage,
157
- subscribeToNewMessages
158
- }) => {
159
- var _a;
160
- React__default.useEffect(() => subscribeToNewMessages(), []);
161
- const count = 20;
162
- const title = (channel == null ? void 0 : channel.title.slice(0, count)) + ((channel == null ? void 0 : channel.title.length) > count ? "..." : "");
163
- 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" }, title), /* @__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) : "")));
164
- });
165
489
  const ServiceDialogsListItem = React__default.memo(ServiceDialogsListItemComponent);export{ServiceDialogsListItem,ServiceDialogsListItemComponent};//# sourceMappingURL=ServiceDialogsListItem.js.map