From 48ee6385d3630b8dfac5ebf8a405238a655cf9f6 Mon Sep 17 00:00:00 2001 From: canove Date: Wed, 17 Jun 2020 09:03:44 -0300 Subject: [PATCH] added new "last message" logic, before useReducer --- backend/app.js | 2 + backend/controllers/contact.js | 2 +- backend/controllers/wbotMessageListener.js | 127 ++++++++++-------- backend/controllers/wbotMonitor.js | 7 +- backend/controllers/whatsapp.js | 15 +++ backend/models/Contact.js | 2 +- backend/models/Message.js | 2 +- backend/routes/whatsapp.js | 15 +++ .../components/ContactsList/ContactsList.js | 53 +++++--- 9 files changed, 140 insertions(+), 85 deletions(-) create mode 100644 backend/controllers/whatsapp.js create mode 100644 backend/routes/whatsapp.js diff --git a/backend/app.js b/backend/app.js index 44cd1a0..052c053 100644 --- a/backend/app.js +++ b/backend/app.js @@ -12,6 +12,7 @@ const wbotMonitor = require("./controllers/wbotMonitor"); const messageRoutes = require("./routes/message"); const ContactRoutes = require("./routes/contacts"); const AuthRoutes = require("./routes/auth"); +const WhatsRoutes = require("./routes/whatsapp"); const app = express(); @@ -31,6 +32,7 @@ app.use("/public", express.static(path.join(__dirname, "public"))); app.use(messageRoutes); app.use(ContactRoutes); +app.use(WhatsRoutes); app.use("/auth", AuthRoutes); app.use((error, req, res, next) => { diff --git a/backend/controllers/contact.js b/backend/controllers/contact.js index 332893e..890540a 100644 --- a/backend/controllers/contact.js +++ b/backend/controllers/contact.js @@ -7,7 +7,7 @@ exports.getContacts = async (req, res) => { const contacts = await Contact.findAll({ include: { model: Message, - attributes: ["messageBody", "createdAt"], + attributes: [], }, attributes: { include: [ diff --git a/backend/controllers/wbotMessageListener.js b/backend/controllers/wbotMessageListener.js index c5da672..80bc6cc 100644 --- a/backend/controllers/wbotMessageListener.js +++ b/backend/controllers/wbotMessageListener.js @@ -13,80 +13,91 @@ const wbotMessageListener = () => { wbot.on("message", async msg => { let newMessage; - console.log(msg); + // console.log(msg); if (msg.from === "status@broadcast") { return; } - const msgContact = await msg.getContact(); - const imageUrl = await msgContact.getProfilePicUrl(); try { - let contact = await Contact.findOne({ - where: { number: msgContact.number }, - }); + const msgContact = await msg.getContact(); + const imageUrl = await msgContact.getProfilePicUrl(); + try { + let contact = await Contact.findOne({ + where: { number: msgContact.number }, + }); - if (contact) { - await contact.update({ imageURL: imageUrl }); - } - - if (!contact) { - try { - contact = await Contact.create({ - name: msgContact.pushname || msgContact.number.toString(), - number: msgContact.number, - imageURL: imageUrl, - }); - } catch (err) { - console.log(err); + if (contact) { + await contact.update({ imageURL: imageUrl }); } - } - if (msg.hasMedia) { - const media = await msg.downloadMedia(); - if (media) { - if (!media.filename) { - let ext = media.mimetype.split("/")[1].split(";")[0]; - media.filename = `${new Date().getTime()}.${ext}`; + if (!contact) { + try { + contact = await Contact.create({ + name: msgContact.pushname || msgContact.number.toString(), + number: msgContact.number, + imageURL: imageUrl, + }); + } catch (err) { + console.log(err); } + } + if (msg.hasMedia) { + const media = await msg.downloadMedia(); - fs.writeFile( - path.join(__dirname, "..", "public", media.filename), - media.data, - "base64", - err => { - console.log(err); + if (media) { + if (!media.filename) { + let ext = media.mimetype.split("/")[1].split(";")[0]; + media.filename = `${new Date().getTime()}.${ext}`; } - ); + fs.writeFile( + path.join(__dirname, "..", "public", media.filename), + media.data, + "base64", + err => { + console.log(err); + } + ); + + newMessage = await contact.createMessage({ + id: msg.id.id, + messageBody: msg.body || media.filename, + mediaUrl: media.filename, + mediaType: media.mimetype.split("/")[0], + }); + await contact.update({ lastMessage: msg.body || media.filename }); + } + } else { newMessage = await contact.createMessage({ id: msg.id.id, - messageBody: msg.body || media.filename, - mediaUrl: media.filename, - mediaType: media.mimetype.split("/")[0], + messageBody: msg.body, }); + await contact.update({ lastMessage: msg.body }); } - } else { - newMessage = await contact.createMessage({ - id: msg.id.id, - messageBody: msg.body, - }); + + io.to(contact.id) + .to("notification") + .emit("appMessage", { + action: "create", + message: { + ...newMessage.dataValues, + mediaUrl: `${ + newMessage.mediaUrl + ? `http://localhost:8080/public/${newMessage.mediaUrl}` + : "" + }`, + }, + contact: { + ...contact.dataValues, + unreadMessages: 1, + lastMessage: newMessage.messageBody, + }, + }); + + let chat = await msg.getChat(); + chat.sendSeen(); + } catch (err) { + console.log(err); } - - io.to(contact.id) - .to("notification") - .emit("appMessage", { - action: "create", - message: { - ...newMessage.dataValues, - mediaUrl: `${ - newMessage.mediaUrl - ? `http://localhost:8080/public/${newMessage.mediaUrl}` - : "" - }`, - }, - }); - - let chat = await msg.getChat(); - chat.sendSeen(); } catch (err) { console.log(err); } diff --git a/backend/controllers/wbotMonitor.js b/backend/controllers/wbotMonitor.js index dd76119..f30f64f 100644 --- a/backend/controllers/wbotMonitor.js +++ b/backend/controllers/wbotMonitor.js @@ -13,7 +13,7 @@ const wbotMonitor = () => { const wbot = getWbot(); wbot.on("change_state", newState => { - console.log(newState); + console.log("monitor", newState); }); wbot.on("change_battery", batteryInfo => { @@ -27,7 +27,10 @@ const wbotMonitor = () => { wbot.destroy(); setTimeout(() => init() - .then(res => wbotMessageListener(), 2000) + .then(res => { + wbotMessageListener(); + wbotMonitor(); + }) .catch(err => console.log(err)) ); }); diff --git a/backend/controllers/whatsapp.js b/backend/controllers/whatsapp.js new file mode 100644 index 0000000..9ec318b --- /dev/null +++ b/backend/controllers/whatsapp.js @@ -0,0 +1,15 @@ +const Whatsapp = require("../models/whatsapp"); + +exports.getSession = async (req, res, next) => { + try { + const dbSession = await Whatsapp.findOne({ where: { id: 1 } }); + + if (!dbSession) { + return res.status(200).json({ message: "Session not found" }); + } + + return res.status(200).json(dbSession); + } catch (err) { + next(err); + } +}; diff --git a/backend/models/Contact.js b/backend/models/Contact.js index e89612c..94ae656 100644 --- a/backend/models/Contact.js +++ b/backend/models/Contact.js @@ -8,7 +8,7 @@ const Contact = sequelize.define("contact", { name: { type: Sequelize.STRING(100), allowNull: false }, number: { type: Sequelize.STRING(15), allowNull: false }, imageURL: { type: Sequelize.STRING(200) }, - ateraId: Sequelize.INTEGER(), + lastMessage: { type: Sequelize.TEXT }, }); Contact.hasMany(Message, { diff --git a/backend/models/Message.js b/backend/models/Message.js index 49f09a9..d45f27f 100644 --- a/backend/models/Message.js +++ b/backend/models/Message.js @@ -13,7 +13,7 @@ const Message = sequelize.define("message", { }, userId: { type: Sequelize.INTEGER, defaultValue: 0 }, ack: { type: Sequelize.INTEGER, defaultValue: 0 }, - messageBody: { type: Sequelize.STRING(250), allowNull: false }, + messageBody: { type: Sequelize.TEXT, allowNull: false }, read: { type: Sequelize.BOOLEAN, defaultValue: false }, mediaUrl: { type: Sequelize.STRING(250) }, mediaType: { type: Sequelize.STRING(250) }, diff --git a/backend/routes/whatsapp.js b/backend/routes/whatsapp.js new file mode 100644 index 0000000..a9e34fd --- /dev/null +++ b/backend/routes/whatsapp.js @@ -0,0 +1,15 @@ +const express = require("express"); +const isAuth = require("../middleware/is-auth"); + +const WhatsappController = require("../controllers/whatsapp"); + +const routes = express.Router(); + +routes.get("/whatsapp/session", isAuth, WhatsappController.getSession); +// routes.post( +// "/messages/:contactId", +// isAuth, +// WhatsappController.postCreateContactMessage +// ); + +module.exports = routes; diff --git a/frontend/src/pages/Chat/components/ContactsList/ContactsList.js b/frontend/src/pages/Chat/components/ContactsList/ContactsList.js index daaa829..fe7b33d 100644 --- a/frontend/src/pages/Chat/components/ContactsList/ContactsList.js +++ b/frontend/src/pages/Chat/components/ContactsList/ContactsList.js @@ -114,7 +114,6 @@ const ContactsList = ({ selectedContact, setSelectedContact }) => { const [contacts, setContacts] = useState([]); const [displayedContacts, setDisplayedContacts] = useState([]); - const [notification, setNotification] = useState(true); const history = useHistory(); @@ -129,10 +128,7 @@ const ContactsList = ({ selectedContact, setSelectedContact }) => { useEffect(() => { const fetchContacts = async () => { try { - const res = await api.get( - "/contacts" - // { headers: { Authorization: "Bearer " + token }, } - ); + const res = await api.get("/contacts"); setContacts(res.data); setDisplayedContacts(res.data); } catch (err) { @@ -144,7 +140,7 @@ const ContactsList = ({ selectedContact, setSelectedContact }) => { } }; fetchContacts(); - }, [token, notification, history]); + }, [token, history]); useEffect(() => { const socket = openSocket("http://localhost:8080"); @@ -158,7 +154,6 @@ const ContactsList = ({ selectedContact, setSelectedContact }) => { }); socket.on("appMessage", data => { - setNotification(prevState => !prevState); if ( selectedContact && data.message.contactId === selectedContact.id && @@ -177,16 +172,22 @@ const ContactsList = ({ selectedContact, setSelectedContact }) => { if (contactIndex !== -1) { contactImageUrl = contacts[contactIndex].imageURL; contactName = contacts[contactIndex].name; + setDisplayedContacts(prevState => { + let aux = [...prevState]; + aux.unshift(aux.splice(contactIndex, 1)[0]); + return aux; + }); + setContacts(prevState => { + let aux = [...prevState]; + aux[contactIndex].unreadMessages++; + aux.unshift(aux.splice(contactIndex, 1)[0]); + return aux; + }); + } else { + setContacts(prevState => [data.contact, ...prevState]); + setDisplayedContacts(prevState => [data.contact, ...prevState]); } - - const options = { - body: `${data.message.messageBody} - ${moment(new Date()) - .tz("America/Sao_Paulo") - .format("DD/MM/YY - HH:mm")}`, - icon: contactImageUrl, - }; - new Notification(`Mensagem de ${contactName}`, options); - document.getElementById("sound").play(); + showNotification(data, contactName, contactImageUrl); }); return () => { @@ -194,6 +195,17 @@ const ContactsList = ({ selectedContact, setSelectedContact }) => { }; }, [selectedContact, contacts]); + const showNotification = (data, contactName, contactImageUrl) => { + const options = { + body: `${data.message.messageBody} - ${moment(new Date()) + .tz("America/Sao_Paulo") + .format("DD/MM/YY - HH:mm")}`, + icon: contactImageUrl, + }; + new Notification(`Mensagem de ${contactName}`, options); + document.getElementById("sound").play(); + }; + const resetUnreadMessages = contactId => { setDisplayedContacts(prevState => { let aux = [...prevState]; @@ -259,15 +271,14 @@ const ContactsList = ({ selectedContact, setSelectedContact }) => { > {contact.name} - {contact.messages && contact.messages[0] && ( + {contact.lastMessage && ( - {moment(contact.messages[0].createdAt) + {moment(contact.updatedAt) .tz("America/Sao_Paulo") .format("HH:mm")} @@ -283,9 +294,7 @@ const ContactsList = ({ selectedContact, setSelectedContact }) => { variant="body2" color="textSecondary" > - {(contact.messages && - contact.messages[0] && - contact.messages[0].messageBody) ||
} + {contact.lastMessage ||
} {contact.unreadMessages > 0 && (