diff --git a/web/src/pages/Archived.tsx b/web/src/pages/Archived.tsx index cf0dd4f4683af..08e70c2b8402f 100644 --- a/web/src/pages/Archived.tsx +++ b/web/src/pages/Archived.tsx @@ -1,6 +1,6 @@ -import { Tooltip } from "@mui/joy"; +import { Button, Tooltip } from "@mui/joy"; import { ClientError } from "nice-grpc-web"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import toast from "react-hot-toast"; import { showCommonDialog } from "@/components/Dialog/CommonDialog"; import Empty from "@/components/Empty"; @@ -9,49 +9,56 @@ import MemoContent from "@/components/MemoContent"; import MemoFilter from "@/components/MemoFilter"; import MobileHeader from "@/components/MobileHeader"; import SearchBar from "@/components/SearchBar"; -import { memoServiceClient } from "@/grpcweb"; +import { DEFAULT_MEMO_LIMIT } from "@/helpers/consts"; +import { getTimeStampByDate } from "@/helpers/datetime"; import { getDateTimeString } from "@/helpers/datetime"; import useCurrentUser from "@/hooks/useCurrentUser"; import useFilterWithUrlParams from "@/hooks/useFilterWithUrlParams"; -import useLoading from "@/hooks/useLoading"; -import { useMemoStore } from "@/store/v1"; +import { useMemoList, useMemoStore } from "@/store/v1"; import { RowStatus } from "@/types/proto/api/v2/common"; import { Memo } from "@/types/proto/api/v2/memo_service"; import { useTranslate } from "@/utils/i18n"; const Archived = () => { const t = useTranslate(); - const loadingState = useLoading(); const user = useCurrentUser(); const memoStore = useMemoStore(); - const [archivedMemos, setArchivedMemos] = useState([]); + const memoList = useMemoList(); + const [isRequesting, setIsRequesting] = useState(true); + const nextPageTokenRef = useRef(undefined); const { tag: tagQuery, text: textQuery } = useFilterWithUrlParams(); + const sortedMemos = memoList.value + .filter((memo) => memo.rowStatus === RowStatus.ARCHIVED) + .sort((a, b) => getTimeStampByDate(b.displayTime) - getTimeStampByDate(a.displayTime)); useEffect(() => { - (async () => { - try { - const filters = [`creator == "${user.name}"`, "row_status == 'ARCHIVED'"]; - const contentSearch: string[] = []; - if (tagQuery) { - contentSearch.push(JSON.stringify(`#${tagQuery}`)); - } - if (textQuery) { - contentSearch.push(JSON.stringify(textQuery)); - } - if (contentSearch.length > 0) { - filters.push(`content_search == [${contentSearch.join(", ")}]`); - } - const { memos } = await memoServiceClient.listMemos({ - filter: filters.join(" && "), - }); - setArchivedMemos(memos); - } catch (error: unknown) { - toast.error((error as ClientError).details); - } - loadingState.setFinish(); - })(); + nextPageTokenRef.current = undefined; + memoList.reset(); + fetchMemos(); }, [tagQuery, textQuery]); + const fetchMemos = async () => { + const filters = [`creator == "${user.name}"`, `row_status == "ARCHIVED"`]; + const contentSearch: string[] = []; + if (tagQuery) { + contentSearch.push(JSON.stringify(`#${tagQuery}`)); + } + if (textQuery) { + contentSearch.push(JSON.stringify(textQuery)); + } + if (contentSearch.length > 0) { + filters.push(`content_search == [${contentSearch.join(", ")}]`); + } + setIsRequesting(true); + const data = await memoStore.fetchMemos({ + pageSize: DEFAULT_MEMO_LIMIT, + filter: filters.join(" && "), + pageToken: nextPageTokenRef.current, + }); + setIsRequesting(false); + nextPageTokenRef.current = data.nextPageToken; + }; + const handleDeleteMemoClick = async (memo: Memo) => { showCommonDialog({ title: t("memo.delete-memo"), @@ -60,7 +67,6 @@ const Archived = () => { dialogName: "delete-memo-dialog", onConfirm: async () => { await memoStore.deleteMemo(memo.id); - setArchivedMemos((prev) => prev.filter((m) => m.id !== memo.id)); }, }); }; @@ -74,7 +80,6 @@ const Archived = () => { }, ["row_status"], ); - setArchivedMemos((prev) => prev.filter((m) => m.id !== memo.id)); toast(t("message.restored-successfully")); } catch (error: unknown) { console.error(error); @@ -83,7 +88,7 @@ const Archived = () => { }; return ( -
+
@@ -93,41 +98,49 @@ const Archived = () => {
- {loadingState.isLoading ? ( -
-

{t("memo.fetching-data")}

+ {sortedMemos.map((memo) => ( +
+
+
+ {getDateTimeString(memo.displayTime)} +
+
+ + + + + + +
+
+
- ) : archivedMemos.length === 0 ? ( -
- -

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

+ ))} + {isRequesting ? ( +
+ +

{t("memo.fetching-data")}

- ) : ( - archivedMemos.map((memo) => ( -
-
-
- {getDateTimeString(memo.updateTime)} -
-
- - - - - - -
-
- + ) : !nextPageTokenRef.current ? ( + sortedMemos.length === 0 && ( +
+ +

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

- )) + ) + ) : ( +
+ +
)}