@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.
- package/CHANGELOG.md +8 -0
- package/lib/screens/inbox/components/CachedImage/index.js +0 -19
- package/lib/screens/inbox/components/CachedImage/index.js.map +1 -1
- 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 +536 -66
- package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
- package/lib/screens/inbox/containers/ThreadConversationView.js +95 -23
- package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
- package/lib/screens/inbox/containers/workflow/dialogs-xstate.js +211 -0
- package/lib/screens/inbox/containers/workflow/dialogs-xstate.js.map +1 -0
- package/package.json +2 -2
- package/src/screens/inbox/components/CachedImage/index.tsx +9 -9
- 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 +711 -169
- 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
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
293
|
+
React__default.useEffect(() => {
|
|
55
294
|
var _a2;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
}, [
|
|
64
|
-
|
|
65
|
-
var _a2, _b2, _c2
|
|
66
|
-
if (
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ?
|
|
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: (
|
|
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
|