@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React__default,{useState,useRef,useCallback,useEffect,useMemo}from'react';import {Button,Box,Spinner,Text,VStack,
|
|
1
|
+
import React__default,{useState,useRef,useCallback,useEffect,useMemo}from'react';import {Button,Box,Spinner,Text,HStack,VStack,Avatar,AvatarFallbackText,AvatarImage,Center,Image}from'@admin-layout/gluestack-ui-mobile';import {Platform,SafeAreaView,TouchableHighlight,Alert,Linking,View}from'react-native';import {useRoute,useNavigation,useFocusEffect}from'@react-navigation/native';import {useSelector}from'react-redux';import {orderBy,startCase,uniqBy}from'lodash-es';import*as ImagePicker from'expo-image-picker';import {MaterialIcons,Ionicons,MaterialCommunityIcons}from'@expo/vector-icons';import {GiftedChat,Actions as Actions$1,InputToolbar,Send}from'react-native-gifted-chat';import'common';import {useCreatePostThreadMutation,useSendExpoNotificationOnPostMutation,useGetPostThreadLazyQuery,OnThreadChatMessageAddedDocument}from'common/graphql';import {useUploadFilesNative}from'@messenger-box/platform-client';import {objectId}from'@messenger-box/core';import {format,isToday,isYesterday}from'date-fns';import {userSelector}from'@adminide-stack/user-auth0-client';import {config}from'../config/config.js';import Message from'../components/SlackMessageContainer/SlackMessage.js';import ImageViewerModal from'../components/SlackMessageContainer/ImageViewerModal.js';import CachedImage from'../components/CachedImage/index.js';import colors from'tailwindcss/colors';import {Actions,BaseState,MainState}from'./workflow/thread-conversation-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,12 +27,22 @@ const {
|
|
|
27
27
|
const createdAtText = (value) => {
|
|
28
28
|
if (!value)
|
|
29
29
|
return "";
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
try {
|
|
31
|
+
const timestamp = new Date(value).getTime();
|
|
32
|
+
if (isNaN(timestamp)) {
|
|
33
|
+
console.warn(`Invalid date value in createdAtText: ${value}`);
|
|
34
|
+
return "Unknown date";
|
|
35
|
+
}
|
|
36
|
+
let date = new Date(value);
|
|
37
|
+
if (isToday(date))
|
|
38
|
+
return "Today";
|
|
39
|
+
if (isYesterday(date))
|
|
40
|
+
return "Yesterday";
|
|
41
|
+
return format(date, "MMM dd, yyyy");
|
|
42
|
+
} catch (error) {
|
|
43
|
+
console.error(`Error processing date in createdAtText: ${value}`, error);
|
|
44
|
+
return "Unknown date";
|
|
45
|
+
}
|
|
36
46
|
};
|
|
37
47
|
function useSafeMachine(machine) {
|
|
38
48
|
const [state, setState] = useState({
|
|
@@ -138,11 +148,15 @@ function useSafeMachine(machine) {
|
|
|
138
148
|
})
|
|
139
149
|
}));
|
|
140
150
|
} else if (event.type === Actions.STOP_LOADING) {
|
|
141
|
-
setState((prev) =>
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
151
|
+
setState((prev) => {
|
|
152
|
+
var _a2;
|
|
153
|
+
return __spreadProps(__spreadValues({}, prev), {
|
|
154
|
+
context: __spreadProps(__spreadValues({}, prev.context), {
|
|
155
|
+
loading: false,
|
|
156
|
+
loadingOldMessages: ((_a2 = event.data) == null ? void 0 : _a2.loadingOldMessages) === false ? false : prev.context.loadingOldMessages
|
|
157
|
+
})
|
|
158
|
+
});
|
|
159
|
+
});
|
|
146
160
|
} else if (event.type === Actions.SEND_THREAD_MESSAGE) {
|
|
147
161
|
console.log("Sending message event with text:", (_a = event.data) == null ? void 0 : _a.messageText);
|
|
148
162
|
setState((prev) => {
|
|
@@ -202,14 +216,52 @@ function useSafeMachine(machine) {
|
|
|
202
216
|
});
|
|
203
217
|
} else if (event.type === "FETCH_MORE_MESSAGES_SUCCESS") {
|
|
204
218
|
setState((prev) => {
|
|
205
|
-
var _a2;
|
|
219
|
+
var _a2, _b2;
|
|
206
220
|
const newMessages = ((_a2 = event.data) == null ? void 0 : _a2.messages) || [];
|
|
221
|
+
const apiTotalCount = (_b2 = event.data) == null ? void 0 : _b2.totalCount;
|
|
222
|
+
console.log(`Merging ${newMessages.length} older messages with ${prev.context.threadMessages.length} existing messages`);
|
|
223
|
+
if (newMessages.length > 0) {
|
|
224
|
+
try {
|
|
225
|
+
console.log("First new message date:", !isNaN(new Date(newMessages[0].createdAt).getTime()) ? new Date(newMessages[0].createdAt).toISOString() : "Invalid date");
|
|
226
|
+
console.log("Last new message date:", !isNaN(new Date(newMessages[newMessages.length - 1].createdAt).getTime()) ? new Date(newMessages[newMessages.length - 1].createdAt).toISOString() : "Invalid date");
|
|
227
|
+
} catch (error) {
|
|
228
|
+
console.error("Error logging new message dates:", error);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (prev.context.threadMessages.length > 0) {
|
|
232
|
+
try {
|
|
233
|
+
console.log("First existing message date:", !isNaN(new Date(prev.context.threadMessages[0].createdAt).getTime()) ? new Date(prev.context.threadMessages[0].createdAt).toISOString() : "Invalid date");
|
|
234
|
+
console.log("Last existing message date:", !isNaN(new Date(prev.context.threadMessages[prev.context.threadMessages.length - 1].createdAt).getTime()) ? new Date(prev.context.threadMessages[prev.context.threadMessages.length - 1].createdAt).toISOString() : "Invalid date");
|
|
235
|
+
} catch (error) {
|
|
236
|
+
console.error("Error logging existing message dates:", error);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (newMessages.length === 0 && prev.context.totalCount > prev.context.threadMessages.length) {
|
|
240
|
+
console.log("No new messages found despite totalCount indicating more should exist");
|
|
241
|
+
return __spreadProps(__spreadValues({}, prev), {
|
|
242
|
+
context: __spreadProps(__spreadValues({}, prev.context), {
|
|
243
|
+
loadingOldMessages: false,
|
|
244
|
+
totalCount: prev.context.threadMessages.length
|
|
245
|
+
}),
|
|
246
|
+
value: "active"
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
const combinedMessages = uniqBy([...prev.context.threadMessages, ...newMessages], "id");
|
|
250
|
+
const sortedMessages = orderBy(combinedMessages, [(msg) => {
|
|
251
|
+
try {
|
|
252
|
+
return !isNaN(new Date(msg.createdAt).getTime()) ? new Date(msg.createdAt).getTime() : 0;
|
|
253
|
+
} catch (error) {
|
|
254
|
+
console.error(`Error sorting message by date: ${msg.id}`, error);
|
|
255
|
+
return 0;
|
|
256
|
+
}
|
|
257
|
+
}], ["desc"]);
|
|
258
|
+
const newTotalCount = typeof apiTotalCount === "number" ? apiTotalCount : Math.max(sortedMessages.length, prev.context.totalCount);
|
|
259
|
+
console.log(`Total messages after merge and sort: ${sortedMessages.length}, totalCount: ${newTotalCount}`);
|
|
207
260
|
return __spreadProps(__spreadValues({}, prev), {
|
|
208
261
|
context: __spreadProps(__spreadValues({}, prev.context), {
|
|
209
262
|
loadingOldMessages: false,
|
|
210
|
-
threadMessages:
|
|
211
|
-
|
|
212
|
-
}) => id)
|
|
263
|
+
threadMessages: sortedMessages,
|
|
264
|
+
totalCount: newTotalCount
|
|
213
265
|
}),
|
|
214
266
|
value: "active"
|
|
215
267
|
});
|
|
@@ -246,7 +298,7 @@ const ThreadConversationViewComponent = ({
|
|
|
246
298
|
isPostParentIdThread,
|
|
247
299
|
role
|
|
248
300
|
}) => {
|
|
249
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t
|
|
301
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t;
|
|
250
302
|
const {
|
|
251
303
|
params
|
|
252
304
|
} = useRoute();
|
|
@@ -314,11 +366,64 @@ const ThreadConversationViewComponent = ({
|
|
|
314
366
|
}] = useGetPostThreadLazyQuery({
|
|
315
367
|
fetchPolicy: "cache-and-network"
|
|
316
368
|
});
|
|
369
|
+
const forceRefreshMessages = useCallback(() => {
|
|
370
|
+
console.log("Force refreshing all messages");
|
|
371
|
+
safeSend({
|
|
372
|
+
type: Actions.CLEAR_MESSAGES
|
|
373
|
+
});
|
|
374
|
+
if (channelId && parentId) {
|
|
375
|
+
safeSend({
|
|
376
|
+
type: Actions.START_LOADING,
|
|
377
|
+
data: {
|
|
378
|
+
loading: true
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
getThreadMessages({
|
|
382
|
+
variables: {
|
|
383
|
+
channelId: channelId == null ? void 0 : channelId.toString(),
|
|
384
|
+
role: role == null ? void 0 : role.toString(),
|
|
385
|
+
postParentId: !parentId || parentId == 0 ? null : parentId == null ? void 0 : parentId.toString(),
|
|
386
|
+
selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
|
|
387
|
+
limit: 50
|
|
388
|
+
}
|
|
389
|
+
}).then(({
|
|
390
|
+
data: data2
|
|
391
|
+
}) => {
|
|
392
|
+
var _a2, _b2, _c2;
|
|
393
|
+
if (data2 == null ? void 0 : data2.getPostThread) {
|
|
394
|
+
const threads = data2.getPostThread;
|
|
395
|
+
const threadPost = (_a2 = threads == null ? void 0 : threads.post) != null ? _a2 : [];
|
|
396
|
+
const threadReplies = (_b2 = threads == null ? void 0 : threads.replies) != null ? _b2 : [];
|
|
397
|
+
const messageTotalCount = (_c2 = threads == null ? void 0 : threads.replyCount) != null ? _c2 : 0;
|
|
398
|
+
const messages = [...threadReplies];
|
|
399
|
+
console.log(`Force refresh complete. Got ${messages.length} messages of ${messageTotalCount} total`);
|
|
400
|
+
safeSend({
|
|
401
|
+
type: Actions.SET_THREAD_MESSAGES,
|
|
402
|
+
data: {
|
|
403
|
+
messages,
|
|
404
|
+
totalCount: messageTotalCount,
|
|
405
|
+
threadPost,
|
|
406
|
+
postThread: threads
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
}).catch((error) => {
|
|
411
|
+
console.error("Error during force refresh:", error);
|
|
412
|
+
safeSend({
|
|
413
|
+
type: "ERROR",
|
|
414
|
+
data: {
|
|
415
|
+
message: error.message
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
}, [channelId, parentId, getThreadMessages, safeSend]);
|
|
317
421
|
useFocusEffect(React__default.useCallback(() => {
|
|
318
422
|
var _a2;
|
|
319
423
|
navigation.setOptions({
|
|
320
424
|
title: (_a2 = params == null ? void 0 : params.title) != null ? _a2 : "Thread",
|
|
321
|
-
headerLeft: (props) => /* @__PURE__ */ React__default.createElement(Button, { className: "bg-transparent active:bg-gray-200 ", onPress: () => navigation.goBack() }, /* @__PURE__ */ React__default.createElement(MaterialIcons, { size: 20, name: "arrow-back-ios", color: "black" }))
|
|
425
|
+
headerLeft: (props) => /* @__PURE__ */ React__default.createElement(Button, { className: "bg-transparent active:bg-gray-200 ", onPress: () => navigation.goBack() }, /* @__PURE__ */ React__default.createElement(MaterialIcons, { size: 20, name: "arrow-back-ios", color: "black" })),
|
|
426
|
+
headerRight: () => /* @__PURE__ */ React__default.createElement(Button, { className: "bg-transparent active:bg-gray-200 mr-2", onPress: forceRefreshMessages }, /* @__PURE__ */ React__default.createElement(MaterialIcons, { size: 20, name: "refresh", color: "black" }))
|
|
322
427
|
});
|
|
323
428
|
if (channelId && postParentId) {
|
|
324
429
|
safeSend({
|
|
@@ -336,7 +441,7 @@ const ThreadConversationViewComponent = ({
|
|
|
336
441
|
type: Actions.CLEAR_MESSAGES
|
|
337
442
|
});
|
|
338
443
|
};
|
|
339
|
-
}, [postParentId]));
|
|
444
|
+
}, [postParentId, forceRefreshMessages]));
|
|
340
445
|
useEffect(() => {
|
|
341
446
|
if (safeMatches(BaseState.FetchThreadMessages)) {
|
|
342
447
|
fetchThreadMessages();
|
|
@@ -363,13 +468,14 @@ const ThreadConversationViewComponent = ({
|
|
|
363
468
|
}, [state.value]);
|
|
364
469
|
const fetchThreadMessages = useCallback(() => {
|
|
365
470
|
if (channelId && parentId) {
|
|
471
|
+
console.log("Initial fetch of thread messages using larger limit (50)");
|
|
366
472
|
getThreadMessages({
|
|
367
473
|
variables: {
|
|
368
474
|
channelId: channelId == null ? void 0 : channelId.toString(),
|
|
369
475
|
role: role == null ? void 0 : role.toString(),
|
|
370
476
|
postParentId: !parentId || parentId == 0 ? null : parentId == null ? void 0 : parentId.toString(),
|
|
371
477
|
selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
|
|
372
|
-
limit:
|
|
478
|
+
limit: 50
|
|
373
479
|
}
|
|
374
480
|
}).then(({
|
|
375
481
|
data: data2
|
|
@@ -381,6 +487,7 @@ const ThreadConversationViewComponent = ({
|
|
|
381
487
|
const threadReplies = (_b2 = threads == null ? void 0 : threads.replies) != null ? _b2 : [];
|
|
382
488
|
const messageTotalCount = (_c2 = threads == null ? void 0 : threads.replyCount) != null ? _c2 : 0;
|
|
383
489
|
const messages = [...threadReplies];
|
|
490
|
+
console.log(`Initial fetch complete. Got ${messages.length} messages of ${messageTotalCount} total`);
|
|
384
491
|
safeSend({
|
|
385
492
|
type: Actions.SET_THREAD_MESSAGES,
|
|
386
493
|
data: {
|
|
@@ -427,6 +534,54 @@ const ThreadConversationViewComponent = ({
|
|
|
427
534
|
});
|
|
428
535
|
}
|
|
429
536
|
}, [safeContextProperty("selectedImage")]);
|
|
537
|
+
React__default.useEffect(() => {
|
|
538
|
+
const isLoading = safeContextProperty("loadingOldMessages", false);
|
|
539
|
+
if (isLoading) {
|
|
540
|
+
console.log("Message loading timeout safety started");
|
|
541
|
+
const timeoutId = setTimeout(() => {
|
|
542
|
+
if (safeContextProperty("loadingOldMessages", false)) {
|
|
543
|
+
console.log("Message loading timed out - resetting state");
|
|
544
|
+
safeSend({
|
|
545
|
+
type: Actions.STOP_LOADING,
|
|
546
|
+
data: {
|
|
547
|
+
loadingOldMessages: false
|
|
548
|
+
}
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
}, 1e4);
|
|
552
|
+
return () => clearTimeout(timeoutId);
|
|
553
|
+
}
|
|
554
|
+
}, [safeContextProperty("loadingOldMessages")]);
|
|
555
|
+
const failedLoadAttemptsRef = useRef(0);
|
|
556
|
+
const registerLoadAttemptResult = useCallback((success) => {
|
|
557
|
+
if (!success) {
|
|
558
|
+
failedLoadAttemptsRef.current += 1;
|
|
559
|
+
console.log(`Failed load attempt registered, count: ${failedLoadAttemptsRef.current}`);
|
|
560
|
+
} else {
|
|
561
|
+
failedLoadAttemptsRef.current = 0;
|
|
562
|
+
}
|
|
563
|
+
}, []);
|
|
564
|
+
React__default.useEffect(() => {
|
|
565
|
+
const isLoading = safeContextProperty("loadingOldMessages", false);
|
|
566
|
+
const totalCount = safeContextProperty("totalCount", 0);
|
|
567
|
+
const messagesCount = safeContextProperty("threadMessages", []).length;
|
|
568
|
+
if (!isLoading && totalCount > messagesCount) {
|
|
569
|
+
if (failedLoadAttemptsRef.current >= 2) {
|
|
570
|
+
console.log(`Auto-fixing incorrect message count after ${failedLoadAttemptsRef.current + 1} failed load attempts`);
|
|
571
|
+
console.log(`Adjusting totalCount from ${totalCount} to ${messagesCount}`);
|
|
572
|
+
safeSend({
|
|
573
|
+
type: Actions.SET_THREAD_MESSAGES,
|
|
574
|
+
data: {
|
|
575
|
+
messages: safeContextProperty("threadMessages", []),
|
|
576
|
+
totalCount: messagesCount,
|
|
577
|
+
threadPost: safeContextProperty("threadPost", []),
|
|
578
|
+
postThread: safeContextProperty("postThread", null)
|
|
579
|
+
}
|
|
580
|
+
});
|
|
581
|
+
failedLoadAttemptsRef.current = 0;
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
}, [safeContextProperty("loadingOldMessages"), safeContextProperty("threadMessages")]);
|
|
430
585
|
React__default.useCallback(() => {
|
|
431
586
|
if (threadMessageListRef == null ? void 0 : threadMessageListRef.current) {
|
|
432
587
|
threadMessageListRef.current.scrollToBottom();
|
|
@@ -438,35 +593,72 @@ const ThreadConversationViewComponent = ({
|
|
|
438
593
|
if (totalCount > threadMessages.length && !safeContextProperty("loadingOldMessages", false)) {
|
|
439
594
|
console.log("Loading more messages - current count:", threadMessages.length, "of", totalCount);
|
|
440
595
|
safeSend({
|
|
441
|
-
type: Actions.
|
|
596
|
+
type: Actions.FETCH_MORE_MESSAGES,
|
|
442
597
|
data: {
|
|
443
598
|
loadingOldMessages: true
|
|
444
599
|
}
|
|
445
600
|
});
|
|
601
|
+
console.log("Using proven approach: Skip=0, Limit=50");
|
|
602
|
+
const queryVariables = {
|
|
603
|
+
channelId: channelId == null ? void 0 : channelId.toString(),
|
|
604
|
+
role: role == null ? void 0 : role.toString(),
|
|
605
|
+
postParentId: !parentId || parentId == 0 ? null : parentId == null ? void 0 : parentId.toString(),
|
|
606
|
+
selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
|
|
607
|
+
limit: 50,
|
|
608
|
+
skip: 0
|
|
609
|
+
};
|
|
610
|
+
console.log("Query variables:", JSON.stringify(queryVariables));
|
|
446
611
|
fetchMoreMessages({
|
|
447
|
-
variables:
|
|
448
|
-
channelId: channelId == null ? void 0 : channelId.toString(),
|
|
449
|
-
role: role == null ? void 0 : role.toString(),
|
|
450
|
-
postParentId: parentId == null ? void 0 : parentId.toString(),
|
|
451
|
-
selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
|
|
452
|
-
limit: MESSAGES_PER_PAGE,
|
|
453
|
-
skip: threadMessages.length
|
|
454
|
-
}
|
|
612
|
+
variables: queryVariables
|
|
455
613
|
}).then((res) => {
|
|
456
|
-
var _a2, _b2, _c2;
|
|
614
|
+
var _a2, _b2, _c2, _d2;
|
|
615
|
+
console.log("API response received:", JSON.stringify(res == null ? void 0 : res.data, null, 2));
|
|
457
616
|
if ((_a2 = res == null ? void 0 : res.data) == null ? void 0 : _a2.getPostThread) {
|
|
458
617
|
const threads = (_b2 = res == null ? void 0 : res.data) == null ? void 0 : _b2.getPostThread;
|
|
459
618
|
const threadReplies = (_c2 = threads == null ? void 0 : threads.replies) != null ? _c2 : [];
|
|
460
|
-
|
|
619
|
+
const actualTotalCount = (_d2 = threads == null ? void 0 : threads.replyCount) != null ? _d2 : 0;
|
|
620
|
+
console.log("API response details:");
|
|
621
|
+
console.log("- replyCount:", threads == null ? void 0 : threads.replyCount);
|
|
622
|
+
console.log("- replies array length:", threadReplies.length);
|
|
623
|
+
console.log("- replies structure:", threadReplies.length > 0 ? `First item has fields: ${Object.keys(threadReplies[0]).join(", ")}` : "No items");
|
|
624
|
+
if (threadReplies.length > 0) {
|
|
625
|
+
console.log("- Sample message:", JSON.stringify(threadReplies[0], null, 2));
|
|
626
|
+
}
|
|
627
|
+
console.log("Successfully loaded more messages:", threadReplies.length, "of total:", actualTotalCount);
|
|
628
|
+
console.log("Thread reply IDs:", threadReplies.map((msg) => msg.id).join(", "));
|
|
629
|
+
const existingIds = new Set(threadMessages.map((msg) => msg.id));
|
|
630
|
+
const newUniqueMessages = threadReplies.filter((msg) => !existingIds.has(msg.id));
|
|
631
|
+
console.log(`Found ${newUniqueMessages.length} unique new messages out of ${threadReplies.length} received`);
|
|
632
|
+
if (actualTotalCount !== totalCount) {
|
|
633
|
+
console.log(`Updating totalCount from ${totalCount} to ${actualTotalCount} based on API response`);
|
|
634
|
+
}
|
|
635
|
+
if (newUniqueMessages.length === 0) {
|
|
636
|
+
console.log("No new unique messages found, adjusting total count");
|
|
637
|
+
registerLoadAttemptResult(false);
|
|
638
|
+
safeSend({
|
|
639
|
+
type: Actions.SET_THREAD_MESSAGES,
|
|
640
|
+
data: {
|
|
641
|
+
messages: threadMessages,
|
|
642
|
+
totalCount: threadMessages.length,
|
|
643
|
+
threadPost: safeContextProperty("threadPost", []),
|
|
644
|
+
postThread: safeContextProperty("postThread", null)
|
|
645
|
+
}
|
|
646
|
+
});
|
|
647
|
+
return;
|
|
648
|
+
}
|
|
649
|
+
registerLoadAttemptResult(true);
|
|
650
|
+
console.log(`Adding ${newUniqueMessages.length} new messages to thread`);
|
|
461
651
|
safeSend({
|
|
462
652
|
type: "FETCH_MORE_MESSAGES_SUCCESS",
|
|
463
653
|
data: {
|
|
464
|
-
messages:
|
|
654
|
+
messages: newUniqueMessages,
|
|
655
|
+
totalCount: actualTotalCount,
|
|
465
656
|
loadingOldMessages: false
|
|
466
657
|
}
|
|
467
658
|
});
|
|
468
659
|
} else {
|
|
469
660
|
console.log("No thread data returned when loading more messages");
|
|
661
|
+
registerLoadAttemptResult(false);
|
|
470
662
|
safeSend({
|
|
471
663
|
type: Actions.STOP_LOADING,
|
|
472
664
|
data: {
|
|
@@ -476,6 +668,7 @@ const ThreadConversationViewComponent = ({
|
|
|
476
668
|
}
|
|
477
669
|
}).catch((error) => {
|
|
478
670
|
console.error("Error fetching more messages:", error);
|
|
671
|
+
registerLoadAttemptResult(false);
|
|
479
672
|
safeSend({
|
|
480
673
|
type: "ERROR",
|
|
481
674
|
data: {
|
|
@@ -486,13 +679,26 @@ const ThreadConversationViewComponent = ({
|
|
|
486
679
|
});
|
|
487
680
|
} else {
|
|
488
681
|
console.log("No more messages to load or already loading");
|
|
682
|
+
if (safeContextProperty("loadingOldMessages", false)) {
|
|
683
|
+
safeSend({
|
|
684
|
+
type: Actions.STOP_LOADING,
|
|
685
|
+
data: {
|
|
686
|
+
loadingOldMessages: false
|
|
687
|
+
}
|
|
688
|
+
});
|
|
689
|
+
}
|
|
489
690
|
}
|
|
490
|
-
}, [parentId, channelId, state.context]);
|
|
691
|
+
}, [parentId, channelId, state.context, registerLoadAttemptResult]);
|
|
491
692
|
const handleScrollToTop = ({
|
|
492
693
|
nativeEvent
|
|
493
694
|
}) => {
|
|
494
695
|
if (isCloseToTop(nativeEvent)) {
|
|
495
|
-
|
|
696
|
+
const isLoading = safeContextProperty("loadingOldMessages", false);
|
|
697
|
+
const totalCount = safeContextProperty("totalCount", 0);
|
|
698
|
+
const currentCount = safeContextProperty("threadMessages", []).length;
|
|
699
|
+
const hasMoreMessages = totalCount > currentCount;
|
|
700
|
+
console.log(`Scroll near top - Loading state: ${isLoading}, Messages: ${currentCount}/${totalCount}, Has more: ${hasMoreMessages}`);
|
|
701
|
+
if (!isLoading && hasMoreMessages) {
|
|
496
702
|
console.log("Near top of list - loading older messages");
|
|
497
703
|
safeSend({
|
|
498
704
|
type: Actions.FETCH_MORE_MESSAGES
|
|
@@ -508,8 +714,12 @@ const ThreadConversationViewComponent = ({
|
|
|
508
714
|
contentOffset,
|
|
509
715
|
contentSize
|
|
510
716
|
}) => {
|
|
511
|
-
const
|
|
512
|
-
|
|
717
|
+
const visibleHeight = layoutMeasurement.height;
|
|
718
|
+
const topThreshold = Math.min(80, visibleHeight * 0.15);
|
|
719
|
+
const distanceFromTop = contentOffset.y;
|
|
720
|
+
const totalContentHeight = contentSize.height;
|
|
721
|
+
console.log(`Scroll position: ${distanceFromTop.toFixed(0)}px from top, threshold: ${topThreshold.toFixed(0)}px, content height: ${totalContentHeight.toFixed(0)}px`);
|
|
722
|
+
return contentOffset.y <= topThreshold;
|
|
513
723
|
};
|
|
514
724
|
const onSelectImages = async () => {
|
|
515
725
|
var _a2;
|
|
@@ -792,19 +1002,40 @@ const ThreadConversationViewComponent = ({
|
|
|
792
1002
|
messageIds.add(msg.id);
|
|
793
1003
|
return true;
|
|
794
1004
|
}).map((msg) => {
|
|
795
|
-
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2, _m2
|
|
1005
|
+
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2, _m2;
|
|
796
1006
|
const uniqueId = msg.id || `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
1007
|
+
let messageDate;
|
|
1008
|
+
try {
|
|
1009
|
+
if (msg.createdAt && !isNaN(new Date(msg.createdAt).getTime())) {
|
|
1010
|
+
messageDate = new Date(msg.createdAt);
|
|
1011
|
+
} else {
|
|
1012
|
+
console.warn(`Invalid date value for message ${msg.id}: ${msg.createdAt}`);
|
|
1013
|
+
messageDate = new Date();
|
|
1014
|
+
}
|
|
1015
|
+
} catch (error) {
|
|
1016
|
+
console.error(`Error creating date for message ${msg.id}:`, error);
|
|
1017
|
+
messageDate = new Date();
|
|
1018
|
+
}
|
|
1019
|
+
let imageUrl = null;
|
|
1020
|
+
if (((_a2 = msg.files) == null ? void 0 : _a2.data) && msg.files.data.length > 0) {
|
|
1021
|
+
const fileData = msg.files.data[0];
|
|
1022
|
+
if (fileData && fileData.url) {
|
|
1023
|
+
imageUrl = fileData.url;
|
|
1024
|
+
console.log("\u{1F4F7} Found image URL for message", msg.id, ":", imageUrl);
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
1027
|
+
let messageText = msg.message || "";
|
|
797
1028
|
let message = {
|
|
798
1029
|
_id: uniqueId,
|
|
799
|
-
text:
|
|
800
|
-
createdAt:
|
|
1030
|
+
text: messageText,
|
|
1031
|
+
createdAt: messageDate,
|
|
801
1032
|
user: {
|
|
802
|
-
_id: (
|
|
803
|
-
name: (
|
|
804
|
-
avatar: (
|
|
1033
|
+
_id: (_d2 = (_b2 = msg == null ? void 0 : msg.author) == null ? void 0 : _b2.id) != null ? _d2 : (_c2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _c2.id,
|
|
1034
|
+
name: (_j2 = (_h2 = (_e2 = msg == null ? void 0 : msg.author) == null ? void 0 : _e2.givenName) != null ? _h2 : ((_f2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _f2.given_name) + " " + ((_g2 = msg == null ? void 0 : msg.author) == null ? void 0 : _g2.familyName)) != null ? _j2 : (_i2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _i2.family_name,
|
|
1035
|
+
avatar: (_m2 = (_k2 = msg == null ? void 0 : msg.author) == null ? void 0 : _k2.picture) != null ? _m2 : (_l2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _l2.picture
|
|
805
1036
|
},
|
|
806
1037
|
type: (msg == null ? void 0 : msg.type) || "",
|
|
807
|
-
image:
|
|
1038
|
+
image: imageUrl,
|
|
808
1039
|
sent: (msg == null ? void 0 : msg.isDelivered) || true,
|
|
809
1040
|
received: (msg == null ? void 0 : msg.isRead) || false,
|
|
810
1041
|
propsConfiguration: msg == null ? void 0 : msg.propsConfiguration
|
|
@@ -812,7 +1043,23 @@ const ThreadConversationViewComponent = ({
|
|
|
812
1043
|
return message;
|
|
813
1044
|
});
|
|
814
1045
|
}
|
|
815
|
-
const sortedMessages = res
|
|
1046
|
+
const sortedMessages = orderBy(res, [(msg) => {
|
|
1047
|
+
try {
|
|
1048
|
+
return msg.createdAt instanceof Date ? msg.createdAt.getTime() : new Date().getTime();
|
|
1049
|
+
} catch (error) {
|
|
1050
|
+
console.error("Error sorting message by date:", error);
|
|
1051
|
+
return 0;
|
|
1052
|
+
}
|
|
1053
|
+
}], ["desc"]);
|
|
1054
|
+
if (sortedMessages.length > 0) {
|
|
1055
|
+
try {
|
|
1056
|
+
const firstMsg = sortedMessages[0];
|
|
1057
|
+
const lastMsg = sortedMessages[sortedMessages.length - 1];
|
|
1058
|
+
console.log("Message date range:", lastMsg.createdAt instanceof Date ? lastMsg.createdAt.toISOString() : "invalid date", "to", firstMsg.createdAt instanceof Date ? firstMsg.createdAt.toISOString() : "invalid date");
|
|
1059
|
+
} catch (error) {
|
|
1060
|
+
console.error("Error logging message date range:", error);
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
816
1063
|
return sortedMessages;
|
|
817
1064
|
}, [safeContextProperty("threadMessages"), auth]);
|
|
818
1065
|
const renderSend = (props) => {
|
|
@@ -940,15 +1187,256 @@ const ThreadConversationViewComponent = ({
|
|
|
940
1187
|
alignItems: "center"
|
|
941
1188
|
} }));
|
|
942
1189
|
};
|
|
1190
|
+
const forceLoadMessages = useCallback((skipValue) => {
|
|
1191
|
+
console.log(`Force loading messages with explicit skip=${skipValue}, limit=50`);
|
|
1192
|
+
if (channelId && parentId) {
|
|
1193
|
+
safeSend({
|
|
1194
|
+
type: Actions.START_LOADING,
|
|
1195
|
+
data: {
|
|
1196
|
+
loading: true
|
|
1197
|
+
}
|
|
1198
|
+
});
|
|
1199
|
+
getThreadMessages({
|
|
1200
|
+
variables: {
|
|
1201
|
+
channelId: channelId == null ? void 0 : channelId.toString(),
|
|
1202
|
+
role: role == null ? void 0 : role.toString(),
|
|
1203
|
+
postParentId: !parentId || parentId == 0 ? null : parentId == null ? void 0 : parentId.toString(),
|
|
1204
|
+
selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
|
|
1205
|
+
skip: skipValue,
|
|
1206
|
+
limit: 50
|
|
1207
|
+
}
|
|
1208
|
+
}).then(({
|
|
1209
|
+
data: data2
|
|
1210
|
+
}) => {
|
|
1211
|
+
var _a2, _b2, _c2;
|
|
1212
|
+
if (data2 == null ? void 0 : data2.getPostThread) {
|
|
1213
|
+
const threads = data2.getPostThread;
|
|
1214
|
+
const threadPost = (_a2 = threads == null ? void 0 : threads.post) != null ? _a2 : [];
|
|
1215
|
+
const threadReplies = (_b2 = threads == null ? void 0 : threads.replies) != null ? _b2 : [];
|
|
1216
|
+
const messageTotalCount = (_c2 = threads == null ? void 0 : threads.replyCount) != null ? _c2 : 0;
|
|
1217
|
+
const messages = [...threadReplies];
|
|
1218
|
+
console.log(`Force load with skip=${skipValue} complete. Got ${messages.length} messages of ${messageTotalCount} total`);
|
|
1219
|
+
safeSend({
|
|
1220
|
+
type: Actions.SET_THREAD_MESSAGES,
|
|
1221
|
+
data: {
|
|
1222
|
+
messages,
|
|
1223
|
+
totalCount: messageTotalCount,
|
|
1224
|
+
threadPost,
|
|
1225
|
+
postThread: threads
|
|
1226
|
+
}
|
|
1227
|
+
});
|
|
1228
|
+
}
|
|
1229
|
+
}).catch((error) => {
|
|
1230
|
+
console.error("Error during force load:", error);
|
|
1231
|
+
safeSend({
|
|
1232
|
+
type: "ERROR",
|
|
1233
|
+
data: {
|
|
1234
|
+
message: error.message
|
|
1235
|
+
}
|
|
1236
|
+
});
|
|
1237
|
+
});
|
|
1238
|
+
}
|
|
1239
|
+
}, [channelId, parentId, getThreadMessages, safeSend]);
|
|
943
1240
|
return /* @__PURE__ */ React__default.createElement(SafeAreaView, { style: {
|
|
944
1241
|
flex: 1
|
|
945
|
-
} }, safeContextProperty("loadingOldMessages", false) && /* @__PURE__ */ React__default.createElement(Box, { className: "absolute top-10 left-0 right-0 z-10 items-center" }, /* @__PURE__ */ React__default.createElement(Box, { className: "bg-blue-500/20 rounded-full px-4 py-2 flex-row items-center" }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500], size: "small" }), /* @__PURE__ */ React__default.createElement(Text, { className: "text-sm font-medium color-blue-600 ml-2" }, "Loading messages..."))),
|
|
1242
|
+
} }, safeContextProperty("loadingOldMessages", false) === true && /* @__PURE__ */ React__default.createElement(Box, { className: "absolute top-10 left-0 right-0 z-10 items-center" }, /* @__PURE__ */ React__default.createElement(Box, { className: "bg-blue-500/20 rounded-full px-4 py-2 flex-row items-center" }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500], size: "small" }), /* @__PURE__ */ React__default.createElement(Text, { className: "text-sm font-medium color-blue-600 ml-2" }, "Loading messages..."))), !safeContextProperty("loadingOldMessages", false) && safeContextProperty("totalCount", 0) > safeContextProperty("threadMessages", []).length && /* @__PURE__ */ React__default.createElement(Box, { className: "absolute top-10 left-0 right-0 z-10 items-center" }, /* @__PURE__ */ React__default.createElement(HStack, { space: 2, className: "px-2" }, /* @__PURE__ */ React__default.createElement(TouchableHighlight, { onPress: () => {
|
|
1243
|
+
console.log("Manual load more pressed");
|
|
1244
|
+
Alert.alert("Load Options", "Choose loading method", [{
|
|
1245
|
+
text: "Normal Load",
|
|
1246
|
+
onPress: () => safeSend({
|
|
1247
|
+
type: Actions.FETCH_MORE_MESSAGES
|
|
1248
|
+
})
|
|
1249
|
+
}, {
|
|
1250
|
+
text: "Try Skip=0",
|
|
1251
|
+
onPress: () => forceLoadMessages(0)
|
|
1252
|
+
}, {
|
|
1253
|
+
text: "Try Skip=0, Limit=50",
|
|
1254
|
+
onPress: () => {
|
|
1255
|
+
console.log("Force loading with explicit skip=0, limit=50");
|
|
1256
|
+
safeSend({
|
|
1257
|
+
type: Actions.START_LOADING,
|
|
1258
|
+
data: {
|
|
1259
|
+
loadingOldMessages: true
|
|
1260
|
+
}
|
|
1261
|
+
});
|
|
1262
|
+
fetchMoreMessages({
|
|
1263
|
+
variables: {
|
|
1264
|
+
channelId: channelId == null ? void 0 : channelId.toString(),
|
|
1265
|
+
role: role == null ? void 0 : role.toString(),
|
|
1266
|
+
postParentId: !parentId || parentId == 0 ? null : parentId == null ? void 0 : parentId.toString(),
|
|
1267
|
+
selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
|
|
1268
|
+
limit: 50,
|
|
1269
|
+
skip: 0
|
|
1270
|
+
}
|
|
1271
|
+
}).then((res) => {
|
|
1272
|
+
var _a2, _b2, _c2, _d2;
|
|
1273
|
+
console.log("LARGE LIMIT response:", JSON.stringify(res == null ? void 0 : res.data, null, 2));
|
|
1274
|
+
if ((_a2 = res == null ? void 0 : res.data) == null ? void 0 : _a2.getPostThread) {
|
|
1275
|
+
const threads = (_b2 = res == null ? void 0 : res.data) == null ? void 0 : _b2.getPostThread;
|
|
1276
|
+
const threadReplies = (_c2 = threads == null ? void 0 : threads.replies) != null ? _c2 : [];
|
|
1277
|
+
const actualTotalCount = (_d2 = threads == null ? void 0 : threads.replyCount) != null ? _d2 : 0;
|
|
1278
|
+
console.log(`Large limit load complete. Got ${threadReplies.length} messages of ${actualTotalCount} total`);
|
|
1279
|
+
if (threadReplies.length > 0) {
|
|
1280
|
+
safeSend({
|
|
1281
|
+
type: Actions.SET_THREAD_MESSAGES,
|
|
1282
|
+
data: {
|
|
1283
|
+
messages: threadReplies,
|
|
1284
|
+
totalCount: actualTotalCount,
|
|
1285
|
+
threadPost: safeContextProperty("threadPost", []),
|
|
1286
|
+
postThread: threads
|
|
1287
|
+
}
|
|
1288
|
+
});
|
|
1289
|
+
} else {
|
|
1290
|
+
safeSend({
|
|
1291
|
+
type: Actions.SET_THREAD_MESSAGES,
|
|
1292
|
+
data: {
|
|
1293
|
+
messages: safeContextProperty("threadMessages", []),
|
|
1294
|
+
totalCount: safeContextProperty("threadMessages", []).length,
|
|
1295
|
+
threadPost: safeContextProperty("threadPost", []),
|
|
1296
|
+
postThread: safeContextProperty("postThread", null)
|
|
1297
|
+
}
|
|
1298
|
+
});
|
|
1299
|
+
}
|
|
1300
|
+
} else {
|
|
1301
|
+
safeSend({
|
|
1302
|
+
type: Actions.STOP_LOADING,
|
|
1303
|
+
data: {
|
|
1304
|
+
loadingOldMessages: false
|
|
1305
|
+
}
|
|
1306
|
+
});
|
|
1307
|
+
}
|
|
1308
|
+
}).catch((error) => {
|
|
1309
|
+
console.error("Error in large limit load:", error);
|
|
1310
|
+
safeSend({
|
|
1311
|
+
type: Actions.STOP_LOADING,
|
|
1312
|
+
data: {
|
|
1313
|
+
loadingOldMessages: false
|
|
1314
|
+
}
|
|
1315
|
+
});
|
|
1316
|
+
});
|
|
1317
|
+
}
|
|
1318
|
+
}, {
|
|
1319
|
+
text: "Try Direct Fetch",
|
|
1320
|
+
onPress: () => {
|
|
1321
|
+
const currentCount = safeContextProperty("threadMessages", []).length;
|
|
1322
|
+
const totalCount = safeContextProperty("totalCount", 0);
|
|
1323
|
+
const missingCount = totalCount - currentCount;
|
|
1324
|
+
if (missingCount <= 0) {
|
|
1325
|
+
Alert.alert("Info", "No missing messages to fetch");
|
|
1326
|
+
return;
|
|
1327
|
+
}
|
|
1328
|
+
console.log(`Attempting direct fetch of missing ${missingCount} messages`);
|
|
1329
|
+
safeSend({
|
|
1330
|
+
type: Actions.START_LOADING,
|
|
1331
|
+
data: {
|
|
1332
|
+
loadingOldMessages: true
|
|
1333
|
+
}
|
|
1334
|
+
});
|
|
1335
|
+
getThreadMessages({
|
|
1336
|
+
variables: {
|
|
1337
|
+
channelId: channelId == null ? void 0 : channelId.toString(),
|
|
1338
|
+
role: role == null ? void 0 : role.toString(),
|
|
1339
|
+
postParentId: !parentId || parentId == 0 ? null : parentId == null ? void 0 : parentId.toString(),
|
|
1340
|
+
selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
|
|
1341
|
+
limit: missingCount,
|
|
1342
|
+
skip: 0
|
|
1343
|
+
}
|
|
1344
|
+
}).then(({
|
|
1345
|
+
data: data2
|
|
1346
|
+
}) => {
|
|
1347
|
+
var _a2, _b2;
|
|
1348
|
+
console.log("DIRECT FETCH response:", JSON.stringify(data2, null, 2));
|
|
1349
|
+
if (data2 == null ? void 0 : data2.getPostThread) {
|
|
1350
|
+
const threads = data2.getPostThread;
|
|
1351
|
+
const threadReplies = (_a2 = threads == null ? void 0 : threads.replies) != null ? _a2 : [];
|
|
1352
|
+
const actualTotalCount = (_b2 = threads == null ? void 0 : threads.replyCount) != null ? _b2 : 0;
|
|
1353
|
+
console.log(`Direct fetch complete. Got ${threadReplies.length} messages of ${actualTotalCount} total`);
|
|
1354
|
+
console.log("Message IDs:", threadReplies.map((msg) => msg.id).join(", "));
|
|
1355
|
+
const existingIds = new Set(safeContextProperty("threadMessages", []).map((msg) => msg.id));
|
|
1356
|
+
const newMessages = threadReplies.filter((msg) => !existingIds.has(msg.id));
|
|
1357
|
+
console.log(`Found ${newMessages.length} new messages that we didn't have before`);
|
|
1358
|
+
if (newMessages.length > 0) {
|
|
1359
|
+
safeSend({
|
|
1360
|
+
type: "FETCH_MORE_MESSAGES_SUCCESS",
|
|
1361
|
+
data: {
|
|
1362
|
+
messages: newMessages,
|
|
1363
|
+
totalCount: actualTotalCount,
|
|
1364
|
+
loadingOldMessages: false
|
|
1365
|
+
}
|
|
1366
|
+
});
|
|
1367
|
+
Alert.alert("Success", `Found ${newMessages.length} new messages`);
|
|
1368
|
+
} else {
|
|
1369
|
+
console.log("No new messages found, adjusting count");
|
|
1370
|
+
safeSend({
|
|
1371
|
+
type: Actions.SET_THREAD_MESSAGES,
|
|
1372
|
+
data: {
|
|
1373
|
+
messages: safeContextProperty("threadMessages", []),
|
|
1374
|
+
totalCount: safeContextProperty("threadMessages", []).length,
|
|
1375
|
+
threadPost: safeContextProperty("threadPost", []),
|
|
1376
|
+
postThread: safeContextProperty("postThread", null)
|
|
1377
|
+
}
|
|
1378
|
+
});
|
|
1379
|
+
Alert.alert("Info", "No new messages found. Count has been adjusted.");
|
|
1380
|
+
}
|
|
1381
|
+
} else {
|
|
1382
|
+
Alert.alert("Error", "Could not fetch thread messages");
|
|
1383
|
+
safeSend({
|
|
1384
|
+
type: Actions.STOP_LOADING,
|
|
1385
|
+
data: {
|
|
1386
|
+
loadingOldMessages: false
|
|
1387
|
+
}
|
|
1388
|
+
});
|
|
1389
|
+
}
|
|
1390
|
+
}).catch((error) => {
|
|
1391
|
+
console.error("Error in direct fetch:", error);
|
|
1392
|
+
Alert.alert("Error", "Failed to fetch messages: " + error.message);
|
|
1393
|
+
safeSend({
|
|
1394
|
+
type: Actions.STOP_LOADING,
|
|
1395
|
+
data: {
|
|
1396
|
+
loadingOldMessages: false
|
|
1397
|
+
}
|
|
1398
|
+
});
|
|
1399
|
+
});
|
|
1400
|
+
}
|
|
1401
|
+
}, {
|
|
1402
|
+
text: "Reset Count",
|
|
1403
|
+
style: "destructive",
|
|
1404
|
+
onPress: () => {
|
|
1405
|
+
console.log("Resetting message count to match reality");
|
|
1406
|
+
safeSend({
|
|
1407
|
+
type: Actions.SET_THREAD_MESSAGES,
|
|
1408
|
+
data: {
|
|
1409
|
+
messages: safeContextProperty("threadMessages", []),
|
|
1410
|
+
totalCount: safeContextProperty("threadMessages", []).length,
|
|
1411
|
+
threadPost: safeContextProperty("threadPost", []),
|
|
1412
|
+
postThread: safeContextProperty("postThread", null)
|
|
1413
|
+
}
|
|
1414
|
+
});
|
|
1415
|
+
}
|
|
1416
|
+
}, {
|
|
1417
|
+
text: "Cancel",
|
|
1418
|
+
style: "cancel"
|
|
1419
|
+
}]);
|
|
1420
|
+
}, underlayColor: "#e6e6e6" }, /* @__PURE__ */ React__default.createElement(Box, { className: "bg-gray-200 rounded-full px-4 py-2 flex-row items-center" }, /* @__PURE__ */ React__default.createElement(MaterialIcons, { name: "arrow-upward", size: 16, color: colors.blue[500] }), /* @__PURE__ */ React__default.createElement(Text, { className: "text-sm font-medium color-blue-600 ml-2" }, "Load More (", safeContextProperty("totalCount", 0) - safeContextProperty("threadMessages", []).length, ")"))), /* @__PURE__ */ React__default.createElement(TouchableHighlight, { onPress: forceRefreshMessages, underlayColor: "#e6e6e6" }, /* @__PURE__ */ React__default.createElement(Box, { className: "bg-gray-200 rounded-full px-4 py-2 flex-row items-center" }, /* @__PURE__ */ React__default.createElement(MaterialIcons, { name: "refresh", size: 16, color: colors.blue[500] }), /* @__PURE__ */ React__default.createElement(Text, { className: "text-sm font-medium color-blue-600 ml-2" }, "Refresh All"))))), isPostParentIdThread && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, ((_a = safeContextProperty("threadPost", [])) == null ? void 0 : _a.length) > 0 && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(VStack, { className: "px-2 pt-2 pb-0", space: "sm" }, /* @__PURE__ */ React__default.createElement(HStack, { space: "sm", className: "items-center" }, /* @__PURE__ */ React__default.createElement(Avatar, { className: "bg-transparent", size: "md" }, /* @__PURE__ */ React__default.createElement(AvatarFallbackText, null, startCase((_d = (_c = (_b = safeContextProperty("threadPost")[0]) == null ? void 0 : _b.author) == null ? void 0 : _c.username) == null ? void 0 : _d.charAt(0))), /* @__PURE__ */ React__default.createElement(AvatarImage, { alt: "image", style: {
|
|
946
1421
|
borderRadius: 6,
|
|
947
1422
|
borderWidth: 2,
|
|
948
1423
|
borderColor: "#fff"
|
|
949
1424
|
}, source: {
|
|
950
1425
|
uri: (_f = (_e = safeContextProperty("threadPost")[0]) == null ? void 0 : _e.author) == null ? void 0 : _f.picture
|
|
951
|
-
} })), /* @__PURE__ */ React__default.createElement(Box, null, /* @__PURE__ */ React__default.createElement(Text, { className: "font-bold color-black" }, (_i = (_h = (_g = safeContextProperty("threadPost")[0]) == null ? void 0 : _g.author) == null ? void 0 : _h.givenName) != null ? _i : "", " ", (_l = (_k = (_j = safeContextProperty("threadPost")[0]) == null ? void 0 : _j.author) == null ? void 0 : _k.familyName) != null ? _l : ""), /* @__PURE__ */ React__default.createElement(Text, { className: "pl-0 color-gray-500" }, createdAtText((_m = safeContextProperty("threadPost")[0]) == null ? void 0 : _m.createdAt), " at", " ",
|
|
1426
|
+
} })), /* @__PURE__ */ React__default.createElement(Box, null, /* @__PURE__ */ React__default.createElement(Text, { className: "font-bold color-black" }, (_i = (_h = (_g = safeContextProperty("threadPost")[0]) == null ? void 0 : _g.author) == null ? void 0 : _h.givenName) != null ? _i : "", " ", (_l = (_k = (_j = safeContextProperty("threadPost")[0]) == null ? void 0 : _j.author) == null ? void 0 : _k.familyName) != null ? _l : ""), /* @__PURE__ */ React__default.createElement(Text, { className: "pl-0 color-gray-500" }, createdAtText((_m = safeContextProperty("threadPost")[0]) == null ? void 0 : _m.createdAt), " at", " ", (() => {
|
|
1427
|
+
var _a2;
|
|
1428
|
+
try {
|
|
1429
|
+
const createdAt = (_a2 = safeContextProperty("threadPost")[0]) == null ? void 0 : _a2.createdAt;
|
|
1430
|
+
if (createdAt && !isNaN(new Date(createdAt).getTime())) {
|
|
1431
|
+
return format(new Date(createdAt), "hh:mm:a");
|
|
1432
|
+
} else {
|
|
1433
|
+
return "unknown time";
|
|
1434
|
+
}
|
|
1435
|
+
} catch (error) {
|
|
1436
|
+
console.error("Error formatting thread post time:", error);
|
|
1437
|
+
return "unknown time";
|
|
1438
|
+
}
|
|
1439
|
+
})()))), /* @__PURE__ */ React__default.createElement(HStack, { space: "sm", className: "px-2 items-center" }, /* @__PURE__ */ React__default.createElement(Text, null, (_o = (_n = safeContextProperty("threadPost")[0]) == null ? void 0 : _n.message) != null ? _o : ""))), /* @__PURE__ */ React__default.createElement(Box, { className: "py-4" }, /* @__PURE__ */ React__default.createElement(Box, { className: "px-4 py-2 border-t border-b border-gray-200" }, /* @__PURE__ */ React__default.createElement(Text, { className: "font-bold color-gray-600" }, (_q = (_p = safeContextProperty("threadPost")[0]) == null ? void 0 : _p.replies) == null ? void 0 : _q.totalCount, " ", ((_s = (_r = safeContextProperty("threadPost")[0]) == null ? void 0 : _r.replies) == null ? void 0 : _s.totalCount) > 0 ? "replies" : "reply"))))), /* @__PURE__ */ React__default.createElement(GiftedChat, { ref: threadMessageListRef, wrapInSafeArea: false, renderLoading: () => /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500] }), messages: messageList, listViewProps: {
|
|
952
1440
|
onScroll: handleScrollToTop,
|
|
953
1441
|
onEndReached: handleEndReached,
|
|
954
1442
|
onEndReachedThreshold: 0.2,
|
|
@@ -959,7 +1447,7 @@ const ThreadConversationViewComponent = ({
|
|
|
959
1447
|
minIndexForVisible: 0,
|
|
960
1448
|
autoscrollToTopThreshold: 100
|
|
961
1449
|
},
|
|
962
|
-
scrollEventThrottle:
|
|
1450
|
+
scrollEventThrottle: 16,
|
|
963
1451
|
keyboardDismissMode: "on-drag",
|
|
964
1452
|
keyboardShouldPersistTaps: "handled"
|
|
965
1453
|
}, onSend: (messages) => {
|
|
@@ -1006,7 +1494,7 @@ const ThreadConversationViewComponent = ({
|
|
|
1006
1494
|
});
|
|
1007
1495
|
}, renderFooter: () => safeContextProperty("loading", false) && !safeContextProperty("loadingOldMessages", false) ? /* @__PURE__ */ React__default.createElement(Box, { className: "w-full py-2 items-center" }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500] })) : safeContextProperty("imageLoading", false) ? /* @__PURE__ */ React__default.createElement(Box, { className: "w-full py-2 items-center" }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500] })) : /* @__PURE__ */ React__default.createElement(React__default.Fragment, null), scrollToBottom: true, loadEarlier: false, isLoadingEarlier: false, user: {
|
|
1008
1496
|
_id: (auth == null ? void 0 : auth.id) || ""
|
|
1009
|
-
}, isTyping: true, alwaysShowSend: safeContextProperty("loading", false) ? false : true, infiniteScroll: true, renderSend, renderInputToolbar, minInputToolbarHeight: 50, renderActions, renderAccessory: !!((
|
|
1497
|
+
}, isTyping: true, alwaysShowSend: safeContextProperty("loading", false) ? false : true, infiniteScroll: true, renderSend, renderInputToolbar, minInputToolbarHeight: 50, renderActions, renderAccessory: !!((_t = state == null ? void 0 : state.context) == null ? void 0 : _t.selectedImage) ? renderAccessory : void 0, renderMessage, maxInputLength: 1e3, placeholder: "Type a message...", showUserAvatar: true, showAvatarForEveryMessage: false, inverted: true, parsePatterns: (linkStyle) => [{
|
|
1010
1498
|
type: "url",
|
|
1011
1499
|
style: __spreadProps(__spreadValues({}, linkStyle), {
|
|
1012
1500
|
color: colors.blue[500]
|