Merge pull request #282 from w3nder/FarewellMessage

Add Feat. Farewell Message
This commit is contained in:
Cassio Santos
2021-10-19 06:28:15 -03:00
committed by GitHub
9 changed files with 93 additions and 23 deletions

View File

@@ -6,6 +6,8 @@ import DeleteTicketService from "../services/TicketServices/DeleteTicketService"
import ListTicketsService from "../services/TicketServices/ListTicketsService";
import ShowTicketService from "../services/TicketServices/ShowTicketService";
import UpdateTicketService from "../services/TicketServices/UpdateTicketService";
import SendWhatsAppMessage from "../services/WbotServices/SendWhatsAppMessage";
import ShowWhatsAppService from "../services/WhatsappService/ShowWhatsAppService";
type IndexQuery = {
searchParam: string;
@@ -91,6 +93,20 @@ export const update = async (
ticketId
});
if (ticket.status === "closed") {
const whatsapp = await ShowWhatsAppService(ticket.whatsappId);
const { farewellMessage } = whatsapp;
if (farewellMessage) {
await SendWhatsAppMessage({
body: farewellMessage,
ticket
});
}
}
return res.status(200).json(ticket);
};

View File

@@ -0,0 +1,13 @@
import { QueryInterface, DataTypes } from "sequelize";
module.exports = {
up: (queryInterface: QueryInterface) => {
return queryInterface.addColumn("Whatsapps", "farewellMessage", {
type: DataTypes.TEXT
});
},
down: (queryInterface: QueryInterface) => {
return queryInterface.removeColumn("Whatsapps", "farewellMessage");
}
};

View File

@@ -50,6 +50,9 @@ class Whatsapp extends Model<Whatsapp> {
@Column(DataType.TEXT)
greetingMessage: string;
@Column(DataType.TEXT)
farewellMessage: string;
@Default(false)
@AllowNull
@Column

View File

@@ -2,6 +2,8 @@ import CheckContactOpenTickets from "../../helpers/CheckContactOpenTickets";
import SetTicketMessagesAsRead from "../../helpers/SetTicketMessagesAsRead";
import { getIO } from "../../libs/socket";
import Ticket from "../../models/Ticket";
import SendWhatsAppMessage from "../WbotServices/SendWhatsAppMessage";
import ShowWhatsAppService from "../WhatsappService/ShowWhatsAppService";
import ShowTicketService from "./ShowTicketService";
interface TicketData {
@@ -28,7 +30,6 @@ const UpdateTicketService = async ({
const { status, userId, queueId } = ticketData;
const ticket = await ShowTicketService(ticketId);
await SetTicketMessagesAsRead(ticket);
const oldStatus = ticket.status;
@@ -44,6 +45,8 @@ const UpdateTicketService = async ({
userId
});
await ticket.reload();
const io = getIO();
@@ -55,6 +58,8 @@ const UpdateTicketService = async ({
});
}
io.to(ticket.status)
.to("notification")
.to(ticketId.toString())

View File

@@ -113,7 +113,6 @@ const verifyMessage = async (
contact: Contact
) => {
const quotedMsg = await verifyQuotedMessage(msg);
const messageData = {
id: msg.id.id,
ticketId: ticket.id,
@@ -126,6 +125,7 @@ const verifyMessage = async (
};
await ticket.update({ lastMessage: msg.body });
await CreateMessageService({ messageData });
};
@@ -231,6 +231,7 @@ const handleMessage = async (
const chat = await msg.getChat();
if (chat.isGroup) {
let msgGroupContact;
@@ -242,34 +243,39 @@ const handleMessage = async (
groupContact = await verifyContact(msgGroupContact);
}
const whatsapp = await ShowWhatsAppService(wbot.id!);
const unreadMessages = msg.fromMe ? 0 : chat.unreadCount;
const contact = await verifyContact(msgContact);
const ticket = await FindOrCreateTicketService(
contact,
wbot.id!,
unreadMessages,
groupContact
);
if (msg.hasMedia) {
await verifyMediaMessage(msg, ticket, contact);
} else {
await verifyMessage(msg, ticket, contact);
}
if(unreadMessages === 0 && whatsapp.farewellMessage === msg.body) return;
const ticket = await FindOrCreateTicketService(
contact,
wbot.id!,
unreadMessages,
groupContact
);
if (msg.hasMedia) {
await verifyMediaMessage(msg, ticket, contact);
} else {
await verifyMessage(msg, ticket, contact);
}
if (
!ticket.queue &&
!chat.isGroup &&
!msg.fromMe &&
!ticket.userId &&
whatsapp.queues.length >= 1
) {
await verifyQueue(wbot, msg, ticket, contact);
}
const whatsapp = await ShowWhatsAppService(wbot.id!);
if (
!ticket.queue &&
!chat.isGroup &&
!msg.fromMe &&
!ticket.userId &&
whatsapp.queues.length >= 1
) {
await verifyQueue(wbot, msg, ticket, contact);
}
} catch (err) {
Sentry.captureException(err);
logger.error(`Error handling whatsapp message: Err: ${err}`);

View File

@@ -8,6 +8,7 @@ interface Request {
name: string;
queueIds?: number[];
greetingMessage?: string;
farewellMessage?: string;
status?: string;
isDefault?: boolean;
}
@@ -22,6 +23,7 @@ const CreateWhatsAppService = async ({
status = "OPENING",
queueIds = [],
greetingMessage,
farewellMessage,
isDefault = false
}: Request): Promise<Response> => {
const schema = Yup.object().shape({
@@ -72,6 +74,7 @@ const CreateWhatsAppService = async ({
name,
status,
greetingMessage,
farewellMessage,
isDefault
},
{ include: ["queues"] }

View File

@@ -12,6 +12,7 @@ interface WhatsappData {
session?: string;
isDefault?: boolean;
greetingMessage?: string;
farewellMessage?: string;
queueIds?: number[];
}
@@ -41,6 +42,7 @@ const UpdateWhatsAppService = async ({
isDefault,
session,
greetingMessage,
farewellMessage,
queueIds = []
} = whatsappData;
@@ -72,6 +74,7 @@ const UpdateWhatsAppService = async ({
status,
session,
greetingMessage,
farewellMessage,
isDefault
});

View File

@@ -62,6 +62,7 @@ const WhatsAppModal = ({ open, onClose, whatsAppId }) => {
const initialState = {
name: "",
greetingMessage: "",
farewellMessage: "",
isDefault: false,
};
const [whatsApp, setWhatsApp] = useState(initialState);
@@ -176,6 +177,25 @@ const WhatsAppModal = ({ open, onClose, whatsAppId }) => {
margin="dense"
/>
</div>
<div>
<Field
as={TextField}
label={i18n.t("whatsappModal.form.farewellMessage")}
type="farewellMessage"
multiline
rows={5}
fullWidth
name="farewellMessage"
error={
touched.farewellMessage && Boolean(errors.farewellMessage)
}
helperText={
touched.farewellMessage && errors.farewellMessage
}
variant="outlined"
margin="dense"
/>
</div>
<QueueSelect
selectedQueueIds={selectedQueueIds}
onChange={selectedIds => setSelectedQueueIds(selectedIds)}

View File

@@ -97,6 +97,7 @@ const messages = {
form: {
name: "Nome",
default: "Padrão",
farewellMessage: "Mensagem de despedida"
},
buttons: {
okAdd: "Adicionar",