+
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({