@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.
- package/CHANGELOG.md +8 -0
- package/lib/screens/inbox/components/CachedImage/index.js +125 -93
- package/lib/screens/inbox/components/CachedImage/index.js.map +1 -1
- package/lib/screens/inbox/components/DialogsListItem.js +80 -256
- package/lib/screens/inbox/components/DialogsListItem.js.map +1 -1
- package/lib/screens/inbox/components/ServiceDialogsListItem.js +222 -324
- package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +1 -1
- package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js +0 -2
- package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
- package/lib/screens/inbox/containers/ConversationView.js +487 -888
- package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
- package/lib/screens/inbox/containers/Dialogs.js +243 -547
- package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
- package/lib/screens/inbox/containers/ThreadConversationView.js +409 -1364
- package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
- package/package.json +4 -4
- package/src/screens/inbox/components/CachedImage/index.tsx +191 -140
- package/src/screens/inbox/components/DialogsListItem.tsx +112 -345
- package/src/screens/inbox/components/ServiceDialogsListItem.tsx +316 -437
- package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +2 -4
- package/src/screens/inbox/containers/ConversationView.tsx +676 -993
- package/src/screens/inbox/containers/ConversationView.tsx.bk +1467 -0
- package/src/screens/inbox/containers/Dialogs.tsx +345 -636
- package/src/screens/inbox/containers/ThreadConversationView.tsx +661 -1887
- package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js +0 -175
- package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js.map +0 -1
- package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js +0 -191
- package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js.map +0 -1
- package/lib/screens/inbox/containers/workflow/conversation-xstate.js +0 -380
- package/lib/screens/inbox/containers/workflow/conversation-xstate.js.map +0 -1
- package/lib/screens/inbox/containers/workflow/dialogs-xstate.js +0 -211
- package/lib/screens/inbox/containers/workflow/dialogs-xstate.js.map +0 -1
- package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js +0 -438
- package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React__default,{useState,useRef,useCallback,
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
|
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
|
-
|
|
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 [
|
|
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 (
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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
|
-
|
|
441
|
-
|
|
442
|
-
|
|
100
|
+
setTotalCount(0);
|
|
101
|
+
setChannelMessages([]);
|
|
102
|
+
setThreadPost([]);
|
|
443
103
|
};
|
|
444
|
-
}, [postParentId
|
|
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:
|
|
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
|
-
}, [
|
|
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
|
|
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
|
-
|
|
528
|
-
|
|
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
|
-
|
|
593
|
-
|
|
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
|
-
|
|
145
|
+
setIsScrollToBottom(false);
|
|
146
|
+
threadMessageListRef.current.scrollTop = threadMessageListRef.current.scrollHeight;
|
|
596
147
|
}
|
|
597
148
|
}, [threadMessageListRef]);
|
|
598
|
-
const
|
|
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
|
|
604
|
-
|
|
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
|
-
|
|
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
|
-
|
|
196
|
+
exif: false
|
|
642
197
|
});
|
|
643
|
-
if (imageSource.canceled) {
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
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
|
-
|
|
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
|
-
|
|
683
|
-
type: "ERROR",
|
|
684
|
-
data: {
|
|
685
|
-
message: error.message || "Failed to select image"
|
|
686
|
-
}
|
|
687
|
-
});
|
|
219
|
+
setImageLoading(false);
|
|
688
220
|
}
|
|
689
221
|
};
|
|
690
|
-
const
|
|
691
|
-
var _a2, _b2;
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
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
|
-
|
|
701
|
-
|
|
702
|
-
|
|
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
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
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:
|
|
715
|
-
postParentId: !parentId || parentId
|
|
286
|
+
postThreadId: postThread && (postThread == null ? void 0 : postThread.id),
|
|
287
|
+
postParentId: !parentId || parentId === 0 ? null : parentId,
|
|
716
288
|
threadMessageInput: {
|
|
717
|
-
content:
|
|
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,
|
|
726
|
-
|
|
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
|
-
|
|
735
|
-
|
|
736
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
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,
|
|
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
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
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
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
}
|
|
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,
|
|
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) ? (
|
|
1079
|
-
param = ((
|
|
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
|
-
}, [
|
|
1111
|
-
const
|
|
1112
|
-
return /* @__PURE__ */ React__default.createElement(
|
|
1113
|
-
|
|
1114
|
-
|
|
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
|
|
1130
|
-
const
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
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
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
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
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
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: (
|
|
1489
|
-
} })), /* @__PURE__ */ React__default.createElement(Box, null, /* @__PURE__ */ React__default.createElement(Text, { className: "font-bold color-black" }, (
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
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
|
-
|
|
1519
|
-
|
|
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:
|
|
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:
|
|
634
|
+
minHeight: 36,
|
|
1585
635
|
maxHeight: 80,
|
|
1586
636
|
color: "#000",
|
|
1587
|
-
padding:
|
|
1588
|
-
paddingHorizontal:
|
|
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:
|
|
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 =
|
|
662
|
+
const newReplyCount = prevReplyCount || 0 + 1;
|
|
1611
663
|
const replies = ((_c2 = prev == null ? void 0 : prev.getPostThread) == null ? void 0 : _c2.replies) || [];
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
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
|
-
}
|
|
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 =
|
|
697
|
+
const ThreadConversationView = ThreadConversationViewComponent;export{ThreadConversationView};//# sourceMappingURL=ThreadConversationView.js.map
|