import { useEffect, useMemo } from "react"; import { ActionButton } from "@/components/ui/action-button"; import useBulkActionsStore from "@/lib/bulkActions"; import { bookmarkLayoutSwitch, useBookmarkLayout, } from "@/lib/userLocalSettings/bookmarksLayout"; import tailwindConfig from "@/tailwind.config"; import { Slot } from "@radix-ui/react-slot"; import { useInView } from "react-intersection-observer"; import Masonry from "react-masonry-css"; import resolveConfig from "tailwindcss/resolveConfig"; import type { ZBookmark } from "@hoarder/shared/types/bookmarks"; import BookmarkCard from "./BookmarkCard"; import EditorCard from "./EditorCard"; function StyledBookmarkCard({ children }: { children: React.ReactNode }) { return ( {children} ); } function getBreakpointConfig() { const fullConfig = resolveConfig(tailwindConfig); const breakpointColumnsObj: { [key: number]: number; default: number } = { default: 3, }; breakpointColumnsObj[parseInt(fullConfig.theme.screens.lg)] = 2; breakpointColumnsObj[parseInt(fullConfig.theme.screens.md)] = 1; breakpointColumnsObj[parseInt(fullConfig.theme.screens.sm)] = 1; return breakpointColumnsObj; } export default function BookmarksGrid({ bookmarks, hasNextPage = false, fetchNextPage = () => ({}), isFetchingNextPage = false, showEditorCard = false, }: { bookmarks: ZBookmark[]; showEditorCard?: boolean; hasNextPage?: boolean; isFetchingNextPage?: boolean; fetchNextPage?: () => void; }) { const layout = useBookmarkLayout(); const bulkActionsStore = useBulkActionsStore(); const breakpointConfig = useMemo(() => getBreakpointConfig(), []); const { ref: loadMoreRef, inView: loadMoreButtonInView } = useInView(); useEffect(() => { bulkActionsStore.setVisibleBookmarks(bookmarks); return () => { bulkActionsStore.setVisibleBookmarks([]); }; }, [bookmarks]); useEffect(() => { if (loadMoreButtonInView && hasNextPage && !isFetchingNextPage) { fetchNextPage(); } }, [loadMoreButtonInView]); if (bookmarks.length == 0 && !showEditorCard) { return

No bookmarks

; } const children = [ showEditorCard && ( ), ...bookmarks.map((b) => ( )), ]; return ( <> {bookmarkLayoutSwitch(layout, { masonry: ( {children} ), grid: ( {children} ), list:
{children}
, compact:
{children}
, })} {hasNextPage && (
fetchNextPage()} variant="ghost" > Load More
)} ); }