@messenger-box/platform-mobile 10.0.3-alpha.18 → 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.
- package/CHANGELOG.md +8 -0
- package/lib/screens/inbox/components/DialogsListItem.js +423 -50
- package/lib/screens/inbox/components/DialogsListItem.js.map +1 -1
- package/lib/screens/inbox/components/ServiceDialogsListItem.js +375 -51
- package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +1 -1
- package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js +175 -0
- package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js.map +1 -0
- package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js +191 -0
- package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js.map +1 -0
- package/lib/screens/inbox/containers/Dialogs.js +382 -181
- package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
- package/lib/screens/inbox/containers/ThreadConversationView.js +536 -48
- package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
- package/lib/screens/inbox/containers/workflow/dialogs-xstate.js +1 -25
- package/lib/screens/inbox/containers/workflow/dialogs-xstate.js.map +1 -1
- package/package.json +2 -2
- package/src/screens/inbox/components/DialogsListItem.tsx +624 -107
- package/src/screens/inbox/components/ServiceDialogsListItem.tsx +506 -114
- package/src/screens/inbox/components/SupportServiceDialogsListItem.tsx +35 -17
- package/src/screens/inbox/components/workflow/dialogs-list-item-xstate.ts +145 -0
- package/src/screens/inbox/components/workflow/service-dialogs-list-item-xstate.ts +159 -0
- package/src/screens/inbox/containers/Dialogs.tsx +531 -281
- package/src/screens/inbox/containers/ThreadConversationView.tsx +812 -37
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
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
|
+
|
|
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)
|
|
11
|
+
|
|
12
|
+
**Note:** Version bump only for package @messenger-box/platform-mobile
|
|
13
|
+
|
|
6
14
|
## [10.0.3-alpha.18](https://github.com/CDEBase/messenger-box/compare/v10.0.3-alpha.17...v10.0.3-alpha.18) (2025-04-10)
|
|
7
15
|
|
|
8
16
|
**Note:** Version bump only for package @messenger-box/platform-mobile
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React__default,{
|
|
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 [
|
|
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: "
|
|
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
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
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
|
-
|
|
442
|
+
useEffect(() => {
|
|
101
443
|
var _a2, _b2, _c2;
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
}, [
|
|
109
|
-
|
|
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 && ((
|
|
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
|
|
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
|