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