@messenger-box/platform-mobile 10.0.3-alpha.16 → 10.0.3-alpha.18

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 (31) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/lib/routes.json +14 -1
  3. package/lib/screens/inbox/components/CachedImage/consts.js +1 -1
  4. package/lib/screens/inbox/components/CachedImage/consts.js.map +1 -1
  5. package/lib/screens/inbox/components/CachedImage/index.js +125 -16
  6. package/lib/screens/inbox/components/CachedImage/index.js.map +1 -1
  7. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js +32 -21
  8. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
  9. package/lib/screens/inbox/containers/ConversationView.js +1175 -400
  10. package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
  11. package/lib/screens/inbox/containers/Dialogs.js +290 -21
  12. package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
  13. package/lib/screens/inbox/containers/ThreadConversationView.js +858 -351
  14. package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
  15. package/lib/screens/inbox/containers/workflow/conversation-xstate.js +380 -0
  16. package/lib/screens/inbox/containers/workflow/conversation-xstate.js.map +1 -0
  17. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js +235 -0
  18. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js.map +1 -0
  19. package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js +438 -0
  20. package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js.map +1 -0
  21. package/package.json +4 -4
  22. package/src/screens/inbox/components/CachedImage/consts.ts +4 -3
  23. package/src/screens/inbox/components/CachedImage/index.tsx +137 -17
  24. package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +35 -9
  25. package/src/screens/inbox/containers/ConversationView.tsx +1510 -641
  26. package/src/screens/inbox/containers/Dialogs.tsx +415 -123
  27. package/src/screens/inbox/containers/ThreadConversationView.tsx +1053 -288
  28. package/src/screens/inbox/containers/workflow/apollo/handleResult.ts +20 -0
  29. package/src/screens/inbox/containers/workflow/conversation-xstate.ts +313 -0
  30. package/src/screens/inbox/containers/workflow/dialogs-xstate.ts +196 -0
  31. package/src/screens/inbox/containers/workflow/thread-conversation-xstate.ts +401 -0
@@ -1,4 +1,4 @@
1
- import React__default,{useState,useRef,useEffect,useCallback,useMemo}from'react';import {Button,Spinner,VStack,HStack,Avatar,AvatarFallbackText,AvatarImage,Box,Text,Center,Image,ButtonText}from'@admin-layout/gluestack-ui-mobile';import {Platform}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 {encode}from'base-64';import {MaterialIcons,Ionicons,MaterialCommunityIcons}from'@expo/vector-icons';import {GiftedChat,Actions,MessageText,Send}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';var __defProp = Object.defineProperty;
1
+ import React__default,{useState,useRef,useCallback,useEffect,useMemo}from'react';import {Button,Box,Spinner,Text,VStack,HStack,Avatar,AvatarFallbackText,AvatarImage,Center,Image}from'@admin-layout/gluestack-ui-mobile';import {Platform,SafeAreaView,Linking,View,TouchableHighlight}from'react-native';import {useRoute,useNavigation,useFocusEffect}from'@react-navigation/native';import {useSelector}from'react-redux';import {startCase,uniqBy}from'lodash-es';import*as ImagePicker from'expo-image-picker';import {MaterialIcons,Ionicons,MaterialCommunityIcons}from'@expo/vector-icons';import {GiftedChat,Actions as Actions$1,InputToolbar,Send}from'react-native-gifted-chat';import'common';import {useCreatePostThreadMutation,useSendExpoNotificationOnPostMutation,useGetPostThreadLazyQuery,OnThreadChatMessageAddedDocument}from'common/graphql';import {useUploadFilesNative}from'@messenger-box/platform-client';import {objectId}from'@messenger-box/core';import {format,isToday,isYesterday}from'date-fns';import {userSelector}from'@adminide-stack/user-auth0-client';import {config}from'../config/config.js';import Message from'../components/SlackMessageContainer/SlackMessage.js';import ImageViewerModal from'../components/SlackMessageContainer/ImageViewerModal.js';import CachedImage from'../components/CachedImage/index.js';import colors from'tailwindcss/colors';import {Actions,BaseState,MainState}from'./workflow/thread-conversation-xstate.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -34,42 +34,277 @@ const createdAtText = (value) => {
34
34
  return "Yesterday";
35
35
  return format(new Date(value), "MMM dd, yyyy");
36
36
  };
37
+ function useSafeMachine(machine) {
38
+ const [state, setState] = useState({
39
+ context: {
40
+ channelId: null,
41
+ postParentId: null,
42
+ role: null,
43
+ threadMessages: [],
44
+ totalCount: 0,
45
+ skip: 0,
46
+ loading: false,
47
+ loadingOldMessages: false,
48
+ error: null,
49
+ selectedImage: "",
50
+ files: [],
51
+ images: [],
52
+ messageText: "",
53
+ imageLoading: false,
54
+ postThread: null,
55
+ threadPost: [],
56
+ isScrollToBottom: false
57
+ },
58
+ value: "idle"
59
+ });
60
+ const send = useCallback((event) => {
61
+ var _a, _b, _c, _d;
62
+ try {
63
+ console.log("Thread Event received:", event.type);
64
+ if (event.type === Actions.INITIAL_CONTEXT) {
65
+ setState((prev) => {
66
+ var _a2, _b2, _c2;
67
+ return __spreadProps(__spreadValues({}, prev), {
68
+ context: __spreadProps(__spreadValues({}, prev.context), {
69
+ channelId: ((_a2 = event.data) == null ? void 0 : _a2.channelId) || null,
70
+ postParentId: ((_b2 = event.data) == null ? void 0 : _b2.postParentId) || null,
71
+ role: ((_c2 = event.data) == null ? void 0 : _c2.role) || null
72
+ }),
73
+ value: BaseState.FetchThreadMessages
74
+ });
75
+ });
76
+ } else if (event.type === Actions.SET_THREAD_MESSAGES) {
77
+ setState((prev) => {
78
+ var _a2, _b2, _c2, _d2;
79
+ return __spreadProps(__spreadValues({}, prev), {
80
+ context: __spreadProps(__spreadValues({}, prev.context), {
81
+ threadMessages: ((_a2 = event.data) == null ? void 0 : _a2.messages) || [],
82
+ totalCount: ((_b2 = event.data) == null ? void 0 : _b2.totalCount) || 0,
83
+ loading: false,
84
+ loadingOldMessages: false,
85
+ threadPost: ((_c2 = event.data) == null ? void 0 : _c2.threadPost) || [],
86
+ postThread: ((_d2 = event.data) == null ? void 0 : _d2.postThread) || null
87
+ }),
88
+ value: "active"
89
+ });
90
+ });
91
+ } else if (event.type === Actions.CLEAR_MESSAGES) {
92
+ setState((prev) => __spreadProps(__spreadValues({}, prev), {
93
+ context: __spreadProps(__spreadValues({}, prev.context), {
94
+ threadMessages: [],
95
+ totalCount: 0
96
+ })
97
+ }));
98
+ } else if (event.type === Actions.SET_MESSAGE_TEXT) {
99
+ setState((prev) => {
100
+ var _a2;
101
+ return __spreadProps(__spreadValues({}, prev), {
102
+ context: __spreadProps(__spreadValues({}, prev.context), {
103
+ messageText: ((_a2 = event.data) == null ? void 0 : _a2.messageText) || ""
104
+ })
105
+ });
106
+ });
107
+ } else if (event.type === Actions.FETCH_MORE_MESSAGES) {
108
+ setState((prev) => __spreadProps(__spreadValues({}, prev), {
109
+ context: __spreadProps(__spreadValues({}, prev.context), {
110
+ loadingOldMessages: true
111
+ }),
112
+ value: MainState.FetchMoreMessages
113
+ }));
114
+ } else if (event.type === Actions.SET_IMAGE) {
115
+ setState((prev) => {
116
+ var _a2, _b2, _c2;
117
+ return __spreadProps(__spreadValues({}, prev), {
118
+ context: __spreadProps(__spreadValues({}, prev.context), {
119
+ selectedImage: ((_a2 = event.data) == null ? void 0 : _a2.image) || "",
120
+ images: ((_b2 = event.data) == null ? void 0 : _b2.images) || [],
121
+ files: ((_c2 = event.data) == null ? void 0 : _c2.files) || [],
122
+ imageLoading: false
123
+ })
124
+ });
125
+ });
126
+ } else if (event.type === Actions.CLEAR_IMAGE) {
127
+ setState((prev) => __spreadProps(__spreadValues({}, prev), {
128
+ context: __spreadProps(__spreadValues({}, prev.context), {
129
+ selectedImage: "",
130
+ images: [],
131
+ files: []
132
+ })
133
+ }));
134
+ } else if (event.type === Actions.START_LOADING) {
135
+ setState((prev) => __spreadProps(__spreadValues({}, prev), {
136
+ context: __spreadProps(__spreadValues({}, prev.context), {
137
+ loading: true
138
+ })
139
+ }));
140
+ } else if (event.type === Actions.STOP_LOADING) {
141
+ setState((prev) => __spreadProps(__spreadValues({}, prev), {
142
+ context: __spreadProps(__spreadValues({}, prev.context), {
143
+ loading: false
144
+ })
145
+ }));
146
+ } else if (event.type === Actions.SEND_THREAD_MESSAGE) {
147
+ console.log("Sending message event with text:", (_a = event.data) == null ? void 0 : _a.messageText);
148
+ setState((prev) => {
149
+ var _a2;
150
+ return __spreadProps(__spreadValues({}, prev), {
151
+ context: __spreadProps(__spreadValues({}, prev.context), {
152
+ loading: true,
153
+ messageText: ((_a2 = event.data) == null ? void 0 : _a2.messageText) || prev.context.messageText
154
+ }),
155
+ value: MainState.SendThreadMessage
156
+ });
157
+ });
158
+ } else if (event.type === Actions.SEND_THREAD_MESSAGE_WITH_FILE) {
159
+ console.log("Sending message with file event, text:", (_b = event.data) == null ? void 0 : _b.messageText);
160
+ setState((prev) => {
161
+ var _a2;
162
+ return __spreadProps(__spreadValues({}, prev), {
163
+ context: __spreadProps(__spreadValues({}, prev.context), {
164
+ loading: true,
165
+ messageText: ((_a2 = event.data) == null ? void 0 : _a2.messageText) || prev.context.messageText
166
+ }),
167
+ value: MainState.SendThreadMessageWithFile
168
+ });
169
+ });
170
+ } else if (event.type === "SEND_THREAD_MESSAGE_SUCCESS" || event.type === "SEND_THREAD_MESSAGE_WITH_FILE_SUCCESS") {
171
+ console.log("Handling send success event:", event.type, "with message:", (_d = (_c = event.data) == null ? void 0 : _c.message) == null ? void 0 : _d.id);
172
+ setState((prev) => {
173
+ var _a2;
174
+ if (!((_a2 = event.data) == null ? void 0 : _a2.message)) {
175
+ console.warn("Send success event without message data");
176
+ return __spreadProps(__spreadValues({}, prev), {
177
+ context: __spreadProps(__spreadValues({}, prev.context), {
178
+ loading: false,
179
+ messageText: "",
180
+ images: [],
181
+ selectedImage: "",
182
+ files: []
183
+ }),
184
+ value: "active"
185
+ });
186
+ }
187
+ const newMessage = event.data.message;
188
+ const updatedMessages = [newMessage, ...prev.context.threadMessages];
189
+ console.log("Updated thread messages list after send, now has", updatedMessages.length, "messages");
190
+ return __spreadProps(__spreadValues({}, prev), {
191
+ context: __spreadProps(__spreadValues({}, prev.context), {
192
+ loading: false,
193
+ messageText: "",
194
+ images: [],
195
+ selectedImage: "",
196
+ files: [],
197
+ threadMessages: updatedMessages,
198
+ totalCount: prev.context.totalCount + 1
199
+ }),
200
+ value: "active"
201
+ });
202
+ });
203
+ } else if (event.type === "FETCH_MORE_MESSAGES_SUCCESS") {
204
+ setState((prev) => {
205
+ var _a2;
206
+ const newMessages = ((_a2 = event.data) == null ? void 0 : _a2.messages) || [];
207
+ return __spreadProps(__spreadValues({}, prev), {
208
+ context: __spreadProps(__spreadValues({}, prev.context), {
209
+ loadingOldMessages: false,
210
+ threadMessages: uniqBy([...prev.context.threadMessages, ...newMessages], ({
211
+ id
212
+ }) => id)
213
+ }),
214
+ value: "active"
215
+ });
216
+ });
217
+ } else if (event.type === "ERROR") {
218
+ setState((prev) => {
219
+ var _a2;
220
+ return __spreadProps(__spreadValues({}, prev), {
221
+ context: __spreadProps(__spreadValues({}, prev.context), {
222
+ loading: false,
223
+ loadingOldMessages: false,
224
+ error: ((_a2 = event.data) == null ? void 0 : _a2.message) || "Unknown error"
225
+ }),
226
+ value: "error"
227
+ });
228
+ });
229
+ }
230
+ } catch (error) {
231
+ console.error("Error in thread conversation send function:", error);
232
+ }
233
+ }, []);
234
+ const stateWithMatches = useMemo(() => {
235
+ return __spreadProps(__spreadValues({}, state), {
236
+ matches: (checkState) => {
237
+ return state.value === checkState;
238
+ }
239
+ });
240
+ }, [state]);
241
+ return [stateWithMatches, send];
242
+ }
37
243
  const ThreadConversationViewComponent = ({
38
244
  channelId,
39
245
  postParentId,
40
246
  isPostParentIdThread,
41
247
  role
42
248
  }) => {
43
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
249
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
44
250
  const {
45
251
  params
46
252
  } = useRoute();
47
253
  const [channelToTop, setChannelToTop] = useState(0);
48
- const [channelMessages, setChannelMessages] = useState([]);
254
+ useRef(true);
255
+ const [state, send] = useSafeMachine();
256
+ useCallback(() => {
257
+ try {
258
+ return (state == null ? void 0 : state.context) || {};
259
+ } catch (error) {
260
+ console.error("Error accessing state.context:", error);
261
+ return {};
262
+ }
263
+ }, [state]);
264
+ const safeContextProperty = useCallback((property, defaultValue = null) => {
265
+ var _a2, _b2;
266
+ try {
267
+ return (_b2 = (_a2 = state == null ? void 0 : state.context) == null ? void 0 : _a2[property]) != null ? _b2 : defaultValue;
268
+ } catch (error) {
269
+ console.error(`Error accessing state.context.${property}:`, error);
270
+ return defaultValue;
271
+ }
272
+ }, [state]);
273
+ const safeMatches = useCallback((stateValue) => {
274
+ var _a2;
275
+ try {
276
+ return ((_a2 = state == null ? void 0 : state.matches) == null ? void 0 : _a2.call(state, stateValue)) || false;
277
+ } catch (error) {
278
+ console.error(`Error calling state.matches with ${stateValue}:`, error);
279
+ return false;
280
+ }
281
+ }, [state]);
282
+ const safeSend = useCallback((event) => {
283
+ try {
284
+ send(event);
285
+ } catch (error) {
286
+ console.error("Error sending event to state machine:", error, event);
287
+ }
288
+ }, [send]);
289
+ const stateRef = useRef(state);
290
+ useEffect(() => {
291
+ stateRef.current = state;
292
+ }, [state]);
49
293
  const auth = useSelector(userSelector);
50
- const [totalCount, setTotalCount] = useState(0);
51
294
  const [selectedImage, setImage] = useState("");
52
- const [loadingOldMessages, setLoadingOldMessages] = useState(false);
53
- const [loadEarlierMsg, setLoadEarlierMsg] = useState(false);
54
295
  const navigation = useNavigation();
55
296
  const [files, setFiles] = useState([]);
56
297
  const [images, setImages] = useState([]);
57
- const [msg, setMsg] = useState("");
58
- const [loading, setLoading] = useState(false);
59
- const [imageLoading, setImageLoading] = useState(false);
60
- const [expoTokens, setExpoTokens] = useState([]);
61
298
  const [isShowImageViewer, setImageViewer] = useState(false);
62
299
  const [imageObject, setImageObject] = useState({});
63
300
  const [parentId, setParentId] = useState(postParentId);
64
- const [postThread, setPostThread] = useState();
65
- const {
66
- startUpload
67
- } = useUploadFilesNative();
68
- const [threadPost, setThreadPost] = useState([]);
69
- const [isScrollToBottom, setIsScrollToBottom] = useState(false);
301
+ const [expoTokens, setExpoTokens] = useState([]);
70
302
  const threadMessageListRef = useRef(null);
71
303
  const [sendThreadMessage] = useCreatePostThreadMutation();
72
304
  const [sendExpoNotificationOnPostMutation] = useSendExpoNotificationOnPostMutation();
305
+ const {
306
+ startUpload
307
+ } = useUploadFilesNative();
73
308
  const [getThreadMessages, {
74
309
  data,
75
310
  loading: threadLoading,
@@ -85,23 +320,48 @@ const ThreadConversationViewComponent = ({
85
320
  title: (_a2 = params == null ? void 0 : params.title) != null ? _a2 : "Thread",
86
321
  headerLeft: (props) => /* @__PURE__ */ React__default.createElement(Button, { className: "bg-transparent active:bg-gray-200 ", onPress: () => navigation.goBack() }, /* @__PURE__ */ React__default.createElement(MaterialIcons, { size: 20, name: "arrow-back-ios", color: "black" }))
87
322
  });
88
- if (postParentId) {
89
- refetchThreadMessages({
90
- channelId: channelId == null ? void 0 : channelId.toString(),
91
- role: role == null ? void 0 : role.toString(),
92
- postParentId: postParentId == null ? void 0 : postParentId.toString(),
93
- selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
94
- limit: MESSAGES_PER_PAGE
323
+ if (channelId && postParentId) {
324
+ safeSend({
325
+ type: Actions.INITIAL_CONTEXT,
326
+ data: {
327
+ channelId,
328
+ postParentId,
329
+ role
330
+ }
95
331
  });
96
332
  }
97
333
  setParentId(postParentId);
98
334
  return () => {
99
- setTotalCount(0);
100
- setChannelMessages([]);
101
- setThreadPost([]);
335
+ safeSend({
336
+ type: Actions.CLEAR_MESSAGES
337
+ });
102
338
  };
103
339
  }, [postParentId]));
104
340
  useEffect(() => {
341
+ if (safeMatches(BaseState.FetchThreadMessages)) {
342
+ fetchThreadMessages();
343
+ }
344
+ }, [state.value]);
345
+ useEffect(() => {
346
+ if (safeMatches(MainState.FetchMoreMessages)) {
347
+ onFetchOld();
348
+ }
349
+ }, [state.value]);
350
+ useEffect(() => {
351
+ if (safeMatches(MainState.SendThreadMessage)) {
352
+ const messageText = safeContextProperty("messageText", "");
353
+ console.log("Sending message from state transition, text:", messageText);
354
+ sendThreadMessageHandler(messageText);
355
+ }
356
+ }, [state.value]);
357
+ useEffect(() => {
358
+ if (safeMatches(MainState.SendThreadMessageWithFile)) {
359
+ const messageText = safeContextProperty("messageText", "");
360
+ const images2 = safeContextProperty("images", []);
361
+ sendThreadMessageWithFileHandler(messageText, images2);
362
+ }
363
+ }, [state.value]);
364
+ const fetchThreadMessages = useCallback(() => {
105
365
  if (channelId && parentId) {
106
366
  getThreadMessages({
107
367
  variables: {
@@ -111,43 +371,78 @@ const ThreadConversationViewComponent = ({
111
371
  selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
112
372
  limit: MESSAGES_PER_PAGE
113
373
  }
374
+ }).then(({
375
+ data: data2
376
+ }) => {
377
+ var _a2, _b2, _c2;
378
+ if (data2 == null ? void 0 : data2.getPostThread) {
379
+ const threads = data2.getPostThread;
380
+ const threadPost = (_a2 = threads == null ? void 0 : threads.post) != null ? _a2 : [];
381
+ const threadReplies = (_b2 = threads == null ? void 0 : threads.replies) != null ? _b2 : [];
382
+ const messageTotalCount = (_c2 = threads == null ? void 0 : threads.replyCount) != null ? _c2 : 0;
383
+ const messages = [...threadReplies];
384
+ safeSend({
385
+ type: Actions.SET_THREAD_MESSAGES,
386
+ data: {
387
+ messages,
388
+ totalCount: messageTotalCount,
389
+ threadPost,
390
+ postThread: threads
391
+ }
392
+ });
393
+ }
394
+ }).catch((error) => {
395
+ safeSend({
396
+ type: "ERROR",
397
+ data: {
398
+ message: error.message
399
+ }
400
+ });
114
401
  });
115
402
  }
116
- }, [parentId]);
403
+ }, [channelId, parentId, role]);
117
404
  React__default.useEffect(() => {
118
405
  var _a2, _b2, _c2;
119
406
  if (data == null ? void 0 : data.getPostThread) {
120
407
  const threads = data.getPostThread;
121
- const threadPost2 = (_a2 = threads == null ? void 0 : threads.post) != null ? _a2 : [];
408
+ const threadPost = (_a2 = threads == null ? void 0 : threads.post) != null ? _a2 : [];
122
409
  const threadReplies = (_b2 = threads == null ? void 0 : threads.replies) != null ? _b2 : [];
123
410
  const messeageTotalCount = (_c2 = threads == null ? void 0 : threads.replyCount) != null ? _c2 : 0;
124
- const messages = [threadPost2, ...threadReplies];
125
- if (messages && messages.length > 0 && messeageTotalCount > totalCount || messages && messages.length > 0 && channelMessages.length === 0) {
126
- setThreadMessages(messages, messeageTotalCount);
127
- }
411
+ const messages = [...threadReplies];
412
+ safeSend({
413
+ type: Actions.SET_THREAD_MESSAGES,
414
+ data: {
415
+ messages,
416
+ totalCount: messeageTotalCount,
417
+ threadPost,
418
+ postThread: threads
419
+ }
420
+ });
128
421
  }
129
- if (isScrollToBottom && channelMessages)
130
- scrollToBottom();
131
- }, [data, channelMessages, loadingOldMessages, totalCount, isPostParentIdThread, isScrollToBottom]);
132
- const setThreadMessages = (messages, messagesTotalCount) => {
133
- setChannelMessages((oldMessages) => uniqBy([...messages, ...oldMessages], ({
134
- id
135
- }) => id));
136
- setTotalCount(messagesTotalCount);
137
- };
422
+ }, [data]);
138
423
  React__default.useEffect(() => {
139
- if (selectedImage)
140
- setImageLoading(false);
141
- }, [selectedImage]);
142
- const scrollToBottom = React__default.useCallback(() => {
424
+ if (safeContextProperty("selectedImage")) {
425
+ safeSend({
426
+ type: Actions.STOP_LOADING
427
+ });
428
+ }
429
+ }, [safeContextProperty("selectedImage")]);
430
+ React__default.useCallback(() => {
143
431
  if (threadMessageListRef == null ? void 0 : threadMessageListRef.current) {
144
- setIsScrollToBottom(false);
145
- threadMessageListRef.current.scrollTop = threadMessageListRef.current.scrollHeight;
432
+ threadMessageListRef.current.scrollToBottom();
146
433
  }
147
434
  }, [threadMessageListRef]);
148
435
  const onFetchOld = useCallback(() => {
149
- if (totalCount > channelMessages.length && !loadingOldMessages) {
150
- setLoadEarlierMsg(true);
436
+ const totalCount = safeContextProperty("totalCount", 0);
437
+ const threadMessages = safeContextProperty("threadMessages", []);
438
+ if (totalCount > threadMessages.length && !safeContextProperty("loadingOldMessages", false)) {
439
+ console.log("Loading more messages - current count:", threadMessages.length, "of", totalCount);
440
+ safeSend({
441
+ type: Actions.START_LOADING,
442
+ data: {
443
+ loadingOldMessages: true
444
+ }
445
+ });
151
446
  fetchMoreMessages({
152
447
  variables: {
153
448
  channelId: channelId == null ? void 0 : channelId.toString(),
@@ -155,73 +450,228 @@ const ThreadConversationViewComponent = ({
155
450
  postParentId: parentId == null ? void 0 : parentId.toString(),
156
451
  selectedFields: "id channel post replies replyCount lastReplyAt createdAt updatedAt",
157
452
  limit: MESSAGES_PER_PAGE,
158
- skip: channelMessages.length - 1
453
+ skip: threadMessages.length
159
454
  }
160
455
  }).then((res) => {
161
- var _a2, _b2, _c2, _d2;
456
+ var _a2, _b2, _c2;
162
457
  if ((_a2 = res == null ? void 0 : res.data) == null ? void 0 : _a2.getPostThread) {
163
458
  const threads = (_b2 = res == null ? void 0 : res.data) == null ? void 0 : _b2.getPostThread;
164
459
  const threadReplies = (_c2 = threads == null ? void 0 : threads.replies) != null ? _c2 : [];
165
- const messeageTotalCount = (_d2 = threads == null ? void 0 : threads.replyCount) != null ? _d2 : 0;
166
- setThreadMessages(threadReplies, messeageTotalCount);
460
+ console.log("Successfully loaded more messages:", threadReplies.length);
461
+ safeSend({
462
+ type: "FETCH_MORE_MESSAGES_SUCCESS",
463
+ data: {
464
+ messages: threadReplies,
465
+ loadingOldMessages: false
466
+ }
467
+ });
468
+ } else {
469
+ console.log("No thread data returned when loading more messages");
470
+ safeSend({
471
+ type: Actions.STOP_LOADING,
472
+ data: {
473
+ loadingOldMessages: false
474
+ }
475
+ });
167
476
  }
168
- }).finally(() => {
169
- setLoadEarlierMsg(false);
170
- setLoadingOldMessages(false);
171
477
  }).catch((error) => {
172
- setLoadEarlierMsg(false);
173
- setLoadingOldMessages(false);
478
+ console.error("Error fetching more messages:", error);
479
+ safeSend({
480
+ type: "ERROR",
481
+ data: {
482
+ message: error.message,
483
+ loadingOldMessages: false
484
+ }
485
+ });
174
486
  });
487
+ } else {
488
+ console.log("No more messages to load or already loading");
489
+ }
490
+ }, [parentId, channelId, state.context]);
491
+ const handleScrollToTop = ({
492
+ nativeEvent
493
+ }) => {
494
+ if (isCloseToTop(nativeEvent)) {
495
+ if (!safeContextProperty("loadingOldMessages", false) && safeContextProperty("totalCount", 0) > safeContextProperty("threadMessages", []).length) {
496
+ console.log("Near top of list - loading older messages");
497
+ safeSend({
498
+ type: Actions.FETCH_MORE_MESSAGES
499
+ });
500
+ }
175
501
  }
176
- }, [parentId, channelId, totalCount, channelMessages]);
502
+ };
503
+ const handleEndReached = () => {
504
+ console.log("Reached end of message list");
505
+ };
177
506
  const isCloseToTop = ({
178
507
  layoutMeasurement,
179
508
  contentOffset,
180
509
  contentSize
181
510
  }) => {
182
- const paddingToTop = 60;
183
- return contentSize.height - layoutMeasurement.height - paddingToTop <= contentOffset.y;
184
- };
185
- const dataURLtoFile = (dataurl, filename) => {
186
- var arr = dataurl.split(","), mime = arr[0].match(/:(.*?);/)[1], bstr = encode(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
187
- while (n--) {
188
- u8arr[n] = bstr.charCodeAt(n);
189
- }
190
- return new File([u8arr], filename, {
191
- type: mime
192
- });
511
+ const paddingToTop = 80;
512
+ return contentOffset.y <= paddingToTop;
193
513
  };
194
514
  const onSelectImages = async () => {
195
515
  var _a2;
196
- setImageLoading(true);
197
- let imageSource = await ImagePicker.launchImageLibraryAsync({
198
- mediaTypes: ImagePicker.MediaTypeOptions.Images,
199
- allowsEditing: true,
200
- aspect: [4, 3],
201
- quality: 1,
202
- base64: true
203
- });
204
- if (!imageSource.canceled) {
205
- const image = "data:image/jpeg;base64," + ((_a2 = imageSource.assets[0]) == null ? void 0 : _a2.base64);
206
- setImage(image);
207
- const file = dataURLtoFile(image, "inputImage.jpg");
208
- setFiles((files2) => files2.concat(file));
209
- setImages((images2) => images2.concat(imageSource.assets[0]));
516
+ try {
517
+ safeSend({
518
+ type: Actions.START_LOADING
519
+ });
520
+ const imageSource = await ImagePicker.launchImageLibraryAsync({
521
+ mediaTypes: ImagePicker.MediaTypeOptions.Images,
522
+ allowsEditing: true,
523
+ aspect: [4, 3],
524
+ quality: 0.8,
525
+ base64: true,
526
+ allowsMultipleSelection: false
527
+ });
528
+ if (imageSource.canceled) {
529
+ console.log("Image selection was canceled");
530
+ safeSend({
531
+ type: Actions.STOP_LOADING
532
+ });
533
+ return;
534
+ }
535
+ if (!imageSource.assets || imageSource.assets.length === 0 || !((_a2 = imageSource.assets[0]) == null ? void 0 : _a2.base64)) {
536
+ console.error("No valid image data received");
537
+ safeSend({
538
+ type: "ERROR",
539
+ data: {
540
+ message: "No valid image data received"
541
+ }
542
+ });
543
+ return;
544
+ }
545
+ const asset = imageSource.assets[0];
546
+ const fileExtension = asset.mimeType ? asset.mimeType.split("/").pop() || "jpg" : "jpg";
547
+ const filename = `image_${Date.now()}.${fileExtension}`;
548
+ const mimeType = asset.mimeType || "image/jpeg";
549
+ const image = `data:${mimeType};base64,${asset.base64}`;
550
+ const fileData = {
551
+ uri: asset.uri,
552
+ type: mimeType,
553
+ name: filename,
554
+ base64: asset.base64
555
+ };
556
+ console.log(`Selected image: ${filename}, type: ${mimeType}`);
557
+ safeSend({
558
+ type: Actions.SET_IMAGE,
559
+ data: {
560
+ image,
561
+ files: [fileData],
562
+ images: [asset]
563
+ }
564
+ });
565
+ } catch (error) {
566
+ console.error("Error selecting image:", error);
567
+ safeSend({
568
+ type: "ERROR",
569
+ data: {
570
+ message: error.message || "Failed to select image"
571
+ }
572
+ });
210
573
  }
211
- if (imageSource.canceled)
212
- setLoading(false);
213
574
  };
214
- const handleSend = useCallback(async (message) => {
215
- var _a2;
216
- if (!channelId)
575
+ const sendThreadMessageHandler = useCallback(async (message) => {
576
+ var _a2, _b2;
577
+ console.log("Sending message:", message);
578
+ if (!channelId) {
579
+ console.error("No channelId provided");
217
580
  return;
218
- if (!message && message != " " && images.length == 0)
581
+ }
582
+ const messageContent = (message == null ? void 0 : message.trim()) || " ";
583
+ console.log("Using message content for sending:", messageContent);
584
+ const postId = objectId();
585
+ console.log("Generated postId:", postId);
586
+ safeSend({
587
+ type: Actions.START_LOADING
588
+ });
589
+ try {
590
+ console.log("Sending mutation with variables:", {
591
+ channelId,
592
+ postThreadId: (_a2 = safeContextProperty("postThread")) == null ? void 0 : _a2.id,
593
+ postParentId: !parentId || parentId == 0 ? null : parentId,
594
+ message: messageContent
595
+ });
596
+ const result = await sendThreadMessage({
597
+ variables: {
598
+ channelId,
599
+ postThreadId: safeContextProperty("postThread") && ((_b2 = safeContextProperty("postThread")) == null ? void 0 : _b2.id),
600
+ postParentId: !parentId || parentId == 0 ? null : parentId,
601
+ threadMessageInput: {
602
+ content: messageContent,
603
+ role
604
+ }
605
+ },
606
+ update: (cache, {
607
+ data: data2,
608
+ errors
609
+ }) => {
610
+ var _a3, _b3, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2;
611
+ console.log("Send message update callback - data:", data2, "errors:", errors);
612
+ if (!data2 || errors) {
613
+ console.error("Send message failed:", errors);
614
+ safeSend({
615
+ type: Actions.STOP_LOADING
616
+ });
617
+ return;
618
+ }
619
+ console.log("Message sent successfully:", (_a3 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _a3.lastMessage);
620
+ const newMessage = (_b3 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _b3.lastMessage;
621
+ safeSend({
622
+ type: "SEND_THREAD_MESSAGE_SUCCESS",
623
+ data: {
624
+ message: newMessage,
625
+ messageText: ""
626
+ }
627
+ });
628
+ if (!parentId || parentId == 0) {
629
+ console.log("Setting new parentId:", (_d2 = (_c2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _c2.lastMessage) == null ? void 0 : _d2.id);
630
+ setParentId((_f2 = (_e2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _e2.lastMessage) == null ? void 0 : _f2.id);
631
+ }
632
+ setChannelToTop(channelToTop + 1);
633
+ const lastMessageId = (_h2 = (_g2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _g2.lastMessage) == null ? void 0 : _h2.id;
634
+ sendPushNotification(lastMessageId, channelId, parentId, (_j2 = (_i2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _i2.data) == null ? void 0 : _j2.id);
635
+ }
636
+ });
637
+ console.log("Send mutation result:", result);
638
+ } catch (error) {
639
+ console.error("Error sending message:", error);
640
+ safeSend({
641
+ type: "ERROR",
642
+ data: {
643
+ message: error.message || "Failed to send message"
644
+ }
645
+ });
646
+ }
647
+ }, [channelId, parentId, state.context, role]);
648
+ const sendThreadMessageWithFileHandler = useCallback(async (message, images2) => {
649
+ var _a2, _b2;
650
+ console.log("Sending message with file:", message, "Images:", images2.length);
651
+ if (!channelId) {
652
+ console.error("No channelId provided");
653
+ return;
654
+ }
655
+ if (images2.length === 0) {
656
+ console.error("No images to send");
219
657
  return;
658
+ }
659
+ const messageContent = (message == null ? void 0 : message.trim()) || " ";
660
+ console.log("Using message content for file send:", messageContent);
220
661
  const postId = objectId();
221
- if (images && images.length > 0) {
222
- setLoading(true);
662
+ console.log("Generated postId for file upload:", postId);
663
+ try {
664
+ const preparedImages = images2.map((img) => ({
665
+ uri: img.uri,
666
+ type: img.mimeType || "image/jpeg",
667
+ name: img.fileName || `image_${Date.now()}.jpg`,
668
+ base64: img.base64,
669
+ width: img.width || 0,
670
+ height: img.height || 0
671
+ }));
672
+ console.log("Starting file upload with prepared images:", preparedImages.length);
223
673
  const uploadResponse = await startUpload({
224
- file: images,
674
+ file: preparedImages,
225
675
  saveUploadedFile: {
226
676
  variables: {
227
677
  postId
@@ -233,22 +683,27 @@ const ThreadConversationViewComponent = ({
233
683
  }
234
684
  }
235
685
  });
236
- if (uploadResponse == null ? void 0 : uploadResponse.error)
237
- setLoading(false);
686
+ if (uploadResponse == null ? void 0 : uploadResponse.error) {
687
+ console.error("File upload failed:", uploadResponse.error);
688
+ safeSend({
689
+ type: Actions.STOP_LOADING
690
+ });
691
+ return;
692
+ }
238
693
  const uploadedFiles = uploadResponse.data;
694
+ console.log("Files uploaded successfully:", uploadedFiles == null ? void 0 : uploadedFiles.length);
239
695
  if (uploadResponse.data) {
240
- setImage("");
241
- setFiles([]);
242
- setImages([]);
243
696
  const files2 = (_a2 = uploadedFiles == null ? void 0 : uploadedFiles.map((f) => f.id)) != null ? _a2 : null;
244
- await sendThreadMessage({
697
+ console.log("File IDs for message:", files2);
698
+ console.log("Sending message with attached files");
699
+ const result = await sendThreadMessage({
245
700
  variables: {
246
701
  postId,
247
702
  channelId,
248
- postThreadId: postThread && (postThread == null ? void 0 : postThread.id),
703
+ postThreadId: safeContextProperty("postThread") && ((_b2 = safeContextProperty("postThread")) == null ? void 0 : _b2.id),
249
704
  postParentId: !parentId || parentId == 0 ? null : parentId,
250
705
  threadMessageInput: {
251
- content: message,
706
+ content: messageContent,
252
707
  files: files2,
253
708
  role
254
709
  }
@@ -257,57 +712,45 @@ const ThreadConversationViewComponent = ({
257
712
  data: data2,
258
713
  errors
259
714
  }) => {
260
- var _a3, _b2, _c2, _d2, _e2, _f2, _g2;
715
+ var _a3, _b3, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2;
716
+ console.log("Send message with file update callback - data:", data2, "errors:", errors);
261
717
  if (!data2 || errors) {
262
- setLoading(false);
718
+ console.error("Send message with file failed:", errors);
719
+ safeSend({
720
+ type: Actions.STOP_LOADING
721
+ });
263
722
  return;
264
723
  }
265
- setPostThread((_a3 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _a3.data);
266
- const lastMessageId = (_c2 = (_b2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _b2.lastMessage) == null ? void 0 : _c2.id;
724
+ console.log("Message with file sent successfully:", (_a3 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _a3.lastMessage);
725
+ const newMessage = (_b3 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _b3.lastMessage;
726
+ safeSend({
727
+ type: "SEND_THREAD_MESSAGE_WITH_FILE_SUCCESS",
728
+ data: {
729
+ message: newMessage,
730
+ messageText: ""
731
+ }
732
+ });
267
733
  if (!parentId || parentId == 0) {
268
- setParentId((_e2 = (_d2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _d2.lastMessage) == null ? void 0 : _e2.id);
734
+ console.log("Setting new parentId:", (_d2 = (_c2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _c2.lastMessage) == null ? void 0 : _d2.id);
735
+ setParentId((_f2 = (_e2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _e2.lastMessage) == null ? void 0 : _f2.id);
269
736
  }
270
737
  setChannelToTop(channelToTop + 1);
271
- setLoading(false);
272
- setMsg("");
273
- sendPushNotification(lastMessageId, channelId, parentId, (_g2 = (_f2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _f2.data) == null ? void 0 : _g2.id);
738
+ const lastMessageId = (_h2 = (_g2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _g2.lastMessage) == null ? void 0 : _h2.id;
739
+ sendPushNotification(lastMessageId, channelId, parentId, (_j2 = (_i2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _i2.data) == null ? void 0 : _j2.id);
274
740
  }
275
741
  });
742
+ console.log("Send with file mutation result:", result);
276
743
  }
277
- } else {
278
- setLoading(true);
279
- await sendThreadMessage({
280
- variables: {
281
- channelId,
282
- postThreadId: postThread && (postThread == null ? void 0 : postThread.id),
283
- postParentId: !parentId || parentId == 0 ? null : parentId,
284
- threadMessageInput: {
285
- content: message,
286
- role
287
- }
288
- },
289
- update: (cache, {
290
- data: data2,
291
- errors
292
- }) => {
293
- var _a3, _b2, _c2, _d2, _e2, _f2;
294
- if (!data2 || errors) {
295
- setLoading(false);
296
- return;
297
- }
298
- setPostThread(data2 == null ? void 0 : data2.createPostThread.data);
299
- const lastMessageId = (_b2 = (_a3 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _a3.lastMessage) == null ? void 0 : _b2.id;
300
- if (!parentId || parentId == 0) {
301
- setParentId((_d2 = (_c2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _c2.lastMessage) == null ? void 0 : _d2.id);
302
- }
303
- setChannelToTop(channelToTop + 1);
304
- setLoading(false);
305
- setMsg("");
306
- sendPushNotification(lastMessageId, channelId, parentId, (_f2 = (_e2 = data2 == null ? void 0 : data2.createPostThread) == null ? void 0 : _e2.data) == null ? void 0 : _f2.id);
744
+ } catch (error) {
745
+ console.error("Error sending message with file:", error);
746
+ safeSend({
747
+ type: "ERROR",
748
+ data: {
749
+ message: error.message || "Failed to send message with file"
307
750
  }
308
751
  });
309
752
  }
310
- }, [setChannelMessages, channelId, images, parentId, expoTokens]);
753
+ }, [channelId, parentId, state.context, role, startUpload]);
311
754
  const sendPushNotification = async (messageId, channelId2, parentId2, threadId) => {
312
755
  var _a2;
313
756
  const notificationData = {
@@ -336,121 +779,129 @@ const ThreadConversationViewComponent = ({
336
779
  }
337
780
  };
338
781
  const messageList = useMemo(() => {
782
+ const threadMessages = safeContextProperty("threadMessages", []);
783
+ console.log(`Creating message list from ${threadMessages.length} thread messages`);
339
784
  let res = [];
340
- const filteredMessages = channelMessages && (channelMessages == null ? void 0 : channelMessages.length) > 0 ? uniqBy([...channelMessages], ({
341
- id
342
- }) => id) : [];
343
- if (filteredMessages == null ? void 0 : filteredMessages.length) {
344
- orderBy(filteredMessages, ["createdAt"], ["desc"]).map((msg2) => {
345
- var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2, _m2, _n2;
785
+ if (threadMessages == null ? void 0 : threadMessages.length) {
786
+ const messageIds = /* @__PURE__ */ new Set();
787
+ res = threadMessages.filter((msg) => {
788
+ if (!msg.id || messageIds.has(msg.id)) {
789
+ console.log("Skipping duplicate message ID:", msg.id);
790
+ return false;
791
+ }
792
+ messageIds.add(msg.id);
793
+ return true;
794
+ }).map((msg) => {
795
+ var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2, _m2, _n2, _o2;
796
+ const uniqueId = msg.id || `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
346
797
  let message = {
347
- _id: "",
348
- text: "",
349
- createdAt: 0,
798
+ _id: uniqueId,
799
+ text: msg.message || "",
800
+ createdAt: new Date(msg.createdAt),
350
801
  user: {
351
- _id: "",
352
- name: "",
353
- avatar: ""
802
+ _id: (_c2 = (_a2 = msg == null ? void 0 : msg.author) == null ? void 0 : _a2.id) != null ? _c2 : (_b2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _b2.id,
803
+ name: (_i2 = (_g2 = (_d2 = msg == null ? void 0 : msg.author) == null ? void 0 : _d2.givenName) != null ? _g2 : ((_e2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _e2.given_name) + " " + ((_f2 = msg == null ? void 0 : msg.author) == null ? void 0 : _f2.familyName)) != null ? _i2 : (_h2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _h2.family_name,
804
+ avatar: (_l2 = (_j2 = msg == null ? void 0 : msg.author) == null ? void 0 : _j2.picture) != null ? _l2 : (_k2 = auth == null ? void 0 : auth.profile) == null ? void 0 : _k2.picture
354
805
  },
355
- type: ""
806
+ type: (msg == null ? void 0 : msg.type) || "",
807
+ image: (_o2 = (_n2 = (_m2 = msg == null ? void 0 : msg.files) == null ? void 0 : _m2.data) == null ? void 0 : _n2[0]) == null ? void 0 : _o2.url,
808
+ sent: (msg == null ? void 0 : msg.isDelivered) || true,
809
+ received: (msg == null ? void 0 : msg.isRead) || false,
810
+ propsConfiguration: msg == null ? void 0 : msg.propsConfiguration
356
811
  };
357
- const date = new Date(msg2.createdAt);
358
- message._id = msg2.id;
359
- message.text = msg2.message;
360
- message.createdAt = date;
361
- message.user = {
362
- _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,
363
- 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,
364
- 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
365
- }, 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;
366
- message.type = msg2 == null ? void 0 : msg2.type;
367
- message.propsConfiguration = msg2 == null ? void 0 : msg2.propsConfiguration;
368
- res.push(message);
812
+ return message;
369
813
  });
370
814
  }
371
- return (res == null ? void 0 : res.length) > 0 ? uniqBy([...res], ({
372
- _id
373
- }) => _id) : [];
374
- }, [channelMessages]);
815
+ const sortedMessages = res.sort((a, b) => b.createdAt - a.createdAt);
816
+ return sortedMessages;
817
+ }, [safeContextProperty("threadMessages"), auth]);
375
818
  const renderSend = (props) => {
376
- return /* @__PURE__ */ React__default.createElement(Send, __spreadValues({}, props), /* @__PURE__ */ React__default.createElement(Box, null, /* @__PURE__ */ React__default.createElement(MaterialCommunityIcons, { name: "send-circle", style: {
377
- marginBottom: 5,
378
- marginRight: 5
379
- }, size: 32, color: "#2e64e5" })));
819
+ const hasImage = safeContextProperty("selectedImage", "") !== "";
820
+ const isDisabled = !hasImage && (!props.text || props.text.trim().length === 0);
821
+ return /* @__PURE__ */ React__default.createElement(Send, __spreadProps(__spreadValues({}, props), { containerStyle: {
822
+ alignItems: "center",
823
+ justifyContent: "center",
824
+ marginHorizontal: 4,
825
+ marginBottom: 0
826
+ }, disabled: isDisabled }), /* @__PURE__ */ React__default.createElement(Box, { style: {
827
+ width: 32,
828
+ height: 32,
829
+ alignItems: "center",
830
+ justifyContent: "center"
831
+ } }, /* @__PURE__ */ React__default.createElement(MaterialCommunityIcons, { name: "send-circle", size: 30, color: isDisabled ? colors.gray[400] : colors.blue[500] })));
380
832
  };
381
- const renderMessageText = (props) => {
382
- 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;
383
- const {
384
- currentMessage
385
- } = props;
386
- if (currentMessage.type === "ALERT") {
387
- const attachment = (_b2 = (_a2 = currentMessage == null ? void 0 : currentMessage.propsConfiguration) == null ? void 0 : _a2.contents) == null ? void 0 : _b2.attachment;
388
- let action = "";
389
- let actionId = "";
390
- let params2 = {};
391
- if ((_c2 = attachment == null ? void 0 : attachment.callToAction) == null ? void 0 : _c2.extraParams) {
392
- const extraParams = (_d2 = attachment == null ? void 0 : attachment.callToAction) == null ? void 0 : _d2.extraParams;
393
- const route = (_e2 = extraParams == null ? void 0 : extraParams.route) != null ? _e2 : null;
394
- let path = null;
395
- let param = null;
396
- if (role && role == PreDefinedRole.Guest) {
397
- path = ((_f2 = route == null ? void 0 : route.guest) == null ? void 0 : _f2.name) ? (_h2 = (_g2 = route == null ? void 0 : route.guest) == null ? void 0 : _g2.name) != null ? _h2 : null : null;
398
- param = ((_i2 = route == null ? void 0 : route.guest) == null ? void 0 : _i2.params) ? (_k2 = (_j2 = route == null ? void 0 : route.guest) == null ? void 0 : _j2.params) != null ? _k2 : null : null;
399
- } else if (role && role == PreDefinedRole.Owner) {
400
- 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;
401
- 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;
402
- } else {
403
- 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;
404
- 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;
405
- }
406
- action = path;
407
- params2 = __spreadValues({}, param);
408
- } else if ((_x = attachment == null ? void 0 : attachment.callToAction) == null ? void 0 : _x.link) {
409
- action = CALL_TO_ACTION_PATH;
410
- actionId = (_y = attachment == null ? void 0 : attachment.callToAction) == null ? void 0 : _y.link.split("/").pop();
411
- params2 = {
412
- reservationId: actionId
413
- };
414
- }
415
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, (attachment == null ? void 0 : attachment.callToAction) && action ? /* @__PURE__ */ React__default.createElement(Box, { className: `bg-[${CALL_TO_ACTION_BOX_BGCOLOR}] rounded-[15] pb-2` }, /* @__PURE__ */ React__default.createElement(
416
- Button,
417
- {
418
- variant: "outline",
419
- size: "sm",
420
- className: `border-[${CALL_TO_ACTION_BUTTON_BORDERCOLOR}]`,
421
- onPress: () => action && params2 && navigation.navigate(action, params2)
833
+ const renderActions = (props) => {
834
+ return /* @__PURE__ */ React__default.createElement(
835
+ Actions$1,
836
+ __spreadProps(__spreadValues({}, props), {
837
+ options: {
838
+ ["Choose from Library"]: onSelectImages,
839
+ ["Cancel"]: () => {
840
+ }
422
841
  },
423
- /* @__PURE__ */ React__default.createElement(ButtonText, { className: `color-[${CALL_TO_ACTION_TEXT_COLOR}]` }, attachment.callToAction.title)
424
- ), /* @__PURE__ */ React__default.createElement(MessageText, __spreadProps(__spreadValues({}, props), { textStyle: {
425
- left: {
426
- marginLeft: 5,
427
- color: CALL_TO_ACTION_TEXT_COLOR,
428
- paddingHorizontal: 2
429
- }
430
- } }))) : /* @__PURE__ */ React__default.createElement(MessageText, __spreadProps(__spreadValues({}, props), { textStyle: {
431
- left: {
432
- marginLeft: 5
842
+ optionTintColor: "#000000",
843
+ cancelButtonIndex: 1,
844
+ icon: () => /* @__PURE__ */ React__default.createElement(Box, { style: {
845
+ width: 32,
846
+ height: 32,
847
+ alignItems: "center",
848
+ justifyContent: "center"
849
+ } }, /* @__PURE__ */ React__default.createElement(Ionicons, { name: "image", size: 24, color: colors.blue[500] })),
850
+ containerStyle: {
851
+ alignItems: "center",
852
+ justifyContent: "center",
853
+ marginLeft: 8,
854
+ marginBottom: 0
433
855
  }
434
- } })));
435
- } else {
436
- return /* @__PURE__ */ React__default.createElement(MessageText, __spreadProps(__spreadValues({}, props), { textStyle: {
437
- left: {
438
- marginLeft: 5
439
- }
440
- } }));
441
- }
442
- };
443
- const renderActions = (props) => {
444
- return /* @__PURE__ */ React__default.createElement(Actions, __spreadProps(__spreadValues({}, props), { icon: () => /* @__PURE__ */ React__default.createElement(Ionicons, { name: "image", size: 30, color: "black", onPress: onSelectImages }) }));
856
+ })
857
+ );
445
858
  };
446
859
  const renderAccessory = (props) => {
447
- return /* @__PURE__ */ React__default.createElement(Box, null, selectedImage !== "" ? /* @__PURE__ */ React__default.createElement(HStack, { className: "items-center" }, /* @__PURE__ */ React__default.createElement(Image, { className: "ml-3", key: selectedImage, alt: "image", source: {
448
- uri: selectedImage
449
- }, size: "xs" }), /* @__PURE__ */ React__default.createElement(Button, { variant: "solid", className: "bg-transparent", onPress: () => {
450
- setFiles([]);
451
- setImage("");
452
- setImages([]);
453
- } }, /* @__PURE__ */ React__default.createElement(ButtonText, { className: "color-black" }, "Cancel"))) : null);
860
+ var _a2, _b2;
861
+ const selectedImage2 = safeContextProperty("selectedImage", "");
862
+ if (!selectedImage2) {
863
+ return null;
864
+ }
865
+ return /* @__PURE__ */ React__default.createElement(View, { style: {
866
+ height: 80,
867
+ padding: 10,
868
+ backgroundColor: "white",
869
+ borderTopWidth: 1,
870
+ borderTopColor: "#e0e0e0",
871
+ flexDirection: "row",
872
+ alignItems: "center"
873
+ } }, /* @__PURE__ */ React__default.createElement(View, { style: {
874
+ flex: 1,
875
+ flexDirection: "row",
876
+ alignItems: "center",
877
+ paddingHorizontal: 20
878
+ } }, /* @__PURE__ */ React__default.createElement(Image, { key: (_a2 = state == null ? void 0 : state.context) == null ? void 0 : _a2.selectedImage, alt: "selected image", source: {
879
+ uri: (_b2 = state == null ? void 0 : state.context) == null ? void 0 : _b2.selectedImage
880
+ }, size: "xs", style: {
881
+ width: 5,
882
+ height: 5,
883
+ borderRadius: 5,
884
+ marginRight: 20
885
+ } }), /* @__PURE__ */ React__default.createElement(TouchableHighlight, { underlayColor: "#dddddd", onPress: () => safeSend({
886
+ type: Actions.CLEAR_IMAGE
887
+ }), style: {
888
+ backgroundColor: "#f44336",
889
+ paddingVertical: 2,
890
+ paddingHorizontal: 5,
891
+ borderRadius: 5,
892
+ marginLeft: 10,
893
+ elevation: 3,
894
+ shadowColor: "#000",
895
+ shadowOffset: {
896
+ width: 0,
897
+ height: 1
898
+ },
899
+ shadowOpacity: 0.3,
900
+ shadowRadius: 2
901
+ } }, /* @__PURE__ */ React__default.createElement(Text, { style: {
902
+ color: "white",
903
+ fontWeight: "bold"
904
+ } }, "X"))));
454
905
  };
455
906
  const setImageViewerObject = (obj, v) => {
456
907
  setImageObject(obj);
@@ -463,126 +914,182 @@ const ThreadConversationViewComponent = ({
463
914
  image,
464
915
  _id
465
916
  } = imageObject;
466
- return /* @__PURE__ */ React__default.createElement(
467
- CachedImage,
468
- {
469
- style: {
470
- width: "100%",
471
- height: "100%"
472
- },
473
- resizeMode: "cover",
474
- cacheKey: `${_id}-slack-bubble-imageKey`,
475
- source: {
476
- uri: image,
477
- expiresIn: 86400
478
- },
479
- alt: "image"
480
- }
481
- );
917
+ return /* @__PURE__ */ React__default.createElement(CachedImage, { style: {
918
+ width: "100%",
919
+ height: "100%"
920
+ }, resizeMode: "cover", cacheKey: `${_id}-slack-bubble-imageKey`, source: {
921
+ uri: image,
922
+ expiresIn: 86400
923
+ }, alt: "image" });
482
924
  }, [imageObject]);
483
925
  const renderMessage = (props) => {
484
926
  return /* @__PURE__ */ React__default.createElement(Message, __spreadProps(__spreadValues({}, props), { isShowImageViewer, setImageViewer: setImageViewerObject }));
485
927
  };
486
- let onScroll = false;
487
- const onMomentumScrollBegin = ({
488
- nativeEvent
489
- }) => {
490
- onScroll = true;
491
- console.log("scroll top");
492
- if (!loadingOldMessages && isCloseToTop(nativeEvent) && totalCount > (channelMessages == null ? void 0 : channelMessages.length)) {
493
- onFetchOld();
494
- }
495
- };
496
- const onEndReached = () => {
497
- console.log("on end reached");
498
- if (!onScroll)
499
- return;
500
- onScroll = false;
928
+ const currentMessageText = useMemo(() => {
929
+ const text = safeContextProperty("messageText", "") || " ";
930
+ return text;
931
+ }, [safeContextProperty("messageText")]);
932
+ const renderInputToolbar = (props) => {
933
+ return /* @__PURE__ */ React__default.createElement(InputToolbar, __spreadProps(__spreadValues({}, props), { containerStyle: {
934
+ backgroundColor: "white",
935
+ borderTopWidth: 1,
936
+ borderTopColor: colors.gray[200],
937
+ paddingHorizontal: 4,
938
+ paddingVertical: 4
939
+ }, primaryStyle: {
940
+ alignItems: "center"
941
+ } }));
501
942
  };
502
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, (loadingOldMessages || loadEarlierMsg) && /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500] }), 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: {
943
+ return /* @__PURE__ */ React__default.createElement(SafeAreaView, { style: {
944
+ flex: 1
945
+ } }, safeContextProperty("loadingOldMessages", false) && /* @__PURE__ */ React__default.createElement(Box, { className: "absolute top-10 left-0 right-0 z-10 items-center" }, /* @__PURE__ */ React__default.createElement(Box, { className: "bg-blue-500/20 rounded-full px-4 py-2 flex-row items-center" }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500], size: "small" }), /* @__PURE__ */ React__default.createElement(Text, { className: "text-sm font-medium color-blue-600 ml-2" }, "Loading messages..."))), isPostParentIdThread && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, ((_a = safeContextProperty("threadPost", [])) == null ? void 0 : _a.length) > 0 && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(VStack, { className: "px-2 pt-2 pb-0", space: "sm" }, /* @__PURE__ */ React__default.createElement(HStack, { space: "sm", className: "items-center" }, /* @__PURE__ */ React__default.createElement(Avatar, { className: "bg-transparent", size: "md" }, /* @__PURE__ */ React__default.createElement(AvatarFallbackText, null, startCase((_d = (_c = (_b = safeContextProperty("threadPost")[0]) == null ? void 0 : _b.author) == null ? void 0 : _c.username) == null ? void 0 : _d.charAt(0))), /* @__PURE__ */ React__default.createElement(AvatarImage, { alt: "image", style: {
503
946
  borderRadius: 6,
504
947
  borderWidth: 2,
505
948
  borderColor: "#fff"
506
949
  }, source: {
507
- uri: (_e = (_d = threadPost[0]) == null ? void 0 : _d.author) == null ? void 0 : _e.picture
508
- } })), /* @__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(
509
- GiftedChat,
510
- {
511
- ref: threadMessageListRef,
512
- wrapInSafeArea: false,
513
- renderLoading: () => /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500] }),
514
- messages: messageList,
515
- listViewProps: {
516
- onEndReached,
517
- onEndReachedThreshold: 0.5,
518
- onMomentumScrollBegin
519
- },
520
- onSend: (messages) => {
521
- var _a2, _b2;
522
- return handleSend((_b2 = (_a2 = messages[0]) == null ? void 0 : _a2.text) != null ? _b2 : " ");
523
- },
524
- text: msg ? msg : " ",
525
- onInputTextChanged: (text) => setMsg(text),
526
- renderFooter: () => loading ? /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500] }) : imageLoading ? /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500] }) : "",
527
- scrollToBottom: true,
528
- user: {
529
- _id: (auth == null ? void 0 : auth.id) || ""
530
- },
531
- isTyping: true,
532
- alwaysShowSend: loading ? false : true,
533
- infiniteScroll: true,
534
- renderSend,
535
- renderMessageText,
536
- minInputToolbarHeight: 50,
537
- renderActions,
538
- renderAccessory,
539
- renderMessage,
540
- 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({
541
- document: OnThreadChatMessageAddedDocument,
542
- variables: {
543
- channelId: channelId == null ? void 0 : channelId.toString(),
544
- postParentId: !parentId || parentId == 0 ? null : parentId == null ? void 0 : parentId.toString()
545
- },
546
- updateQuery: (prev, {
547
- subscriptionData
548
- }) => {
549
- var _a2, _b2, _c2;
550
- if (!subscriptionData.data)
551
- return prev;
552
- const newMessage = (_a2 = subscriptionData == null ? void 0 : subscriptionData.data) == null ? void 0 : _a2.threadChatMessageAdded;
553
- const prevReplyCount = (_b2 = prev == null ? void 0 : prev.getPostThread) == null ? void 0 : _b2.replyCount;
554
- const newReplyCount = prevReplyCount || 0 + 1;
555
- const replies = ((_c2 = prev == null ? void 0 : prev.getPostThread) == null ? void 0 : _c2.replies) || [];
556
- setChannelMessages((oldMessages) => uniqBy([...oldMessages, newMessage], ({
557
- id
558
- }) => id));
559
- setTotalCount(newReplyCount);
560
- return Object.assign({}, prev, {
561
- getPostThread: __spreadProps(__spreadValues({}, prev == null ? void 0 : prev.getPostThread), {
562
- lastReplyAt: newMessage.createdAt,
563
- replies: [newMessage, ...replies],
564
- replyCount: newReplyCount,
565
- updatedAt: newMessage.createdAt
566
- })
567
- });
950
+ uri: (_f = (_e = safeContextProperty("threadPost")[0]) == null ? void 0 : _e.author) == null ? void 0 : _f.picture
951
+ } })), /* @__PURE__ */ React__default.createElement(Box, null, /* @__PURE__ */ React__default.createElement(Text, { className: "font-bold color-black" }, (_i = (_h = (_g = safeContextProperty("threadPost")[0]) == null ? void 0 : _g.author) == null ? void 0 : _h.givenName) != null ? _i : "", " ", (_l = (_k = (_j = safeContextProperty("threadPost")[0]) == null ? void 0 : _j.author) == null ? void 0 : _k.familyName) != null ? _l : ""), /* @__PURE__ */ React__default.createElement(Text, { className: "pl-0 color-gray-500" }, createdAtText((_m = safeContextProperty("threadPost")[0]) == null ? void 0 : _m.createdAt), " at", " ", format(new Date((_n = safeContextProperty("threadPost")[0]) == null ? void 0 : _n.createdAt), "hh:ss:a")))), /* @__PURE__ */ React__default.createElement(HStack, { space: "sm", className: "px-2 items-center" }, /* @__PURE__ */ React__default.createElement(Text, null, (_p = (_o = safeContextProperty("threadPost")[0]) == null ? void 0 : _o.message) != null ? _p : ""))), /* @__PURE__ */ React__default.createElement(Box, { className: "py-4" }, /* @__PURE__ */ React__default.createElement(Box, { className: "px-4 py-2 border-t border-b border-gray-200" }, /* @__PURE__ */ React__default.createElement(Text, { className: "font-bold color-gray-600" }, (_r = (_q = safeContextProperty("threadPost")[0]) == null ? void 0 : _q.replies) == null ? void 0 : _r.totalCount, " ", ((_t = (_s = safeContextProperty("threadPost")[0]) == null ? void 0 : _s.replies) == null ? void 0 : _t.totalCount) > 0 ? "replies" : "reply"))))), /* @__PURE__ */ React__default.createElement(GiftedChat, { ref: threadMessageListRef, wrapInSafeArea: false, renderLoading: () => /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500] }), messages: messageList, listViewProps: {
952
+ onScroll: handleScrollToTop,
953
+ onEndReached: handleEndReached,
954
+ onEndReachedThreshold: 0.2,
955
+ contentContainerStyle: {
956
+ paddingBottom: 10
957
+ },
958
+ maintainVisibleContentPosition: {
959
+ minIndexForVisible: 0,
960
+ autoscrollToTopThreshold: 100
961
+ },
962
+ scrollEventThrottle: 100,
963
+ keyboardDismissMode: "on-drag",
964
+ keyboardShouldPersistTaps: "handled"
965
+ }, onSend: (messages) => {
966
+ var _a2, _b2;
967
+ if (!messages || messages.length === 0) {
968
+ console.log("No messages to send");
969
+ return;
970
+ }
971
+ const currentInputText = currentMessageText;
972
+ const messageToSend = (currentInputText == null ? void 0 : currentInputText.trim()) || ((_b2 = (_a2 = messages[0]) == null ? void 0 : _a2.text) == null ? void 0 : _b2.trim()) || " ";
973
+ console.log("GiftedChat onSend triggered with text from state:", messageToSend);
974
+ safeSend({
975
+ type: Actions.SET_MESSAGE_TEXT,
976
+ data: {
977
+ messageText: ""
978
+ }
979
+ });
980
+ if (safeContextProperty("images", []).length > 0) {
981
+ console.log("Sending message with file:", messageToSend, "Images:", safeContextProperty("images", []).length);
982
+ safeSend({
983
+ type: Actions.SEND_THREAD_MESSAGE_WITH_FILE,
984
+ data: {
985
+ messageText: messageToSend
568
986
  }
569
- }) })),
570
- messagesContainerStyle: (messageList == null ? void 0 : messageList.length) == 0 && {
571
- transform: [{
572
- scaleY: -1
573
- }]
574
- },
575
- 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!")))),
576
- lightboxProps: {
577
- underlayColor: "transparent",
578
- springConfig: {
579
- tension: 9e4,
580
- friction: 9e4
581
- },
582
- disabled: true
987
+ });
988
+ } else {
989
+ console.log("Sending text message:", messageToSend);
990
+ safeSend({
991
+ type: Actions.SEND_THREAD_MESSAGE,
992
+ data: {
993
+ messageText: messageToSend
994
+ }
995
+ });
996
+ }
997
+ }, text: currentMessageText, onInputTextChanged: (text) => {
998
+ if (text.length % 5 === 0 || text.length < 5) {
999
+ console.log("Input text changed:", text);
1000
+ }
1001
+ safeSend({
1002
+ type: Actions.SET_MESSAGE_TEXT,
1003
+ data: {
1004
+ messageText: text
583
1005
  }
1006
+ });
1007
+ }, renderFooter: () => safeContextProperty("loading", false) && !safeContextProperty("loadingOldMessages", false) ? /* @__PURE__ */ React__default.createElement(Box, { className: "w-full py-2 items-center" }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500] })) : safeContextProperty("imageLoading", false) ? /* @__PURE__ */ React__default.createElement(Box, { className: "w-full py-2 items-center" }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500] })) : /* @__PURE__ */ React__default.createElement(React__default.Fragment, null), scrollToBottom: true, loadEarlier: false, isLoadingEarlier: false, user: {
1008
+ _id: (auth == null ? void 0 : auth.id) || ""
1009
+ }, isTyping: true, alwaysShowSend: safeContextProperty("loading", false) ? false : true, infiniteScroll: true, renderSend, renderInputToolbar, minInputToolbarHeight: 50, renderActions, renderAccessory: !!((_u = state == null ? void 0 : state.context) == null ? void 0 : _u.selectedImage) ? renderAccessory : void 0, renderMessage, maxInputLength: 1e3, placeholder: "Type a message...", showUserAvatar: true, showAvatarForEveryMessage: false, inverted: true, parsePatterns: (linkStyle) => [{
1010
+ type: "url",
1011
+ style: __spreadProps(__spreadValues({}, linkStyle), {
1012
+ color: colors.blue[500]
1013
+ }),
1014
+ onPress: (url) => Linking.openURL(url)
1015
+ }, {
1016
+ type: "phone",
1017
+ style: __spreadProps(__spreadValues({}, linkStyle), {
1018
+ color: colors.blue[500]
1019
+ }),
1020
+ onPress: (phone) => Linking.openURL(`tel:${phone}`)
1021
+ }, {
1022
+ type: "email",
1023
+ style: __spreadProps(__spreadValues({}, linkStyle), {
1024
+ color: colors.blue[500]
1025
+ }),
1026
+ onPress: (email) => Linking.openURL(`mailto:${email}`)
1027
+ }], textInputProps: {
1028
+ style: {
1029
+ borderWidth: 1,
1030
+ borderColor: colors.gray[300],
1031
+ backgroundColor: "#f8f8f8",
1032
+ borderRadius: 20,
1033
+ minHeight: 40,
1034
+ maxHeight: 80,
1035
+ color: "#000",
1036
+ padding: 10,
1037
+ paddingHorizontal: 20,
1038
+ fontSize: 16,
1039
+ flex: 1
1040
+ },
1041
+ multiline: true,
1042
+ returnKeyType: "default",
1043
+ enablesReturnKeyAutomatically: true,
1044
+ placeholderTextColor: colors.gray[400]
1045
+ }, 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({
1046
+ document: OnThreadChatMessageAddedDocument,
1047
+ variables: {
1048
+ channelId: channelId == null ? void 0 : channelId.toString(),
1049
+ postParentId: !parentId || parentId == 0 ? null : parentId == null ? void 0 : parentId.toString()
1050
+ },
1051
+ updateQuery: (prev, {
1052
+ subscriptionData
1053
+ }) => {
1054
+ var _a2, _b2, _c2;
1055
+ if (!subscriptionData.data)
1056
+ return prev;
1057
+ const newMessage = (_a2 = subscriptionData == null ? void 0 : subscriptionData.data) == null ? void 0 : _a2.threadChatMessageAdded;
1058
+ const prevReplyCount = (_b2 = prev == null ? void 0 : prev.getPostThread) == null ? void 0 : _b2.replyCount;
1059
+ const newReplyCount = prevReplyCount || 0 + 1;
1060
+ const replies = ((_c2 = prev == null ? void 0 : prev.getPostThread) == null ? void 0 : _c2.replies) || [];
1061
+ safeSend({
1062
+ type: Actions.SET_THREAD_MESSAGES,
1063
+ data: {
1064
+ messages: uniqBy([...safeContextProperty("threadMessages", []), newMessage], ({
1065
+ id
1066
+ }) => id),
1067
+ totalCount: newReplyCount,
1068
+ threadPost: safeContextProperty("threadPost", []),
1069
+ postThread: safeContextProperty("postThread", null)
1070
+ }
1071
+ });
1072
+ return Object.assign({}, prev, {
1073
+ getPostThread: __spreadProps(__spreadValues({}, prev == null ? void 0 : prev.getPostThread), {
1074
+ lastReplyAt: newMessage.createdAt,
1075
+ replies: [newMessage, ...replies],
1076
+ replyCount: newReplyCount,
1077
+ updatedAt: newMessage.createdAt
1078
+ })
1079
+ });
584
1080
  }
585
- ));
1081
+ }) })), messagesContainerStyle: (messageList == null ? void 0 : messageList.length) == 0 && {
1082
+ transform: [{
1083
+ scaleY: -1
1084
+ }]
1085
+ }, 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: {
1086
+ underlayColor: "transparent",
1087
+ springConfig: {
1088
+ tension: 9e4,
1089
+ friction: 9e4
1090
+ },
1091
+ disabled: true
1092
+ } }));
586
1093
  };
587
1094
  const SubscriptionHandler = ({
588
1095
  subscribeToNewMessages,
@@ -591,4 +1098,4 @@ const SubscriptionHandler = ({
591
1098
  useEffect(() => subscribeToNewMessages(), [channelId]);
592
1099
  return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null);
593
1100
  };
594
- const ThreadConversationView = ThreadConversationViewComponent;export{ThreadConversationView};//# sourceMappingURL=ThreadConversationView.js.map
1101
+ const ThreadConversationView = React__default.memo(ThreadConversationViewComponent);export{ThreadConversationView};//# sourceMappingURL=ThreadConversationView.js.map