diff options
| author | MohamedBassem <me@mbassem.com> | 2024-03-17 13:12:11 +0000 |
|---|---|---|
| committer | MohamedBassem <me@mbassem.com> | 2024-03-17 13:12:11 +0000 |
| commit | fc8eb79b98bbea558bd614dc71dd66b72ab9b0c0 (patch) | |
| tree | e868b500b8b5d00cf82011013b68dd3e669bbec3 /apps/web/components/dashboard | |
| parent | e86f6a9cf0eb271abfc7cf53ec10ef372d52f0bd (diff) | |
| download | karakeep-fc8eb79b98bbea558bd614dc71dd66b72ab9b0c0.tar.zst | |
feature: Implemente pagination support
Diffstat (limited to 'apps/web/components/dashboard')
| -rw-r--r-- | apps/web/components/dashboard/bookmarks/Bookmarks.tsx | 2 | ||||
| -rw-r--r-- | apps/web/components/dashboard/bookmarks/BookmarksGrid.tsx | 47 |
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> + </> ); } |
