import { CollectionIncludingMembersAndLinkCount, LinkIncludingShortenedCollectionAndTags, } from "@/types/global"; import { faFolder, faEllipsis, faLink, } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useEffect, useState } from "react"; import Image from "next/image"; import useLinkStore from "@/store/links"; import useCollectionStore from "@/store/collections"; import useAccountStore from "@/store/account"; import { faCalendarDays, faFileImage, faFilePdf, } from "@fortawesome/free-regular-svg-icons"; import usePermissions from "@/hooks/usePermissions"; import { toast } from "react-hot-toast"; import isValidUrl from "@/lib/shared/isValidUrl"; import Link from "next/link"; import unescapeString from "@/lib/client/unescapeString"; import { useRouter } from "next/router"; import EditLinkModal from "./ModalContent/EditLinkModal"; import DeleteLinkModal from "./ModalContent/DeleteLinkModal"; import ExpandedLink from "./ModalContent/ExpandedLink"; import PreservedFormatsModal from "./ModalContent/PreservedFormatsModal"; type Props = { link: LinkIncludingShortenedCollectionAndTags; count: number; className?: string; }; export default function LinkCard({ link, count, className }: Props) { const router = useRouter(); const permissions = usePermissions(link.collection.id as number); const { collections } = useCollectionStore(); const { links } = useLinkStore(); const { account } = useAccountStore(); let shortendURL; try { shortendURL = new URL(link.url || "").host.toLowerCase(); } catch (error) { console.log(error); } 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 { removeLink, updateLink } = useLinkStore(); const pinLink = async () => { const isAlreadyPinned = link?.pinnedBy && link.pinnedBy[0]; const load = toast.loading("Applying..."); const response = await updateLink({ ...link, pinnedBy: isAlreadyPinned ? undefined : [{ id: account.id }], }); toast.dismiss(load); response.ok && toast.success(`Link ${isAlreadyPinned ? "Unpinned!" : "Pinned!"}`); }; const deleteLink = async () => { const load = toast.loading("Deleting..."); const response = await removeLink(link.id as number); toast.dismiss(load); response.ok && toast.success(`Link Deleted.`); }; const url = isValidUrl(link.url || "") && link.url ? new URL(link.url) : undefined; const formattedDate = new Date(link.createdAt as string).toLocaleString( "en-US", { year: "numeric", month: "short", day: "numeric", } ); const [editLinkModal, setEditLinkModal] = useState(false); const [deleteLinkModal, setDeleteLinkModal] = useState(false); const [preservedFormatsModal, setPreservedFormatsModal] = useState(false); const [expandedLink, setExpandedLink] = useState(false); return (
{permissions === true || permissions?.canUpdate || permissions?.canDelete ? (
    {permissions === true ? (
  • { (document?.activeElement as HTMLElement)?.blur(); pinLink(); }} > {link?.pinnedBy && link.pinnedBy[0] ? "Unpin" : "Pin to Dashboard"}
  • ) : undefined} {permissions === true || permissions?.canUpdate ? (
  • { (document?.activeElement as HTMLElement)?.blur(); setEditLinkModal(true); }} > Edit
  • ) : undefined} {permissions === true ? (
  • { (document?.activeElement as HTMLElement)?.blur(); setPreservedFormatsModal(true); // updateArchive(); }} > Preserved Formats
  • ) : undefined} {permissions === true || permissions?.canDelete ? (
  • { (document?.activeElement as HTMLElement)?.blur(); e.shiftKey ? deleteLink() : setDeleteLinkModal(true); }} > Delete
  • ) : undefined}
) : undefined} router.push("/links/" + link.id) // // setExpandedLink(true) // } className="flex flex-col justify-between cursor-pointer h-full w-full gap-1 p-3" > {link.url && url ? ( { const target = e.target as HTMLElement; target.style.display = "none"; }} /> ) : link.type === "pdf" ? ( ) : link.type === "image" ? ( ) : undefined}

{count + 1}

{unescapeString(link.name || link.description) || shortendURL}

{link.url ? (
{ e.preventDefault(); window.open(link.url || "", "_blank"); }} className="flex items-center gap-1 max-w-full w-fit text-neutral hover:opacity-60 duration-100" >

{shortendURL}

) : (
{link.type}
)}
{ e.preventDefault(); router.push(`/collections/${link.collection.id}`); }} className="flex items-center gap-1 max-w-full w-fit hover:opacity-70 duration-100" >

{collection?.name}

{formattedDate}

{/* {link.tags[0] ? (
{link.tags.map((e, i) => ( { e.stopPropagation(); }} className="btn btn-xs btn-ghost truncate max-w-[19rem]" > #{e.name} ))}
) : (

No Tags

)} */} {editLinkModal ? ( setEditLinkModal(false)} activeLink={link} /> ) : undefined} {deleteLinkModal ? ( setDeleteLinkModal(false)} activeLink={link} /> ) : undefined} {preservedFormatsModal ? ( setPreservedFormatsModal(false)} activeLink={link} /> ) : undefined} {/* {expandedLink ? ( setExpandedLink(false)} link={link} /> ) : undefined} */}
); }