@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.
Files changed (23) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/lib/screens/inbox/components/DialogsListItem.js +423 -50
  3. package/lib/screens/inbox/components/DialogsListItem.js.map +1 -1
  4. package/lib/screens/inbox/components/ServiceDialogsListItem.js +375 -51
  5. package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +1 -1
  6. package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js +175 -0
  7. package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js.map +1 -0
  8. package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js +191 -0
  9. package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js.map +1 -0
  10. package/lib/screens/inbox/containers/Dialogs.js +382 -181
  11. package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
  12. package/lib/screens/inbox/containers/ThreadConversationView.js +536 -48
  13. package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
  14. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js +1 -25
  15. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js.map +1 -1
  16. package/package.json +2 -2
  17. package/src/screens/inbox/components/DialogsListItem.tsx +624 -107
  18. package/src/screens/inbox/components/ServiceDialogsListItem.tsx +506 -114
  19. package/src/screens/inbox/components/SupportServiceDialogsListItem.tsx +35 -17
  20. package/src/screens/inbox/components/workflow/dialogs-list-item-xstate.ts +145 -0
  21. package/src/screens/inbox/components/workflow/service-dialogs-list-item-xstate.ts +159 -0
  22. package/src/screens/inbox/containers/Dialogs.tsx +531 -281
  23. 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,HStack,Avatar,AvatarFallbackText,AvatarImage,Center,Image}from'@admin-layout/gluestack-ui-mobile';import {Platform,SafeAreaView,Linking,View,TouchableHighlight}from'react-native';import {useRoute,useNavigation,useFocusEffect}from'@react-navigation/native';import {useSelector}from'react-redux';import {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;
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
- let date = new Date(value);
31
- if (isToday(date))
32
- return "Today";
33
- if (isYesterday(date))
34
- return "Yesterday";
35
- return format(new Date(value), "MMM dd, yyyy");
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) => __spreadProps(__spreadValues({}, prev), {
142
- context: __spreadProps(__spreadValues({}, prev.context), {
143
- loading: false
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: uniqBy([...prev.context.threadMessages, ...newMessages], ({
211
- id
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, _u;
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: MESSAGES_PER_PAGE
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.START_LOADING,
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
- console.log("Successfully loaded more messages:", threadReplies.length);
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: threadReplies,
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
- if (!safeContextProperty("loadingOldMessages", false) && safeContextProperty("totalCount", 0) > safeContextProperty("threadMessages", []).length) {
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 paddingToTop = 80;
512
- return contentOffset.y <= paddingToTop;
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, _n2, _o2;
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: msg.message || "",
800
- createdAt: new Date(msg.createdAt),
1030
+ text: messageText,
1031
+ createdAt: messageDate,
801
1032
  user: {
802
- _id: (_c2 = (_a2 = msg == null ? void 0 : msg.author) == null ? void 0 : _a2.id) != null ? _c2 : (_b2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _b2.id,
803
- name: (_i2 = (_g2 = (_d2 = msg == null ? void 0 : msg.author) == null ? void 0 : _d2.givenName) != null ? _g2 : ((_e2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _e2.given_name) + " " + ((_f2 = msg == null ? void 0 : msg.author) == null ? void 0 : _f2.familyName)) != null ? _i2 : (_h2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _h2.family_name,
804
- avatar: (_l2 = (_j2 = msg == null ? void 0 : msg.author) == null ? void 0 : _j2.picture) != null ? _l2 : (_k2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _k2.picture
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: (_o2 = (_n2 = (_m2 = msg == null ? void 0 : msg.files) == null ? void 0 : _m2.data) == null ? void 0 : _n2[0]) == null ? void 0 : _o2.url,
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.sort((a, b) => b.createdAt - a.createdAt);
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..."))), 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: {
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", " ", format(new Date((_n = safeContextProperty("threadPost")[0]) == null ? void 0 : _n.createdAt), "hh:ss:a")))), /* @__PURE__ */ React__default.createElement(HStack, { space: "sm", className: "px-2 items-center" }, /* @__PURE__ */ React__default.createElement(Text, null, (_p = (_o = safeContextProperty("threadPost")[0]) == null ? void 0 : _o.message) != null ? _p : ""))), /* @__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" }, (_r = (_q = safeContextProperty("threadPost")[0]) == null ? void 0 : _q.replies) == null ? void 0 : _r.totalCount, " ", ((_t = (_s = safeContextProperty("threadPost")[0]) == null ? void 0 : _s.replies) == null ? void 0 : _t.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: {
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: 100,
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: !!((_u = state == null ? void 0 : state.context) == null ? void 0 : _u.selectedImage) ? renderAccessory : void 0, renderMessage, maxInputLength: 1e3, placeholder: "Type a message...", showUserAvatar: true, showAvatarForEveryMessage: false, inverted: true, parsePatterns: (linkStyle) => [{
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]