mirror of
https://github.com/cheveguerra/whaticket-community.git
synced 2026-04-20 04:39:20 +00:00
improvement: use handleScroll instead lib to infinite scroll
This commit is contained in:
@@ -19,7 +19,6 @@
|
|||||||
"react": "^16.13.1",
|
"react": "^16.13.1",
|
||||||
"react-dom": "^16.13.1",
|
"react-dom": "^16.13.1",
|
||||||
"react-infinite-scroll-reverse": "^1.0.3",
|
"react-infinite-scroll-reverse": "^1.0.3",
|
||||||
"react-infinite-scroller": "^1.2.4",
|
|
||||||
"react-linkify": "^1.0.0-alpha",
|
"react-linkify": "^1.0.0-alpha",
|
||||||
"react-modal-image": "^2.5.0",
|
"react-modal-image": "^2.5.0",
|
||||||
"react-router-dom": "^5.2.0",
|
"react-router-dom": "^5.2.0",
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { useHistory, useParams } from "react-router-dom";
|
|||||||
import openSocket from "socket.io-client";
|
import openSocket from "socket.io-client";
|
||||||
import { format } from "date-fns";
|
import { format } from "date-fns";
|
||||||
import { toast } from "react-toastify";
|
import { toast } from "react-toastify";
|
||||||
import InfiniteScroll from "react-infinite-scroller";
|
|
||||||
|
|
||||||
import { makeStyles } from "@material-ui/core/styles";
|
import { makeStyles } from "@material-ui/core/styles";
|
||||||
import Paper from "@material-ui/core/Paper";
|
import Paper from "@material-ui/core/Paper";
|
||||||
@@ -27,7 +26,7 @@ import TabPanel from "../TabPanel";
|
|||||||
import api from "../../services/api";
|
import api from "../../services/api";
|
||||||
|
|
||||||
const useStyles = makeStyles(theme => ({
|
const useStyles = makeStyles(theme => ({
|
||||||
contactsWrapper: {
|
ticketsWrapper: {
|
||||||
position: "relative",
|
position: "relative",
|
||||||
display: "flex",
|
display: "flex",
|
||||||
height: "100%",
|
height: "100%",
|
||||||
@@ -330,6 +329,15 @@ const Tickets = () => {
|
|||||||
setTab("search");
|
setTab("search");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleScroll = e => {
|
||||||
|
if (count === tickets.length || loading) return;
|
||||||
|
const { scrollTop, scrollHeight, clientHeight } = e.currentTarget;
|
||||||
|
|
||||||
|
if (scrollHeight - (scrollTop + 100) < clientHeight) {
|
||||||
|
loadMore();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleChangeTab = (event, newValue) => {
|
const handleChangeTab = (event, newValue) => {
|
||||||
setTab(newValue);
|
setTab(newValue);
|
||||||
};
|
};
|
||||||
@@ -357,38 +365,8 @@ const Tickets = () => {
|
|||||||
return ticketsFound;
|
return ticketsFound;
|
||||||
};
|
};
|
||||||
|
|
||||||
const CustomInfiniteScroll = ({ children, loadingKey }) => {
|
|
||||||
return (
|
|
||||||
<InfiniteScroll
|
|
||||||
pageStart={0}
|
|
||||||
loadMore={() => !loading && loadMore()}
|
|
||||||
hasMore={count > tickets.length}
|
|
||||||
useWindow={false}
|
|
||||||
initialLoad={false}
|
|
||||||
threshold={100}
|
|
||||||
loader={<TicketsSkeleton key={loadingKey} />}
|
|
||||||
>
|
|
||||||
<List style={{ paddingTop: 0 }}>{children}</List>
|
|
||||||
</InfiniteScroll>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const CustomTicketList = ({ ...rest }) => {
|
|
||||||
return (
|
|
||||||
<TicketsList
|
|
||||||
tickets={tickets}
|
|
||||||
loading={loading}
|
|
||||||
handleSelectTicket={handleSelectTicket}
|
|
||||||
showAllTickets={showAllTickets}
|
|
||||||
ticketId={ticketId}
|
|
||||||
handleAcepptTicket={handleAcepptTicket}
|
|
||||||
{...rest}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Paper elevation={0} variant="outlined" className={classes.contactsWrapper}>
|
<Paper elevation={0} variant="outlined" className={classes.ticketsWrapper}>
|
||||||
<NewTicketModal
|
<NewTicketModal
|
||||||
modalOpen={newTicketModalOpen}
|
modalOpen={newTicketModalOpen}
|
||||||
onClose={e => setNewTicketModalOpen(false)}
|
onClose={e => setNewTicketModalOpen(false)}
|
||||||
@@ -433,8 +411,13 @@ const Tickets = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</Paper>
|
</Paper>
|
||||||
<TabPanel value={tab} name={"open"} className={classes.contactsWrapper}>
|
<TabPanel value={tab} name="open" className={classes.ticketsWrapper}>
|
||||||
<Paper square elevation={0} className={classes.halfTicketsList}>
|
<Paper
|
||||||
|
square
|
||||||
|
elevation={0}
|
||||||
|
className={classes.halfTicketsList}
|
||||||
|
onScroll={handleScroll}
|
||||||
|
>
|
||||||
<div className={classes.ticketsListHeader}>
|
<div className={classes.ticketsListHeader}>
|
||||||
Atendendo
|
Atendendo
|
||||||
<span className={classes.ticketsCount}>
|
<span className={classes.ticketsCount}>
|
||||||
@@ -464,19 +447,27 @@ const Tickets = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<List style={{ paddingTop: 0 }}>
|
<List style={{ paddingTop: 0 }}>
|
||||||
{loading ? (
|
<TicketsList
|
||||||
<TicketsSkeleton />
|
tickets={tickets}
|
||||||
) : (
|
loading={loading}
|
||||||
<CustomTicketList
|
handleSelectTicket={handleSelectTicket}
|
||||||
noTicketsTitle="Pronto pra mais?"
|
showAllTickets={showAllTickets}
|
||||||
noTicketsMessage="Aceite um ticket da fila para começar."
|
ticketId={ticketId}
|
||||||
status="open"
|
handleAcepptTicket={handleAcepptTicket}
|
||||||
userId={userId}
|
noTicketsTitle="Pronto pra mais?"
|
||||||
/>
|
noTicketsMessage="Aceite um ticket da fila para começar."
|
||||||
)}
|
status="open"
|
||||||
|
userId={userId}
|
||||||
|
/>
|
||||||
|
{loading && <TicketsSkeleton />}
|
||||||
</List>
|
</List>
|
||||||
</Paper>
|
</Paper>
|
||||||
<Paper square elevation={0} className={classes.halfTicketsList}>
|
<Paper
|
||||||
|
square
|
||||||
|
elevation={0}
|
||||||
|
className={classes.halfTicketsList}
|
||||||
|
onScroll={handleScroll}
|
||||||
|
>
|
||||||
<div className={classes.ticketsListHeader}>
|
<div className={classes.ticketsListHeader}>
|
||||||
Aguardando
|
Aguardando
|
||||||
<span className={classes.ticketsCount}>
|
<span className={classes.ticketsCount}>
|
||||||
@@ -484,7 +475,13 @@ const Tickets = () => {
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<List style={{ paddingTop: 0 }}>
|
<List style={{ paddingTop: 0 }}>
|
||||||
<CustomTicketList
|
<TicketsList
|
||||||
|
tickets={tickets}
|
||||||
|
loading={loading}
|
||||||
|
handleSelectTicket={handleSelectTicket}
|
||||||
|
showAllTickets={showAllTickets}
|
||||||
|
ticketId={ticketId}
|
||||||
|
handleAcepptTicket={handleAcepptTicket}
|
||||||
noTicketsTitle="Tudo resolvido"
|
noTicketsTitle="Tudo resolvido"
|
||||||
noTicketsMessage="Nenhum Ticket pendente"
|
noTicketsMessage="Nenhum Ticket pendente"
|
||||||
status="pending"
|
status="pending"
|
||||||
@@ -493,22 +490,48 @@ const Tickets = () => {
|
|||||||
</List>
|
</List>
|
||||||
</Paper>
|
</Paper>
|
||||||
</TabPanel>
|
</TabPanel>
|
||||||
<TabPanel value={tab} name="closed" className={classes.contactsWrapper}>
|
<TabPanel value={tab} name="closed" className={classes.ticketsWrapper}>
|
||||||
<Paper square elevation={0} className={classes.fullHeightTicketsList}>
|
<Paper
|
||||||
<CustomInfiniteScroll loadingKey="loading-closed">
|
square
|
||||||
<CustomTicketList status="closed" userId={null} />
|
elevation={0}
|
||||||
</CustomInfiniteScroll>
|
className={classes.fullHeightTicketsList}
|
||||||
|
onScroll={handleScroll}
|
||||||
|
>
|
||||||
|
<List style={{ paddingTop: 0 }}>
|
||||||
|
<TicketsList
|
||||||
|
tickets={tickets}
|
||||||
|
loading={loading}
|
||||||
|
handleSelectTicket={handleSelectTicket}
|
||||||
|
showAllTickets={showAllTickets}
|
||||||
|
ticketId={ticketId}
|
||||||
|
handleAcepptTicket={handleAcepptTicket}
|
||||||
|
status="closed"
|
||||||
|
userId={null}
|
||||||
|
/>
|
||||||
|
</List>
|
||||||
</Paper>
|
</Paper>
|
||||||
</TabPanel>
|
</TabPanel>
|
||||||
<TabPanel value={tab} name="search" className={classes.contactsWrapper}>
|
<TabPanel value={tab} name="search" className={classes.ticketsWrapper}>
|
||||||
<Paper square elevation={0} className={classes.fullHeightTicketsList}>
|
<Paper
|
||||||
<CustomInfiniteScroll loadingKey="loading-all">
|
square
|
||||||
<CustomTicketList
|
elevation={0}
|
||||||
|
className={classes.fullHeightTicketsList}
|
||||||
|
onScroll={handleScroll}
|
||||||
|
>
|
||||||
|
<List style={{ paddingTop: 0 }}>
|
||||||
|
<TicketsList
|
||||||
|
tickets={tickets}
|
||||||
|
loading={loading}
|
||||||
|
handleSelectTicket={handleSelectTicket}
|
||||||
|
showAllTickets={showAllTickets}
|
||||||
|
ticketId={ticketId}
|
||||||
|
handleAcepptTicket={handleAcepptTicket}
|
||||||
noTicketsTitle="Nada encontrado"
|
noTicketsTitle="Nada encontrado"
|
||||||
noTicketsMessage="Tente buscar por outro termo"
|
noTicketsMessage="Tente buscar por outro termo"
|
||||||
status="all"
|
status="all"
|
||||||
/>
|
/>
|
||||||
</CustomInfiniteScroll>
|
</List>
|
||||||
|
{loading && <TicketsSkeleton />}
|
||||||
</Paper>
|
</Paper>
|
||||||
</TabPanel>
|
</TabPanel>
|
||||||
<audio id="sound" preload="auto">
|
<audio id="sound" preload="auto">
|
||||||
|
|||||||
@@ -9012,7 +9012,7 @@ prompts@^2.0.1:
|
|||||||
kleur "^3.0.3"
|
kleur "^3.0.3"
|
||||||
sisteransi "^1.0.4"
|
sisteransi "^1.0.4"
|
||||||
|
|
||||||
prop-types@15.7.2, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2:
|
prop-types@15.7.2, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2:
|
||||||
version "15.7.2"
|
version "15.7.2"
|
||||||
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
|
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
|
||||||
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
|
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
|
||||||
@@ -9249,13 +9249,6 @@ react-infinite-scroll-reverse@^1.0.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
prop-types "15.7.2"
|
prop-types "15.7.2"
|
||||||
|
|
||||||
react-infinite-scroller@^1.2.4:
|
|
||||||
version "1.2.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/react-infinite-scroller/-/react-infinite-scroller-1.2.4.tgz#f67eaec4940a4ce6417bebdd6e3433bfc38826e9"
|
|
||||||
integrity sha512-/oOa0QhZjXPqaD6sictN2edFMsd3kkMiE19Vcz5JDgHpzEJVqYcmq+V3mkwO88087kvKGe1URNksHEOt839Ubw==
|
|
||||||
dependencies:
|
|
||||||
prop-types "^15.5.8"
|
|
||||||
|
|
||||||
react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.4:
|
react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.4:
|
||||||
version "16.13.1"
|
version "16.13.1"
|
||||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
|
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
|
||||||
|
|||||||
Reference in New Issue
Block a user