diff --git a/backend/src/services/WbotServices/wbotMessageListener.ts b/backend/src/services/WbotServices/wbotMessageListener.ts
index ffa650e..1cf3016 100644
--- a/backend/src/services/WbotServices/wbotMessageListener.ts
+++ b/backend/src/services/WbotServices/wbotMessageListener.ts
@@ -46,7 +46,7 @@ import FindOrCreateTicketService from "../TicketServices/FindOrCreateTicketServi
import ShowWhatsAppService from "../WhatsappService/ShowWhatsAppService";
import { debounce } from "../../helpers/Debounce";
import UpdateTicketService from "../TicketServices/UpdateTicketService";
-import { date } from "faker";
+import { date, name } from "faker";
import ShowQueueService from "../QueueService/ShowQueueService";
import ShowTicketMessage from "../TicketServices/ShowTicketMessage";
@@ -101,6 +101,7 @@ import ShowTicketService from "../TicketServices/ShowTicketService";
import ShowQueuesByUser from "../UserServices/ShowQueuesByUser";
import ListWhatsappQueuesByUserQueue from "../UserServices/ListWhatsappQueuesByUserQueue";
import CreateContactService from "../ContactServices/CreateContactService";
+import { number } from "yup";
var lst: any[] = getWhatsappIds();
@@ -316,6 +317,14 @@ const verifyMessage = async (
await ticket.update({ lastMessage: msg.body });
+ if (!msg?.fromMe && msg?.vCards && msg?.vCards?.length > 0) {
+ if (msg.vCards.length == 1) {
+ messageData = { ...messageData, body: msg.vCards[0] };
+ } else {
+ messageData = { ...messageData, body: JSON.stringify(msg.vCards) };
+ }
+ }
+
await CreateMessageService({ messageData });
};
@@ -504,7 +513,7 @@ const isValidMsg = (msg: any): boolean => {
msg.type === "image" ||
msg.type === "document" ||
msg.type === "vcard" ||
- // msg.type === "multi_vcard" ||
+ msg.type === "multi_vcard" ||
msg.type === "sticker"
)
return true;
@@ -550,7 +559,7 @@ const transferTicket = async (
}
if (queue) await botTransferTicket(queue, ticket, sendGreetingMessage);
- io.emit('notifyPeding', {data: {ticket, queue}});
+ io.emit("notifyPeding", { data: { ticket, queue } });
};
const botTransferTicket = async (
@@ -586,7 +595,7 @@ const botTransferTicketToUser = async (
};
const botSendMessage = (ticket: Ticket, msg: string) => {
- const { phoneNumberId } = ticket;
+ const { phoneNumberId } = ticket;
const debouncedSentMessage = debounce(
async () => {
@@ -644,9 +653,9 @@ const handleMessage = async (
let msgContact: any = wbot.msgContact;
// let groupContact: Contact | undefined;
- if (msg.fromMe) {
+ if (msg.fromMe) {
// messages sent automatically by wbot have a special character in front of it
- // if so, this message was already been stored in database;
+ // if so, this message was already been stored in database;
if (/\u200e/.test(msg.body[0])) return;
// media messages sent from me from cell phone, first comes with "hasMedia = false" and type = "image/ptt/etc"
@@ -787,32 +796,8 @@ const handleMessage = async (
await verifyQueue(wbot, msg, ticket, contact);
}
- if (msg.type === "vcard") {
- try {
- const array = msg.body.split("\n");
- const obj = [];
- let contact = "";
- for (let index = 0; index < array.length; index++) {
- const v = array[index];
- const values = v.split(":");
- for (let ind = 0; ind < values.length; ind++) {
- if (values[ind].indexOf("+") !== -1) {
- obj.push({ number: values[ind] });
- }
- if (values[ind].indexOf("FN") !== -1) {
- contact = values[ind + 1];
- }
- }
- }
- for await (const ob of obj) {
- const cont = await CreateContactService({
- name: contact,
- number: ob.number.replace(/\D/g, "")
- });
- }
- } catch (error) {
- console.log(error);
- }
+ if (msg.type === "vcard" || msg.type === "multi_vcard") {
+ await vcard(msg);
}
const botInfo = await BotIsOnQueue("botqueue");
@@ -977,7 +962,7 @@ const handleMessage = async (
if (ticket?.queueId) {
ticketHasQueue = true;
}
-
+
if (ticketHasQueue && ticket.status != "open") {
let whatsapp: any = await whatsappInfo(ticket?.whatsappId);
@@ -1258,6 +1243,59 @@ export {
mediaTypeWhatsappOfficial,
botSendMessage
};
+async function vcard(msg: any) {
+ let array: any[] = [];
+ let contact: any;
+ let obj: any[] = [];
+
+ try {
+ const multi_vcard = msg?.vCards?.length === 0 ? false : true;
+
+ if (multi_vcard) {
+ array = msg?.vCards;
+ contact = [];
+ } else {
+ array = msg.body.split("\n");
+ contact = "";
+ }
+
+ for (let index = 0; index < array.length; index++) {
+ const v = array[index];
+ const values = v.split(":");
+ for (let ind = 0; ind < values.length; ind++) {
+ if (values[ind].indexOf("+") !== -1) {
+ obj.push({ number: values[ind] });
+ }
+ if (values[ind].indexOf("FN") !== -1) {
+ if (multi_vcard)
+ contact.push({ name: values[ind + 1].split("\n")[0] });
+ else contact = values[ind + 1];
+ }
+ }
+ }
+
+ for (const i in obj) {
+ let data: any = {};
+
+ if (multi_vcard) {
+ data = {
+ name: contact[i].name,
+ number: obj[i].number.replace(/\D/g, "")
+ };
+ } else {
+ data = {
+ name: contact,
+ number: obj[i].number.replace(/\D/g, "")
+ };
+ }
+
+ const cont = await CreateContactService(data);
+ }
+ } catch (error) {
+ console.log(error);
+ }
+}
+
async function backUra(whatsappId: any, contactId: any, data: any) {
let uraOptionSelected = await findObject(whatsappId, contactId, "ura");
diff --git a/frontend/src/components/ContactCreateTicketModal/index.js b/frontend/src/components/ContactCreateTicketModal/index.js
index 3681c6c..3ba9281 100644
--- a/frontend/src/components/ContactCreateTicketModal/index.js
+++ b/frontend/src/components/ContactCreateTicketModal/index.js
@@ -157,7 +157,7 @@ const ContactCreateTicketModal = ({ modalOpen, onClose, contactId }) => {
const { data } = await api.get("/whatsapp/official/matchQueue", { params: { userId: user.id, queueId: selectedQueue }, })
- console.log('WHATSAPP DATA: ', data)
+ // console.log('WHATSAPP DATA: ', data)
setWhatsQueue(data)
diff --git a/frontend/src/components/MessageInput/index.js b/frontend/src/components/MessageInput/index.js
index 9773517..e710ab2 100644
--- a/frontend/src/components/MessageInput/index.js
+++ b/frontend/src/components/MessageInput/index.js
@@ -311,9 +311,7 @@ const MessageInput = ({ ticketStatus }) => {
}
const handleSendMessage = async (templateParams = null) => {
-
- console.log('templateParams: ', templateParams, ' | inputMessage: ', inputMessage)
-
+
if (inputMessage.trim() === "") return
setLoading(true)
@@ -323,9 +321,7 @@ const MessageInput = ({ ticketStatus }) => {
if (templateParams) {
for (let key in templateParams) {
- if (templateParams.hasOwnProperty(key)) {
- // let value = templateParams[key]
- // console.log('key: ', key, ' | ', 'VALUE: ', value)
+ if (templateParams.hasOwnProperty(key)) {
if (key === '_reactName') {
templateParams = null
@@ -348,9 +344,7 @@ const MessageInput = ({ ticketStatus }) => {
}
- try {
-
- console.log('kkkkkkkkkkkkkkkkkkk message: ', message)
+ try {
const { data } = await api.post(`/messages/${ticketId}`, message)
setParams(null)
diff --git a/frontend/src/components/MessagesList/index.js b/frontend/src/components/MessagesList/index.js
index 9d25471..5a99c79 100644
--- a/frontend/src/components/MessagesList/index.js
+++ b/frontend/src/components/MessagesList/index.js
@@ -1,18 +1,18 @@
-import React, { useContext, useState, useEffect, useReducer, useRef } from "react";
+import React, { useContext, useState, useEffect, useReducer, useRef } from "react"
-import { isSameDay, parseISO, format } from "date-fns";
-import openSocket from "socket.io-client";
-import clsx from "clsx";
-import { AuthContext } from "../../context/Auth/AuthContext";
+import { isSameDay, parseISO, format } from "date-fns"
+import openSocket from "socket.io-client"
+import clsx from "clsx"
+import { AuthContext } from "../../context/Auth/AuthContext"
-import { green } from "@material-ui/core/colors";
+import { green } from "@material-ui/core/colors"
import {
Button,
CircularProgress,
Divider,
IconButton,
makeStyles,
-} from "@material-ui/core";
+} from "@material-ui/core"
import {
AccessTime,
Block,
@@ -20,20 +20,20 @@ import {
DoneAll,
ExpandMore,
GetApp,
-} from "@material-ui/icons";
+} from "@material-ui/icons"
-import MarkdownWrapper from "../MarkdownWrapper";
-import VcardPreview from "../VcardPreview";
-import LocationPreview from "../LocationPreview";
-import Audio from "../Audio";
+import MarkdownWrapper from "../MarkdownWrapper"
+import VcardPreview from "../VcardPreview"
+import LocationPreview from "../LocationPreview"
+import Audio from "../Audio"
-import ModalImageCors from "../ModalImageCors";
-import MessageOptionsMenu from "../MessageOptionsMenu";
-import whatsBackground from "../../assets/wa-background.png";
+import ModalImageCors from "../ModalImageCors"
+import MessageOptionsMenu from "../MessageOptionsMenu"
+import whatsBackground from "../../assets/wa-background.png"
-import api from "../../services/api";
-import toastError from "../../errors/toastError";
+import api from "../../services/api"
+import toastError from "../../errors/toastError"
const useStyles = makeStyles((theme) => ({
messagesListWrapper: {
@@ -262,78 +262,78 @@ const useStyles = makeStyles((theme) => ({
backgroundColor: "inherit",
padding: 10,
},
-}));
+}))
const reducer = (state, action) => {
if (action.type === "LOAD_MESSAGES") {
- const messages = action.payload;
- const newMessages = [];
+ const messages = action.payload
+ const newMessages = []
messages.forEach((message) => {
- const messageIndex = state.findIndex((m) => m.id === message.id);
+ const messageIndex = state.findIndex((m) => m.id === message.id)
if (messageIndex !== -1) {
- state[messageIndex] = message;
+ state[messageIndex] = message
} else {
- newMessages.push(message);
+ newMessages.push(message)
}
- });
+ })
- return [...newMessages, ...state];
+ return [...newMessages, ...state]
}
if (action.type === "ADD_MESSAGE") {
- const newMessage = action.payload;
- const messageIndex = state.findIndex((m) => m.id === newMessage.id);
+ const newMessage = action.payload
+ const messageIndex = state.findIndex((m) => m.id === newMessage.id)
if (messageIndex !== -1) {
- state[messageIndex] = newMessage;
+ state[messageIndex] = newMessage
} else {
- state.push(newMessage);
+ state.push(newMessage)
}
- return [...state];
+ return [...state]
}
if (action.type === "UPDATE_MESSAGE") {
- const messageToUpdate = action.payload;
- const messageIndex = state.findIndex((m) => m.id === messageToUpdate.id);
+ const messageToUpdate = action.payload
+ const messageIndex = state.findIndex((m) => m.id === messageToUpdate.id)
if (messageIndex !== -1) {
- state[messageIndex] = messageToUpdate;
+ state[messageIndex] = messageToUpdate
}
- return [...state];
+ return [...state]
}
if (action.type === "RESET") {
- return [];
+ return []
}
-};
+}
const MessagesList = ({ ticketId, isGroup }) => {
- const classes = useStyles();
+ const classes = useStyles()
- const [messagesList, dispatch] = useReducer(reducer, []);
- const [pageNumber, setPageNumber] = useState(1);
- const [hasMore, setHasMore] = useState(false);
- const [loading, setLoading] = useState(false);
- const lastMessageRef = useRef();
+ const [messagesList, dispatch] = useReducer(reducer, [])
+ const [pageNumber, setPageNumber] = useState(1)
+ const [hasMore, setHasMore] = useState(false)
+ const [loading, setLoading] = useState(false)
+ const lastMessageRef = useRef()
- const [selectedMessage, setSelectedMessage] = useState({});
- const [anchorEl, setAnchorEl] = useState(null);
- const messageOptionsMenuOpen = Boolean(anchorEl);
- const currentTicketId = useRef(ticketId);
+ const [selectedMessage, setSelectedMessage] = useState({})
+ const [anchorEl, setAnchorEl] = useState(null)
+ const messageOptionsMenuOpen = Boolean(anchorEl)
+ const currentTicketId = useRef(ticketId)
const [sendSeen, setSendSeen] = useState(false)
- const { user } = useContext(AuthContext);
+ const { user } = useContext(AuthContext)
useEffect(() => {
- dispatch({ type: "RESET" });
- setPageNumber(1);
+ dispatch({ type: "RESET" })
+ setPageNumber(1)
- currentTicketId.current = ticketId;
- }, [ticketId]);
+ currentTicketId.current = ticketId
+ }, [ticketId])
useEffect(() => {
@@ -359,7 +359,7 @@ const MessagesList = ({ ticketId, isGroup }) => {
try {
const { data } = await api.get("/messages/" + ticketId, {
params: { pageNumber },
- });
+ })
setSendSeen(false)
@@ -382,116 +382,116 @@ const MessagesList = ({ ticketId, isGroup }) => {
}
} catch (err) {
- setLoading(false);
- toastError(err);
+ setLoading(false)
+ toastError(err)
}
- };
- sendSeenMessage();
- }, 500);
+ }
+ sendSeenMessage()
+ }, 500)
return () => {
- clearTimeout(delayDebounceFn);
- };
+ clearTimeout(delayDebounceFn)
+ }
- }, [sendSeen, pageNumber, ticketId, user.id]);
+ }, [sendSeen, pageNumber, ticketId, user.id])
useEffect(() => {
- setLoading(true);
+ setLoading(true)
const delayDebounceFn = setTimeout(() => {
const fetchMessages = async () => {
try {
const { data } = await api.get("/messages/" + ticketId, {
params: { pageNumber },
- });
+ })
if (currentTicketId.current === ticketId) {
- dispatch({ type: "LOAD_MESSAGES", payload: data.messages });
- setHasMore(data.hasMore);
- setLoading(false);
+ dispatch({ type: "LOAD_MESSAGES", payload: data.messages })
+ setHasMore(data.hasMore)
+ setLoading(false)
}
if (pageNumber === 1 && data.messages.length > 1) {
- scrollToBottom();
+ scrollToBottom()
}
} catch (err) {
- setLoading(false);
- toastError(err);
+ setLoading(false)
+ toastError(err)
}
- };
- fetchMessages();
- }, 500);
+ }
+ fetchMessages()
+ }, 500)
return () => {
- clearTimeout(delayDebounceFn);
- };
- }, [pageNumber, ticketId]);
+ clearTimeout(delayDebounceFn)
+ }
+ }, [pageNumber, ticketId])
useEffect(() => {
- const socket = openSocket(process.env.REACT_APP_BACKEND_URL);
+ const socket = openSocket(process.env.REACT_APP_BACKEND_URL)
- socket.on("connect", () => socket.emit("joinChatBox", ticketId));
+ socket.on("connect", () => socket.emit("joinChatBox", ticketId))
socket.on("appMessage", (data) => {
if (data.action === "create") {
- dispatch({ type: "ADD_MESSAGE", payload: data.message });
+ dispatch({ type: "ADD_MESSAGE", payload: data.message })
- scrollToBottom();
+ scrollToBottom()
}
if (data.action === "update") {
- dispatch({ type: "UPDATE_MESSAGE", payload: data.message });
+ dispatch({ type: "UPDATE_MESSAGE", payload: data.message })
}
- });
+ })
return () => {
- socket.disconnect();
- };
- }, [ticketId]);
+ socket.disconnect()
+ }
+ }, [ticketId])
const loadMore = () => {
- setPageNumber((prevPageNumber) => prevPageNumber + 1);
- };
+ setPageNumber((prevPageNumber) => prevPageNumber + 1)
+ }
const scrollToBottom = () => {
if (lastMessageRef.current) {
setSendSeen(true)
- lastMessageRef.current.scrollIntoView({});
+ lastMessageRef.current.scrollIntoView({})
}
- };
+ }
const handleScroll = (e) => {
- if (!hasMore) return;
- const { scrollTop } = e.currentTarget;
+ if (!hasMore) return
+ const { scrollTop } = e.currentTarget
if (scrollTop === 0) {
- document.getElementById("messagesList").scrollTop = 1;
+ document.getElementById("messagesList").scrollTop = 1
}
if (loading) {
- return;
+ return
}
if (scrollTop < 50) {
- loadMore();
+ loadMore()
}
- };
+ }
const handleOpenMessageOptionsMenu = (e, message) => {
- setAnchorEl(e.currentTarget);
- setSelectedMessage(message);
- };
+ setAnchorEl(e.currentTarget)
+ setSelectedMessage(message)
+ }
const handleCloseMessageOptionsMenu = (e) => {
- setAnchorEl(null);
- };
+ setAnchorEl(null)
+ }
// const checkMessageMedia = (message) => {
// if (message.mediaType === "image") {
@@ -548,8 +548,6 @@ const MessagesList = ({ ticketId, isGroup }) => {
return