@messenger-box/platform-mobile 10.0.3-alpha.34 → 10.0.3-alpha.37

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 (34) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/lib/screens/inbox/components/CachedImage/index.js +125 -93
  3. package/lib/screens/inbox/components/CachedImage/index.js.map +1 -1
  4. package/lib/screens/inbox/components/DialogsListItem.js +80 -256
  5. package/lib/screens/inbox/components/DialogsListItem.js.map +1 -1
  6. package/lib/screens/inbox/components/ServiceDialogsListItem.js +222 -324
  7. package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +1 -1
  8. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js +0 -2
  9. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
  10. package/lib/screens/inbox/containers/ConversationView.js +487 -888
  11. package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
  12. package/lib/screens/inbox/containers/Dialogs.js +243 -547
  13. package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
  14. package/lib/screens/inbox/containers/ThreadConversationView.js +409 -1364
  15. package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
  16. package/package.json +4 -4
  17. package/src/screens/inbox/components/CachedImage/index.tsx +191 -140
  18. package/src/screens/inbox/components/DialogsListItem.tsx +112 -345
  19. package/src/screens/inbox/components/ServiceDialogsListItem.tsx +316 -437
  20. package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +2 -4
  21. package/src/screens/inbox/containers/ConversationView.tsx +676 -993
  22. package/src/screens/inbox/containers/ConversationView.tsx.bk +1467 -0
  23. package/src/screens/inbox/containers/Dialogs.tsx +345 -636
  24. package/src/screens/inbox/containers/ThreadConversationView.tsx +661 -1887
  25. package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js +0 -175
  26. package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js.map +0 -1
  27. package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js +0 -191
  28. package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js.map +0 -1
  29. package/lib/screens/inbox/containers/workflow/conversation-xstate.js +0 -380
  30. package/lib/screens/inbox/containers/workflow/conversation-xstate.js.map +0 -1
  31. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js +0 -211
  32. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js.map +0 -1
  33. package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js +0 -438
  34. package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import React__default,{useState,useRef,useCallback,useEffect,useMemo}from'react';import {Button,Box,Image,Text,ButtonText,Spinner,HStack,VStack,Avatar,AvatarFallbackText,AvatarImage,Center}from'@admin-layout/gluestack-ui-mobile';import {Platform,View,TouchableHighlight,SafeAreaView,Alert,Linking}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,MaterialCommunityIcons,Ionicons}from'@expo/vector-icons';import {Send,Actions as Actions$1,InputToolbar,MessageText,GiftedChat}from'react-native-gifted-chat';import {PreDefinedRole}from'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,useEffect,useCallback,useMemo}from'react';import {Button,Box,ButtonText,Image,Spinner,Text,Skeleton,VStack,HStack,Avatar,AvatarFallbackText,AvatarImage,Center}from'@admin-layout/gluestack-ui-mobile';import {Platform,View,TouchableHighlight}from'react-native';import {useRoute,useNavigation,useFocusEffect}from'@react-navigation/native';import {useSelector}from'react-redux';import {uniqBy,orderBy,startCase}from'lodash-es';import*as ImagePicker from'expo-image-picker';import'base-64';import {MaterialIcons,MaterialCommunityIcons,Ionicons}from'@expo/vector-icons';import {Send,MessageText,InputToolbar,GiftedChat,Actions}from'react-native-gifted-chat';import {FileRefType,PreDefinedRole}from'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';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -27,336 +27,50 @@ const {
27
27
  const createdAtText = (value) => {
28
28
  if (!value)
29
29
  return "";
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
- }
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");
46
36
  };
47
- function useSafeMachine(machine) {
48
- const [state, setState] = useState({
49
- context: {
50
- channelId: null,
51
- postParentId: null,
52
- role: null,
53
- threadMessages: [],
54
- totalCount: 0,
55
- skip: 0,
56
- loading: false,
57
- loadingOldMessages: false,
58
- error: null,
59
- selectedImage: "",
60
- files: [],
61
- images: [],
62
- messageText: "",
63
- imageLoading: false,
64
- postThread: null,
65
- threadPost: [],
66
- isScrollToBottom: false
67
- },
68
- value: "idle"
69
- });
70
- const send = useCallback((event) => {
71
- var _a, _b, _c, _d;
72
- try {
73
- console.log("Thread Event received:", event.type);
74
- if (event.type === Actions.INITIAL_CONTEXT) {
75
- setState((prev) => {
76
- var _a2, _b2, _c2;
77
- return __spreadProps(__spreadValues({}, prev), {
78
- context: __spreadProps(__spreadValues({}, prev.context), {
79
- channelId: ((_a2 = event.data) == null ? void 0 : _a2.channelId) || null,
80
- postParentId: ((_b2 = event.data) == null ? void 0 : _b2.postParentId) || null,
81
- role: ((_c2 = event.data) == null ? void 0 : _c2.role) || null
82
- }),
83
- value: BaseState.FetchThreadMessages
84
- });
85
- });
86
- } else if (event.type === Actions.SET_THREAD_MESSAGES) {
87
- setState((prev) => {
88
- var _a2, _b2, _c2, _d2;
89
- return __spreadProps(__spreadValues({}, prev), {
90
- context: __spreadProps(__spreadValues({}, prev.context), {
91
- threadMessages: ((_a2 = event.data) == null ? void 0 : _a2.messages) || [],
92
- totalCount: ((_b2 = event.data) == null ? void 0 : _b2.totalCount) || 0,
93
- loading: false,
94
- loadingOldMessages: false,
95
- threadPost: ((_c2 = event.data) == null ? void 0 : _c2.threadPost) || [],
96
- postThread: ((_d2 = event.data) == null ? void 0 : _d2.postThread) || null
97
- }),
98
- value: "active"
99
- });
100
- });
101
- } else if (event.type === Actions.CLEAR_MESSAGES) {
102
- setState((prev) => __spreadProps(__spreadValues({}, prev), {
103
- context: __spreadProps(__spreadValues({}, prev.context), {
104
- threadMessages: [],
105
- totalCount: 0
106
- })
107
- }));
108
- } else if (event.type === Actions.SET_MESSAGE_TEXT) {
109
- setState((prev) => {
110
- var _a2;
111
- return __spreadProps(__spreadValues({}, prev), {
112
- context: __spreadProps(__spreadValues({}, prev.context), {
113
- messageText: ((_a2 = event.data) == null ? void 0 : _a2.messageText) || ""
114
- })
115
- });
116
- });
117
- } else if (event.type === Actions.FETCH_MORE_MESSAGES) {
118
- setState((prev) => __spreadProps(__spreadValues({}, prev), {
119
- context: __spreadProps(__spreadValues({}, prev.context), {
120
- loadingOldMessages: true
121
- }),
122
- value: MainState.FetchMoreMessages
123
- }));
124
- } else if (event.type === Actions.SET_IMAGE) {
125
- setState((prev) => {
126
- var _a2, _b2, _c2;
127
- return __spreadProps(__spreadValues({}, prev), {
128
- context: __spreadProps(__spreadValues({}, prev.context), {
129
- selectedImage: ((_a2 = event.data) == null ? void 0 : _a2.image) || "",
130
- images: ((_b2 = event.data) == null ? void 0 : _b2.images) || [],
131
- files: ((_c2 = event.data) == null ? void 0 : _c2.files) || [],
132
- imageLoading: false
133
- })
134
- });
135
- });
136
- } else if (event.type === Actions.CLEAR_IMAGE) {
137
- setState((prev) => __spreadProps(__spreadValues({}, prev), {
138
- context: __spreadProps(__spreadValues({}, prev.context), {
139
- selectedImage: "",
140
- images: [],
141
- files: []
142
- })
143
- }));
144
- } else if (event.type === Actions.START_LOADING) {
145
- setState((prev) => __spreadProps(__spreadValues({}, prev), {
146
- context: __spreadProps(__spreadValues({}, prev.context), {
147
- loading: true
148
- })
149
- }));
150
- } else if (event.type === Actions.STOP_LOADING) {
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
- });
160
- } else if (event.type === Actions.SEND_THREAD_MESSAGE) {
161
- console.log("Sending message event with text:", (_a = event.data) == null ? void 0 : _a.messageText);
162
- setState((prev) => {
163
- var _a2;
164
- return __spreadProps(__spreadValues({}, prev), {
165
- context: __spreadProps(__spreadValues({}, prev.context), {
166
- loading: true,
167
- messageText: ((_a2 = event.data) == null ? void 0 : _a2.messageText) || prev.context.messageText
168
- }),
169
- value: MainState.SendThreadMessage
170
- });
171
- });
172
- } else if (event.type === Actions.SEND_THREAD_MESSAGE_WITH_FILE) {
173
- console.log("Sending message with file event, text:", (_b = event.data) == null ? void 0 : _b.messageText);
174
- setState((prev) => {
175
- var _a2;
176
- return __spreadProps(__spreadValues({}, prev), {
177
- context: __spreadProps(__spreadValues({}, prev.context), {
178
- loading: true,
179
- messageText: ((_a2 = event.data) == null ? void 0 : _a2.messageText) || prev.context.messageText
180
- }),
181
- value: MainState.SendThreadMessageWithFile
182
- });
183
- });
184
- } else if (event.type === "SEND_THREAD_MESSAGE_SUCCESS" || event.type === "SEND_THREAD_MESSAGE_WITH_FILE_SUCCESS") {
185
- console.log("Handling send success event:", event.type, "with message:", (_d = (_c = event.data) == null ? void 0 : _c.message) == null ? void 0 : _d.id);
186
- setState((prev) => {
187
- var _a2;
188
- if (!((_a2 = event.data) == null ? void 0 : _a2.message)) {
189
- console.warn("Send success event without message data");
190
- return __spreadProps(__spreadValues({}, prev), {
191
- context: __spreadProps(__spreadValues({}, prev.context), {
192
- loading: false,
193
- messageText: "",
194
- images: [],
195
- selectedImage: "",
196
- files: []
197
- }),
198
- value: "active"
199
- });
200
- }
201
- const newMessage = event.data.message;
202
- const updatedMessages = [newMessage, ...prev.context.threadMessages];
203
- console.log("Updated thread messages list after send, now has", updatedMessages.length, "messages");
204
- return __spreadProps(__spreadValues({}, prev), {
205
- context: __spreadProps(__spreadValues({}, prev.context), {
206
- loading: false,
207
- messageText: "",
208
- images: [],
209
- selectedImage: "",
210
- files: [],
211
- threadMessages: updatedMessages,
212
- totalCount: prev.context.totalCount + 1
213
- }),
214
- value: "active"
215
- });
216
- });
217
- } else if (event.type === "FETCH_MORE_MESSAGES_SUCCESS") {
218
- setState((prev) => {
219
- var _a2, _b2;
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}`);
260
- return __spreadProps(__spreadValues({}, prev), {
261
- context: __spreadProps(__spreadValues({}, prev.context), {
262
- loadingOldMessages: false,
263
- threadMessages: sortedMessages,
264
- totalCount: newTotalCount
265
- }),
266
- value: "active"
267
- });
268
- });
269
- } else if (event.type === "ERROR") {
270
- setState((prev) => {
271
- var _a2;
272
- return __spreadProps(__spreadValues({}, prev), {
273
- context: __spreadProps(__spreadValues({}, prev.context), {
274
- loading: false,
275
- loadingOldMessages: false,
276
- error: ((_a2 = event.data) == null ? void 0 : _a2.message) || "Unknown error"
277
- }),
278
- value: "error"
279
- });
280
- });
281
- }
282
- } catch (error) {
283
- console.error("Error in thread conversation send function:", error);
284
- }
285
- }, []);
286
- const stateWithMatches = useMemo(() => {
287
- return __spreadProps(__spreadValues({}, state), {
288
- matches: (checkState) => {
289
- return state.value === checkState;
290
- }
291
- });
292
- }, [state]);
293
- return [stateWithMatches, send];
294
- }
295
37
  const ThreadConversationViewComponent = ({
296
38
  channelId,
297
39
  postParentId,
298
40
  isPostParentIdThread,
299
41
  role
300
42
  }) => {
301
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
43
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
302
44
  const {
303
45
  params
304
46
  } = useRoute();
305
47
  const [channelToTop, setChannelToTop] = useState(0);
306
- useRef(true);
307
- const [state, send] = useSafeMachine();
308
- useCallback(() => {
309
- try {
310
- return (state == null ? void 0 : state.context) || {};
311
- } catch (error) {
312
- console.error("Error accessing state.context:", error);
313
- return {};
314
- }
315
- }, [state]);
316
- const safeContextProperty = useCallback((property, defaultValue = null) => {
317
- var _a2, _b2;
318
- try {
319
- return (_b2 = (_a2 = state == null ? void 0 : state.context) == null ? void 0 : _a2[property]) != null ? _b2 : defaultValue;
320
- } catch (error) {
321
- console.error(`Error accessing state.context.${property}:`, error);
322
- return defaultValue;
323
- }
324
- }, [state]);
325
- const safeMatches = useCallback((stateValue) => {
326
- var _a2;
327
- try {
328
- return ((_a2 = state == null ? void 0 : state.matches) == null ? void 0 : _a2.call(state, stateValue)) || false;
329
- } catch (error) {
330
- console.error(`Error calling state.matches with ${stateValue}:`, error);
331
- return false;
332
- }
333
- }, [state]);
334
- const safeSend = useCallback((event) => {
335
- try {
336
- send(event);
337
- } catch (error) {
338
- console.error("Error sending event to state machine:", error, event);
339
- }
340
- }, [send]);
341
- const stateRef = useRef(state);
342
- useEffect(() => {
343
- stateRef.current = state;
344
- }, [state]);
48
+ const [channelMessages, setChannelMessages] = useState([]);
345
49
  const auth = useSelector(userSelector);
50
+ const [totalCount, setTotalCount] = useState(0);
346
51
  const [selectedImage, setImage] = useState("");
52
+ const [loadingOldMessages, setLoadingOldMessages] = useState(false);
53
+ const [loadEarlierMsg, setLoadEarlierMsg] = useState(false);
347
54
  const navigation = useNavigation();
348
55
  const [files, setFiles] = useState([]);
349
56
  const [images, setImages] = useState([]);
57
+ const [msg, setMsg] = useState("");
58
+ const [loading, setLoading] = useState(false);
59
+ const [imageLoading, setImageLoading] = useState(false);
60
+ const [uploadingMessageId, setUploadingMessageId] = useState(null);
61
+ const [expoTokens, setExpoTokens] = useState([]);
350
62
  const [isShowImageViewer, setImageViewer] = useState(false);
351
63
  const [imageObject, setImageObject] = useState({});
352
64
  const [parentId, setParentId] = useState(postParentId);
353
- const [expoTokens, setExpoTokens] = useState([]);
354
- const threadMessageListRef = useRef(null);
355
- const [sendThreadMessage] = useCreatePostThreadMutation();
356
- const [sendExpoNotificationOnPostMutation] = useSendExpoNotificationOnPostMutation();
65
+ const [postThread, setPostThread] = useState();
357
66
  const {
358
67
  startUpload
359
68
  } = useUploadFilesNative();
69
+ const [threadPost, setThreadPost] = useState([]);
70
+ const [isScrollToBottom, setIsScrollToBottom] = useState(false);
71
+ const threadMessageListRef = useRef(null);
72
+ const [sendThreadMessage] = useCreatePostThreadMutation();
73
+ const [sendExpoNotificationOnPostMutation] = useSendExpoNotificationOnPostMutation();
360
74
  const [getThreadMessages, {
361
75
  data,
362
76
  loading: threadLoading,
@@ -366,355 +80,214 @@ const ThreadConversationViewComponent = ({
366
80
  }] = useGetPostThreadLazyQuery({
367
81
  fetchPolicy: "cache-and-network"
368
82
  });
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]);
421
83
  useFocusEffect(React__default.useCallback(() => {
422
84
  var _a2;
423
85
  navigation.setOptions({
424
86
  title: (_a2 = params == null ? void 0 : params.title) != null ? _a2 : "Thread",
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" }))
87
+ 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" }))
427
88
  });
428
- if (channelId && postParentId) {
429
- safeSend({
430
- type: Actions.INITIAL_CONTEXT,
431
- data: {
432
- channelId,
433
- postParentId,
434
- role
435
- }
89
+ if (postParentId) {
90
+ refetchThreadMessages({
91
+ channelId: channelId == null ? void 0 : channelId.toString(),
92
+ role: role == null ? void 0 : role.toString(),
93
+ postParentId: postParentId == null ? void 0 : postParentId.toString(),
94
+ selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
95
+ limit: MESSAGES_PER_PAGE
436
96
  });
437
97
  }
438
98
  setParentId(postParentId);
439
99
  return () => {
440
- safeSend({
441
- type: Actions.CLEAR_MESSAGES
442
- });
100
+ setTotalCount(0);
101
+ setChannelMessages([]);
102
+ setThreadPost([]);
443
103
  };
444
- }, [postParentId, forceRefreshMessages]));
445
- useEffect(() => {
446
- if (safeMatches(BaseState.FetchThreadMessages)) {
447
- fetchThreadMessages();
448
- }
449
- }, [state.value]);
450
- useEffect(() => {
451
- if (safeMatches(MainState.FetchMoreMessages)) {
452
- onFetchOld();
453
- }
454
- }, [state.value]);
104
+ }, [postParentId]));
455
105
  useEffect(() => {
456
- if (safeMatches(MainState.SendThreadMessage)) {
457
- const messageText = safeContextProperty("messageText", "");
458
- console.log("Sending message from state transition, text:", messageText);
459
- sendThreadMessageHandler(messageText);
460
- }
461
- }, [state.value]);
462
- useEffect(() => {
463
- if (safeMatches(MainState.SendThreadMessageWithFile)) {
464
- const messageText = safeContextProperty("messageText", "");
465
- const images2 = safeContextProperty("images", []);
466
- sendThreadMessageWithFileHandler(messageText, images2);
467
- }
468
- }, [state.value]);
469
- const fetchThreadMessages = useCallback(() => {
470
106
  if (channelId && parentId) {
471
- if (__DEV__)
472
- console.log("Initial fetch of thread messages using larger limit (50)");
473
- safeSend({
474
- type: Actions.START_LOADING,
475
- data: {
476
- loading: true
477
- }
478
- });
479
107
  getThreadMessages({
480
108
  variables: {
481
109
  channelId: channelId == null ? void 0 : channelId.toString(),
482
110
  role: role == null ? void 0 : role.toString(),
483
111
  postParentId: !parentId || parentId == 0 ? null : parentId == null ? void 0 : parentId.toString(),
484
112
  selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
485
- limit: 50
486
- }
487
- }).then(({
488
- data: data2
489
- }) => {
490
- var _a2, _b2, _c2;
491
- if (data2 == null ? void 0 : data2.getPostThread) {
492
- const threads = data2.getPostThread;
493
- const threadPost = (_a2 = threads == null ? void 0 : threads.post) != null ? _a2 : [];
494
- const threadReplies = (_b2 = threads == null ? void 0 : threads.replies) != null ? _b2 : [];
495
- const messageTotalCount = (_c2 = threads == null ? void 0 : threads.replyCount) != null ? _c2 : 0;
496
- const messages = [...threadReplies];
497
- if (__DEV__)
498
- console.log(`Initial fetch complete. Got ${messages.length} messages of ${messageTotalCount} total`);
499
- safeSend({
500
- type: Actions.SET_THREAD_MESSAGES,
501
- data: {
502
- messages,
503
- totalCount: messageTotalCount,
504
- threadPost,
505
- postThread: threads
506
- }
507
- });
113
+ limit: MESSAGES_PER_PAGE
508
114
  }
509
- }).catch((error) => {
510
- safeSend({
511
- type: "ERROR",
512
- data: {
513
- message: error.message
514
- }
515
- });
516
115
  });
517
116
  }
518
- }, [channelId, parentId, role, getThreadMessages, safeSend]);
117
+ }, [parentId]);
519
118
  React__default.useEffect(() => {
520
119
  var _a2, _b2, _c2;
521
120
  if (data == null ? void 0 : data.getPostThread) {
522
121
  const threads = data.getPostThread;
523
- const threadPost = (_a2 = threads == null ? void 0 : threads.post) != null ? _a2 : [];
122
+ const threadPost2 = (_a2 = threads == null ? void 0 : threads.post) != null ? _a2 : [];
524
123
  const threadReplies = (_b2 = threads == null ? void 0 : threads.replies) != null ? _b2 : [];
525
124
  const messeageTotalCount = (_c2 = threads == null ? void 0 : threads.replyCount) != null ? _c2 : 0;
526
- const messages = [...threadReplies];
527
- safeSend({
528
- type: Actions.SET_THREAD_MESSAGES,
529
- data: {
530
- messages,
531
- totalCount: messeageTotalCount,
532
- threadPost,
533
- postThread: threads
534
- }
535
- });
536
- }
537
- }, [data]);
538
- React__default.useEffect(() => {
539
- if (safeContextProperty("selectedImage")) {
540
- safeSend({
541
- type: Actions.STOP_LOADING
542
- });
543
- }
544
- }, [safeContextProperty("selectedImage")]);
545
- React__default.useEffect(() => {
546
- const isLoading = safeContextProperty("loadingOldMessages", false);
547
- if (isLoading) {
548
- console.log("Message loading timeout safety started");
549
- const timeoutId = setTimeout(() => {
550
- if (safeContextProperty("loadingOldMessages", false)) {
551
- console.log("Message loading timed out - resetting state");
552
- safeSend({
553
- type: Actions.STOP_LOADING,
554
- data: {
555
- loadingOldMessages: false
556
- }
557
- });
558
- }
559
- }, 1e4);
560
- return () => clearTimeout(timeoutId);
561
- }
562
- }, [safeContextProperty("loadingOldMessages")]);
563
- const failedLoadAttemptsRef = useRef(0);
564
- const registerLoadAttemptResult = useCallback((success) => {
565
- if (!success) {
566
- failedLoadAttemptsRef.current += 1;
567
- console.log(`Failed load attempt registered, count: ${failedLoadAttemptsRef.current}`);
568
- } else {
569
- failedLoadAttemptsRef.current = 0;
570
- }
571
- }, []);
572
- React__default.useEffect(() => {
573
- const isLoading = safeContextProperty("loadingOldMessages", false);
574
- const totalCount = safeContextProperty("totalCount", 0);
575
- const messagesCount = safeContextProperty("threadMessages", []).length;
576
- if (!isLoading && totalCount > messagesCount) {
577
- if (failedLoadAttemptsRef.current >= 2) {
578
- console.log(`Auto-fixing incorrect message count after ${failedLoadAttemptsRef.current + 1} failed load attempts`);
579
- console.log(`Adjusting totalCount from ${totalCount} to ${messagesCount}`);
580
- safeSend({
581
- type: Actions.SET_THREAD_MESSAGES,
582
- data: {
583
- messages: safeContextProperty("threadMessages", []),
584
- totalCount: messagesCount,
585
- threadPost: safeContextProperty("threadPost", []),
586
- postThread: safeContextProperty("postThread", null)
587
- }
588
- });
589
- failedLoadAttemptsRef.current = 0;
125
+ const messages = [threadPost2, ...threadReplies];
126
+ if (messages && messages.length > 0 && messeageTotalCount > totalCount || messages && messages.length > 0 && channelMessages.length === 0) {
127
+ setThreadMessages(messages, messeageTotalCount);
590
128
  }
591
129
  }
592
- }, [safeContextProperty("loadingOldMessages"), safeContextProperty("threadMessages")]);
593
- React__default.useCallback(() => {
130
+ if (isScrollToBottom && channelMessages)
131
+ scrollToBottom();
132
+ }, [data, channelMessages, loadingOldMessages, totalCount, isPostParentIdThread, isScrollToBottom]);
133
+ const setThreadMessages = (messages, messagesTotalCount) => {
134
+ setChannelMessages((oldMessages) => uniqBy([...messages, ...oldMessages], ({
135
+ id
136
+ }) => id));
137
+ setTotalCount(messagesTotalCount);
138
+ };
139
+ React__default.useEffect(() => {
140
+ if (selectedImage)
141
+ setImageLoading(false);
142
+ }, [selectedImage]);
143
+ const scrollToBottom = React__default.useCallback(() => {
594
144
  if (threadMessageListRef == null ? void 0 : threadMessageListRef.current) {
595
- threadMessageListRef.current.scrollToBottom();
145
+ setIsScrollToBottom(false);
146
+ threadMessageListRef.current.scrollTop = threadMessageListRef.current.scrollHeight;
596
147
  }
597
148
  }, [threadMessageListRef]);
598
- const isCloseToTop = useCallback(({
149
+ const onFetchOld = useCallback(() => {
150
+ if (totalCount > channelMessages.length && !loadingOldMessages) {
151
+ setLoadEarlierMsg(true);
152
+ fetchMoreMessages({
153
+ variables: {
154
+ channelId: channelId == null ? void 0 : channelId.toString(),
155
+ role: role == null ? void 0 : role.toString(),
156
+ postParentId: parentId == null ? void 0 : parentId.toString(),
157
+ selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
158
+ limit: MESSAGES_PER_PAGE,
159
+ skip: channelMessages.length - 1
160
+ }
161
+ }).then((res) => {
162
+ var _a2, _b2, _c2, _d2;
163
+ if ((_a2 = res == null ? void 0 : res.data) == null ? void 0 : _a2.getPostThread) {
164
+ const threads = (_b2 = res == null ? void 0 : res.data) == null ? void 0 : _b2.getPostThread;
165
+ const threadReplies = (_c2 = threads == null ? void 0 : threads.replies) != null ? _c2 : [];
166
+ const messeageTotalCount = (_d2 = threads == null ? void 0 : threads.replyCount) != null ? _d2 : 0;
167
+ setThreadMessages(threadReplies, messeageTotalCount);
168
+ }
169
+ }).finally(() => {
170
+ setLoadEarlierMsg(false);
171
+ setLoadingOldMessages(false);
172
+ }).catch((error) => {
173
+ setLoadEarlierMsg(false);
174
+ setLoadingOldMessages(false);
175
+ });
176
+ }
177
+ }, [parentId, channelId, totalCount, channelMessages]);
178
+ const isCloseToTop = ({
599
179
  layoutMeasurement,
600
180
  contentOffset,
601
181
  contentSize
602
182
  }) => {
603
- const visibleHeight = layoutMeasurement.height;
604
- const topThreshold = Math.min(80, visibleHeight * 0.15);
605
- return contentOffset.y <= topThreshold;
606
- }, []);
607
- const handleScrollToTop = useCallback(({
608
- nativeEvent
609
- }) => {
610
- if (isCloseToTop(nativeEvent)) {
611
- const isLoading = safeContextProperty("loadingOldMessages", false);
612
- const totalCount = safeContextProperty("totalCount", 0);
613
- const currentCount = safeContextProperty("threadMessages", []).length;
614
- const hasMoreMessages = totalCount > currentCount;
615
- if (__DEV__)
616
- console.log(`Scroll near top - Loading state: ${isLoading}, Messages: ${currentCount}/${totalCount}, Has more: ${hasMoreMessages}`);
617
- if (!isLoading && hasMoreMessages) {
618
- if (__DEV__)
619
- console.log("Near top of list - loading older messages");
620
- safeSend({
621
- type: Actions.FETCH_MORE_MESSAGES
622
- });
623
- }
624
- }
625
- }, [isCloseToTop, safeContextProperty, safeSend]);
626
- const handleEndReached = () => {
627
- console.log("Reached end of message list");
183
+ const paddingToTop = 60;
184
+ return contentSize.height - layoutMeasurement.height - paddingToTop <= contentOffset.y;
628
185
  };
629
186
  const onSelectImages = async () => {
630
187
  var _a2;
188
+ setImageLoading(true);
631
189
  try {
632
- safeSend({
633
- type: Actions.START_LOADING
634
- });
635
- const imageSource = await ImagePicker.launchImageLibraryAsync({
190
+ let imageSource = await ImagePicker.launchImageLibraryAsync({
636
191
  mediaTypes: ImagePicker.MediaTypeOptions.Images,
637
192
  allowsEditing: true,
638
193
  aspect: [4, 3],
639
194
  quality: 0.8,
640
195
  base64: true,
641
- allowsMultipleSelection: false
196
+ exif: false
642
197
  });
643
- if (imageSource.canceled) {
644
- console.log("Image selection was canceled");
645
- safeSend({
646
- type: Actions.STOP_LOADING
647
- });
648
- return;
649
- }
650
- if (!imageSource.assets || imageSource.assets.length === 0 || !((_a2 = imageSource.assets[0]) == null ? void 0 : _a2.base64)) {
651
- console.error("No valid image data received");
652
- safeSend({
653
- type: "ERROR",
654
- data: {
655
- message: "No valid image data received"
656
- }
198
+ if (!(imageSource == null ? void 0 : imageSource.canceled)) {
199
+ const selectedAsset = (_a2 = imageSource == null ? void 0 : imageSource.assets) == null ? void 0 : _a2[0];
200
+ if (!selectedAsset) {
201
+ setImageLoading(false);
202
+ return;
203
+ }
204
+ const base64Data = selectedAsset.base64;
205
+ const previewImage = base64Data ? `data:image/jpeg;base64,${base64Data}` : selectedAsset.uri;
206
+ const asset = __spreadProps(__spreadValues({}, selectedAsset), {
207
+ url: selectedAsset.uri,
208
+ fileName: selectedAsset.fileName || `image_${Date.now()}.jpg`,
209
+ mimeType: "image/jpeg"
657
210
  });
658
- return;
211
+ setImage(previewImage);
212
+ setImages([asset]);
213
+ setImageLoading(false);
214
+ } else {
215
+ setImageLoading(false);
659
216
  }
660
- const asset = imageSource.assets[0];
661
- const fileExtension = asset.mimeType ? asset.mimeType.split("/").pop() || "jpg" : "jpg";
662
- const filename = `image_${Date.now()}.${fileExtension}`;
663
- const mimeType = asset.mimeType || "image/jpeg";
664
- const image = `data:${mimeType};base64,${asset.base64}`;
665
- const fileData = {
666
- uri: asset.uri,
667
- type: mimeType,
668
- name: filename,
669
- base64: asset.base64
670
- };
671
- console.log(`Selected image: ${filename}, type: ${mimeType}`);
672
- safeSend({
673
- type: Actions.SET_IMAGE,
674
- data: {
675
- image,
676
- files: [fileData],
677
- images: [asset]
678
- }
679
- });
680
217
  } catch (error) {
681
218
  console.error("Error selecting image:", error);
682
- safeSend({
683
- type: "ERROR",
684
- data: {
685
- message: error.message || "Failed to select image"
686
- }
687
- });
219
+ setImageLoading(false);
688
220
  }
689
221
  };
690
- const sendThreadMessageHandler = useCallback(async (message) => {
691
- var _a2, _b2;
692
- console.log("Sending message:", message);
693
- if (!channelId) {
694
- console.error("No channelId provided");
222
+ const handleSend = useCallback(async (message) => {
223
+ var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2;
224
+ if (!channelId)
225
+ return;
226
+ if (!message && message !== " " && images.length === 0)
695
227
  return;
696
- }
697
- const messageContent = (message == null ? void 0 : message.trim()) || " ";
698
- console.log("Using message content for sending:", messageContent);
699
228
  const postId = objectId();
700
- console.log("Generated postId:", postId);
701
- safeSend({
702
- type: Actions.START_LOADING
703
- });
229
+ const currentDate = new Date();
230
+ setUploadingMessageId(postId);
231
+ images.length > 0 ? {
232
+ id: objectId(),
233
+ name: ((_a2 = images[0]) == null ? void 0 : _a2.fileName) || "image.jpg",
234
+ refType: FileRefType.Post,
235
+ height: ((_b2 = images[0]) == null ? void 0 : _b2.height) || 0,
236
+ width: ((_c2 = images[0]) == null ? void 0 : _c2.width) || 0
237
+ } : null;
238
+ ({
239
+ message: message || (images.length > 0 ? " " : ""),
240
+ createdAt: currentDate.toISOString(),
241
+ author: {
242
+ id: (_d2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _d2.id,
243
+ givenName: (_e2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _e2.given_name,
244
+ familyName: (_f2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _f2.family_name,
245
+ picture: (_g2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _g2.picture
246
+ }});
247
+ setMsg("");
704
248
  try {
705
- console.log("Sending mutation with variables:", {
706
- channelId,
707
- postThreadId: (_a2 = safeContextProperty("postThread")) == null ? void 0 : _a2.id,
708
- postParentId: !parentId || parentId == 0 ? null : parentId,
709
- message: messageContent
710
- });
711
- const result = await sendThreadMessage({
249
+ let fileIds = null;
250
+ if (images && images.length > 0) {
251
+ setLoading(true);
252
+ const imagesToUpload = images.map((img) => {
253
+ return __spreadProps(__spreadValues({}, img), {
254
+ uri: img.uri || img.url,
255
+ type: img.mimeType || "image/jpeg",
256
+ name: img.fileName || `image_${Date.now()}.jpg`
257
+ });
258
+ });
259
+ const uploadResponse = await startUpload({
260
+ file: imagesToUpload,
261
+ saveUploadedFile: {
262
+ variables: {
263
+ postId
264
+ }
265
+ },
266
+ createUploadLink: {
267
+ variables: {
268
+ postId
269
+ }
270
+ }
271
+ });
272
+ if (uploadResponse == null ? void 0 : uploadResponse.error)
273
+ throw new Error(uploadResponse.error.toString());
274
+ const uploadedFiles = uploadResponse.data;
275
+ if (uploadResponse.data) {
276
+ setImage("");
277
+ setFiles([]);
278
+ setImages([]);
279
+ fileIds = (_h2 = uploadedFiles == null ? void 0 : uploadedFiles.map((f) => f.id)) != null ? _h2 : null;
280
+ }
281
+ }
282
+ await sendThreadMessage({
712
283
  variables: {
284
+ postId,
713
285
  channelId,
714
- postThreadId: safeContextProperty("postThread") && ((_b2 = safeContextProperty("postThread")) == null ? void 0 : _b2.id),
715
- postParentId: !parentId || parentId == 0 ? null : parentId,
286
+ postThreadId: postThread && (postThread == null ? void 0 : postThread.id),
287
+ postParentId: !parentId || parentId === 0 ? null : parentId,
716
288
  threadMessageInput: {
717
- content: messageContent,
289
+ content: message,
290
+ files: fileIds,
718
291
  role
719
292
  }
720
293
  },
@@ -722,150 +295,29 @@ const ThreadConversationViewComponent = ({
722
295
  data: data2,
723
296
  errors
724
297
  }) => {
725
- var _a3, _b3, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2;
726
- console.log("Send message update callback - data:", data2, "errors:", errors);
727
- if (!data2 || errors) {
728
- console.error("Send message failed:", errors);
729
- safeSend({
730
- type: Actions.STOP_LOADING
731
- });
298
+ var _a3, _b3, _c3, _d3, _e3, _f3, _g3;
299
+ if (!data2 || errors)
732
300
  return;
733
- }
734
- console.log("Message sent successfully:", (_a3 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _a3.lastMessage);
735
- const newMessage = (_b3 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _b3.lastMessage;
736
- safeSend({
737
- type: "SEND_THREAD_MESSAGE_SUCCESS",
738
- data: {
739
- message: newMessage,
740
- messageText: ""
741
- }
742
- });
743
- if (!parentId || parentId == 0) {
744
- console.log("Setting new parentId:", (_d2 = (_c2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _c2.lastMessage) == null ? void 0 : _d2.id);
745
- setParentId((_f2 = (_e2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _e2.lastMessage) == null ? void 0 : _f2.id);
301
+ setPostThread((_a3 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _a3.data);
302
+ const lastMessageId = (_c3 = (_b3 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _b3.lastMessage) == null ? void 0 : _c3.id;
303
+ if (!parentId || parentId === 0) {
304
+ setParentId((_e3 = (_d3 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _d3.lastMessage) == null ? void 0 : _e3.id);
746
305
  }
747
306
  setChannelToTop(channelToTop + 1);
748
- const lastMessageId = (_h2 = (_g2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _g2.lastMessage) == null ? void 0 : _h2.id;
749
- sendPushNotification(lastMessageId, channelId, parentId, (_j2 = (_i2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _i2.data) == null ? void 0 : _j2.id);
307
+ sendPushNotification(lastMessageId, channelId, parentId, (_g3 = (_f3 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _f3.data) == null ? void 0 : _g3.id);
750
308
  }
751
309
  });
752
- console.log("Send mutation result:", result);
310
+ setChannelMessages((oldMessages) => oldMessages.map((msg2) => msg2.id === postId ? __spreadProps(__spreadValues({}, msg2), {
311
+ isDelivered: true
312
+ }) : msg2));
753
313
  } catch (error) {
754
314
  console.error("Error sending message:", error);
755
- safeSend({
756
- type: "ERROR",
757
- data: {
758
- message: error.message || "Failed to send message"
759
- }
760
- });
761
- }
762
- }, [channelId, parentId, state.context, role]);
763
- const sendThreadMessageWithFileHandler = useCallback(async (message, images2) => {
764
- var _a2, _b2;
765
- console.log("Sending message with file:", message, "Images:", images2.length);
766
- if (!channelId) {
767
- console.error("No channelId provided");
768
- return;
769
- }
770
- if (images2.length === 0) {
771
- console.error("No images to send");
772
- return;
773
- }
774
- const messageContent = (message == null ? void 0 : message.trim()) || " ";
775
- console.log("Using message content for file send:", messageContent);
776
- const postId = objectId();
777
- console.log("Generated postId for file upload:", postId);
778
- try {
779
- const preparedImages = images2.map((img) => ({
780
- uri: img.uri,
781
- type: img.mimeType || "image/jpeg",
782
- name: img.fileName || `image_${Date.now()}.jpg`,
783
- base64: img.base64,
784
- width: img.width || 0,
785
- height: img.height || 0
786
- }));
787
- console.log("Starting file upload with prepared images:", preparedImages.length);
788
- const uploadResponse = await startUpload({
789
- file: preparedImages,
790
- saveUploadedFile: {
791
- variables: {
792
- postId
793
- }
794
- },
795
- createUploadLink: {
796
- variables: {
797
- postId
798
- }
799
- }
800
- });
801
- if (uploadResponse == null ? void 0 : uploadResponse.error) {
802
- console.error("File upload failed:", uploadResponse.error);
803
- safeSend({
804
- type: Actions.STOP_LOADING
805
- });
806
- return;
807
- }
808
- const uploadedFiles = uploadResponse.data;
809
- console.log("Files uploaded successfully:", uploadedFiles == null ? void 0 : uploadedFiles.length);
810
- if (uploadResponse.data) {
811
- const files2 = (_a2 = uploadedFiles == null ? void 0 : uploadedFiles.map((f) => f.id)) != null ? _a2 : null;
812
- console.log("File IDs for message:", files2);
813
- console.log("Sending message with attached files");
814
- const result = await sendThreadMessage({
815
- variables: {
816
- postId,
817
- channelId,
818
- postThreadId: safeContextProperty("postThread") && ((_b2 = safeContextProperty("postThread")) == null ? void 0 : _b2.id),
819
- postParentId: !parentId || parentId == 0 ? null : parentId,
820
- threadMessageInput: {
821
- content: messageContent,
822
- files: files2,
823
- role
824
- }
825
- },
826
- update: (cache, {
827
- data: data2,
828
- errors
829
- }) => {
830
- var _a3, _b3, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2;
831
- console.log("Send message with file update callback - data:", data2, "errors:", errors);
832
- if (!data2 || errors) {
833
- console.error("Send message with file failed:", errors);
834
- safeSend({
835
- type: Actions.STOP_LOADING
836
- });
837
- return;
838
- }
839
- console.log("Message with file sent successfully:", (_a3 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _a3.lastMessage);
840
- const newMessage = (_b3 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _b3.lastMessage;
841
- safeSend({
842
- type: "SEND_THREAD_MESSAGE_WITH_FILE_SUCCESS",
843
- data: {
844
- message: newMessage,
845
- messageText: ""
846
- }
847
- });
848
- if (!parentId || parentId == 0) {
849
- console.log("Setting new parentId:", (_d2 = (_c2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _c2.lastMessage) == null ? void 0 : _d2.id);
850
- setParentId((_f2 = (_e2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _e2.lastMessage) == null ? void 0 : _f2.id);
851
- }
852
- setChannelToTop(channelToTop + 1);
853
- const lastMessageId = (_h2 = (_g2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _g2.lastMessage) == null ? void 0 : _h2.id;
854
- sendPushNotification(lastMessageId, channelId, parentId, (_j2 = (_i2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _i2.data) == null ? void 0 : _j2.id);
855
- }
856
- });
857
- console.log("Send with file mutation result:", result);
858
- }
859
- } catch (error) {
860
- console.error("Error sending message with file:", error);
861
- safeSend({
862
- type: "ERROR",
863
- data: {
864
- message: error.message || "Failed to send message with file"
865
- }
866
- });
315
+ setChannelMessages((oldMessages) => oldMessages.filter((msg2) => msg2.id !== postId));
316
+ } finally {
317
+ setLoading(false);
318
+ setUploadingMessageId(null);
867
319
  }
868
- }, [channelId, parentId, state.context, role, startUpload]);
320
+ }, [auth, channelId, channelToTop, images, parentId, postThread, selectedImage, setChannelMessages]);
869
321
  const sendPushNotification = async (messageId, channelId2, parentId2, threadId) => {
870
322
  var _a2;
871
323
  const notificationData = {
@@ -894,167 +346,50 @@ const ThreadConversationViewComponent = ({
894
346
  }
895
347
  };
896
348
  const messageList = useMemo(() => {
897
- const threadMessages = safeContextProperty("threadMessages", []);
898
- if (__DEV__)
899
- console.log(`Creating message list from ${threadMessages.length} thread messages`);
900
- if (!(threadMessages == null ? void 0 : threadMessages.length))
901
- return [];
902
- const messageIds = /* @__PURE__ */ new Set();
903
- const res = threadMessages.filter((msg) => {
904
- if (!msg.id || messageIds.has(msg.id))
905
- return false;
906
- messageIds.add(msg.id);
907
- return true;
908
- }).map((msg) => {
909
- var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2, _m2;
910
- const uniqueId = msg.id || `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
911
- let messageDate;
912
- try {
913
- if (msg.createdAt && !isNaN(new Date(msg.createdAt).getTime())) {
914
- messageDate = new Date(msg.createdAt);
915
- } else {
916
- messageDate = new Date();
917
- }
918
- } catch (error) {
919
- messageDate = new Date();
920
- }
921
- let imageUrl = null;
922
- if (((_a2 = msg.files) == null ? void 0 : _a2.data) && msg.files.data.length > 0) {
923
- const fileData = msg.files.data[0];
924
- if (fileData && fileData.url) {
925
- imageUrl = fileData.url;
926
- }
927
- }
928
- let messageText = msg.message || "";
929
- return {
930
- _id: uniqueId,
931
- text: messageText,
932
- createdAt: messageDate,
933
- user: {
934
- _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,
935
- 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,
936
- 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
937
- },
938
- type: (msg == null ? void 0 : msg.type) || "",
939
- image: imageUrl,
940
- sent: (msg == null ? void 0 : msg.isDelivered) || true,
941
- received: (msg == null ? void 0 : msg.isRead) || false,
942
- propsConfiguration: msg == null ? void 0 : msg.propsConfiguration
943
- };
944
- });
945
- return orderBy(res, [(msg) => {
946
- try {
947
- return msg.createdAt instanceof Date ? msg.createdAt.getTime() : new Date().getTime();
948
- } catch (error) {
949
- return 0;
950
- }
951
- }], ["desc"]);
952
- }, [safeContextProperty("threadMessages"), auth]);
953
- const renderSend = useCallback((props) => {
954
- const hasImage = safeContextProperty("selectedImage", "") !== "";
955
- const isDisabled = !hasImage && (!props.text || props.text.trim().length === 0);
956
- return /* @__PURE__ */ React__default.createElement(Send, __spreadProps(__spreadValues({}, props), { containerStyle: {
957
- alignItems: "center",
958
- justifyContent: "center",
959
- marginHorizontal: 4,
960
- marginBottom: 0
961
- }, disabled: isDisabled }), /* @__PURE__ */ React__default.createElement(Box, { style: {
962
- width: 32,
963
- height: 32,
964
- alignItems: "center",
965
- justifyContent: "center"
966
- } }, /* @__PURE__ */ React__default.createElement(MaterialCommunityIcons, { name: "send-circle", size: 30, color: isDisabled ? colors.gray[400] : colors.blue[500] })));
967
- }, [safeContextProperty]);
968
- const renderActions = useCallback((props) => {
969
- return /* @__PURE__ */ React__default.createElement(
970
- Actions$1,
971
- __spreadProps(__spreadValues({}, props), {
972
- options: {
973
- ["Choose from Library"]: onSelectImages,
974
- ["Cancel"]: () => {
975
- }
976
- },
977
- optionTintColor: "#000000",
978
- cancelButtonIndex: 1,
979
- icon: () => /* @__PURE__ */ React__default.createElement(Box, { style: {
980
- width: 32,
981
- height: 32,
982
- alignItems: "center",
983
- justifyContent: "center"
984
- } }, /* @__PURE__ */ React__default.createElement(Ionicons, { name: "image", size: 24, color: colors.blue[500] })),
985
- containerStyle: {
986
- alignItems: "center",
987
- justifyContent: "center",
988
- marginLeft: 8,
989
- marginBottom: 0
990
- }
991
- })
992
- );
993
- }, [onSelectImages]);
994
- const renderAccessory = useCallback((props) => {
995
- var _a2, _b2;
996
- const selectedImage2 = safeContextProperty("selectedImage", "");
997
- if (!selectedImage2) {
998
- return null;
349
+ let res = [];
350
+ const filteredMessages = channelMessages && (channelMessages == null ? void 0 : channelMessages.length) > 0 ? uniqBy([...channelMessages], ({
351
+ id
352
+ }) => id) : [];
353
+ if (filteredMessages == null ? void 0 : filteredMessages.length) {
354
+ orderBy(filteredMessages, ["createdAt"], ["desc"]).map((msg2) => {
355
+ var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2, _m2, _n2;
356
+ let message = {
357
+ _id: "",
358
+ text: "",
359
+ createdAt: 0,
360
+ user: {
361
+ _id: "",
362
+ name: "",
363
+ avatar: ""
364
+ },
365
+ type: ""
366
+ };
367
+ const date = new Date(msg2.createdAt);
368
+ message._id = msg2.id;
369
+ message.text = msg2.message;
370
+ message.createdAt = date;
371
+ message.user = {
372
+ _id: (_c2 = (_a2 = msg2 == null ? void 0 : msg2.author) == null ? void 0 : _a2.id) != null ? _c2 : (_b2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _b2.id,
373
+ name: (_i2 = (_g2 = (_d2 = msg2 == null ? void 0 : msg2.author) == null ? void 0 : _d2.givenName) != null ? _g2 : ((_e2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _e2.given_name) + " " + ((_f2 = msg2 == null ? void 0 : msg2.author) == null ? void 0 : _f2.familyName)) != null ? _i2 : (_h2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _h2.family_name,
374
+ avatar: (_l2 = (_j2 = msg2 == null ? void 0 : msg2.author) == null ? void 0 : _j2.picture) != null ? _l2 : (_k2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _k2.picture
375
+ }, message.image = (_n2 = (_m2 = msg2.files) == null ? void 0 : _m2.data[0]) == null ? void 0 : _n2.url, message.sent = msg2 == null ? void 0 : msg2.isDelivered, message.received = msg2 == null ? void 0 : msg2.isRead;
376
+ message.type = msg2 == null ? void 0 : msg2.type;
377
+ message.propsConfiguration = msg2 == null ? void 0 : msg2.propsConfiguration;
378
+ res.push(message);
379
+ });
999
380
  }
1000
- return /* @__PURE__ */ React__default.createElement(View, { style: {
1001
- height: 80,
1002
- padding: 10,
1003
- backgroundColor: "white",
1004
- borderTopWidth: 1,
1005
- borderTopColor: "#e0e0e0",
1006
- flexDirection: "row",
1007
- alignItems: "center"
1008
- } }, /* @__PURE__ */ React__default.createElement(View, { style: {
1009
- flex: 1,
1010
- flexDirection: "row",
1011
- alignItems: "center",
1012
- paddingHorizontal: 20
1013
- } }, /* @__PURE__ */ React__default.createElement(Image, { key: (_a2 = state == null ? void 0 : state.context) == null ? void 0 : _a2.selectedImage, alt: "selected image", source: {
1014
- uri: (_b2 = state == null ? void 0 : state.context) == null ? void 0 : _b2.selectedImage
1015
- }, size: "xs", style: {
1016
- width: 5,
1017
- height: 5,
1018
- borderRadius: 5,
1019
- marginRight: 20
1020
- } }), /* @__PURE__ */ React__default.createElement(TouchableHighlight, { underlayColor: "#dddddd", onPress: () => safeSend({
1021
- type: Actions.CLEAR_IMAGE
1022
- }), style: {
1023
- backgroundColor: "#f44336",
1024
- paddingVertical: 2,
1025
- paddingHorizontal: 5,
1026
- borderRadius: 5,
1027
- marginLeft: 10,
1028
- elevation: 3,
1029
- shadowColor: "#000",
1030
- shadowOffset: {
1031
- width: 0,
1032
- height: 1
1033
- },
1034
- shadowOpacity: 0.3,
1035
- shadowRadius: 2
1036
- } }, /* @__PURE__ */ React__default.createElement(Text, { style: {
1037
- color: "white",
1038
- fontWeight: "bold"
1039
- } }, "X"))));
1040
- }, [(_a = state == null ? void 0 : state.context) == null ? void 0 : _a.selectedImage, safeSend]);
1041
- const renderInputToolbar = useCallback((props) => {
1042
- return /* @__PURE__ */ React__default.createElement(InputToolbar, __spreadProps(__spreadValues({}, props), { containerStyle: {
1043
- backgroundColor: "white",
1044
- borderTopWidth: 1,
1045
- borderTopColor: colors.gray[200],
1046
- paddingHorizontal: 4,
1047
- paddingVertical: 4
1048
- }, primaryStyle: {
1049
- alignItems: "center"
1050
- } }));
381
+ return (res == null ? void 0 : res.length) > 0 ? uniqBy([...res], ({
382
+ _id
383
+ }) => _id) : [];
384
+ }, [channelMessages]);
385
+ const renderSend = useCallback((props) => {
386
+ return /* @__PURE__ */ React__default.createElement(Send, __spreadValues({}, props), /* @__PURE__ */ React__default.createElement(Box, null, /* @__PURE__ */ React__default.createElement(MaterialCommunityIcons, { name: "send-circle", style: {
387
+ marginBottom: 5,
388
+ marginRight: 5
389
+ }, size: 32, color: "#2e64e5" })));
1051
390
  }, []);
1052
- const setImageViewerObject = (obj, v) => {
1053
- setImageObject(obj);
1054
- setImageViewer(v);
1055
- };
1056
391
  const renderMessageText = useCallback((props) => {
1057
- var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2, _m2, _n2, _o2, _p2, _q2, _r2, _s2, _t2, _u2, _v, _w, _x, _y;
392
+ var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2, _m2, _n2, _o2, _p2, _q2, _r2, _s2, _t, _u, _v, _w, _x, _y;
1058
393
  const {
1059
394
  currentMessage
1060
395
  } = props;
@@ -1075,8 +410,8 @@ const ThreadConversationViewComponent = ({
1075
410
  path = ((_l2 = route == null ? void 0 : route.host) == null ? void 0 : _l2.name) ? (_n2 = (_m2 = route == null ? void 0 : route.host) == null ? void 0 : _m2.name) != null ? _n2 : null : null;
1076
411
  param = ((_o2 = route == null ? void 0 : route.host) == null ? void 0 : _o2.params) ? (_q2 = (_p2 = route == null ? void 0 : route.host) == null ? void 0 : _p2.params) != null ? _q2 : null : null;
1077
412
  } else {
1078
- path = ((_r2 = route == null ? void 0 : route.host) == null ? void 0 : _r2.name) ? (_t2 = (_s2 = route == null ? void 0 : route.host) == null ? void 0 : _s2.name) != null ? _t2 : null : null;
1079
- param = ((_u2 = route == null ? void 0 : route.host) == null ? void 0 : _u2.params) ? (_w = (_v = route == null ? void 0 : route.host) == null ? void 0 : _v.params) != null ? _w : null : null;
413
+ path = ((_r2 = route == null ? void 0 : route.host) == null ? void 0 : _r2.name) ? (_t = (_s2 = route == null ? void 0 : route.host) == null ? void 0 : _s2.name) != null ? _t : null : null;
414
+ param = ((_u = route == null ? void 0 : route.host) == null ? void 0 : _u.params) ? (_w = (_v = route == null ? void 0 : route.host) == null ? void 0 : _v.params) != null ? _w : null : null;
1080
415
  }
1081
416
  action = path;
1082
417
  params2 = __spreadValues({}, param);
@@ -1098,8 +433,6 @@ const ThreadConversationViewComponent = ({
1098
433
  marginLeft: 5
1099
434
  }
1100
435
  } })));
1101
- } else if (currentMessage.text === "\u{1F4CE} File attachment") {
1102
- return null;
1103
436
  } else {
1104
437
  return /* @__PURE__ */ React__default.createElement(MessageText, __spreadProps(__spreadValues({}, props), { textStyle: {
1105
438
  left: {
@@ -1107,11 +440,114 @@ const ThreadConversationViewComponent = ({
1107
440
  }
1108
441
  } }));
1109
442
  }
1110
- }, [role, navigation]);
1111
- const renderMessage = useCallback((props) => {
1112
- return /* @__PURE__ */ React__default.createElement(Message, __spreadProps(__spreadValues({}, props), { isShowImageViewer, setImageViewer: setImageViewerObject }));
1113
- }, [isShowImageViewer, setImageViewerObject]);
1114
- const modalContent = React__default.useMemo(() => {
443
+ }, [navigation, role]);
444
+ const renderActions = (props) => {
445
+ return /* @__PURE__ */ React__default.createElement(
446
+ Actions,
447
+ __spreadProps(__spreadValues({}, props), {
448
+ options: {
449
+ ["Choose from Library"]: onSelectImages,
450
+ ["Cancel"]: () => {
451
+ }
452
+ },
453
+ optionTintColor: "#000000",
454
+ cancelButtonIndex: 1,
455
+ icon: () => /* @__PURE__ */ React__default.createElement(Box, { className: "w-8 h-8 items-center justify-center" }, /* @__PURE__ */ React__default.createElement(Ionicons, { name: "image", size: 24, color: colors.blue[500] })),
456
+ containerStyle: {
457
+ alignItems: "center",
458
+ justifyContent: "center",
459
+ marginLeft: 8,
460
+ marginBottom: 0
461
+ }
462
+ })
463
+ );
464
+ };
465
+ const renderAccessory = useCallback(() => {
466
+ var _a2;
467
+ if (!selectedImage) {
468
+ return null;
469
+ }
470
+ return /* @__PURE__ */ React__default.createElement(View, { style: {
471
+ height: 70,
472
+ backgroundColor: "white",
473
+ borderTopWidth: 1,
474
+ borderTopColor: "#e0e0e0",
475
+ flexDirection: "row",
476
+ alignItems: "center",
477
+ margin: 0,
478
+ padding: 0,
479
+ paddingVertical: 0,
480
+ position: "absolute",
481
+ bottom: Platform.OS === "ios" ? 105 : 95,
482
+ left: 0,
483
+ right: 0,
484
+ zIndex: 1,
485
+ elevation: 3,
486
+ shadowColor: "#000",
487
+ shadowOffset: {
488
+ width: 0,
489
+ height: -1
490
+ },
491
+ shadowOpacity: 0.05,
492
+ shadowRadius: 2
493
+ } }, /* @__PURE__ */ React__default.createElement(View, { style: {
494
+ flex: 1,
495
+ flexDirection: "row",
496
+ alignItems: "center",
497
+ paddingLeft: 15,
498
+ paddingRight: 5
499
+ } }, /* @__PURE__ */ React__default.createElement(View, { style: {
500
+ width: 56,
501
+ height: 56,
502
+ marginRight: 15,
503
+ borderRadius: 4,
504
+ backgroundColor: colors.gray[200],
505
+ overflow: "hidden",
506
+ borderWidth: 1,
507
+ borderColor: "#e0e0e0"
508
+ } }, /* @__PURE__ */ React__default.createElement(Image, { key: selectedImage, alt: "selected image", source: {
509
+ uri: selectedImage
510
+ }, style: {
511
+ width: "100%",
512
+ height: "100%"
513
+ }, size: "md" }), loading && /* @__PURE__ */ React__default.createElement(View, { style: {
514
+ position: "absolute",
515
+ top: 0,
516
+ left: 0,
517
+ right: 0,
518
+ bottom: 0,
519
+ backgroundColor: "rgba(255, 255, 255, 0.7)",
520
+ justifyContent: "center",
521
+ alignItems: "center"
522
+ } }, /* @__PURE__ */ React__default.createElement(Spinner, { size: "small", color: colors.blue[500] }))), /* @__PURE__ */ React__default.createElement(View, { style: {
523
+ flex: 1
524
+ } }, /* @__PURE__ */ React__default.createElement(Text, { style: {
525
+ fontSize: 14,
526
+ fontWeight: "400",
527
+ color: colors.gray[800]
528
+ } }, ((_a2 = images[0]) == null ? void 0 : _a2.fileName) || "image_" + new Date().getTime() + ".jpg"), /* @__PURE__ */ React__default.createElement(Text, { style: {
529
+ fontSize: 12,
530
+ color: colors.gray[500],
531
+ marginTop: 2
532
+ } }, loading ? "Preparing..." : "Ready to send")), /* @__PURE__ */ React__default.createElement(TouchableHighlight, { underlayColor: "rgba(0,0,0,0.1)", onPress: () => {
533
+ setFiles([]);
534
+ setImage("");
535
+ setImages([]);
536
+ }, style: {
537
+ backgroundColor: colors.red[500],
538
+ borderRadius: 24,
539
+ width: 36,
540
+ height: 36,
541
+ alignItems: "center",
542
+ justifyContent: "center",
543
+ marginRight: 10
544
+ } }, /* @__PURE__ */ React__default.createElement(Ionicons, { name: "close", size: 20, color: "white" }))));
545
+ }, [selectedImage, loading, images]);
546
+ const setImageViewerObject = useCallback((obj, v) => {
547
+ setImageObject(obj);
548
+ setImageViewer(v);
549
+ }, []);
550
+ const modalContent = useMemo(() => {
1115
551
  if (!imageObject)
1116
552
  return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null);
1117
553
  const {
@@ -1126,474 +562,90 @@ const ThreadConversationViewComponent = ({
1126
562
  expiresIn: 86400
1127
563
  }, alt: "image" });
1128
564
  }, [imageObject]);
1129
- const currentMessageText = useMemo(() => {
1130
- const text = safeContextProperty("messageText", "") || " ";
1131
- return text;
1132
- }, [safeContextProperty("messageText")]);
1133
- const forceLoadMessages = useCallback((skipValue) => {
1134
- console.log(`Force loading messages with explicit skip=${skipValue}, limit=50`);
1135
- if (channelId && parentId) {
1136
- safeSend({
1137
- type: Actions.START_LOADING,
1138
- data: {
1139
- loading: true
1140
- }
1141
- });
1142
- getThreadMessages({
1143
- variables: {
1144
- channelId: channelId == null ? void 0 : channelId.toString(),
1145
- role: role == null ? void 0 : role.toString(),
1146
- postParentId: !parentId || parentId == 0 ? null : parentId == null ? void 0 : parentId.toString(),
1147
- selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
1148
- skip: skipValue,
1149
- limit: 50
1150
- }
1151
- }).then(({
1152
- data: data2
1153
- }) => {
1154
- var _a2, _b2, _c2;
1155
- if (data2 == null ? void 0 : data2.getPostThread) {
1156
- const threads = data2.getPostThread;
1157
- const threadPost = (_a2 = threads == null ? void 0 : threads.post) != null ? _a2 : [];
1158
- const threadReplies = (_b2 = threads == null ? void 0 : threads.replies) != null ? _b2 : [];
1159
- const messageTotalCount = (_c2 = threads == null ? void 0 : threads.replyCount) != null ? _c2 : 0;
1160
- const messages = [...threadReplies];
1161
- console.log(`Force load with skip=${skipValue} complete. Got ${messages.length} messages of ${messageTotalCount} total`);
1162
- safeSend({
1163
- type: Actions.SET_THREAD_MESSAGES,
1164
- data: {
1165
- messages,
1166
- totalCount: messageTotalCount,
1167
- threadPost,
1168
- postThread: threads
1169
- }
1170
- });
1171
- }
1172
- }).catch((error) => {
1173
- console.error("Error during force load:", error);
1174
- safeSend({
1175
- type: "ERROR",
1176
- data: {
1177
- message: error.message
1178
- }
1179
- });
1180
- });
565
+ const renderMessage = useCallback((props) => {
566
+ const {
567
+ currentMessage
568
+ } = props;
569
+ const isUploading = currentMessage._id === uploadingMessageId && loading;
570
+ if (isUploading) {
571
+ return /* @__PURE__ */ React__default.createElement(Box, { className: "p-3 mb-2 mr-3 self-end rounded-2xl bg-gray-100 max-w-[80%]" }, currentMessage.text && currentMessage.text.trim() !== "" && /* @__PURE__ */ React__default.createElement(Box, { className: "h-4 mb-2 rounded bg-gray-200 overflow-hidden" }, /* @__PURE__ */ React__default.createElement(Skeleton, { variant: "rounded", className: "flex-1" })), currentMessage.image && /* @__PURE__ */ React__default.createElement(Box, { className: "h-[150px] w-[150px] rounded-lg bg-gray-200 overflow-hidden mt-1" }, /* @__PURE__ */ React__default.createElement(Box, { className: "flex-1 items-center justify-center" }, /* @__PURE__ */ React__default.createElement(Spinner, { size: "small", color: colors.blue[500] })), /* @__PURE__ */ React__default.createElement(Skeleton, { variant: "rounded", className: "flex-1" })));
1181
572
  }
1182
- }, [channelId, parentId, getThreadMessages, safeSend]);
1183
- const onFetchOld = useCallback(() => {
1184
- const totalCount = safeContextProperty("totalCount", 0);
1185
- const threadMessages = safeContextProperty("threadMessages", []);
1186
- const isLoading = safeContextProperty("loadingOldMessages", false);
1187
- if (totalCount <= threadMessages.length || isLoading) {
1188
- if (isLoading) {
1189
- safeSend({
1190
- type: Actions.STOP_LOADING,
1191
- data: {
1192
- loadingOldMessages: false
1193
- }
1194
- });
1195
- }
1196
- if (__DEV__)
1197
- console.log("No more messages to load or already loading");
1198
- return;
573
+ return /* @__PURE__ */ React__default.createElement(Message, __spreadProps(__spreadValues({}, props), { isShowImageViewer, setImageViewer: setImageViewerObject }));
574
+ }, [uploadingMessageId, loading, isShowImageViewer, setImageViewerObject]);
575
+ const renderInputToolbar = useCallback((props) => {
576
+ return /* @__PURE__ */ React__default.createElement(InputToolbar, __spreadProps(__spreadValues({}, props), { containerStyle: {
577
+ backgroundColor: "white",
578
+ borderTopWidth: 1,
579
+ borderTopColor: colors.gray[200],
580
+ paddingHorizontal: 4,
581
+ paddingVertical: 0,
582
+ paddingTop: 2,
583
+ marginBottom: 0,
584
+ marginTop: 0
585
+ }, primaryStyle: {
586
+ alignItems: "center"
587
+ } }));
588
+ }, []);
589
+ const renderLoadEarlier = useCallback(() => {
590
+ return loadingOldMessages ? /* @__PURE__ */ React__default.createElement(Box, { style: {
591
+ padding: 10,
592
+ backgroundColor: "rgba(255,255,255,0.8)",
593
+ borderRadius: 10,
594
+ marginTop: 10
595
+ } }, /* @__PURE__ */ React__default.createElement(Spinner, { size: "small", color: colors.blue[500] })) : null;
596
+ }, [loadingOldMessages]);
597
+ let onScroll = false;
598
+ const onMomentumScrollBegin = ({
599
+ nativeEvent
600
+ }) => {
601
+ onScroll = true;
602
+ if (!loadingOldMessages && isCloseToTop(nativeEvent) && totalCount > (channelMessages == null ? void 0 : channelMessages.length)) {
603
+ onFetchOld();
1199
604
  }
1200
- if (__DEV__)
1201
- console.log("Loading more messages - current count:", threadMessages.length, "of", totalCount);
1202
- safeSend({
1203
- type: Actions.FETCH_MORE_MESSAGES,
1204
- data: {
1205
- loadingOldMessages: true
1206
- }
1207
- });
1208
- if (__DEV__)
1209
- console.log("Using proven approach: Skip=0, Limit=50");
1210
- const queryVariables = {
1211
- channelId: channelId == null ? void 0 : channelId.toString(),
1212
- role: role == null ? void 0 : role.toString(),
1213
- postParentId: !parentId || parentId == 0 ? null : parentId == null ? void 0 : parentId.toString(),
1214
- selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
1215
- limit: 50,
1216
- skip: 0
1217
- };
1218
- if (__DEV__)
1219
- console.log("Query variables:", JSON.stringify(queryVariables));
1220
- fetchMoreMessages({
1221
- variables: queryVariables
1222
- }).then((res) => {
1223
- var _a2, _b2, _c2, _d2;
1224
- if (__DEV__)
1225
- console.log("API response received with status:", res ? "success" : "empty");
1226
- if ((_a2 = res == null ? void 0 : res.data) == null ? void 0 : _a2.getPostThread) {
1227
- const threads = (_b2 = res == null ? void 0 : res.data) == null ? void 0 : _b2.getPostThread;
1228
- const threadReplies = (_c2 = threads == null ? void 0 : threads.replies) != null ? _c2 : [];
1229
- const actualTotalCount = (_d2 = threads == null ? void 0 : threads.replyCount) != null ? _d2 : 0;
1230
- if (__DEV__) {
1231
- console.log("API response details:");
1232
- console.log("- replyCount:", threads == null ? void 0 : threads.replyCount);
1233
- console.log("- replies array length:", threadReplies.length);
1234
- }
1235
- if (threadReplies.length > 0) {
1236
- const existingIds = new Set(threadMessages.map((msg) => msg.id));
1237
- const newUniqueMessages = threadReplies.filter((msg) => !existingIds.has(msg.id));
1238
- if (__DEV__)
1239
- console.log(`Found ${newUniqueMessages.length} unique new messages out of ${threadReplies.length} received`);
1240
- if (newUniqueMessages.length === 0) {
1241
- if (__DEV__)
1242
- console.log("No new unique messages found, adjusting total count");
1243
- registerLoadAttemptResult(false);
1244
- safeSend({
1245
- type: Actions.SET_THREAD_MESSAGES,
1246
- data: {
1247
- messages: threadMessages,
1248
- totalCount: threadMessages.length,
1249
- threadPost: safeContextProperty("threadPost", []),
1250
- postThread: safeContextProperty("postThread", null)
1251
- }
1252
- });
1253
- return;
1254
- }
1255
- registerLoadAttemptResult(true);
1256
- if (__DEV__)
1257
- console.log(`Adding ${newUniqueMessages.length} new messages to thread`);
1258
- safeSend({
1259
- type: "FETCH_MORE_MESSAGES_SUCCESS",
1260
- data: {
1261
- messages: newUniqueMessages,
1262
- totalCount: actualTotalCount,
1263
- loadingOldMessages: false
1264
- }
1265
- });
1266
- } else {
1267
- if (__DEV__)
1268
- console.log("No thread replies returned when loading more messages");
1269
- registerLoadAttemptResult(false);
1270
- safeSend({
1271
- type: Actions.SET_THREAD_MESSAGES,
1272
- data: {
1273
- messages: threadMessages,
1274
- totalCount: threadMessages.length,
1275
- threadPost: safeContextProperty("threadPost", []),
1276
- postThread: safeContextProperty("postThread", null)
1277
- }
1278
- });
1279
- }
1280
- } else {
1281
- if (__DEV__)
1282
- console.log("No thread data returned when loading more messages");
1283
- registerLoadAttemptResult(false);
1284
- safeSend({
1285
- type: Actions.STOP_LOADING,
1286
- data: {
1287
- loadingOldMessages: false
1288
- }
1289
- });
1290
- }
1291
- }).catch((error) => {
1292
- console.error("Error fetching more messages:", error);
1293
- registerLoadAttemptResult(false);
1294
- safeSend({
1295
- type: "ERROR",
1296
- data: {
1297
- message: error.message,
1298
- loadingOldMessages: false
1299
- }
1300
- });
1301
- });
1302
- }, [parentId, channelId, role, safeContextProperty, safeSend, fetchMoreMessages, registerLoadAttemptResult]);
1303
- return /* @__PURE__ */ React__default.createElement(SafeAreaView, { style: {
1304
- flex: 1
1305
- } }, 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: () => {
1306
- console.log("Manual load more pressed");
1307
- Alert.alert("Load Options", "Choose loading method", [{
1308
- text: "Normal Load",
1309
- onPress: () => safeSend({
1310
- type: Actions.FETCH_MORE_MESSAGES
1311
- })
1312
- }, {
1313
- text: "Try Skip=0",
1314
- onPress: () => forceLoadMessages(0)
1315
- }, {
1316
- text: "Try Skip=0, Limit=50",
1317
- onPress: () => {
1318
- console.log("Force loading with explicit skip=0, limit=50");
1319
- safeSend({
1320
- type: Actions.START_LOADING,
1321
- data: {
1322
- loadingOldMessages: true
1323
- }
1324
- });
1325
- fetchMoreMessages({
1326
- variables: {
1327
- channelId: channelId == null ? void 0 : channelId.toString(),
1328
- role: role == null ? void 0 : role.toString(),
1329
- postParentId: !parentId || parentId == 0 ? null : parentId == null ? void 0 : parentId.toString(),
1330
- selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
1331
- limit: 50,
1332
- skip: 0
1333
- }
1334
- }).then((res) => {
1335
- var _a2, _b2, _c2, _d2;
1336
- console.log("LARGE LIMIT response:", JSON.stringify(res == null ? void 0 : res.data, null, 2));
1337
- if ((_a2 = res == null ? void 0 : res.data) == null ? void 0 : _a2.getPostThread) {
1338
- const threads = (_b2 = res == null ? void 0 : res.data) == null ? void 0 : _b2.getPostThread;
1339
- const threadReplies = (_c2 = threads == null ? void 0 : threads.replies) != null ? _c2 : [];
1340
- const actualTotalCount = (_d2 = threads == null ? void 0 : threads.replyCount) != null ? _d2 : 0;
1341
- console.log(`Large limit load complete. Got ${threadReplies.length} messages of ${actualTotalCount} total`);
1342
- if (threadReplies.length > 0) {
1343
- safeSend({
1344
- type: Actions.SET_THREAD_MESSAGES,
1345
- data: {
1346
- messages: threadReplies,
1347
- totalCount: actualTotalCount,
1348
- threadPost: safeContextProperty("threadPost", []),
1349
- postThread: threads
1350
- }
1351
- });
1352
- } else {
1353
- safeSend({
1354
- type: Actions.SET_THREAD_MESSAGES,
1355
- data: {
1356
- messages: safeContextProperty("threadMessages", []),
1357
- totalCount: safeContextProperty("threadMessages", []).length,
1358
- threadPost: safeContextProperty("threadPost", []),
1359
- postThread: safeContextProperty("postThread", null)
1360
- }
1361
- });
1362
- }
1363
- } else {
1364
- safeSend({
1365
- type: Actions.STOP_LOADING,
1366
- data: {
1367
- loadingOldMessages: false
1368
- }
1369
- });
1370
- }
1371
- }).catch((error) => {
1372
- console.error("Error in large limit load:", error);
1373
- safeSend({
1374
- type: Actions.STOP_LOADING,
1375
- data: {
1376
- loadingOldMessages: false
1377
- }
1378
- });
1379
- });
1380
- }
1381
- }, {
1382
- text: "Try Direct Fetch",
1383
- onPress: () => {
1384
- const currentCount = safeContextProperty("threadMessages", []).length;
1385
- const totalCount = safeContextProperty("totalCount", 0);
1386
- const missingCount = totalCount - currentCount;
1387
- if (missingCount <= 0) {
1388
- Alert.alert("Info", "No missing messages to fetch");
1389
- return;
1390
- }
1391
- console.log(`Attempting direct fetch of missing ${missingCount} messages`);
1392
- safeSend({
1393
- type: Actions.START_LOADING,
1394
- data: {
1395
- loadingOldMessages: true
1396
- }
1397
- });
1398
- getThreadMessages({
1399
- variables: {
1400
- channelId: channelId == null ? void 0 : channelId.toString(),
1401
- role: role == null ? void 0 : role.toString(),
1402
- postParentId: !parentId || parentId == 0 ? null : parentId == null ? void 0 : parentId.toString(),
1403
- selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
1404
- limit: missingCount,
1405
- skip: 0
1406
- }
1407
- }).then(({
1408
- data: data2
1409
- }) => {
1410
- var _a2, _b2;
1411
- console.log("DIRECT FETCH response:", JSON.stringify(data2, null, 2));
1412
- if (data2 == null ? void 0 : data2.getPostThread) {
1413
- const threads = data2.getPostThread;
1414
- const threadReplies = (_a2 = threads == null ? void 0 : threads.replies) != null ? _a2 : [];
1415
- const actualTotalCount = (_b2 = threads == null ? void 0 : threads.replyCount) != null ? _b2 : 0;
1416
- console.log(`Direct fetch complete. Got ${threadReplies.length} messages of ${actualTotalCount} total`);
1417
- console.log("Message IDs:", threadReplies.map((msg) => msg.id).join(", "));
1418
- const existingIds = new Set(safeContextProperty("threadMessages", []).map((msg) => msg.id));
1419
- const newMessages = threadReplies.filter((msg) => !existingIds.has(msg.id));
1420
- console.log(`Found ${newMessages.length} new messages that we didn't have before`);
1421
- if (newMessages.length > 0) {
1422
- safeSend({
1423
- type: "FETCH_MORE_MESSAGES_SUCCESS",
1424
- data: {
1425
- messages: newMessages,
1426
- totalCount: actualTotalCount,
1427
- loadingOldMessages: false
1428
- }
1429
- });
1430
- Alert.alert("Success", `Found ${newMessages.length} new messages`);
1431
- } else {
1432
- console.log("No new messages found, adjusting count");
1433
- safeSend({
1434
- type: Actions.SET_THREAD_MESSAGES,
1435
- data: {
1436
- messages: safeContextProperty("threadMessages", []),
1437
- totalCount: safeContextProperty("threadMessages", []).length,
1438
- threadPost: safeContextProperty("threadPost", []),
1439
- postThread: safeContextProperty("postThread", null)
1440
- }
1441
- });
1442
- Alert.alert("Info", "No new messages found. Count has been adjusted.");
1443
- }
1444
- } else {
1445
- Alert.alert("Error", "Could not fetch thread messages");
1446
- safeSend({
1447
- type: Actions.STOP_LOADING,
1448
- data: {
1449
- loadingOldMessages: false
1450
- }
1451
- });
1452
- }
1453
- }).catch((error) => {
1454
- console.error("Error in direct fetch:", error);
1455
- Alert.alert("Error", "Failed to fetch messages: " + error.message);
1456
- safeSend({
1457
- type: Actions.STOP_LOADING,
1458
- data: {
1459
- loadingOldMessages: false
1460
- }
1461
- });
1462
- });
1463
- }
1464
- }, {
1465
- text: "Reset Count",
1466
- style: "destructive",
1467
- onPress: () => {
1468
- console.log("Resetting message count to match reality");
1469
- safeSend({
1470
- type: Actions.SET_THREAD_MESSAGES,
1471
- data: {
1472
- messages: safeContextProperty("threadMessages", []),
1473
- totalCount: safeContextProperty("threadMessages", []).length,
1474
- threadPost: safeContextProperty("threadPost", []),
1475
- postThread: safeContextProperty("postThread", null)
1476
- }
1477
- });
1478
- }
1479
- }, {
1480
- text: "Cancel",
1481
- style: "cancel"
1482
- }]);
1483
- }, 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, ((_b = safeContextProperty("threadPost", [])) == null ? void 0 : _b.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((_e = (_d = (_c = safeContextProperty("threadPost")[0]) == null ? void 0 : _c.author) == null ? void 0 : _d.username) == null ? void 0 : _e.charAt(0))), /* @__PURE__ */ React__default.createElement(AvatarImage, { alt: "image", style: {
605
+ };
606
+ const onEndReached = () => {
607
+ if (!onScroll)
608
+ return;
609
+ onScroll = false;
610
+ };
611
+ return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, isPostParentIdThread && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, (threadPost == null ? void 0 : threadPost.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((_c = (_b = (_a = threadPost[0]) == null ? void 0 : _a.author) == null ? void 0 : _b.username) == null ? void 0 : _c.charAt(0))), /* @__PURE__ */ React__default.createElement(AvatarImage, { alt: "image", style: {
1484
612
  borderRadius: 6,
1485
613
  borderWidth: 2,
1486
614
  borderColor: "#fff"
1487
615
  }, source: {
1488
- uri: (_g = (_f = safeContextProperty("threadPost")[0]) == null ? void 0 : _f.author) == null ? void 0 : _g.picture
1489
- } })), /* @__PURE__ */ React__default.createElement(Box, null, /* @__PURE__ */ React__default.createElement(Text, { className: "font-bold color-black" }, (_j = (_i = (_h = safeContextProperty("threadPost")[0]) == null ? void 0 : _h.author) == null ? void 0 : _i.givenName) != null ? _j : "", " ", (_m = (_l = (_k = safeContextProperty("threadPost")[0]) == null ? void 0 : _k.author) == null ? void 0 : _l.familyName) != null ? _m : ""), /* @__PURE__ */ React__default.createElement(Text, { className: "pl-0 color-gray-500" }, createdAtText((_n = safeContextProperty("threadPost")[0]) == null ? void 0 : _n.createdAt), " at", " ", (() => {
1490
- var _a2;
1491
- try {
1492
- const createdAt = (_a2 = safeContextProperty("threadPost")[0]) == null ? void 0 : _a2.createdAt;
1493
- if (createdAt && !isNaN(new Date(createdAt).getTime())) {
1494
- return format(new Date(createdAt), "hh:mm:a");
1495
- } else {
1496
- return "unknown time";
1497
- }
1498
- } catch (error) {
1499
- console.error("Error formatting thread post time:", error);
1500
- return "unknown time";
1501
- }
1502
- })()))), /* @__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: {
1503
- onScroll: handleScrollToTop,
1504
- onEndReached: handleEndReached,
1505
- onEndReachedThreshold: 0.2,
1506
- contentContainerStyle: {
1507
- paddingBottom: 10
1508
- },
1509
- maintainVisibleContentPosition: {
1510
- minIndexForVisible: 0,
1511
- autoscrollToTopThreshold: 100
1512
- },
1513
- scrollEventThrottle: 16,
1514
- keyboardDismissMode: "on-drag",
1515
- keyboardShouldPersistTaps: "handled"
616
+ uri: (_e = (_d = threadPost[0]) == null ? void 0 : _d.author) == null ? void 0 : _e.picture
617
+ } })), /* @__PURE__ */ React__default.createElement(Box, null, /* @__PURE__ */ React__default.createElement(Text, { className: "font-bold color-black" }, (_h = (_g = (_f = threadPost[0]) == null ? void 0 : _f.author) == null ? void 0 : _g.givenName) != null ? _h : "", " ", (_k = (_j = (_i = threadPost[0]) == null ? void 0 : _i.author) == null ? void 0 : _j.familyName) != null ? _k : ""), /* @__PURE__ */ React__default.createElement(Text, { className: "pl-0 color-gray-500" }, createdAtText((_l = threadPost[0]) == null ? void 0 : _l.createdAt), " at", " ", format(new Date((_m = threadPost[0]) == null ? void 0 : _m.createdAt), "hh:ss:a")))), /* @__PURE__ */ React__default.createElement(HStack, { space: "sm", className: "px-2 items-center" }, /* @__PURE__ */ React__default.createElement(Text, null, (_o = (_n = 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 = threadPost[0]) == null ? void 0 : _p.replies) == null ? void 0 : _q.totalCount, " ", ((_s = (_r = threadPost[0]) == null ? void 0 : _r.replies) == null ? void 0 : _s.totalCount) > 0 ? "replies" : "reply"))))), /* @__PURE__ */ React__default.createElement(GiftedChat, { ref: threadMessageListRef, wrapInSafeArea: true, renderLoading: () => /* @__PURE__ */ React__default.createElement(Skeleton, { variant: "rounded", style: {
618
+ flex: 1
619
+ } }), messages: messageList, listViewProps: {
620
+ onEndReached,
621
+ onEndReachedThreshold: 0.5,
622
+ onMomentumScrollBegin
1516
623
  }, onSend: (messages) => {
1517
624
  var _a2, _b2;
1518
- if (!messages || messages.length === 0) {
1519
- console.log("No messages to send");
1520
- return;
1521
- }
1522
- const currentInputText = currentMessageText;
1523
- const messageToSend = (currentInputText == null ? void 0 : currentInputText.trim()) || ((_b2 = (_a2 = messages[0]) == null ? void 0 : _a2.text) == null ? void 0 : _b2.trim()) || " ";
1524
- if (__DEV__)
1525
- console.log("GiftedChat onSend triggered with text from state:", messageToSend);
1526
- safeSend({
1527
- type: Actions.SET_MESSAGE_TEXT,
1528
- data: {
1529
- messageText: ""
1530
- }
1531
- });
1532
- if (safeContextProperty("images", []).length > 0) {
1533
- if (__DEV__)
1534
- console.log("Sending message with file:", messageToSend, "Images:", safeContextProperty("images", []).length);
1535
- safeSend({
1536
- type: Actions.SEND_THREAD_MESSAGE_WITH_FILE,
1537
- data: {
1538
- messageText: messageToSend
1539
- }
1540
- });
1541
- } else {
1542
- if (__DEV__)
1543
- console.log("Sending text message:", messageToSend);
1544
- safeSend({
1545
- type: Actions.SEND_THREAD_MESSAGE,
1546
- data: {
1547
- messageText: messageToSend
1548
- }
1549
- });
1550
- }
1551
- }, text: currentMessageText, onInputTextChanged: (text) => {
1552
- safeSend({
1553
- type: Actions.SET_MESSAGE_TEXT,
1554
- data: {
1555
- messageText: text
1556
- }
1557
- });
1558
- }, 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: {
625
+ return handleSend((_b2 = (_a2 = messages[0]) == null ? void 0 : _a2.text) != null ? _b2 : " ");
626
+ }, text: msg ? msg : " ", onInputTextChanged: (text) => setMsg(text), renderFooter: () => null, scrollToBottom: true, user: {
1559
627
  _id: (auth == null ? void 0 : auth.id) || ""
1560
- }, isTyping: safeContextProperty("loading", false), 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, renderMessageText, maxInputLength: 1e3, placeholder: "Type a message...", showUserAvatar: true, showAvatarForEveryMessage: false, inverted: true, parsePatterns: (linkStyle) => [{
1561
- type: "url",
1562
- style: __spreadProps(__spreadValues({}, linkStyle), {
1563
- color: colors.blue[500]
1564
- }),
1565
- onPress: (url) => Linking.openURL(url)
1566
- }, {
1567
- type: "phone",
1568
- style: __spreadProps(__spreadValues({}, linkStyle), {
1569
- color: colors.blue[500]
1570
- }),
1571
- onPress: (phone) => Linking.openURL(`tel:${phone}`)
1572
- }, {
1573
- type: "email",
1574
- style: __spreadProps(__spreadValues({}, linkStyle), {
1575
- color: colors.blue[500]
1576
- }),
1577
- onPress: (email) => Linking.openURL(`mailto:${email}`)
1578
- }], textInputProps: {
628
+ }, isTyping: false, alwaysShowSend: true, infiniteScroll: true, renderSend, renderMessageText, renderInputToolbar, minInputToolbarHeight: 50, renderActions, renderAccessory: !!selectedImage ? renderAccessory : void 0, renderMessage, renderLoadEarlier, loadEarlier: totalCount > channelMessages.length, isLoadingEarlier: loadingOldMessages, bottomOffset: Platform.OS === "ios" ? 10 : 0, textInputProps: {
1579
629
  style: {
1580
630
  borderWidth: 1,
1581
631
  borderColor: colors.gray[300],
1582
632
  backgroundColor: "#f8f8f8",
1583
633
  borderRadius: 20,
1584
- minHeight: 40,
634
+ minHeight: 36,
1585
635
  maxHeight: 80,
1586
636
  color: "#000",
1587
- padding: 10,
1588
- paddingHorizontal: 20,
637
+ padding: 8,
638
+ paddingHorizontal: 15,
1589
639
  fontSize: 16,
1590
- flex: 1
640
+ flex: 1,
641
+ marginVertical: 2,
642
+ marginBottom: 0
1591
643
  },
1592
644
  multiline: true,
1593
645
  returnKeyType: "default",
1594
646
  enablesReturnKeyAutomatically: true,
1595
647
  placeholderTextColor: colors.gray[400]
1596
- }, minComposerHeight: 44, isKeyboardInternallyHandled: true, bottomOffset: Platform.OS === "ios" ? 20 : 0, renderChatFooter: () => /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(ImageViewerModal, { isVisible: isShowImageViewer, setVisible: setImageViewer, modalContent }), /* @__PURE__ */ React__default.createElement(SubscriptionHandler, { channelId, subscribeToNewMessages: () => subscribeToMore({
648
+ }, minComposerHeight: 36, maxComposerHeight: 100, placeholder: "Type a message...", renderChatFooter: () => /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(ImageViewerModal, { isVisible: isShowImageViewer, setVisible: setImageViewer, modalContent }), /* @__PURE__ */ React__default.createElement(SubscriptionHandler, { channelId, subscribeToNewMessages: () => subscribeToMore({
1597
649
  document: OnThreadChatMessageAddedDocument,
1598
650
  variables: {
1599
651
  channelId: channelId == null ? void 0 : channelId.toString(),
@@ -1607,19 +659,12 @@ const ThreadConversationViewComponent = ({
1607
659
  return prev;
1608
660
  const newMessage = (_a2 = subscriptionData == null ? void 0 : subscriptionData.data) == null ? void 0 : _a2.threadChatMessageAdded;
1609
661
  const prevReplyCount = (_b2 = prev == null ? void 0 : prev.getPostThread) == null ? void 0 : _b2.replyCount;
1610
- const newReplyCount = (prevReplyCount || 0) + 1;
662
+ const newReplyCount = prevReplyCount || 0 + 1;
1611
663
  const replies = ((_c2 = prev == null ? void 0 : prev.getPostThread) == null ? void 0 : _c2.replies) || [];
1612
- safeSend({
1613
- type: Actions.SET_THREAD_MESSAGES,
1614
- data: {
1615
- messages: uniqBy([...safeContextProperty("threadMessages", []), newMessage], ({
1616
- id
1617
- }) => id),
1618
- totalCount: newReplyCount,
1619
- threadPost: safeContextProperty("threadPost", []),
1620
- postThread: safeContextProperty("postThread", null)
1621
- }
1622
- });
664
+ setChannelMessages((oldMessages) => uniqBy([...oldMessages, newMessage], ({
665
+ id
666
+ }) => id));
667
+ setTotalCount(newReplyCount);
1623
668
  return Object.assign({}, prev, {
1624
669
  getPostThread: __spreadProps(__spreadValues({}, prev == null ? void 0 : prev.getPostThread), {
1625
670
  lastReplyAt: newMessage.createdAt,
@@ -1629,11 +674,11 @@ const ThreadConversationViewComponent = ({
1629
674
  })
1630
675
  });
1631
676
  }
1632
- }) })), messagesContainerStyle: (messageList == null ? void 0 : messageList.length) == 0 ? {
677
+ }) })), messagesContainerStyle: (messageList == null ? void 0 : messageList.length) == 0 && {
1633
678
  transform: [{
1634
679
  scaleY: -1
1635
680
  }]
1636
- } : void 0, renderChatEmpty: () => /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, !threadLoading && messageList && (messageList == null ? void 0 : messageList.length) == 0 && /* @__PURE__ */ React__default.createElement(Box, { className: "p-5" }, /* @__PURE__ */ React__default.createElement(Center, { className: "mt-6" }, /* @__PURE__ */ React__default.createElement(Ionicons, { name: "chatbubbles", size: 30 }), /* @__PURE__ */ React__default.createElement(Text, null, "You don't have any message yet!")))), lightboxProps: {
681
+ }, renderChatEmpty: () => /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, !threadLoading && messageList && (messageList == null ? void 0 : messageList.length) == 0 && /* @__PURE__ */ React__default.createElement(Box, { className: "p-5" }, /* @__PURE__ */ React__default.createElement(Center, { className: "mt-6" }, /* @__PURE__ */ React__default.createElement(Ionicons, { name: "chatbubbles", size: 30 }), /* @__PURE__ */ React__default.createElement(Text, null, "You don't have any message yet!")))), lightboxProps: {
1637
682
  underlayColor: "transparent",
1638
683
  springConfig: {
1639
684
  tension: 9e4,
@@ -1649,4 +694,4 @@ const SubscriptionHandler = ({
1649
694
  useEffect(() => subscribeToNewMessages(), [channelId]);
1650
695
  return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null);
1651
696
  };
1652
- const ThreadConversationView = React__default.memo(ThreadConversationViewComponent);export{ThreadConversationView};//# sourceMappingURL=ThreadConversationView.js.map
697
+ const ThreadConversationView = ThreadConversationViewComponent;export{ThreadConversationView};//# sourceMappingURL=ThreadConversationView.js.map