import React, { useState, useEffect, useRef, useContext } from "react"; import ReactDOM, { useHistory, useParams } from "react-router-dom"; import { parseISO, format, isSameDay } from "date-fns"; import clsx from "clsx"; import { makeStyles } from "@material-ui/core/styles"; import { green } from "@material-ui/core/colors"; import ListItem from "@material-ui/core/ListItem"; import ListItemText from "@material-ui/core/ListItemText"; import ListItemAvatar from "@material-ui/core/ListItemAvatar"; import Typography from "@material-ui/core/Typography"; import Avatar from "@material-ui/core/Avatar"; import Divider from "@material-ui/core/Divider"; import Badge from "@material-ui/core/Badge"; import { i18n } from "../../translate/i18n"; import api from "../../services/api"; import ButtonWithSpinner from "../ButtonWithSpinner"; import MarkdownWrapper from "../MarkdownWrapper"; import { Tooltip } from "@material-ui/core"; import { AuthContext } from "../../context/Auth/AuthContext"; import toastError from "../../errors/toastError"; const useStyles = makeStyles(theme => ({ ticket: { position: "relative", }, pendingTicket: { cursor: "unset", }, noTicketsDiv: { display: "flex", height: "100px", margin: 40, flexDirection: "column", alignItems: "center", justifyContent: "center", }, noTicketsText: { textAlign: "center", color: "rgb(104, 121, 146)", fontSize: "14px", lineHeight: "1.4", }, noTicketsTitle: { textAlign: "center", fontSize: "16px", fontWeight: "600", margin: "0px", }, contactNameWrapper: { display: "flex", justifyContent: "space-between", }, lastMessageTime: { justifySelf: "flex-end", }, closedBadge: { alignSelf: "center", justifySelf: "flex-end", marginRight: 32, marginLeft: "auto", }, contactLastMessage: { paddingRight: 20, }, newMessagesCount: { alignSelf: "center", marginRight: 8, marginLeft: "auto", }, badgeStyle: { color: "white", backgroundColor: green[500], }, acceptButton: { position: "absolute", left: "50%", }, ticketQueueColor: { flex: "none", width: "8px", height: "100%", position: "absolute", top: "0%", left: "0%", }, })); const TicketListItem = ({ ticket }) => { const classes = useStyles(); const history = useHistory(); const [loading, setLoading] = useState(false); const { ticketId } = useParams(); const isMounted = useRef(true); const { user } = useContext(AuthContext); useEffect(() => { return () => { isMounted.current = false; }; }, []); const handleAcepptTicket = async id => { setLoading(true); try { await api.put(`/tickets/${id}`, { status: "open", userId: user?.id, }); } catch (err) { setLoading(false); toastError(err); } if (isMounted.current) { setLoading(false); } history.push(`/tickets/${id}`); }; const handleSelectTicket = id => { history.push(`/tickets/${id}`); }; return ( { if (ticket.status === "pending") return; handleSelectTicket(ticket.id); }} selected={ticketId && +ticketId === ticket.id} ///img src{id}.jpg className={clsx(classes.ticket, { [classes.pendingTicket]: ticket.status === "pending", })} > {ticket.contact.name} {ticket.status === "closed" && ( )} {ticket.lastMessage && ( {isSameDay(parseISO(ticket.updatedAt), new Date()) ? ( <>{format(parseISO(ticket.updatedAt), "HH:mm")} ) : ( <>{format(parseISO(ticket.updatedAt), "dd/MM/yyyy")} )} )} } secondary={ {ticket.lastMessage ? ( {ticket.lastMessage} ) : (
)}
{/* */}
} /> {ticket.status === "pending" && ( handleAcepptTicket(ticket.id)} > {i18n.t("ticketsList.buttons.accept")} )}
); }; export default TicketListItem;