mirror of
https://github.com/cheveguerra/whaticket-community.git
synced 2026-04-20 12:49:32 +00:00
feat: option to delete messages on whatsapp chat
This commit is contained in:
@@ -6,7 +6,7 @@ import { getIO } from "../libs/socket";
|
|||||||
|
|
||||||
import CreateMessageService from "../services/MessageServices/CreateMessageService";
|
import CreateMessageService from "../services/MessageServices/CreateMessageService";
|
||||||
import ListMessagesService from "../services/MessageServices/ListMessagesService";
|
import ListMessagesService from "../services/MessageServices/ListMessagesService";
|
||||||
import UpdateMessageService from "../services/MessageServices/UpdateMessageService";
|
import DeleteMessageService from "../services/MessageServices/DeleteMessageService";
|
||||||
import ShowTicketService from "../services/TicketServices/ShowTicketService";
|
import ShowTicketService from "../services/TicketServices/ShowTicketService";
|
||||||
import DeleteWhatsAppMessage from "../services/WbotServices/DeleteWhatsAppMessage";
|
import DeleteWhatsAppMessage from "../services/WbotServices/DeleteWhatsAppMessage";
|
||||||
import SendWhatsAppMedia from "../services/WbotServices/SendWhatsAppMedia";
|
import SendWhatsAppMedia from "../services/WbotServices/SendWhatsAppMedia";
|
||||||
@@ -88,9 +88,13 @@ export const remove = async (
|
|||||||
|
|
||||||
const messageDeleted = await DeleteWhatsAppMessage(messageId);
|
const messageDeleted = await DeleteWhatsAppMessage(messageId);
|
||||||
|
|
||||||
await UpdateMessageService({ messageData: { isDeleted: true }, messageId });
|
const message = await DeleteMessageService(messageDeleted);
|
||||||
|
|
||||||
console.log(messageDeleted);
|
const io = getIO();
|
||||||
|
io.to(message.ticketId.toString()).emit("appMessage", {
|
||||||
|
action: "update",
|
||||||
|
message
|
||||||
|
});
|
||||||
|
|
||||||
return res.json({ ok: true });
|
return res.json({ ok: true });
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import Message from "../../models/Message";
|
||||||
|
|
||||||
|
const DeleteMessageService = async (message: Message): Promise<Message> => {
|
||||||
|
await message.update({ isDeleted: true });
|
||||||
|
|
||||||
|
return message;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default DeleteMessageService;
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
import Message from "../../models/Message";
|
|
||||||
|
|
||||||
interface MessageData {
|
|
||||||
isDeleted?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Request {
|
|
||||||
messageData: MessageData;
|
|
||||||
messageId: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
const UpdateMessageService = async ({
|
|
||||||
messageData,
|
|
||||||
messageId
|
|
||||||
}: Request): Promise<Response> => {
|
|
||||||
const { isDeleted } = messageData;
|
|
||||||
const message = Message.update({ where: {messageId}, { isDeleted: true } } );
|
|
||||||
};
|
|
||||||
|
|
||||||
export default UpdateMessageService;
|
|
||||||
@@ -13,12 +13,13 @@ const MessageOptionsMenu = ({ messageId, menuOpen, handleClose, anchorEl }) => {
|
|||||||
const [confirmationOpen, setConfirmationOpen] = useState(false);
|
const [confirmationOpen, setConfirmationOpen] = useState(false);
|
||||||
|
|
||||||
const handleDeleteMessage = async () => {
|
const handleDeleteMessage = async () => {
|
||||||
console.log("message deleted", messageId);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await api.delete(`/messages/${messageId}`);
|
await api.delete(`/messages/${messageId}`);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
toast.error("Erro ao deletar o message");
|
console.log(err);
|
||||||
|
if (err.response && err.response.data && err.response.data.error) {
|
||||||
|
toast.error(err.response.data.error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -54,9 +55,7 @@ const MessageOptionsMenu = ({ messageId, menuOpen, handleClose, anchorEl }) => {
|
|||||||
<MenuItem onClick={handleOpenConfirmationModal}>
|
<MenuItem onClick={handleOpenConfirmationModal}>
|
||||||
Delete Message
|
Delete Message
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem onClick={e => console.log("clicked reply")}>
|
<MenuItem disabled>Reply Message</MenuItem>
|
||||||
Reply Message
|
|
||||||
</MenuItem>
|
|
||||||
</Menu>
|
</Menu>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import DoneAllIcon from "@material-ui/icons/DoneAll";
|
|||||||
import Paper from "@material-ui/core/Paper";
|
import Paper from "@material-ui/core/Paper";
|
||||||
|
|
||||||
import { IconButton } from "@material-ui/core";
|
import { IconButton } from "@material-ui/core";
|
||||||
import { ExpandMore } from "@material-ui/icons";
|
import { Block, ExpandMore } from "@material-ui/icons";
|
||||||
|
|
||||||
import api from "../../services/api";
|
import api from "../../services/api";
|
||||||
import ContactDrawer from "../ContactDrawer";
|
import ContactDrawer from "../ContactDrawer";
|
||||||
@@ -161,6 +161,13 @@ const useStyles = makeStyles(theme => ({
|
|||||||
padding: "3px 80px 6px 6px",
|
padding: "3px 80px 6px 6px",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
textContentItemDeleted: {
|
||||||
|
fontStyle: "italic",
|
||||||
|
color: "rgba(0, 0, 0, 0.36)",
|
||||||
|
overflowWrap: "break-word",
|
||||||
|
padding: "3px 80px 6px 6px",
|
||||||
|
},
|
||||||
|
|
||||||
messageMedia: {
|
messageMedia: {
|
||||||
objectFit: "cover",
|
objectFit: "cover",
|
||||||
width: 250,
|
width: 250,
|
||||||
@@ -203,6 +210,12 @@ const useStyles = makeStyles(theme => ({
|
|||||||
marginLeft: 4,
|
marginLeft: 4,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
deletedIcon: {
|
||||||
|
fontSize: 18,
|
||||||
|
verticalAlign: "middle",
|
||||||
|
marginRight: 4,
|
||||||
|
},
|
||||||
|
|
||||||
ackDoneAllIcon: {
|
ackDoneAllIcon: {
|
||||||
color: green[500],
|
color: green[500],
|
||||||
fontSize: 18,
|
fontSize: 18,
|
||||||
@@ -246,7 +259,7 @@ const reducer = (state, action) => {
|
|||||||
const messageIndex = state.findIndex(m => m.id === messageToUpdate.id);
|
const messageIndex = state.findIndex(m => m.id === messageToUpdate.id);
|
||||||
|
|
||||||
if (messageIndex !== -1) {
|
if (messageIndex !== -1) {
|
||||||
state[messageIndex].ack = messageToUpdate.ack;
|
state[messageIndex] = messageToUpdate;
|
||||||
}
|
}
|
||||||
|
|
||||||
return [...state];
|
return [...state];
|
||||||
@@ -534,13 +547,26 @@ const Ticket = () => {
|
|||||||
variant="contained"
|
variant="contained"
|
||||||
size="small"
|
size="small"
|
||||||
id="messageActionsButton"
|
id="messageActionsButton"
|
||||||
|
disabled={message.isDeleted}
|
||||||
className={classes.messageActionsButton}
|
className={classes.messageActionsButton}
|
||||||
onClick={e => handleOpenMessageOptionsMenu(e, message.id)}
|
onClick={e => handleOpenMessageOptionsMenu(e, message.id)}
|
||||||
>
|
>
|
||||||
<ExpandMore />
|
<ExpandMore />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
{message.mediaUrl && checkMessaageMedia(message)}
|
{message.mediaUrl && checkMessaageMedia(message)}
|
||||||
<div className={classes.textContentItem}>
|
{/* <div className={classes.textContentItem}> */}
|
||||||
|
<div
|
||||||
|
className={clsx(classes.textContentItem, {
|
||||||
|
[classes.textContentItemDeleted]: message.isDeleted,
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
{message.isDeleted && (
|
||||||
|
<Block
|
||||||
|
color="disabled"
|
||||||
|
fontSize="small"
|
||||||
|
className={classes.deletedIcon}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
{message.body}
|
{message.body}
|
||||||
<span className={classes.timestamp}>
|
<span className={classes.timestamp}>
|
||||||
{format(parseISO(message.createdAt), "HH:mm")}
|
{format(parseISO(message.createdAt), "HH:mm")}
|
||||||
|
|||||||
@@ -16,15 +16,13 @@ const TicketOptionsMenu = ({ ticket, menuOpen, handleClose, anchorEl }) => {
|
|||||||
try {
|
try {
|
||||||
await api.delete(`/tickets/${ticket.id}`);
|
await api.delete(`/tickets/${ticket.id}`);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
toast.error("Erro ao deletar o ticket");
|
console.log(err);
|
||||||
|
if (err.response && err.response.data && err.response.data.error) {
|
||||||
|
toast.error(err.response.data.error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleTransferTicket = e => {
|
|
||||||
console.log("transfered");
|
|
||||||
handleClose();
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleOpenConfirmationModal = e => {
|
const handleOpenConfirmationModal = e => {
|
||||||
setConfirmationOpen(true);
|
setConfirmationOpen(true);
|
||||||
handleClose();
|
handleClose();
|
||||||
@@ -50,9 +48,7 @@ const TicketOptionsMenu = ({ ticket, menuOpen, handleClose, anchorEl }) => {
|
|||||||
<MenuItem onClick={handleOpenConfirmationModal}>
|
<MenuItem onClick={handleOpenConfirmationModal}>
|
||||||
{i18n.t("ticketOptionsMenu.delete")}
|
{i18n.t("ticketOptionsMenu.delete")}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem onClick={handleTransferTicket}>
|
<MenuItem disabled>{i18n.t("ticketOptionsMenu.transfer")}</MenuItem>
|
||||||
{i18n.t("ticketOptionsMenu.transfer")}
|
|
||||||
</MenuItem>
|
|
||||||
</Menu>
|
</Menu>
|
||||||
<ConfirmationModal
|
<ConfirmationModal
|
||||||
title={`${i18n.t("ticketOptionsMenu.confirmationModal.title")}${
|
title={`${i18n.t("ticketOptionsMenu.confirmationModal.title")}${
|
||||||
|
|||||||
Reference in New Issue
Block a user