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 && (