Before add pagination

This commit is contained in:
Cassio Santos
2020-06-03 07:34:08 -03:00
parent 5f4cf5e5b7
commit 876d8daa51
11 changed files with 283 additions and 76 deletions

View File

@@ -35,6 +35,10 @@ exports.getContactMessages = async (req, res, next) => {
const io = getIO(); const io = getIO();
const { contactId } = req.params; const { contactId } = req.params;
const { search, page = 1 } = req.query;
let limit = 5;
let offset = limit * (page - 1);
try { try {
const contact = await Contact.findByPk(contactId); const contact = await Contact.findByPk(contactId);
@@ -45,9 +49,14 @@ exports.getContactMessages = async (req, res, next) => {
} }
setMessagesAsRead(contactId); setMessagesAsRead(contactId);
const contactMessages = await contact.getMessages();
return res.json(contactMessages); const contactMessages = await contact.getMessages({
limit,
offset,
order: [["createdAt", "DESC"]],
});
return res.json(contactMessages.reverse());
} catch (err) { } catch (err) {
next(err); next(err);
} }

View File

@@ -1 +1 @@
{"WABrowserId":"\"W5pw0Llb60mSeV7WOHnk8A==\"","WASecretBundle":"{\"key\":\"alDLbPjonDFzCh5PEPql9cy59LNh1HFG/AZJVoucuYI=\",\"encKey\":\"FQ1MZ2eIH9hKV4dqFoBYTv1/89aopcMAa4CXgh/9csM=\",\"macKey\":\"alDLbPjonDFzCh5PEPql9cy59LNh1HFG/AZJVoucuYI=\"}","WAToken1":"\"cCkFiHM1JR5ck9OMV+WCiBG6QLCjsCjifdel3jRQ56k=\"","WAToken2":"\"1@0Y7HKBGDZWNuaYV7LiEwm0Y8xzlGoUGoyI8OD/KWjEH7UqVxJWfeT+pMNF4XBO7LeyEjpXVljC6rvQ==\""} {"WABrowserId":"\"W5pw0Llb60mSeV7WOHnk8A==\"","WASecretBundle":"{\"key\":\"alDLbPjonDFzCh5PEPql9cy59LNh1HFG/AZJVoucuYI=\",\"encKey\":\"FQ1MZ2eIH9hKV4dqFoBYTv1/89aopcMAa4CXgh/9csM=\",\"macKey\":\"alDLbPjonDFzCh5PEPql9cy59LNh1HFG/AZJVoucuYI=\"}","WAToken1":"\"GvHbBS6HkZD8f5nYpOxt5qsna4XaDx3JPsjoxwKiM6g=\"","WAToken2":"\"1@P1h9eDyW0m0ILzNfgs6sEF35E66OndfdlOjm3oYzeV13cg82FjBbRvhsma9+p5+/R7zjMUv6L+l/gg==\""}

View File

@@ -84,23 +84,27 @@ const wbotMessageListener = () => {
} }
}); });
wbot.on("message_ack", (msg, ack) => { wbot.on("message_ack", async (msg, ack) => {
// console.log("alteração do ack da msg", msg);
try { try {
const result = Message.update({ ack: ack }, { where: { id: msg.id.id } }); const messageToUpdate = await Message.findOne({
where: { id: msg.id.id },
if (!result) { });
if (!messageToUpdate) {
const error = new Error( const error = new Error(
"Erro ao definir as mensagens como lidas no banco de dados" "Erro ao alterar o ack da mensagem no banco de dados"
); );
error.satusCode = 501; error.satusCode = 501;
throw error; throw error;
} }
await messageToUpdate.update({ ack: ack });
io.to(messageToUpdate.contactId).emit("appMessage", {
action: "update",
message: messageToUpdate,
});
} catch (err) { } catch (err) {
console.log(err); console.log(err);
} }
console.log("ack da msg", ack);
}); });
}; };

View File

@@ -7,6 +7,7 @@ module.exports = (req, res, next) => {
decodedToken = jwt.verify(token, "mysecret"); decodedToken = jwt.verify(token, "mysecret");
} catch (err) { } catch (err) {
err.statusCode = 401; err.statusCode = 401;
err.message = "invalidToken";
next(err); next(err);
} }

View File

@@ -6,6 +6,7 @@ const sequelize = new Sequelize("econo_whatsbot", "root", "nodecomplete", {
collate: "utf8mb4_bin", collate: "utf8mb4_bin",
}, },
dialect: "mysql", dialect: "mysql",
timezone: "-03:00",
host: "localhost", host: "localhost",
logging: false, logging: false,
}); });

View File

@@ -8691,6 +8691,14 @@
"resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz", "resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz",
"integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==" "integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw=="
}, },
"moment-timezone": {
"version": "0.5.31",
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz",
"integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==",
"requires": {
"moment": ">= 2.9.0"
}
},
"move-concurrently": { "move-concurrently": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",

View File

@@ -11,6 +11,7 @@
"bootstrap": "^4.5.0", "bootstrap": "^4.5.0",
"emoji-mart": "^3.0.0", "emoji-mart": "^3.0.0",
"moment": "^2.26.0", "moment": "^2.26.0",
"moment-timezone": "^0.5.31",
"react": "^16.13.1", "react": "^16.13.1",
"react-audio-player": "^0.13.0", "react-audio-player": "^0.13.0",
"react-bootstrap": "^1.0.1", "react-bootstrap": "^1.0.1",

View File

@@ -0,0 +1,22 @@
import { useEffect, useState } from "react";
import api from "../../util/api";
const useMessageSerach = (query, pageNumber) => {
useEffect(() => {
const fetchMessages = async () => {
try {
const res = await api.get("/messages/" + contactId, {
headers: { Authorization: "Bearer " + token },
params: { serach: query, page: pageNumber },
});
setListMessages(res.data);
} catch (err) {
alert(err);
}
};
}, [query, pageNumber]);
return null;
};
export default useMessageSerach;

View File

@@ -1,5 +1,5 @@
import React, { useState, useEffect } from "react"; import React, { useState, useEffect } from "react";
import "./Chat.css"; import { useHistory } from "react-router-dom";
import api from "../../util/api"; import api from "../../util/api";
import profilePic from "../../Images/canove.png"; import profilePic from "../../Images/canove.png";
import profileDefaultPic from "../../Images/profile_default.png"; import profileDefaultPic from "../../Images/profile_default.png";
@@ -10,12 +10,15 @@ import LogedinNavbar from "../../components/Navbar/LogedinNavbar";
import DefaultNavbar from "../../components/Navbar/DefaultNavbar"; import DefaultNavbar from "../../components/Navbar/DefaultNavbar";
import ChatBox from "../ChatBox/ChatBox"; import ChatBox from "../ChatBox/ChatBox";
import "./Chat.css";
// let socket; // let socket;
const Chat = ({ showToast }) => { const Chat = ({ showToast }) => {
const token = localStorage.getItem("token"); const token = localStorage.getItem("token");
const username = localStorage.getItem("username"); const username = localStorage.getItem("username");
const history = useHistory();
const [currentPeerContact, setCurrentPeerContact] = useState(null); const [currentPeerContact, setCurrentPeerContact] = useState(null);
const [contacts, setContacts] = useState([]); const [contacts, setContacts] = useState([]);
const [displayedContacts, setDisplayedContacts] = useState([]); const [displayedContacts, setDisplayedContacts] = useState([]);
@@ -30,11 +33,18 @@ const Chat = ({ showToast }) => {
setContacts(res.data); setContacts(res.data);
setDisplayedContacts(res.data); setDisplayedContacts(res.data);
} catch (err) { } catch (err) {
alert(err.response.data.message); if (err.response.data.message === "invalidToken") {
localStorage.removeItem("token");
localStorage.removeItem("username");
localStorage.removeItem("userId");
history.push("/login");
alert("Sessão expirada, por favor, faça login novamente.");
}
console.log(err);
} }
}; };
fetchContacts(); fetchContacts();
}, [currentPeerContact, token, notification]); }, [currentPeerContact, token, notification, history]);
useEffect(() => { useEffect(() => {
const socket = openSocket("http://localhost:8080"); const socket = openSocket("http://localhost:8080");
@@ -42,7 +52,6 @@ const Chat = ({ showToast }) => {
socket.emit("joinNotification"); socket.emit("joinNotification");
socket.on("contact", data => { socket.on("contact", data => {
console.log("mensagem de um novo contato");
if (data.action === "create") { if (data.action === "create") {
addContact(data.contact); addContact(data.contact);
setNotification(prevState => !prevState); setNotification(prevState => !prevState);
@@ -50,7 +59,6 @@ const Chat = ({ showToast }) => {
}); });
socket.on("appMessage", data => { socket.on("appMessage", data => {
console.log("mensagem de contato existente");
setNotification(prevState => !prevState); setNotification(prevState => !prevState);
// handleUnreadMessages(data.message.contactId); // handleUnreadMessages(data.message.contactId);
}); });

View File

@@ -171,40 +171,43 @@ input::placeholder {
/* View item message */ /* View item message */
.viewItemRight { .viewItemRight {
margin-right: 20px;
margin-top: 5px;
min-width: 100px; min-width: 100px;
max-width: 600px; max-width: 600px;
height: auto; height: auto;
display: block;
margin-right: 20px; position: relative;
margin-top: 5px;
background-color: #dcf8c6;
align-self: flex-end; align-self: flex-end;
text-align: left;
background-color: #dcf8c6;
border-top-left-radius: 8px; border-top-left-radius: 8px;
border-top-right-radius: 8px; border-top-right-radius: 8px;
border-bottom-left-radius: 8px; border-bottom-left-radius: 8px;
border-bottom-right-radius: 0px; border-bottom-right-radius: 0px;
padding-left: 20px;
padding-right: 20px;
padding-top: 10px;
padding-bottom: 10px;
color: #203152;
box-shadow: 0 5px 5px #808888; box-shadow: 0 5px 5px #808888;
padding-left: 10px;
padding-right: 40px;
padding-top: 5px;
padding-bottom: 0px;
color: #203152;
} }
.viewItemRight2 { .viewItemRight2 {
width: 300px; width: 315px;
padding: 4px; padding: 8px;
height: auto; height: auto;
background-color: #dcf8c6; background-color: #dcf8c6;
align-self: flex-end; align-self: flex-end;
margin-right: 20px; margin-right: 20px;
margin-top: 10px; margin-top: 10px;
display: block;
position: relative;
border-top-left-radius: 8px; border-top-left-radius: 8px;
border-top-right-radius: 8px; border-top-right-radius: 8px;
border-bottom-left-radius: 8px; border-bottom-left-radius: 8px;
border-bottom-right-radius: 0px; border-bottom-right-radius: 0px;
color: #203152; color: #203152;
/* text-align: left; */
box-shadow: 0 5px 5px #808888; box-shadow: 0 5px 5px #808888;
} }
@@ -214,6 +217,8 @@ input::placeholder {
align-self: flex-end; align-self: flex-end;
margin-right: 20px; margin-right: 20px;
margin-top: 10px; margin-top: 10px;
display: block;
position: relative;
border-top-left-radius: 8px; border-top-left-radius: 8px;
border-top-right-radius: 8px; border-top-right-radius: 8px;
border-bottom-left-radius: 8px; border-bottom-left-radius: 8px;
@@ -247,33 +252,37 @@ input::placeholder {
} }
.viewItemLeft { .viewItemLeft {
margin-left: 20px;
margin-top: 5px;
min-width: 100px; min-width: 100px;
max-width: 600px; max-width: 600px;
height: auto; height: auto;
display: block;
position: relative;
margin-left: 20px;
margin-top: 5px;
background-color: #ffffff; background-color: #ffffff;
align-self: flex-start; align-self: flex-start;
border-top-left-radius: 8px; border-top-left-radius: 8px;
border-top-right-radius: 8px; border-top-right-radius: 8px;
border-bottom-left-radius: 0px; border-bottom-left-radius: 0px;
border-bottom-right-radius: 8px; border-bottom-right-radius: 8px;
padding-left: 20px; padding-left: 10px;
padding-right: 20px; padding-right: 40px;
padding-top: 10px; padding-top: 5px;
padding-bottom: 10px; padding-bottom: 0px;
color: #303030; color: #303030;
box-shadow: 0 5px 5px #808888; box-shadow: 0 5px 5px #808888;
} }
.viewItemLeft2 { .viewItemLeft2 {
width: 300px; width: 315px;
padding: 4px; padding: 8px;
height: auto; height: auto;
background-color: #ffffff;
margin-left: 10px; margin-left: 10px;
margin-top: 10px; margin-top: 10px;
background-color: #ffffff; display: block;
position: relative;
border-top-left-radius: 8px; border-top-left-radius: 8px;
border-top-right-radius: 8px; border-top-right-radius: 8px;
border-bottom-left-radius: 0px; border-bottom-left-radius: 0px;
@@ -287,6 +296,8 @@ input::placeholder {
margin-top: 10px; margin-top: 10px;
width: 300px; width: 300px;
height: auto; height: auto;
display: block;
position: relative;
border-top-left-radius: 8px; border-top-left-radius: 8px;
border-top-right-radius: 8px; border-top-right-radius: 8px;
border-bottom-left-radius: 0px; border-bottom-left-radius: 0px;
@@ -330,10 +341,16 @@ input::placeholder {
.textContentItem { .textContentItem {
font-size: 16px; font-size: 16px;
overflow-wrap: break-word; overflow-wrap: break-word;
padding: 0px 50px 0px 0px;
} }
.messageAck { .timestamp {
font-size: 10px; font-size: 11px;
position: absolute;
bottom: 5px;
right: 10px;
text-transform: uppercase;
color: #999;
} }
.viewListContentChat div:last-child { .viewListContentChat div:last-child {
@@ -354,7 +371,7 @@ input::placeholder {
.imgItemLeft { .imgItemLeft {
object-fit: cover; object-fit: cover;
width: 300px; width: 290px;
height: 300px; height: 300px;
border-top-left-radius: 8px; border-top-left-radius: 8px;
border-top-right-radius: 8px; border-top-right-radius: 8px;

View File

@@ -1,10 +1,13 @@
import React, { useState, useEffect } from "react"; import React, { useState, useEffect, useRef } from "react";
import { Card } from "react-bootstrap"; // import { Card } from "react-bootstrap"; alterei pra DIV, remover caso não dê problemas
import { FiPaperclip, FiSend, FiX, FiSmile, FiDownload } from "react-icons/fi"; import { FiPaperclip, FiSend, FiX, FiSmile } from "react-icons/fi";
import { RiSendPlane2Line } from "react-icons/ri"; import { RiSendPlane2Line } from "react-icons/ri";
import { BsCheck, BsCheckAll, BsClock } from "react-icons/bs";
import { FaFileDownload } from "react-icons/fa";
import "emoji-mart/css/emoji-mart.css"; import "emoji-mart/css/emoji-mart.css";
import { Picker } from "emoji-mart"; import { Picker } from "emoji-mart";
import ModalImage from "react-modal-image"; import ModalImage from "react-modal-image";
import moment from "moment-timezone";
import api from "../../util/api"; import api from "../../util/api";
import openSocket from "socket.io-client"; import openSocket from "socket.io-client";
@@ -15,7 +18,12 @@ import ScrollToBottom from "react-scroll-to-bottom";
import "react-toastify/dist/ReactToastify.css"; import "react-toastify/dist/ReactToastify.css";
import "./ChatBox.css"; import "./ChatBox.css";
// let socket;
// const executeScroll = myRef =>
// myRef.current.scrollIntoView({
// // behavior: "smooth",
// block: "end",
// });
const ChatBox = ({ currentPeerContact }) => { const ChatBox = ({ currentPeerContact }) => {
const SERVER_URL = "http://localhost:8080/"; const SERVER_URL = "http://localhost:8080/";
@@ -25,19 +33,29 @@ const ChatBox = ({ currentPeerContact }) => {
const username = localStorage.getItem("username"); const username = localStorage.getItem("username");
const token = localStorage.getItem("token"); const token = localStorage.getItem("token");
const mediaInitialState = { preview: "", raw: "", name: "" }; const mediaInitialState = { preview: "", raw: "", name: "" };
// const [isLoading, setIsLoading] = useState(true);
const [listMessages, setListMessages] = useState([]); const [listMessages, setListMessages] = useState([]);
const [inputMessage, setInputMessage] = useState(""); const [inputMessage, setInputMessage] = useState("");
const [media, setMedia] = useState(mediaInitialState); const [media, setMedia] = useState(mediaInitialState);
const [showEmoji, setShowEmoji] = useState(false); const [showEmoji, setShowEmoji] = useState(false);
// let lastMessageRef = useRef();
// useEffect(() => {
// executeScroll(lastMessageRef);
// }, [isLoading]);
useEffect(() => { useEffect(() => {
const fetchMessages = async () => { const fetchMessages = async () => {
// setIsLoading(true);
try { try {
const res = await api.get("/messages/" + contactId, { const res = await api.get("/messages/" + contactId, {
headers: { Authorization: "Bearer " + token }, headers: { Authorization: "Bearer " + token },
params: { page: 3 },
}); });
setListMessages(res.data); setListMessages(res.data);
// setIsLoading(false);
} catch (err) { } catch (err) {
alert(err); alert(err);
} }
@@ -58,9 +76,13 @@ const ChatBox = ({ currentPeerContact }) => {
socket.emit("joinChatBox", contactId, () => {}); socket.emit("joinChatBox", contactId, () => {});
socket.on("appMessage", data => { socket.on("appMessage", data => {
// setIsLoading(true);
if (data.action === "create") { if (data.action === "create") {
addMessage(data.message); addMessage(data.message);
} else if (data.action === "update") {
updateMessageAck(data.message);
} }
// setIsLoading(false);
}); });
return () => { return () => {
@@ -68,6 +90,18 @@ const ChatBox = ({ currentPeerContact }) => {
}; };
}, [contactId]); }, [contactId]);
const updateMessageAck = message => {
let id = message.id;
setListMessages(prevState => {
console.log("mudando o ack da mensagem");
let aux = [...prevState];
let messageIndex = aux.findIndex(message => message.id === id);
aux[messageIndex].ack = message.ack;
return aux;
});
};
const addMessage = message => { const addMessage = message => {
setListMessages(prevState => [...prevState, message]); setListMessages(prevState => [...prevState, message]);
}; };
@@ -140,10 +174,24 @@ const ChatBox = ({ currentPeerContact }) => {
console.log(listMessages); console.log(listMessages);
const renderMsgAck = message => {
//todo remove timestamp logic from main return and adopt moment to timestamps
if (message.ack === 0) {
return <BsClock size="18" />;
} else if (message.ack === 1) {
return <BsCheck size="18" />;
} else if (message.ack === 2) {
return <BsCheckAll size="18" />;
} else if (message.ack === 3) {
return <BsCheckAll size="18" color="green" />;
}
};
const renderMessages = () => { const renderMessages = () => {
if (listMessages.length > 0) { if (listMessages.length > 0) {
let viewListMessages = []; let viewListMessages = [];
listMessages.forEach((message, index) => { listMessages.forEach((message, index) => {
// mensagens recebidas
if (message.userId === 0) { if (message.userId === 0) {
if (message.mediaUrl && message.mediaType === "image") { if (message.mediaUrl && message.mediaType === "image") {
viewListMessages.push( viewListMessages.push(
@@ -155,36 +203,80 @@ const ChatBox = ({ currentPeerContact }) => {
large={`${SERVER_URL}${message.mediaUrl}`} large={`${SERVER_URL}${message.mediaUrl}`}
alt="" alt=""
/> />
<span className="textContentItem">{message.messageBody}</span> <div className="textContentItem">
{message.messageBody}
<span className="timestamp">
{moment(message.createdAt)
.tz("America/Sao_Paulo")
.format("HH:mm")}
</span>
</div>
</div> </div>
); );
} else if (message.mediaUrl && message.mediaType === "audio") { } else if (message.mediaUrl && message.mediaType === "audio") {
viewListMessages.push( viewListMessages.push(
<div className="viewItemLeft3" key={message.id}> <div className="viewItemLeft2" key={message.id}>
{message.messageBody}
<ReactAudioPlayer <ReactAudioPlayer
src={`${SERVER_URL}${message.mediaUrl}`} src={`${SERVER_URL}${message.mediaUrl}`}
controls controls
/> />
<div className="textContentItem">
<span className="timestamp">
{moment(message.createdAt)
.tz("America/Sao_Paulo")
.format("HH:mm")}
</span>
</div>
</div>
);
} else if (message.mediaUrl && message.mediaType === "video") {
viewListMessages.push(
<div className="viewItemLeft2" key={message.id}>
<video
className="imgItemLeft"
src={`${SERVER_URL}${message.mediaUrl}`}
controls
/>
<div className="textContentItem">
{message.messageBody}
<span className="timestamp">
{moment(message.createdAt)
.tz("America/Sao_Paulo")
.format("HH:mm")}
</span>
</div>
</div> </div>
); );
} else if (message.mediaUrl) { } else if (message.mediaUrl) {
viewListMessages.push( viewListMessages.push(
<div className="viewItemLeft" key={message.id}> <div className="viewItemLeft" key={message.id}>
<a <div className="textContentItem">
href={`${SERVER_URL}${message.mediaUrl}`} <a
className="textContentItem" href={`${SERVER_URL}${message.mediaUrl}`}
> className="textContentItem"
{message.messageBody} >
<hr></hr> {message.messageBody}
Download <FiDownload size="20" /> <FaFileDownload size="20" />
</a> </a>
<span className="timestamp">
{moment(message.createdAt)
.tz("America/Sao_Paulo")
.format("HH:mm")}
</span>
</div>
</div> </div>
); );
} else { } else {
viewListMessages.push( viewListMessages.push(
<div className="viewItemLeft" key={message.id}> <div className="viewItemLeft" key={message.id}>
<span className="textContentItem">{message.messageBody}</span> <div className="textContentItem">
{message.messageBody}
<span className="timestamp">
{moment(message.createdAt)
.tz("America/Sao_Paulo")
.format("HH:mm")}
</span>
</div>
</div> </div>
); );
} }
@@ -193,43 +285,86 @@ const ChatBox = ({ currentPeerContact }) => {
viewListMessages.push( viewListMessages.push(
<div className="viewItemRight2" key={message.id}> <div className="viewItemRight2" key={message.id}>
<ModalImage <ModalImage
className="imgItemLeft" className="imgItemRight"
smallSrcSet={`${SERVER_URL}${message.mediaUrl}`} smallSrcSet={`${SERVER_URL}${message.mediaUrl}`}
medium={`${SERVER_URL}${message.mediaUrl}`} medium={`${SERVER_URL}${message.mediaUrl}`}
large={`${SERVER_URL}${message.mediaUrl}`} large={`${SERVER_URL}${message.mediaUrl}`}
alt="" alt=""
/> />
<span className="textContentItem">{message.messageBody}</span> <div className="textContentItem">
{message.messageBody}
<span className="timestamp">
{moment(message.createdAt)
.tz("America/Sao_Paulo")
.format("HH:mm")}{" "}
{renderMsgAck(message)}
</span>
</div>
</div> </div>
); );
// mensagens enviadas
} else if (message.mediaUrl && message.mediaType === "audio") { } else if (message.mediaUrl && message.mediaType === "audio") {
viewListMessages.push( viewListMessages.push(
<div className="viewItemRight3" key={message.id}> <div className="viewItemRight2 " key={message.id}>
{message.messageBody}
<ReactAudioPlayer <ReactAudioPlayer
src={`${SERVER_URL}${message.mediaUrl}`} src={`${SERVER_URL}${message.mediaUrl}`}
controls controls
/> />
<div className="textContetItem">
<span className="timestamp">
{moment(message.createdAt)
.tz("America/Sao_Paulo")
.format("HH:mm")}{" "}
{renderMsgAck(message)}
</span>
</div>
</div>
);
} else if (message.mediaUrl && message.mediaType === "video") {
viewListMessages.push(
<div className="viewItemRight2" key={message.id}>
<video src={`${SERVER_URL}${message.mediaUrl}`} controls />
{message.messageBody}
<span className="timestamp">
{moment(message.createdAt)
.tz("America/Sao_Paulo")
.format("HH:mm")}{" "}
{renderMsgAck(message)}
</span>
</div> </div>
); );
} else if (message.mediaUrl) { } else if (message.mediaUrl) {
viewListMessages.push( viewListMessages.push(
<div className="viewItemRight" key={message.id}> <div className="viewItemRight" key={message.id}>
<a <div className="textContentItem">
href={`${SERVER_URL}${message.mediaUrl}`} <a
className="textContentItem" href={`${SERVER_URL}${message.mediaUrl}`}
> className="textContentItem"
{message.messageBody} >
<hr></hr> {message.messageBody}
Download <FiDownload size="20" /> <FaFileDownload size="20" />
</a> </a>
<span className="timestamp">
{moment(message.createdAt)
.tz("America/Sao_Paulo")
.format("HH:mm")}{" "}
{renderMsgAck(message)}
</span>
</div>
</div> </div>
); );
} else { } else {
viewListMessages.push( viewListMessages.push(
<div className="viewItemRight" key={message.id}> <div className="viewItemRight" key={message.id}>
<span className="textContentItem ">{message.messageBody}</span> <div className="textContentItem">
<span className="messageAck">{message.ack}</span> {message.messageBody}
<span className="timestamp">
{moment(message.createdAt)
.tz("America/Sao_Paulo")
.format("HH:mm")}{" "}
{renderMsgAck(message)}
</span>
</div>
</div> </div>
); );
} }
@@ -246,7 +381,7 @@ const ChatBox = ({ currentPeerContact }) => {
}; };
return ( return (
<Card className="viewChatBoard"> <div className="viewChatBoard">
<div className="headerChatBoard"> <div className="headerChatBoard">
<img <img
className="viewAvatarItem" className="viewAvatarItem"
@@ -257,13 +392,14 @@ const ChatBox = ({ currentPeerContact }) => {
<p style={{ fontSize: "20px" }}>{currentPeerContact.name}</p> <p style={{ fontSize: "20px" }}>{currentPeerContact.name}</p>
</span> </span>
<div className="aboutme"> <div className="aboutme">
<span> <span>Status do contato</span>
<p>Status do contato</p>
</span>
</div> </div>
</div> </div>
<ScrollToBottom className="viewListContentChat"> <ScrollToBottom className="viewListContentChat">
<div className="viewListContentChat">{renderMessages()}</div> <div className="viewListContentChat">
{renderMessages()}
{/* <div ref={lastMessageRef}> </div> */}
</div>
</ScrollToBottom> </ScrollToBottom>
{media.preview ? ( {media.preview ? (
<div className="viewMediaBottom"> <div className="viewMediaBottom">
@@ -326,7 +462,7 @@ const ChatBox = ({ currentPeerContact }) => {
<FiSend color="gray" className="icSend" onClick={handleSendMessage} /> <FiSend color="gray" className="icSend" onClick={handleSendMessage} />
</div> </div>
)} )}
</Card> </div>
); );
}; };