improvement: moved hasMore logic to backend

This commit is contained in:
canove
2020-08-18 14:57:58 -03:00
parent 003173d35d
commit 645489ace6
4 changed files with 36 additions and 29 deletions

View File

@@ -46,8 +46,8 @@ exports.index = async (req, res, next) => {
), ),
}; };
let limit = 20; const limit = 20;
let offset = limit * (pageNumber - 1); const offset = limit * (pageNumber - 1);
const ticket = await Ticket.findByPk(ticketId, { const ticket = await Ticket.findByPk(ticketId, {
include: [ include: [
@@ -90,10 +90,13 @@ exports.index = async (req, res, next) => {
}; };
}); });
const hasMore = count > offset + ticketMessages.length;
return res.json({ return res.json({
messages: serializedMessages.reverse(), messages: serializedMessages.reverse(),
ticket, ticket,
count, count,
hasMore,
}); });
}; };
@@ -163,5 +166,5 @@ exports.store = async (req, res, next) => {
await setMessagesAsRead(ticket); await setMessagesAsRead(ticket);
return res.json({ message: "Mensagem enviada", newMessage, ticket }); return res.json({ newMessage, ticket });
}; };

View File

@@ -15,8 +15,8 @@ exports.index = async (req, res) => {
searchParam = "", searchParam = "",
} = req.query; } = req.query;
let limit = 20; const limit = 20;
let offset = limit * (pageNumber - 1); const offset = limit * (pageNumber - 1);
let whereCondition = {}; let whereCondition = {};
let includeCondition = [ let includeCondition = [
@@ -96,7 +96,9 @@ exports.index = async (req, res) => {
order: [["updatedAt", "DESC"]], order: [["updatedAt", "DESC"]],
}); });
return res.json({ count, tickets }); const hasMore = count > offset + tickets.length;
return res.json({ count, tickets, hasMore });
}; };
exports.store = async (req, res) => { exports.store = async (req, res) => {

View File

@@ -233,7 +233,7 @@ const MessagesList = () => {
const [contact, setContact] = useState({}); const [contact, setContact] = useState({});
const [ticket, setTicket] = useState({}); const [ticket, setTicket] = useState({});
const [messagesList, setMessagesList] = useState([]); const [messagesList, setMessagesList] = useState([]);
const [count, setCount] = useState(0); const [hasMore, setHasMore] = useState(false);
const [pageNumber, setPageNumber] = useState(1); const [pageNumber, setPageNumber] = useState(1);
const [drawerOpen, setDrawerOpen] = useState(false); const [drawerOpen, setDrawerOpen] = useState(false);
const lastMessageRef = useRef(); const lastMessageRef = useRef();
@@ -259,7 +259,7 @@ const MessagesList = () => {
setMessagesList(prevMessages => { setMessagesList(prevMessages => {
return [...data.messages, ...prevMessages]; return [...data.messages, ...prevMessages];
}); });
setCount(data.count); setHasMore(data.hasMore);
setLoading(false); setLoading(false);
if (pageNumber === 1 && data.messages.length > 1) { if (pageNumber === 1 && data.messages.length > 1) {
scrollToBottom(); scrollToBottom();
@@ -339,7 +339,7 @@ const MessagesList = () => {
}; };
const handleScroll = e => { const handleScroll = e => {
if (count === messagesList.length) return; if (!hasMore) return;
const { scrollTop } = e.currentTarget; const { scrollTop } = e.currentTarget;
if (scrollTop === 0) { if (scrollTop === 0) {
@@ -355,6 +355,8 @@ const MessagesList = () => {
} }
}; };
console.log(messagesList);
const checkMessaageMedia = message => { const checkMessaageMedia = message => {
if (message.mediaType === "image") { if (message.mediaType === "image") {
return ( return (

View File

@@ -170,7 +170,7 @@ const Tickets = () => {
const [showAllTickets, setShowAllTickets] = useState(false); const [showAllTickets, setShowAllTickets] = useState(false);
const [pageNumber, setPageNumber] = useState(1); const [pageNumber, setPageNumber] = useState(1);
const [count, setCount] = useState(0); const [hasMore, setHasMore] = useState(false);
useEffect(() => { useEffect(() => {
if (!("Notification" in window)) { if (!("Notification" in window)) {
@@ -193,17 +193,17 @@ const Tickets = () => {
const { data } = await api.get("/tickets", { const { data } = await api.get("/tickets", {
params: { searchParam, pageNumber, status: tab }, params: { searchParam, pageNumber, status: tab },
}); });
setTickets(prevState => { data.tickets.forEach(ticket => {
return [...prevState, ...data.tickets]; updateTickets(ticket);
}); });
setCount(data.count); setHasMore(data.hasMore);
setLoading(false); setLoading(false);
} catch (err) { } catch (err) {
console.log(err); console.log(err);
} }
}; };
fetchTickets(); fetchTickets();
}, 1000); }, 500);
return () => clearTimeout(delayDebounceFn); return () => clearTimeout(delayDebounceFn);
}, [searchParam, pageNumber, token, tab]); }, [searchParam, pageNumber, token, tab]);
@@ -212,14 +212,13 @@ const Tickets = () => {
socket.emit("joinNotification"); socket.emit("joinNotification");
socket.on("ticket", data => { socket.on("ticket", data => {
if (loading) return;
if (data.action === "updateUnread") { if (data.action === "updateUnread") {
resetUnreadMessages(data); resetUnreadMessages(data);
} }
if (data.action === "updateStatus" || data.action === "create") { if (data.action === "updateStatus" || data.action === "create") {
updateTickets(data); console.log("WSS TICKET");
updateTickets(data.ticket);
} }
if (data.action === "delete") { if (data.action === "delete") {
@@ -232,10 +231,9 @@ const Tickets = () => {
}); });
socket.on("appMessage", data => { socket.on("appMessage", data => {
if (loading) return;
if (data.action === "create") { if (data.action === "create") {
updateTickets(data); console.log("WSS MSG");
updateTickets(data.ticket);
if ( if (
(ticketId && (ticketId &&
data.message.ticketId === +ticketId && data.message.ticketId === +ticketId &&
@@ -250,22 +248,24 @@ const Tickets = () => {
return () => { return () => {
socket.disconnect(); socket.disconnect();
}; };
}, [history, ticketId, userId, loading]); }, [history, ticketId, userId]);
const loadMore = () => { const loadMore = () => {
setPageNumber(prevState => prevState + 1); setPageNumber(prevState => prevState + 1);
}; };
const updateTickets = ({ ticket }) => { const updateTickets = ticket => {
setTickets(prevState => { setTickets(prevState => {
const ticketIndex = prevState.findIndex(t => t.id === ticket.id); const ticketIndex = prevState.findIndex(t => t.id === ticket.id);
if (ticketIndex !== -1) { if (ticketIndex !== -1) {
let aux = [...prevState]; const aux = [...prevState];
aux[ticketIndex] = ticket; aux[ticketIndex] = ticket;
if (ticket.unreadMessages > 0) {
aux.unshift(aux.splice(ticketIndex, 1)[0]); aux.unshift(aux.splice(ticketIndex, 1)[0]);
}
return aux; return aux;
} else { } else {
return [ticket, ...prevState]; return [...prevState, ticket];
} }
}); });
}; };
@@ -274,12 +274,12 @@ const Tickets = () => {
setTickets(prevState => { setTickets(prevState => {
const ticketIndex = prevState.findIndex(ticket => ticket.id === ticketId); const ticketIndex = prevState.findIndex(ticket => ticket.id === ticketId);
if (ticketIndex === -1) { if (ticketIndex !== -1) {
return prevState;
} else {
let aux = [...prevState]; let aux = [...prevState];
aux.splice(ticketIndex, 1); aux.splice(ticketIndex, 1);
return aux; return aux;
} else {
return prevState;
} }
}); });
}; };
@@ -338,7 +338,7 @@ const Tickets = () => {
}; };
const handleScroll = e => { const handleScroll = e => {
if (count === tickets.length || loading) return; if (!hasMore || loading) return;
const { scrollTop, scrollHeight, clientHeight } = e.currentTarget; const { scrollTop, scrollHeight, clientHeight } = e.currentTarget;
if (scrollHeight - (scrollTop + 100) < clientHeight) { if (scrollHeight - (scrollTop + 100) < clientHeight) {