|
|
|
@ -1,6 +1,7 @@
|
|
|
|
|
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";
|
|
|
|
@ -28,7 +29,11 @@ const PagedMemoList = (props: Props) => {
|
|
|
|
|
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 }));
|
|
|
|
|
};
|
|
|
|
@ -53,28 +58,38 @@ const PagedMemoList = (props: Props) => {
|
|
|
|
|
}, [props.filter, props.pageSize]);
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
{sortedMemoList.map((memo) => props.renderer(memo))}
|
|
|
|
|
{state.isRequesting && (
|
|
|
|
|
<div className="w-full flex flex-row justify-center items-center my-4">
|
|
|
|
|
<LoaderIcon className="animate-spin text-zinc-500" />
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
{!state.isRequesting && state.nextPageToken && (
|
|
|
|
|
<PullToRefresh
|
|
|
|
|
onRefresh={handleRefresh}
|
|
|
|
|
pullingContent={<></>}
|
|
|
|
|
refreshingContent={
|
|
|
|
|
<div className="w-full flex flex-row justify-center items-center my-4">
|
|
|
|
|
<Button variant="plain" onClick={() => fetchMoreMemos(state.nextPageToken)}>
|
|
|
|
|
{t("memo.load-more")}
|
|
|
|
|
<ArrowDownIcon className="ml-2 w-4 h-auto" />
|
|
|
|
|
</Button>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
{!state.isRequesting && !state.nextPageToken && sortedMemoList.length === 0 && (
|
|
|
|
|
<div className="w-full mt-12 mb-8 flex flex-col justify-center items-center italic">
|
|
|
|
|
<Empty />
|
|
|
|
|
<p className="mt-2 text-gray-600 dark:text-gray-400">{t("message.no-data")}</p>
|
|
|
|
|
<LoaderIcon className="animate-spin" />
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</>
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
<>
|
|
|
|
|
{sortedMemoList.map((memo) => props.renderer(memo))}
|
|
|
|
|
{state.isRequesting && (
|
|
|
|
|
<div className="w-full flex flex-row justify-center items-center my-4">
|
|
|
|
|
<LoaderIcon className="animate-spin text-zinc-500" />
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
{!state.isRequesting && state.nextPageToken && (
|
|
|
|
|
<div className="w-full flex flex-row justify-center items-center my-4">
|
|
|
|
|
<Button variant="plain" onClick={() => fetchMoreMemos(state.nextPageToken)}>
|
|
|
|
|
{t("memo.load-more")}
|
|
|
|
|
<ArrowDownIcon className="ml-2 w-4 h-auto" />
|
|
|
|
|
</Button>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
{!state.isRequesting && !state.nextPageToken && sortedMemoList.length === 0 && (
|
|
|
|
|
<div className="w-full mt-12 mb-8 flex flex-col justify-center items-center italic">
|
|
|
|
|
<Empty />
|
|
|
|
|
<p className="mt-2 text-gray-600 dark:text-gray-400">{t("message.no-data")}</p>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</>
|
|
|
|
|
</PullToRefresh>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|