import { CollectionIncludingMembersAndLinkCount, LinkIncludingShortenedCollectionAndTags, } from "@/types/global"; import { useEffect, useState } from "react"; import useLinkStore from "@/store/links"; import unescapeString from "@/lib/client/unescapeString"; import LinkActions from "@/components/LinkViews/LinkComponents/LinkActions"; import LinkDate from "@/components/LinkViews/LinkComponents/LinkDate"; import LinkCollection from "@/components/LinkViews/LinkComponents/LinkCollection"; import LinkIcon from "@/components/LinkViews/LinkComponents/LinkIcon"; import { isPWA } from "@/lib/client/utils"; import { generateLinkHref } from "@/lib/client/generateLinkHref"; import usePermissions from "@/hooks/usePermissions"; import toast from "react-hot-toast"; import LinkTypeBadge from "./LinkTypeBadge"; import { useTranslation } from "next-i18next"; import { useCollections } from "@/hooks/store/collections"; import { useUser } from "@/hooks/store/user"; import { useLinks } from "@/hooks/store/links"; import useLocalSettingsStore from "@/store/localSettings"; import LinkPin from "./LinkPin"; import { useRouter } from "next/router"; type Props = { link: LinkIncludingShortenedCollectionAndTags; count: number; className?: string; editMode?: boolean; }; export default function LinkCardCompact({ link, editMode }: Props) { const { t } = useTranslation(); const { data: collections = [] } = useCollections(); const { data: user = {} } = useUser(); const { setSelectedLinks, selectedLinks } = useLinkStore(); const { settings: { show }, } = useLocalSettingsStore(); const { links } = useLinks(); useEffect(() => { if (!editMode) { setSelectedLinks([]); } }, [editMode]); const handleCheckboxClick = ( link: LinkIncludingShortenedCollectionAndTags ) => { const linkIndex = selectedLinks.findIndex( (selectedLink) => selectedLink.id === link.id ); if (linkIndex !== -1) { const updatedLinks = [...selectedLinks]; updatedLinks.splice(linkIndex, 1); setSelectedLinks(updatedLinks); } else { setSelectedLinks([...selectedLinks, link]); } }; const [collection, setCollection] = useState( collections.find( (e) => e.id === link.collection.id ) as CollectionIncludingMembersAndLinkCount ); useEffect(() => { setCollection( collections.find( (e) => e.id === link.collection.id ) as CollectionIncludingMembersAndLinkCount ); }, [collections, links]); const permissions = usePermissions(collection?.id as number); const selectedStyle = selectedLinks.some( (selectedLink) => selectedLink.id === link.id ) ? "border border-primary bg-base-300" : "border-transparent"; const selectable = editMode && (permissions === true || permissions?.canCreate || permissions?.canDelete); const router = useRouter(); let isPublic = router.pathname.startsWith("/public") ? true : undefined; return ( <>
selectable ? handleCheckboxClick(link) : editMode ? toast.error(t("link_selection_error")) : undefined } >
!editMode && window.open(generateLinkHref(link, user), "_blank") } > {show.icon && (
)}
{show.name && (

{unescapeString(link.name)}

)}
{show.link && } {show.collection && ( )} {show.date && }
{!isPublic && }
); }