diff --git a/components/LinkViews/CompactGridView.tsx b/components/LinkViews/CompactGridView.tsx index 55cec7b..f71ac5c 100644 --- a/components/LinkViews/CompactGridView.tsx +++ b/components/LinkViews/CompactGridView.tsx @@ -1,4 +1,4 @@ -import LinkCardCompact from "@/components/LinkViews/LinkCardCompact"; +import LinkCardCompact from "@/components/LinkViews/LinkComponents/LinkCardCompact"; import { LinkIncludingShortenedCollectionAndTags } from "@/types/global"; export default function CompactGridView({ diff --git a/components/LinkViews/LinkCardCompact.tsx b/components/LinkViews/LinkComponents/LinkCardCompact.tsx similarity index 64% rename from components/LinkViews/LinkCardCompact.tsx rename to components/LinkViews/LinkComponents/LinkCardCompact.tsx index 841e19a..2e6f60e 100644 --- a/components/LinkViews/LinkCardCompact.tsx +++ b/components/LinkViews/LinkComponents/LinkCardCompact.tsx @@ -5,7 +5,6 @@ import { import { useEffect, useState } from "react"; import useLinkStore from "@/store/links"; import useCollectionStore from "@/store/collections"; -import Link from "next/link"; import unescapeString from "@/lib/client/unescapeString"; import LinkActions from "@/components/LinkViews/LinkComponents/LinkActions"; import LinkDate from "@/components/LinkViews/LinkComponents/LinkDate"; @@ -47,36 +46,31 @@ export default function LinkCardCompact({ link, count, className }: Props) { }, [collections, links]); return ( -
-
-
-
- -
+
+
link.url && window.open(link.url || "", "_blank")} + className="flex items-center cursor-pointer p-3" + > +
+ +
- -
-
-

{count + 1}

-

- {unescapeString(link.name || link.description) || link.url} -

-
+
+

+ {unescapeString(link.name || link.description) || link.url} +

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

{shortendURL}

@@ -86,13 +80,9 @@ export default function LinkCardCompact({ link, count, className }: Props) {
)}
- -
- - · - -
- + · + +
diff --git a/components/LinkViews/LinkComponents/LinkIcon.tsx b/components/LinkViews/LinkComponents/LinkIcon.tsx index 49c9e1f..e9d08cb 100644 --- a/components/LinkViews/LinkComponents/LinkIcon.tsx +++ b/components/LinkViews/LinkComponents/LinkIcon.tsx @@ -12,34 +12,29 @@ export default function LinkIcon({ const url = isValidUrl(link.url || "") && link.url ? new URL(link.url) : undefined; - const iconClasses: string = "w-12 bg-primary/20 text-primary shadow rounded-md p-2 select-none z-10"; + const iconClasses: string = + "w-12 bg-primary/20 text-primary shadow rounded-md p-2 select-none z-10"; return (
- {link.url && url ? ( - { - const target = e.target as HTMLElement; - target.style.display = "none"; - }} - /> - ) : link.type === "pdf" ? ( - - ) : link.type === "image" ? ( - - ) : undefined} + {link.url && url ? ( + { + const target = e.target as HTMLElement; + target.style.display = "none"; + }} + /> + ) : link.type === "pdf" ? ( + + ) : link.type === "image" ? ( + + ) : undefined}
); } diff --git a/components/LinkViews/LinkComponents/LinkRow.tsx b/components/LinkViews/LinkComponents/LinkRow.tsx new file mode 100644 index 0000000..2c2f5c9 --- /dev/null +++ b/components/LinkViews/LinkComponents/LinkRow.tsx @@ -0,0 +1,92 @@ +import { + CollectionIncludingMembersAndLinkCount, + LinkIncludingShortenedCollectionAndTags, +} from "@/types/global"; +import { useEffect, useState } from "react"; +import useLinkStore from "@/store/links"; +import useCollectionStore from "@/store/collections"; +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"; + +type Props = { + link: LinkIncludingShortenedCollectionAndTags; + count: number; + className?: string; +}; + +export default function LinkCardCompact({ link, count, className }: Props) { + const { collections } = useCollectionStore(); + + const { links } = useLinkStore(); + + 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]); + + return ( +
+
link.url && window.open(link.url || "", "_blank")} + className="flex items-center cursor-pointer p-3" + > +
+ +
+ +
+

+ {unescapeString(link.name || link.description) || link.url} +

+ +
+
+ + · + {link.url ? ( +
{ + e.preventDefault(); + window.open(link.url || "", "_blank"); + }} + className="flex items-center hover:opacity-60 cursor-pointer duration-100" + > +

{shortendURL}

+
+ ) : ( +
+ {link.type} +
+ )} +
+ · + +
+
+
+ + +
+ ); +} diff --git a/components/LinkViews/LinkRow.tsx b/components/LinkViews/LinkRow.tsx deleted file mode 100644 index 9dcbe22..0000000 --- a/components/LinkViews/LinkRow.tsx +++ /dev/null @@ -1,172 +0,0 @@ -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"; -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"; - -type Props = { - link: LinkIncludingShortenedCollectionAndTags; - count: number; - className?: string; -}; - -export default function LinkRow({ 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 iconClasses: string = - "w-20 bg-white shadow p-1 bottom-3 right-3 select-none z-10"; - - return ( -
-
-
- - - - -
- -

- {unescapeString(link.name || link.description) || link.url} -

- - -
- - · - {link.url ? ( -
{ - e.preventDefault(); - window.open(link.url || "", "_blank"); - }} - className="flex items-center hover:opacity-60 cursor-pointer duration-100" - > -

{shortendURL}

-
- ) : ( -
- {link.type} -
- )} - · - -
-
-
-
- - -
- ); -} diff --git a/components/LinkViews/ListView.tsx b/components/LinkViews/ListView.tsx index 8dabb72..bb06327 100644 --- a/components/LinkViews/ListView.tsx +++ b/components/LinkViews/ListView.tsx @@ -1,4 +1,4 @@ -import LinkRow from "@/components/LinkViews/LinkRow"; +import LinkRow from "@/components/LinkViews/LinkComponents/LinkRow"; import { LinkIncludingShortenedCollectionAndTags } from "@/types/global"; export default function ListView({