|
@@ -176,63 +176,193 @@ const ChatScreen = ({ route }: { route: any }) => {
|
|
});
|
|
});
|
|
}, []);
|
|
}, []);
|
|
|
|
|
|
- const onSendMedia = useCallback((files: { uri: string; type: 'image' | 'video' }[]) => {
|
|
|
|
- const newMsgs = files.map((file) => {
|
|
|
|
- const msg: IMessage = {
|
|
|
|
- _id: Date.now() + Math.random(),
|
|
|
|
- text: '',
|
|
|
|
- createdAt: new Date(),
|
|
|
|
- user: { _id: +currentUserId, name: 'Me' }
|
|
|
|
- };
|
|
|
|
|
|
+ const onSendMedia = useCallback(
|
|
|
|
+ (files: { uri: string; type: 'image' | 'video' }[]) => {
|
|
|
|
+ const newMsgs = files.map((file) => {
|
|
|
|
+ const msg: IMessage = {
|
|
|
|
+ _id: Date.now() + Math.random(),
|
|
|
|
+ text: '',
|
|
|
|
+ createdAt: new Date(),
|
|
|
|
+ user: { _id: +currentUserId, name: 'Me' }
|
|
|
|
+ };
|
|
|
|
|
|
- if (file.type === 'image') {
|
|
|
|
- msg.image = file.uri;
|
|
|
|
- } else if (file.type === 'video') {
|
|
|
|
- msg.video = file.uri;
|
|
|
|
- }
|
|
|
|
- return msg;
|
|
|
|
- });
|
|
|
|
|
|
+ if (file.type === 'image') {
|
|
|
|
+ msg.image = file.uri;
|
|
|
|
+ } else if (file.type === 'video') {
|
|
|
|
+ msg.video = file.uri;
|
|
|
|
+ }
|
|
|
|
|
|
- setMessages((prev) => GiftedChat.append(prev, newMsgs));
|
|
|
|
- }, []);
|
|
|
|
|
|
+ const messageData = {
|
|
|
|
+ token,
|
|
|
|
+ to_uid: id,
|
|
|
|
+ text: '',
|
|
|
|
+ reply_to_id: replyMessage ? (replyMessage._id as number) : -1,
|
|
|
|
+ attachment: {
|
|
|
|
+ uri: file.uri,
|
|
|
|
+ type: file.type,
|
|
|
|
+ name: file.uri.split('/').pop()
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
|
|
- const onSendLocation = useCallback((coords: { latitude: number; longitude: number }) => {
|
|
|
|
- const locMsg: IMessage = {
|
|
|
|
- _id: Date.now() + Math.random(),
|
|
|
|
- text: `Location: lat=${coords.latitude}, lon=${coords.longitude}`,
|
|
|
|
- createdAt: new Date(),
|
|
|
|
- user: { _id: +currentUserId, name: 'Me' },
|
|
|
|
- location: coords
|
|
|
|
- };
|
|
|
|
- setMessages((prev) => GiftedChat.append(prev, [locMsg]));
|
|
|
|
- }, []);
|
|
|
|
|
|
+ console.log('messageData', messageData);
|
|
|
|
|
|
- const onSendFile = useCallback((files: { uri: string; type: string; name?: string }[]) => {
|
|
|
|
- const newMsgs = files.map((file) => {
|
|
|
|
- const msg: IMessage = {
|
|
|
|
|
|
+ sendMessage(messageData, {
|
|
|
|
+ onSuccess: (res) => {
|
|
|
|
+ console.log('res', res);
|
|
|
|
+ const newMessage = {
|
|
|
|
+ _id: res.message_id,
|
|
|
|
+ text: '',
|
|
|
|
+ attachment: res.attachment,
|
|
|
|
+ replyMessage: replyMessage
|
|
|
|
+ ? { text: replyMessage.text, id: replyMessage._id, sender: replyMessage.user?._id }
|
|
|
|
+ : undefined
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ // setMessages((previousMessages) =>
|
|
|
|
+ // (previousMessages ?? []).map((msg) =>
|
|
|
|
+ // msg._id === msg._id ? { ...msg, _id: res.message_id } : msg
|
|
|
|
+ // )
|
|
|
|
+ // );
|
|
|
|
+ sendWebSocketMessage('new_message', newMessage as unknown as CustomMessage);
|
|
|
|
+ },
|
|
|
|
+ onError: (err) => console.log('err', err)
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ return msg;
|
|
|
|
+ });
|
|
|
|
+ clearReplyMessage();
|
|
|
|
+
|
|
|
|
+ setMessages((prev) => GiftedChat.append(prev, newMsgs));
|
|
|
|
+ },
|
|
|
|
+ [replyMessage]
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ const toBase64 = (str: string) => {
|
|
|
|
+ return global.btoa(unescape(encodeURIComponent(str)));
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const onSendLocation = useCallback(
|
|
|
|
+ (coords: { latitude: number; longitude: number }) => {
|
|
|
|
+ const locMsg: IMessage = {
|
|
_id: Date.now() + Math.random(),
|
|
_id: Date.now() + Math.random(),
|
|
- text: '',
|
|
|
|
|
|
+ text: `Location: lat=${coords.latitude}, lon=${coords.longitude}`,
|
|
createdAt: new Date(),
|
|
createdAt: new Date(),
|
|
- user: { _id: +currentUserId, name: 'Me' }
|
|
|
|
|
|
+ user: { _id: +currentUserId, name: 'Me' },
|
|
|
|
+ location: coords
|
|
};
|
|
};
|
|
|
|
|
|
- if (file.type.includes('image')) {
|
|
|
|
- msg.image = file.uri;
|
|
|
|
- } else if (file.type.includes('video')) {
|
|
|
|
- msg.video = file.uri;
|
|
|
|
- } else {
|
|
|
|
- msg.attachment = {
|
|
|
|
- uri: file.uri,
|
|
|
|
- type: file.type,
|
|
|
|
- name: file.name || 'Attachment'
|
|
|
|
|
|
+ const locationData = JSON.stringify({ lat: coords.latitude, lng: coords.longitude });
|
|
|
|
+
|
|
|
|
+ const locationFile = {
|
|
|
|
+ uri: `data:application/json;base64,${toBase64(locationData)}`,
|
|
|
|
+ type: 'application/json',
|
|
|
|
+ name: 'location.json'
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const messageData = {
|
|
|
|
+ token,
|
|
|
|
+ to_uid: id,
|
|
|
|
+ text: locMsg.text,
|
|
|
|
+ reply_to_id: replyMessage ? (replyMessage._id as number) : -1,
|
|
|
|
+ attachment: locationFile
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ console.log('messageData', messageData);
|
|
|
|
+
|
|
|
|
+ sendMessage(messageData, {
|
|
|
|
+ onSuccess: (res) => {
|
|
|
|
+ console.log('res', res);
|
|
|
|
+ const newMessage = {
|
|
|
|
+ _id: res.message_id,
|
|
|
|
+ text: locMsg.text,
|
|
|
|
+ attachment: res.attachment,
|
|
|
|
+ replyMessage: replyMessage
|
|
|
|
+ ? { text: replyMessage.text, id: replyMessage._id, sender: replyMessage.user?._id }
|
|
|
|
+ : undefined
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ // setMessages((previousMessages) =>
|
|
|
|
+ // (previousMessages ?? []).map((msg) =>
|
|
|
|
+ // msg._id === locMsg._id ? { ...msg, _id: res.message_id } : msg
|
|
|
|
+ // )
|
|
|
|
+ // );
|
|
|
|
+ // sendWebSocketMessage('new_message', newMessage as unknown as CustomMessage);
|
|
|
|
+ },
|
|
|
|
+ onError: (err) => console.log('err', err)
|
|
|
|
+ });
|
|
|
|
+ clearReplyMessage();
|
|
|
|
+
|
|
|
|
+ setMessages((prev) => GiftedChat.append(prev, [locMsg]));
|
|
|
|
+ },
|
|
|
|
+ [replyMessage]
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ const onSendFile = useCallback(
|
|
|
|
+ (files: { uri: string; type: string; name?: string }[]) => {
|
|
|
|
+ const newMsgs = files.map((file) => {
|
|
|
|
+ const msg: IMessage = {
|
|
|
|
+ _id: Date.now() + Math.random(),
|
|
|
|
+ text: '',
|
|
|
|
+ createdAt: new Date(),
|
|
|
|
+ user: { _id: +currentUserId, name: 'Me' }
|
|
};
|
|
};
|
|
- }
|
|
|
|
|
|
|
|
- return msg;
|
|
|
|
- });
|
|
|
|
|
|
+ if (file.type.includes('image')) {
|
|
|
|
+ msg.image = file.uri;
|
|
|
|
+ } else if (file.type.includes('video')) {
|
|
|
|
+ msg.video = file.uri;
|
|
|
|
+ } else {
|
|
|
|
+ msg.attachment = {
|
|
|
|
+ uri: file.uri,
|
|
|
|
+ type: file.type,
|
|
|
|
+ name: file.name || 'Attachment'
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
|
|
- setMessages((prev) => GiftedChat.append(prev, newMsgs));
|
|
|
|
- }, []);
|
|
|
|
|
|
+ const messageData = {
|
|
|
|
+ token,
|
|
|
|
+ to_uid: id,
|
|
|
|
+ text: '',
|
|
|
|
+ reply_to_id: replyMessage ? (replyMessage._id as number) : -1,
|
|
|
|
+ attachment: {
|
|
|
|
+ uri: file.uri,
|
|
|
|
+ type: file.type,
|
|
|
|
+ name: file.name || file.uri.split('/').pop()
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ console.log('messageData', messageData);
|
|
|
|
+
|
|
|
|
+ sendMessage(messageData, {
|
|
|
|
+ onSuccess: (res) => {
|
|
|
|
+ console.log('res', res);
|
|
|
|
+ const newMessage = {
|
|
|
|
+ _id: res.message_id,
|
|
|
|
+ text: '',
|
|
|
|
+ attachment: res.attachment,
|
|
|
|
+ replyMessage: replyMessage
|
|
|
|
+ ? { text: replyMessage.text, id: replyMessage._id, sender: replyMessage.user?._id }
|
|
|
|
+ : undefined
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ // setMessages((previousMessages) =>
|
|
|
|
+ // (previousMessages ?? []).map((msg) =>
|
|
|
|
+ // msg._id === msg._id ? { ...msg, _id: res.message_id } : msg
|
|
|
|
+ // )
|
|
|
|
+ // );
|
|
|
|
+ sendWebSocketMessage('new_message', newMessage as unknown as CustomMessage);
|
|
|
|
+ },
|
|
|
|
+ onError: (err) => console.log('err', err)
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ return msg;
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ clearReplyMessage();
|
|
|
|
+ setMessages((prev) => GiftedChat.append(prev, newMsgs));
|
|
|
|
+ },
|
|
|
|
+ [replyMessage]
|
|
|
|
+ );
|
|
|
|
|
|
async function openFileInApp(uri: string, fileName: string) {
|
|
async function openFileInApp(uri: string, fileName: string) {
|
|
try {
|
|
try {
|
|
@@ -269,8 +399,9 @@ const ChatScreen = ({ route }: { route: any }) => {
|
|
const leftMessage = currentMessage?.user?._id !== +currentUserId;
|
|
const leftMessage = currentMessage?.user?._id !== +currentUserId;
|
|
if (!currentMessage?.attachment) return null;
|
|
if (!currentMessage?.attachment) return null;
|
|
|
|
|
|
- const { uri, type, name } = currentMessage.attachment;
|
|
|
|
- const fileName = name ?? 'Attachment';
|
|
|
|
|
|
+ // const { uri, type, name } = currentMessage.attachment;
|
|
|
|
+ // const fileName = name ?? 'Attachment';
|
|
|
|
+ const fileName = 'Attachment';
|
|
|
|
|
|
return (
|
|
return (
|
|
<TouchableOpacity
|
|
<TouchableOpacity
|
|
@@ -278,8 +409,8 @@ const ChatScreen = ({ route }: { route: any }) => {
|
|
styles.fileContainer,
|
|
styles.fileContainer,
|
|
{ backgroundColor: leftMessage ? 'rgba(15, 63, 79, 0.2)' : 'rgba(244, 244, 244, 0.2)' }
|
|
{ backgroundColor: leftMessage ? 'rgba(15, 63, 79, 0.2)' : 'rgba(244, 244, 244, 0.2)' }
|
|
]}
|
|
]}
|
|
- onPress={() => openFileInApp(uri, fileName)}
|
|
|
|
- onLongPress={() => downloadFileToDevice(uri, fileName)}
|
|
|
|
|
|
+ // onPress={() => openFileInApp(uri, fileName)}
|
|
|
|
+ // onLongPress={() => downloadFileToDevice(uri, fileName)}
|
|
>
|
|
>
|
|
<MaterialCommunityIcons
|
|
<MaterialCommunityIcons
|
|
name="file"
|
|
name="file"
|