"use client"; import Image from "next/image"; import Link from "next/link"; import { useUserSettings } from "@/lib/userSettings"; import type { ZBookmarkTypeLink } from "@karakeep/shared/types/bookmarks"; import { getBookmarkLinkImageUrl, getBookmarkTitle, getSourceUrl, isBookmarkStillCrawling, } from "@karakeep/shared/utils/bookmarkUtils"; import { BookmarkLayoutAdaptingCard } from "./BookmarkLayoutAdaptingCard"; import FooterLinkURL from "./FooterLinkURL"; const useOnClickUrl = (bookmark: ZBookmarkTypeLink) => { const userSettings = useUserSettings(); return { urlTarget: userSettings.bookmarkClickAction === "open_original_link" ? ("_blank" as const) : ("_self" as const), onClickUrl: userSettings.bookmarkClickAction === "expand_bookmark_preview" ? `/dashboard/preview/${bookmark.id}` : bookmark.content.url, }; }; function LinkTitle({ bookmark }: { bookmark: ZBookmarkTypeLink }) { const { onClickUrl, urlTarget } = useOnClickUrl(bookmark); const parsedUrl = new URL(bookmark.content.url); return ( {getBookmarkTitle(bookmark) ?? parsedUrl.host} ); } function LinkImage({ bookmark, className, }: { bookmark: ZBookmarkTypeLink; className?: string; }) { const { onClickUrl, urlTarget } = useOnClickUrl(bookmark); const link = bookmark.content; const imgComponent = (url: string, unoptimized: boolean) => ( card banner ); const imageDetails = getBookmarkLinkImageUrl(link); let img: React.ReactNode; if (isBookmarkStillCrawling(bookmark)) { img = imgComponent("/blur.avif", false); } else if (imageDetails) { img = imgComponent(imageDetails.url, !imageDetails.localAsset); } else { // No image found // A dummy white pixel for when there's no image. img = imgComponent( "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUGFdj+P///38ACfsD/QVDRcoAAAAASUVORK5CYII=", true, ); } return (
{img}
); } export default function LinkCard({ bookmark: bookmarkLink, className, }: { bookmark: ZBookmarkTypeLink; className?: string; }) { return ( } footer={} bookmark={bookmarkLink} wrapTags={false} image={(_layout, className) => ( )} className={className} /> ); }