import { Button } from "@usememos/mui"; import { ArrowDownIcon, LoaderIcon } from "lucide-react"; import { useCallback, useEffect, useState } from "react"; import PullToRefresh from "react-simple-pull-to-refresh"; import { DEFAULT_LIST_MEMOS_PAGE_SIZE } from "@/helpers/consts"; import useResponsiveWidth from "@/hooks/useResponsiveWidth"; 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 { md } = useResponsiveWidth(); 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 fetchMoreMemos = async (nextPageToken: string) => { setState((state) => ({ ...state, isRequesting: 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, })); }; const refreshList = useCallback(async () => { memoList.reset(); setState((state) => ({ ...state, nextPageToken: "" })); fetchMoreMemos(""); }, []); useEffect(() => { refreshList(); }, [props.filter, props.pageSize]); const children = ( <> {sortedMemoList.map((memo) => props.renderer(memo))} {state.isRequesting && (
)} {!state.isRequesting && state.nextPageToken && (
)} {!state.isRequesting && !state.nextPageToken && sortedMemoList.length === 0 && (

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

)} ); // In case of md screen, we don't need pull to refresh. if (md) { return children; } return ( refreshList()} pullingContent={
} refreshingContent={
} > {children}
); }; export default PagedMemoList;