"use client"; import { ImageCard, ImageCardBanner, ImageCardBody, ImageCardContent, ImageCardFooter, ImageCardTitle, } from "@/components/ui/imageCard"; import { ZBookmark } from "@/lib/types/api/bookmarks"; import Link from "next/link"; import BookmarkOptions from "./BookmarkOptions"; import { api } from "@/lib/trpc"; import { Maximize2, Star } from "lucide-react"; import TagList from "./TagList"; function isStillCrawling(bookmark: ZBookmark) { return ( bookmark.content.type == "link" && !bookmark.content.crawledAt && Date.now().valueOf() - bookmark.createdAt.valueOf() < 30 * 1000 ); } function isStillTagging(bookmark: ZBookmark) { return ( bookmark.taggingStatus == "pending" && Date.now().valueOf() - bookmark.createdAt.valueOf() < 30 * 1000 ); } function isStillLoading(bookmark: ZBookmark) { return isStillTagging(bookmark) || isStillCrawling(bookmark); } export default function LinkCard({ bookmark: initialData, className, }: { bookmark: ZBookmark; className?: string; }) { const { data: bookmark } = api.bookmarks.getBookmark.useQuery( { bookmarkId: initialData.id, }, { initialData, refetchInterval: (query) => { const data = query.state.data; if (!data) { return false; } // If the link is not crawled or not tagged if (isStillLoading(data)) { return 1000; } return false; }, }, ); const link = bookmark.content; if (link.type != "link") { throw new Error("Unexpected bookmark type"); } const parsedUrl = new URL(link.url); // A dummy white pixel for when there's no image. // TODO: Better handling for cards with no images const image = link.imageUrl ?? "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUGFdj+P///38ACfsD/QVDRcoAAAAASUVORK5CYII="; return ( {link?.title ?? parsedUrl.host} {/* There's a hack here. Every tag has the full hight of the container itself. That why, when we enable flex-wrap, the overflowed don't show up. */}
{parsedUrl.host}
{bookmark.favourited && ( )}
); }