import React, { useState, useEffect, useRef, useContext } from "react" import { 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" import openSocket from 'socket.io-client' 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, remoteTicketsControll, settings }) => { const classes = useStyles() const history = useHistory() const [loading, setLoading] = useState(false) const { ticketId } = useParams() const isMounted = useRef(true) const { user, getSettingValue } = useContext(AuthContext) const [_remoteTicketsControll, setRemoteTicketsControll] = useState([]) const [_settings, setSettings] = useState(null) useEffect(() => { return () => { isMounted.current = false } }, []) useEffect(() => { setSettings(settings) }, [settings]) useEffect(() => { setRemoteTicketsControll(remoteTicketsControll) }, [remoteTicketsControll, settings]) 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}`) } useEffect(() => { const socket = openSocket(process.env.REACT_APP_BACKEND_URL) socket.on('remoteTickesControll', (data) => { console.log('REMOTE TICKETS CONTROLL UPDATE2: ', data.tickets) if (data.action === 'update') { setRemoteTicketsControll(data.tickets) } }) socket.on('settings', (data) => { if (data.action === 'update') { setSettings((prevState) => { const aux = [...prevState] const settingIndex = aux.findIndex((s) => s.key === data.setting.key) aux[settingIndex].value = data.setting.value return aux }) } }) return () => { socket.disconnect() } }, []) return ( { if (ticket.status === "pending") return handleSelectTicket(ticket.id) }} selected={ticketId && +ticketId === ticket.id} className={clsx(classes.ticket, { [classes.pendingTicket]: ticket.status === "pending", })} style={((ticket.status === "open" || ticket.status === "closed") && ticket?.isRemote) ? { border: (ticket.status === "open" || ticket.status === "closed") ? "1px solid rgba(121,123,127,0.9)" : "1px solid transparent", } : {}} > {ticket.contact.name} {ticket.status === "closed" && ( )} {ticket.lastMessage && ( {ticket?.phoneNumberId && Oficial}{" "} {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" && ( 0 && getSettingValue('remoteTicketSendControll') && getSettingValue('remoteTicketSendControll') === 'enabled') && !ticket?.remoteDone && !_remoteTicketsControll?.includes(+ticket.id)) ? { style: { backgroundColor: "rgba(121,123,127,0.5)", color: "white" } } : { style: { backgroundColor: "rgba(121,123,127,0.9)", color: "white" } } : { color: "primary" })} variant="contained" disabled={true ? ((settings && settings.length > 0 && getSettingValue('remoteTicketSendControll') && getSettingValue('remoteTicketSendControll') === 'enabled') && ticket?.isRemote && !ticket?.remoteDone && !_remoteTicketsControll?.includes(+ticket.id)) : false} className={classes.acceptButton} size="small" loading={loading} onClick={e => handleAcepptTicket(ticket.id)} > <> {(ticket?.isRemote && !ticket?.remoteDone) ? ( <>{i18n.t("ticketsList.buttons.accept")}
CAMPANHA ) : ( <>{i18n.t("ticketsList.buttons.accept")} )}
)}
) } export default TicketListItem