aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web/components/dashboard
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-03-17 13:12:11 +0000
committerMohamedBassem <me@mbassem.com>2024-03-17 13:12:11 +0000
commitfc8eb79b98bbea558bd614dc71dd66b72ab9b0c0 (patch)
treee868b500b8b5d00cf82011013b68dd3e669bbec3 /apps/web/components/dashboard
parente86f6a9cf0eb271abfc7cf53ec10ef372d52f0bd (diff)
downloadkarakeep-fc8eb79b98bbea558bd614dc71dd66b72ab9b0c0.tar.zst
feature: Implemente pagination support
Diffstat (limited to 'apps/web/components/dashboard')
-rw-r--r--apps/web/components/dashboard/bookmarks/Bookmarks.tsx2
-rw-r--r--apps/web/components/dashboard/bookmarks/BookmarksGrid.tsx47
2 files changed, 36 insertions, 13 deletions
diff --git a/apps/web/components/dashboard/bookmarks/Bookmarks.tsx b/apps/web/components/dashboard/bookmarks/Bookmarks.tsx
index 601b1627..96e5c067 100644
--- a/apps/web/components/dashboard/bookmarks/Bookmarks.tsx
+++ b/apps/web/components/dashboard/bookmarks/Bookmarks.tsx
@@ -35,7 +35,7 @@ export default async function Bookmarks({
{showDivider && <hr />}
<BookmarksGrid
query={query}
- bookmarks={bookmarks.bookmarks}
+ bookmarks={bookmarks}
showEditorCard={showEditorCard}
/>
</div>
diff --git a/apps/web/components/dashboard/bookmarks/BookmarksGrid.tsx b/apps/web/components/dashboard/bookmarks/BookmarksGrid.tsx
index 644991bb..b689a192 100644
--- a/apps/web/components/dashboard/bookmarks/BookmarksGrid.tsx
+++ b/apps/web/components/dashboard/bookmarks/BookmarksGrid.tsx
@@ -1,6 +1,7 @@
"use client";
import { useMemo } from "react";
+import { ActionButton } from "@/components/ui/action-button";
import { api } from "@/lib/trpc";
import tailwindConfig from "@/tailwind.config";
import { Slot } from "@radix-ui/react-slot";
@@ -10,6 +11,7 @@ import resolveConfig from "tailwindcss/resolveConfig";
import type {
ZBookmark,
ZGetBookmarksRequest,
+ ZGetBookmarksResponse,
} from "@hoarder/trpc/types/bookmarks";
import EditorCard from "./EditorCard";
@@ -55,24 +57,45 @@ export default function BookmarksGrid({
showEditorCard = false,
}: {
query: ZGetBookmarksRequest;
- bookmarks: ZBookmark[];
+ bookmarks: ZGetBookmarksResponse;
showEditorCard?: boolean;
+ itemsPerPage?: number;
}) {
- const { data } = api.bookmarks.getBookmarks.useQuery(query, {
- initialData: { bookmarks: initialBookmarks },
- });
+ const { data, fetchNextPage, hasNextPage, isFetchingNextPage } =
+ api.bookmarks.getBookmarks.useInfiniteQuery(query, {
+ initialData: () => ({
+ pages: [initialBookmarks],
+ pageParams: [query.cursor],
+ }),
+ initialCursor: null,
+ getNextPageParam: (lastPage) => lastPage.nextCursor,
+ });
+
const breakpointConfig = useMemo(() => getBreakpointConfig(), []);
- if (data.bookmarks.length == 0) {
+ const bookmarks = data!.pages.flatMap((b) => b.bookmarks);
+ if (bookmarks.length == 0) {
return <p>No bookmarks</p>;
}
return (
- <Masonry className="flex gap-4" breakpointCols={breakpointConfig}>
- {showEditorCard && (
- <BookmarkCard>
- <EditorCard />
- </BookmarkCard>
+ <>
+ <Masonry className="flex gap-4" breakpointCols={breakpointConfig}>
+ {showEditorCard && (
+ <BookmarkCard>
+ <EditorCard />
+ </BookmarkCard>
+ )}
+ {bookmarks.map((b) => renderBookmark(b))}
+ </Masonry>
+ {hasNextPage && (
+ <ActionButton
+ loading={isFetchingNextPage}
+ onClick={() => fetchNextPage()}
+ className="mx-auto w-min"
+ variant="ghost"
+ >
+ Load More
+ </ActionButton>
)}
- {data.bookmarks.map((b) => renderBookmark(b))}
- </Masonry>
+ </>
);
}