From e31655a96edd50cdb51512430b0bda23579a2ab3 Mon Sep 17 00:00:00 2001
From: Zamitto <167933696+zamitto@users.noreply.github.com>
Date: Fri, 16 Aug 2024 15:56:03 -0300
Subject: [PATCH] feat: infinite scroll block list
---
.../user-friend-modal-list.tsx | 3 +-
.../user-block-list.tsx | 85 ++++++++++++++-----
2 files changed, 63 insertions(+), 25 deletions(-)
diff --git a/src/renderer/src/pages/shared-modals/user-friend-modal/user-friend-modal-list.tsx b/src/renderer/src/pages/shared-modals/user-friend-modal/user-friend-modal-list.tsx
index b649c45f..b760351c 100644
--- a/src/renderer/src/pages/shared-modals/user-friend-modal/user-friend-modal-list.tsx
+++ b/src/renderer/src/pages/shared-modals/user-friend-modal/user-friend-modal-list.tsx
@@ -34,7 +34,6 @@ export const UserFriendModalList = ({
const loadNextPage = () => {
if (page > maxPage) return;
setIsLoading(true);
- console.log("loading next page");
window.electron
.getUserFriends(userId, pageSize, page * pageSize)
.then((newPage) => {
@@ -106,7 +105,7 @@ export const UserFriendModalList = ({
overflowY: "scroll",
}}
>
- {friends.length === 0 &&
{t("no_friends_added")}
}
+ {!isLoading && friends.length === 0 && {t("no_friends_added")}
}
{friends.map((friend) => {
return (
{
const { showErrorToast } = useToast();
const [page, setPage] = useState(0);
+ const [isLoading, setIsLoading] = useState(false);
const [maxPage, setMaxPage] = useState(0);
const [blocks, setBlocks] = useState([]);
+ const listContainer = useRef(null);
const { unblockUser } = useUserDetails();
const loadNextPage = () => {
if (page > maxPage) return;
+ setIsLoading(true);
window.electron
.getUserBlocks(pageSize, page * pageSize)
.then((newPage) => {
@@ -29,9 +33,29 @@ export const UserEditProfileBlockList = () => {
setBlocks([...blocks, ...newPage.blocks]);
setPage(page + 1);
})
- .catch(() => {});
+ .catch(() => {})
+ .finally(() => setIsLoading(false));
};
+ const handleScroll = () => {
+ const scrollTop = listContainer.current?.scrollTop || 0;
+ const scrollHeight = listContainer.current?.scrollHeight || 0;
+ const clientHeight = listContainer.current?.clientHeight || 0;
+ const maxScrollTop = scrollHeight - clientHeight;
+
+ if (scrollTop < maxScrollTop * 0.9 || isLoading) {
+ return;
+ }
+
+ loadNextPage();
+ };
+
+ useEffect(() => {
+ listContainer.current?.addEventListener("scroll", handleScroll);
+ return () =>
+ listContainer.current?.removeEventListener("scroll", handleScroll);
+ }, [isLoading]);
+
const reloadList = () => {
setPage(0);
setMaxPage(0);
@@ -54,26 +78,41 @@ export const UserEditProfileBlockList = () => {
};
return (
-
- {blocks.length === 0 &&
{t("no_blocked_users")}
}
- {blocks.map((friend) => {
- return (
-
+
+ {!isLoading && blocks.length === 0 &&
{t("no_blocked_users")}
}
+ {blocks.map((friend) => {
+ return (
+
+ );
+ })}
+ {isLoading && (
+
- );
- })}
-
+ )}
+
+
);
};