2023-09-19 12:41:15 +00:00
import React , { useState , useEffect , useRef , useContext } from "react"
2022-01-06 01:26:15 +00:00
2023-09-19 12:41:15 +00:00
import { useHistory , useParams } from "react-router-dom"
import { parseISO , format , isSameDay } from "date-fns"
import clsx from "clsx"
2022-01-06 01:26:15 +00:00
2023-09-19 12:41:15 +00:00
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"
2022-01-06 01:26:15 +00:00
2023-09-19 12:41:15 +00:00
import { i18n } from "../../translate/i18n"
2022-01-06 01:26:15 +00:00
2023-09-19 12:41:15 +00:00
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"
2024-05-08 21:02:31 +00:00
//import openSocket from 'socket.io-client'
import { socket } from "../../services/socket"
2022-01-06 01:26:15 +00:00
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%" ,
} ,
2023-09-19 12:41:15 +00:00
} ) )
2022-01-06 01:26:15 +00:00
2024-04-23 22:51:11 +00:00
const TicketListItem = ( { ticket , remoteTicketsControll , settings } ) => {
2023-09-19 12:41:15 +00:00
const classes = useStyles ( )
const history = useHistory ( )
const [ loading , setLoading ] = useState ( false )
const { ticketId } = useParams ( )
const isMounted = useRef ( true )
2024-04-23 22:51:11 +00:00
const { user , getSettingValue } = useContext ( AuthContext )
const [ _remoteTicketsControll , setRemoteTicketsControll ] = useState ( [ ] )
const [ _settings , setSettings ] = useState ( null )
2022-01-06 01:26:15 +00:00
useEffect ( ( ) => {
return ( ) => {
2023-09-19 12:41:15 +00:00
isMounted . current = false
}
} , [ ] )
2022-01-06 01:26:15 +00:00
2024-04-23 22:51:11 +00:00
useEffect ( ( ) => {
setSettings ( settings )
} , [ settings ] )
useEffect ( ( ) => {
setRemoteTicketsControll ( remoteTicketsControll )
2024-04-24 01:02:17 +00:00
} , [ remoteTicketsControll , settings ] )
2024-04-23 22:51:11 +00:00
2022-01-06 01:26:15 +00:00
const handleAcepptTicket = async id => {
2023-09-19 12:41:15 +00:00
setLoading ( true )
2022-01-06 01:26:15 +00:00
try {
2023-09-19 12:41:15 +00:00
2022-01-06 01:26:15 +00:00
await api . put ( ` /tickets/ ${ id } ` , {
status : "open" ,
userId : user ? . id ,
2023-09-19 12:41:15 +00:00
} )
2022-01-06 01:26:15 +00:00
} catch ( err ) {
2023-09-19 12:41:15 +00:00
setLoading ( false )
toastError ( err )
2022-01-06 01:26:15 +00:00
}
if ( isMounted . current ) {
2023-09-19 12:41:15 +00:00
setLoading ( false )
2022-01-06 01:26:15 +00:00
}
2022-10-25 14:16:36 +00:00
2023-09-19 12:41:15 +00:00
history . push ( ` /tickets/ ${ id } ` )
}
2022-01-06 01:26:15 +00:00
const handleSelectTicket = id => {
2023-09-19 12:41:15 +00:00
history . push ( ` /tickets/ ${ id } ` )
}
2022-01-06 01:26:15 +00:00
2024-04-24 01:02:17 +00:00
useEffect ( ( ) => {
2024-05-08 21:02:31 +00:00
//const socket = openSocket(process.env.REACT_APP_BACKEND_URL)
2024-04-24 01:02:17 +00:00
2024-05-23 20:39:42 +00:00
const onRemoteTickesControllTicketListItem = ( data ) => {
2024-04-24 01:02:17 +00:00
console . log ( 'REMOTE TICKETS CONTROLL UPDATE2: ' , data . tickets )
if ( data . action === 'update' ) {
setRemoteTicketsControll ( data . tickets )
}
2024-05-23 20:39:42 +00:00
}
2024-04-24 01:02:17 +00:00
2024-05-23 20:39:42 +00:00
socket . on ( 'remoteTickesControll' , onRemoteTickesControllTicketListItem )
2024-04-24 01:02:17 +00:00
2024-05-08 21:02:31 +00:00
const onSettingsTicketListItem = ( data ) => {
2024-04-24 01:02:17 +00:00
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
} )
}
2024-05-08 21:02:31 +00:00
}
2024-04-24 01:02:17 +00:00
2024-05-08 21:02:31 +00:00
socket . on ( 'settings' , onSettingsTicketListItem )
2024-04-24 01:02:17 +00:00
return ( ) => {
2024-05-23 20:39:42 +00:00
socket . off ( 'remoteTickesControll' , onRemoteTickesControllTicketListItem ) ;
2024-05-08 21:02:31 +00:00
socket . off ( 'settings' , onSettingsTicketListItem ) ;
2024-04-24 01:02:17 +00:00
}
} , [ ] )
2022-01-06 01:26:15 +00:00
return (
< React . Fragment key = { ticket . id } >
2024-04-23 22:51:11 +00:00
< Tooltip
arrow
placement = "right"
title = {
( ticket ? . isRemote && ticket ? . remoteDone && ticket . status === 'pending' ) ? "Mensagem de campanha enviada" : ( ticket ? . isRemote && ticket . status === 'pending' ) ? "Mensagem de campanha ainda não enviada" :
2024-04-24 01:02:17 +00:00
""
2024-04-23 22:51:11 +00:00
}
2022-01-06 01:26:15 +00:00
>
2024-04-23 22:51:11 +00:00
< ListItem
dense
button
onClick = { e => {
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" ,
} : { } }
2022-01-06 01:26:15 +00:00
>
2024-04-23 22:51:11 +00:00
< Tooltip
arrow
placement = "right"
title = { ticket . queue ? . name || "Sem fila" }
>
< span
style = { { backgroundColor : ticket . queue ? . color || "#7C7C7C" } }
className = { classes . ticketQueueColor }
> < / s p a n >
< / T o o l t i p >
< ListItemAvatar >
< Avatar src = { ticket ? . contact ? . profilePicUrl } / >
< / L i s t I t e m A v a t a r >
< ListItemText
disableTypography
primary = {
< span className = { classes . contactNameWrapper } >
< Typography
noWrap
component = "span"
variant = "body2"
color = "textPrimary"
>
2024-06-13 20:50:30 +00:00
{ ticket ? . contact ? . name }
2024-04-23 22:51:11 +00:00
< / T y p o g r a p h y >
{ ticket . status === "closed" && (
< Badge
className = { classes . closedBadge }
badgeContent = { "closed" }
color = "primary"
/ >
) }
{ ticket . lastMessage && (
< Typography
className = { classes . lastMessageTime }
component = "span"
variant = "body2"
color = "textSecondary"
>
{ ticket ? . phoneNumberId && < span style = { { 'fontWeight' : 'bold' } } > Oficial < / s p a n > } { " " }
{ isSameDay ( parseISO ( ticket . updatedAt ) , new Date ( ) ) ? (
< > { format ( parseISO ( ticket . updatedAt ) , "HH:mm" ) } < / >
) : (
< > { format ( parseISO ( ticket . updatedAt ) , "dd/MM/yyyy" ) } < / >
) }
< / T y p o g r a p h y >
) }
< / s p a n >
}
secondary = {
< span className = { classes . contactNameWrapper } >
2022-01-06 01:26:15 +00:00
< Typography
2024-04-23 22:51:11 +00:00
className = { classes . contactLastMessage }
noWrap
2022-01-06 01:26:15 +00:00
component = "span"
variant = "body2"
color = "textSecondary"
>
2024-04-23 22:51:11 +00:00
{ ticket . lastMessage ? (
< MarkdownWrapper > { ticket . lastMessage } < / M a r k d o w n W r a p p e r >
2022-01-06 01:26:15 +00:00
) : (
2024-04-23 22:51:11 +00:00
< br / >
2022-01-06 01:26:15 +00:00
) }
< / T y p o g r a p h y >
2024-04-23 22:51:11 +00:00
< Badge
className = { classes . newMessagesCount }
badgeContent = { + ticket . unreadMessages }
classes = { {
badge : classes . badgeStyle ,
} }
/ >
2022-07-14 23:00:35 +00:00
2024-04-23 22:51:11 +00:00
{ / * < B a d g e
2022-07-14 23:00:35 +00:00
className = { classes . newMessagesCount }
badgeContent = { ticket . unreadMessages }
classes = { {
badge : classes . badgeStyle ,
} }
/> */ }
2024-04-23 22:51:11 +00:00
< / s p a n >
}
/ >
{ ticket . status === "pending" && (
< ButtonWithSpinner
// color="primary"
{ ... ( ( ticket ? . isRemote ) ?
( ( settings &&
settings . length > 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" ) } < br / > CAMPANHA < / >
) : (
< > { i18n . t ( "ticketsList.buttons.accept" ) } < / >
) }
< / >
< / B u t t o n W i t h S p i n n e r >
) }
< / L i s t I t e m >
< / T o o l t i p >
2022-01-06 01:26:15 +00:00
< Divider variant = "inset" component = "li" / >
< / R e a c t . F r a g m e n t >
2023-09-19 12:41:15 +00:00
)
}
2022-01-06 01:26:15 +00:00
2023-09-19 12:41:15 +00:00
export default TicketListItem