2024-02-26 19:58:39 +00:00
|
|
|
import React, { useState, useEffect, useReducer, useContext } from "react"
|
2023-07-12 14:54:29 +00:00
|
|
|
|
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
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
import { makeStyles } from "@material-ui/core/styles"
|
|
|
|
import List from "@material-ui/core/List"
|
|
|
|
import Paper from "@material-ui/core/Paper"
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
import TicketListItem from "../TicketListItem"
|
|
|
|
import TicketsListSkeleton from "../TicketsListSkeleton"
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
import useTickets from "../../hooks/useTickets"
|
|
|
|
import { i18n } from "../../translate/i18n"
|
|
|
|
import { AuthContext } from "../../context/Auth/AuthContext"
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
import { SearchTicketContext } from "../../context/SearchTicket/SearchTicket"
|
2024-04-23 22:51:11 +00:00
|
|
|
import { Divider } from "@material-ui/core"
|
2024-04-30 19:20:48 +00:00
|
|
|
import { ticketsContext } from "../../context/TicketsProvider/TicketsProvider"
|
2022-01-06 01:26:15 +00:00
|
|
|
|
|
|
|
const useStyles = makeStyles(theme => ({
|
|
|
|
ticketsListWrapper: {
|
|
|
|
position: "relative",
|
|
|
|
display: "flex",
|
|
|
|
height: "100%",
|
|
|
|
flexDirection: "column",
|
|
|
|
overflow: "hidden",
|
|
|
|
borderTopRightRadius: 0,
|
|
|
|
borderBottomRightRadius: 0,
|
|
|
|
},
|
|
|
|
|
|
|
|
ticketsList: {
|
|
|
|
flex: 1,
|
|
|
|
overflowY: "scroll",
|
|
|
|
...theme.scrollbarStyles,
|
|
|
|
borderTop: "2px solid rgba(0, 0, 0, 0.12)",
|
|
|
|
},
|
|
|
|
|
|
|
|
ticketsListHeader: {
|
|
|
|
color: "rgb(67, 83, 105)",
|
|
|
|
zIndex: 2,
|
|
|
|
backgroundColor: "white",
|
|
|
|
borderBottom: "1px solid rgba(0, 0, 0, 0.12)",
|
|
|
|
display: "flex",
|
|
|
|
alignItems: "center",
|
|
|
|
justifyContent: "space-between",
|
|
|
|
},
|
|
|
|
|
|
|
|
ticketsCount: {
|
|
|
|
fontWeight: "normal",
|
|
|
|
color: "rgb(104, 121, 146)",
|
|
|
|
marginLeft: "8px",
|
|
|
|
fontSize: "14px",
|
|
|
|
},
|
|
|
|
|
|
|
|
noTicketsText: {
|
|
|
|
textAlign: "center",
|
|
|
|
color: "rgb(104, 121, 146)",
|
|
|
|
fontSize: "14px",
|
|
|
|
lineHeight: "1.4",
|
|
|
|
},
|
|
|
|
|
|
|
|
noTicketsTitle: {
|
|
|
|
textAlign: "center",
|
|
|
|
fontSize: "16px",
|
|
|
|
fontWeight: "600",
|
|
|
|
margin: "0px",
|
|
|
|
},
|
|
|
|
|
|
|
|
noTicketsDiv: {
|
|
|
|
display: "flex",
|
|
|
|
height: "100px",
|
|
|
|
margin: 40,
|
|
|
|
flexDirection: "column",
|
|
|
|
alignItems: "center",
|
|
|
|
justifyContent: "center",
|
|
|
|
},
|
2024-02-26 19:58:39 +00:00
|
|
|
}))
|
2022-01-06 01:26:15 +00:00
|
|
|
|
|
|
|
const reducer = (state, action) => {
|
|
|
|
if (action.type === "LOAD_TICKETS") {
|
2024-02-26 19:58:39 +00:00
|
|
|
const newTickets = action.payload
|
2022-08-08 16:47:28 +00:00
|
|
|
|
|
|
|
|
2022-01-06 01:26:15 +00:00
|
|
|
newTickets.forEach(ticket => {
|
2022-07-14 23:00:35 +00:00
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
const ticketIndex = state.findIndex(t => +t.id === +ticket.id)
|
2022-01-06 01:26:15 +00:00
|
|
|
if (ticketIndex !== -1) {
|
2024-02-26 19:58:39 +00:00
|
|
|
state[ticketIndex] = ticket
|
2022-10-25 14:16:36 +00:00
|
|
|
if (+ticket.unreadMessages > 0) {
|
2024-02-26 19:58:39 +00:00
|
|
|
state.unshift(state.splice(ticketIndex, 1)[0])
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
} else {
|
2024-02-26 19:58:39 +00:00
|
|
|
state.push(ticket)
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
2024-02-26 19:58:39 +00:00
|
|
|
})
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
return [...state]
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (action.type === "RESET_UNREAD") {
|
2024-02-26 19:58:39 +00:00
|
|
|
const ticketId = action.payload
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
const ticketIndex = state.findIndex(t => +t.id === +ticketId)
|
2022-10-25 14:16:36 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2022-01-06 01:26:15 +00:00
|
|
|
if (ticketIndex !== -1) {
|
2024-02-26 19:58:39 +00:00
|
|
|
state[ticketIndex].unreadMessages = 0
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
return [...state]
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (action.type === "UPDATE_TICKET") {
|
2024-02-26 19:58:39 +00:00
|
|
|
const ticket = action.payload
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
const ticketIndex = state.findIndex(t => +t.id === +ticket.id)
|
2022-07-14 23:00:35 +00:00
|
|
|
|
2022-01-06 01:26:15 +00:00
|
|
|
if (ticketIndex !== -1) {
|
2024-02-26 19:58:39 +00:00
|
|
|
state[ticketIndex] = ticket
|
2022-01-06 01:26:15 +00:00
|
|
|
} else {
|
2024-02-26 19:58:39 +00:00
|
|
|
state.unshift(ticket)
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
return [...state]
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (action.type === "UPDATE_TICKET_UNREAD_MESSAGES") {
|
2022-07-14 23:00:35 +00:00
|
|
|
|
|
|
|
const message = action.payload.message
|
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
const ticket = action.payload.ticket
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
const ticketIndex = state.findIndex(t => +t.id === +ticket.id)
|
2022-07-14 23:00:35 +00:00
|
|
|
|
2022-01-06 01:26:15 +00:00
|
|
|
if (ticketIndex !== -1) {
|
2022-08-08 16:47:28 +00:00
|
|
|
|
2022-07-14 23:00:35 +00:00
|
|
|
|
2022-10-25 14:16:36 +00:00
|
|
|
|
|
|
|
|
2022-08-08 16:47:28 +00:00
|
|
|
|
|
|
|
if (!message.fromMe) {
|
|
|
|
ticket.unreadMessages += 1
|
2022-07-14 23:00:35 +00:00
|
|
|
}
|
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
state[ticketIndex] = ticket
|
|
|
|
state.unshift(state.splice(ticketIndex, 1)[0])
|
2022-08-08 16:47:28 +00:00
|
|
|
|
2022-01-06 01:26:15 +00:00
|
|
|
} else {
|
2024-02-26 19:58:39 +00:00
|
|
|
state.unshift(ticket)
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
return [...state]
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (action.type === "UPDATE_TICKET_CONTACT") {
|
2024-02-26 19:58:39 +00:00
|
|
|
const contact = action.payload
|
|
|
|
const ticketIndex = state.findIndex(t => +t.contactId === +contact.id)
|
2022-01-06 01:26:15 +00:00
|
|
|
if (ticketIndex !== -1) {
|
2024-02-26 19:58:39 +00:00
|
|
|
state[ticketIndex].contact = contact
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
2024-02-26 19:58:39 +00:00
|
|
|
return [...state]
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (action.type === "DELETE_TICKET") {
|
2024-02-26 19:58:39 +00:00
|
|
|
const ticketId = action.payload
|
|
|
|
const ticketIndex = state.findIndex(t => +t.id === +ticketId)
|
2022-01-06 01:26:15 +00:00
|
|
|
if (ticketIndex !== -1) {
|
2024-02-26 19:58:39 +00:00
|
|
|
state.splice(ticketIndex, 1)
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
return [...state]
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (action.type === "RESET") {
|
2024-02-26 19:58:39 +00:00
|
|
|
return []
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
2024-02-26 19:58:39 +00:00
|
|
|
}
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2022-05-25 20:19:38 +00:00
|
|
|
const TicketsList = (props) => {
|
2024-02-26 19:58:39 +00:00
|
|
|
const { status, searchParam, searchParamContent, showAll, selectedQueueIds, updateCount, style, tab } = props
|
|
|
|
const classes = useStyles()
|
|
|
|
const [pageNumber, setPageNumber] = useState(1)
|
|
|
|
const [ticketsList, dispatch] = useReducer(reducer, [])
|
2024-04-23 22:51:11 +00:00
|
|
|
const { user, setting, } = useContext(AuthContext)
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2022-10-25 14:16:36 +00:00
|
|
|
const { searchTicket } = useContext(SearchTicketContext)
|
|
|
|
|
2024-04-23 22:51:11 +00:00
|
|
|
const [_remoteTicketsControll, setRemoteTicketsControll] = useState([])
|
|
|
|
|
|
|
|
const [settings, setSettings] = useState([])
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
setSettings(setting)
|
|
|
|
}, [setting])
|
2024-04-30 19:20:48 +00:00
|
|
|
const { setTickets } = useContext(ticketsContext)
|
|
|
|
|
2024-04-23 22:51:11 +00:00
|
|
|
|
2022-01-06 01:26:15 +00:00
|
|
|
useEffect(() => {
|
2023-07-12 14:54:29 +00:00
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
dispatch({ type: "RESET" })
|
|
|
|
setPageNumber(1)
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
}, [status, searchParam, searchParamContent, showAll, selectedQueueIds, searchTicket])
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2024-04-23 22:51:11 +00:00
|
|
|
let { tickets, hasMore, loading, remoteTicketsControll } = useTickets({
|
2022-01-06 01:26:15 +00:00
|
|
|
pageNumber,
|
|
|
|
searchParam,
|
2023-07-12 14:54:29 +00:00
|
|
|
searchParamContent,
|
2022-01-06 01:26:15 +00:00
|
|
|
status,
|
2024-04-23 22:51:11 +00:00
|
|
|
showAll,
|
2022-01-06 01:26:15 +00:00
|
|
|
queueIds: JSON.stringify(selectedQueueIds),
|
2024-02-26 19:58:39 +00:00
|
|
|
tab,
|
2024-02-28 14:18:48 +00:00
|
|
|
unlimited: status === 'open' ? "all" : "false"
|
2024-02-26 19:58:39 +00:00
|
|
|
})
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2024-04-23 22:51:11 +00:00
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
setRemoteTicketsControll(remoteTicketsControll)
|
|
|
|
}, [remoteTicketsControll])
|
|
|
|
|
2022-01-06 01:26:15 +00:00
|
|
|
useEffect(() => {
|
2023-07-12 14:54:29 +00:00
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
if (!status && !searchParam) return
|
2022-07-28 21:21:14 +00:00
|
|
|
|
2022-10-25 14:16:36 +00:00
|
|
|
// if (searchParam) {
|
|
|
|
//
|
|
|
|
// dispatch({ type: "RESET" });
|
|
|
|
// }
|
2022-07-28 21:21:14 +00:00
|
|
|
|
2022-10-25 14:16:36 +00:00
|
|
|
if ((searchParam && searchParam.trim().length > 0) &&
|
|
|
|
(tickets && tickets.length === 0) &&
|
|
|
|
pageNumber === 1) {
|
|
|
|
dispatch({ type: "RESET" })
|
|
|
|
}
|
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
dispatch({ type: "LOAD_TICKETS", payload: tickets, })
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
}, [tickets, status, searchParam, pageNumber])
|
2022-01-06 01:26:15 +00:00
|
|
|
|
|
|
|
useEffect(() => {
|
2022-10-25 14:16:36 +00:00
|
|
|
|
|
|
|
// if (tab=='search')return
|
|
|
|
|
2024-05-08 21:02:31 +00:00
|
|
|
//const socket = openSocket(process.env.REACT_APP_BACKEND_URL)
|
2022-01-06 01:26:15 +00:00
|
|
|
|
|
|
|
const shouldUpdateTicket = ticket =>
|
|
|
|
(!ticket.userId || ticket.userId === user?.id || showAll) &&
|
2024-02-26 19:58:39 +00:00
|
|
|
(!ticket.queueId || selectedQueueIds.indexOf(ticket.queueId) > -1)
|
2022-01-06 01:26:15 +00:00
|
|
|
|
|
|
|
const notBelongsToUserQueues = ticket =>
|
2024-02-26 19:58:39 +00:00
|
|
|
ticket.queueId && selectedQueueIds.indexOf(ticket.queueId) === -1
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2024-05-08 21:02:31 +00:00
|
|
|
const onConnectTicketList = () => {
|
2022-01-06 01:26:15 +00:00
|
|
|
if (status) {
|
2024-02-26 19:58:39 +00:00
|
|
|
socket.emit("joinTickets", status)
|
2022-01-06 01:26:15 +00:00
|
|
|
} else {
|
2024-02-26 19:58:39 +00:00
|
|
|
socket.emit("joinNotification")
|
2022-05-25 20:19:38 +00:00
|
|
|
}
|
2024-05-08 21:02:31 +00:00
|
|
|
}
|
2022-05-06 22:49:45 +00:00
|
|
|
|
2024-05-08 21:02:31 +00:00
|
|
|
onConnectTicketList()
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2024-05-08 21:02:31 +00:00
|
|
|
socket.on("connect", onConnectTicketList)
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2024-05-08 21:02:31 +00:00
|
|
|
const onTicketTicketList = data => {
|
2022-08-08 16:47:28 +00:00
|
|
|
|
2022-01-06 01:26:15 +00:00
|
|
|
if (data.action === "updateUnread") {
|
2022-10-25 14:16:36 +00:00
|
|
|
|
|
|
|
if (tab === 'search' && data.ticket && data.ticket.status === 'pending') return
|
|
|
|
|
2022-01-06 01:26:15 +00:00
|
|
|
dispatch({
|
|
|
|
type: "RESET_UNREAD",
|
|
|
|
payload: data.ticketId,
|
2024-02-26 19:58:39 +00:00
|
|
|
})
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (data.action === "update" && shouldUpdateTicket(data.ticket)) {
|
2022-10-25 14:16:36 +00:00
|
|
|
|
|
|
|
if (tab === 'search' && data.ticket && (data.ticket.status === 'pending' || data.ticket.status === 'closed')) return
|
|
|
|
|
2022-01-06 01:26:15 +00:00
|
|
|
dispatch({
|
|
|
|
type: "UPDATE_TICKET",
|
|
|
|
payload: data.ticket,
|
2024-02-26 19:58:39 +00:00
|
|
|
})
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
2022-08-08 16:47:28 +00:00
|
|
|
if (data.action === "update" && notBelongsToUserQueues(data.ticket)) {
|
2024-02-26 19:58:39 +00:00
|
|
|
dispatch({ type: "DELETE_TICKET", payload: data.ticket.id })
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (data.action === "delete") {
|
2024-02-26 19:58:39 +00:00
|
|
|
dispatch({ type: "DELETE_TICKET", payload: data.ticketId })
|
2022-10-25 14:16:36 +00:00
|
|
|
}
|
2024-05-08 21:02:31 +00:00
|
|
|
}
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2024-05-08 21:02:31 +00:00
|
|
|
socket.on("ticket", onTicketTicketList)
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2024-05-08 21:02:31 +00:00
|
|
|
const onAppMessageTicketList = data => {
|
2022-01-06 01:26:15 +00:00
|
|
|
if (data.action === "create" && shouldUpdateTicket(data.ticket)) {
|
2022-07-14 23:00:35 +00:00
|
|
|
|
2022-10-25 14:16:36 +00:00
|
|
|
|
|
|
|
if (tab === 'search') return
|
2022-07-14 23:00:35 +00:00
|
|
|
|
2022-01-06 01:26:15 +00:00
|
|
|
dispatch({
|
|
|
|
type: "UPDATE_TICKET_UNREAD_MESSAGES",
|
2022-07-14 23:00:35 +00:00
|
|
|
// payload: data.ticket,
|
|
|
|
payload: data,
|
2024-02-26 19:58:39 +00:00
|
|
|
})
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
2024-05-08 21:02:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
socket.on("appMessage", onAppMessageTicketList)
|
2022-01-06 01:26:15 +00:00
|
|
|
|
|
|
|
socket.on("contact", data => {
|
|
|
|
if (data.action === "update") {
|
|
|
|
dispatch({
|
|
|
|
type: "UPDATE_TICKET_CONTACT",
|
|
|
|
payload: data.contact,
|
2024-02-26 19:58:39 +00:00
|
|
|
})
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
2024-02-26 19:58:39 +00:00
|
|
|
})
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2024-04-23 22:51:11 +00:00
|
|
|
|
|
|
|
socket.on('remoteTickesControll', (data) => {
|
2024-04-24 01:02:17 +00:00
|
|
|
console.log('REMOTE TICKETS CONTROLL UPDATE 1: ', data.tickets)
|
2024-04-23 22:51:11 +00:00
|
|
|
if (data.action === 'update') {
|
|
|
|
setRemoteTicketsControll(data.tickets)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
2024-05-08 21:02:31 +00:00
|
|
|
const onSettingsTicketList = (data) => {
|
2024-04-23 22:51:11 +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-23 22:51:11 +00:00
|
|
|
|
2024-05-08 21:02:31 +00:00
|
|
|
socket.on('settings', onSettingsTicketList)
|
2024-04-23 22:51:11 +00:00
|
|
|
|
2022-01-06 01:26:15 +00:00
|
|
|
return () => {
|
2024-05-08 21:02:31 +00:00
|
|
|
socket.off("ticket", onTicketTicketList)
|
|
|
|
socket.off('appMessage', onAppMessageTicketList);
|
|
|
|
socket.removeAllListeners("contact")
|
|
|
|
socket.off('connect', onConnectTicketList);
|
|
|
|
socket.off('settings', onSettingsTicketList);
|
|
|
|
socket.removeAllListeners('remoteTickesControll');
|
2024-02-26 19:58:39 +00:00
|
|
|
}
|
|
|
|
}, [status, showAll, user, selectedQueueIds, tab])
|
2022-01-06 01:26:15 +00:00
|
|
|
|
|
|
|
useEffect(() => {
|
2022-05-25 20:19:38 +00:00
|
|
|
|
|
|
|
if (typeof updateCount === "function") {
|
2024-02-26 19:58:39 +00:00
|
|
|
updateCount(ticketsList.length)
|
2022-05-25 20:19:38 +00:00
|
|
|
}
|
2024-05-08 21:02:31 +00:00
|
|
|
if (ticketsList && status === "pending") {
|
2024-04-30 19:20:48 +00:00
|
|
|
setTickets(ticketsList)
|
|
|
|
}
|
|
|
|
// else{
|
|
|
|
// setTickets([])
|
|
|
|
// }
|
2022-05-25 20:19:38 +00:00
|
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
2024-02-26 19:58:39 +00:00
|
|
|
}, [ticketsList])
|
2022-01-06 01:26:15 +00:00
|
|
|
|
|
|
|
const loadMore = () => {
|
2024-02-26 19:58:39 +00:00
|
|
|
setPageNumber(prevState => prevState + 1)
|
|
|
|
}
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2022-08-08 16:47:28 +00:00
|
|
|
const handleScroll = e => {
|
2022-07-28 17:55:23 +00:00
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
if (!hasMore || loading) return
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
const { scrollTop, scrollHeight, clientHeight } = e.currentTarget
|
2022-01-06 01:26:15 +00:00
|
|
|
|
|
|
|
if (scrollHeight - (scrollTop + 100) < clientHeight) {
|
2022-10-25 14:16:36 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
loadMore()
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
2024-02-26 19:58:39 +00:00
|
|
|
}
|
2022-01-06 01:26:15 +00:00
|
|
|
|
|
|
|
return (
|
2022-05-25 20:19:38 +00:00
|
|
|
<Paper className={classes.ticketsListWrapper} style={style}>
|
2022-01-06 01:26:15 +00:00
|
|
|
<Paper
|
|
|
|
square
|
|
|
|
name="closed"
|
|
|
|
elevation={0}
|
|
|
|
className={classes.ticketsList}
|
|
|
|
onScroll={handleScroll}
|
|
|
|
>
|
|
|
|
<List style={{ paddingTop: 0 }}>
|
|
|
|
{ticketsList.length === 0 && !loading ? (
|
|
|
|
<div className={classes.noTicketsDiv}>
|
|
|
|
<span className={classes.noTicketsTitle}>
|
|
|
|
{i18n.t("ticketsList.noTicketsTitle")}
|
|
|
|
</span>
|
|
|
|
<p className={classes.noTicketsText}>
|
|
|
|
{i18n.t("ticketsList.noTicketsMessage")}
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
) : (
|
|
|
|
<>
|
|
|
|
{ticketsList.map(ticket => (
|
2024-04-23 22:51:11 +00:00
|
|
|
<TicketListItem ticket={ticket} key={ticket.id} remoteTicketsControll={_remoteTicketsControll} settings={settings} />
|
2022-01-06 01:26:15 +00:00
|
|
|
))}
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
{loading && <TicketsListSkeleton />}
|
|
|
|
</List>
|
|
|
|
</Paper>
|
2022-05-25 20:19:38 +00:00
|
|
|
</Paper>
|
2024-02-26 19:58:39 +00:00
|
|
|
)
|
|
|
|
}
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2024-02-26 19:58:39 +00:00
|
|
|
export default TicketsList
|