import { Button } from "@usememos/mui"; import { ArrowDownIcon, LoaderIcon } from "lucide-react"; import { useEffect, useState } from "react"; import PullToRefresh from "react-simple-pull-to-refresh"; import { DEFAULT_LIST_MEMOS_PAGE_SIZE } from "@/helpers/consts"; import { useMemoList, useMemoStore } from "@/store/v1"; import { Memo } from "@/types/proto/api/v1/memo_service"; import { useTranslate } from "@/utils/i18n"; import Empty from "../Empty"; interface Props { renderer: (memo: Memo) => JSX.Element; listSort?: (list: Memo[]) => Memo[]; filter?: string; pageSize?: number; } interface State { isRequesting: boolean; nextPageToken: string; } const PagedMemoList = (props: Props) => { const t = useTranslate(); const memoStore = useMemoStore(); const memoList = useMemoList(); const [state, setState] = useState({ isRequesting: true, // Initial request nextPageToken: "", }); const sortedMemoList = props.listSort ? props.listSort(memoList.value) : memoList.value; const handleRefresh = async () => { memoList.reset(); setState((state) => ({ ...state, nextPageToken: "" })); fetchMoreMemos(""); }; const setIsRequesting = (isRequesting: boolean) => { setState((state) => ({ ...state, isRequesting })); }; const fetchMoreMemos = async (nextPageToken: string) => { setIsRequesting(true); const response = await memoStore.fetchMemos({ filter: props.filter || "", pageSize: props.pageSize || DEFAULT_LIST_MEMOS_PAGE_SIZE, pageToken: nextPageToken, }); setState(() => ({ isRequesting: false, nextPageToken: response.nextPageToken, })); }; useEffect(() => { memoList.reset(); setState((state) => ({ ...state, nextPageToken: "" })); fetchMoreMemos(""); }, [props.filter, props.pageSize]); return ( } refreshingContent={
} > <> {sortedMemoList.map((memo) => props.renderer(memo))} {state.isRequesting && (
)} {!state.isRequesting && state.nextPageToken && (
)} {!state.isRequesting && !state.nextPageToken && sortedMemoList.length === 0 && (

{t("message.no-data")}

)}
); }; export default PagedMemoList;