Unverified Commit b98f85d8 authored by João Nuno Mota's avatar João Nuno Mota Committed by GitHub

feat: add infinite scroll for memos (#1614)

Add infinite scroll for memos on home
parent 3314fe8b
import { useEffect, useState } from "react"; import { useEffect, useRef, useState } from "react";
import { toast } from "react-hot-toast"; import { toast } from "react-hot-toast";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useFilterStore, useMemoStore, useShortcutStore, useUserStore } from "@/store/module"; import { useFilterStore, useMemoStore, useShortcutStore, useUserStore } from "@/store/module";
...@@ -86,6 +86,8 @@ const MemoList = () => { ...@@ -86,6 +86,8 @@ const MemoList = () => {
unpinnedMemos.sort(memoSort); unpinnedMemos.sort(memoSort);
const sortedMemos = pinnedMemos.concat(unpinnedMemos).filter((m) => m.rowStatus === "NORMAL"); const sortedMemos = pinnedMemos.concat(unpinnedMemos).filter((m) => m.rowStatus === "NORMAL");
const statusRef = useRef<HTMLDivElement>(null);
useEffect(() => { useEffect(() => {
memoStore memoStore
.fetchMemos() .fetchMemos()
...@@ -116,7 +118,21 @@ const MemoList = () => { ...@@ -116,7 +118,21 @@ const MemoList = () => {
if (sortedMemos.length < DEFAULT_MEMO_LIMIT) { if (sortedMemos.length < DEFAULT_MEMO_LIMIT) {
handleFetchMoreClick(); handleFetchMoreClick();
} }
}, [isFetching, isComplete, filter, sortedMemos.length]); const observer = new IntersectionObserver(([entry]) => {
if (entry.isIntersecting) {
handleFetchMoreClick();
observer.unobserve(entry.target);
}
});
if (statusRef?.current) {
observer.observe(statusRef.current);
}
return () => {
if (statusRef?.current) {
observer.unobserve(statusRef.current);
}
};
}, [isFetching, isComplete, filter, sortedMemos.length, statusRef]);
const handleFetchMoreClick = async () => { const handleFetchMoreClick = async () => {
try { try {
...@@ -142,7 +158,7 @@ const MemoList = () => { ...@@ -142,7 +158,7 @@ const MemoList = () => {
<p className="status-text">{t("memo.fetching-data")}</p> <p className="status-text">{t("memo.fetching-data")}</p>
</div> </div>
) : ( ) : (
<div className="status-text-container"> <div ref={statusRef} className="status-text-container">
<p className="status-text"> <p className="status-text">
{isComplete ? ( {isComplete ? (
sortedMemos.length === 0 ? ( sortedMemos.length === 0 ? (
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment