diff --git a/components/LinkCard.tsx b/components/LinkCard.tsx index a3c2d724..748cb2b0 100644 --- a/components/LinkCard.tsx +++ b/components/LinkCard.tsx @@ -18,7 +18,7 @@ import useModalStore from "@/store/modals"; import { faCalendarDays } from "@fortawesome/free-regular-svg-icons"; import usePermissions from "@/hooks/usePermissions"; import { toast } from "react-hot-toast"; -import isValidUrl from "@/lib/client/isValidUrl"; +import isValidUrl from "@/lib/shared/isValidUrl"; import Link from "next/link"; import unescapeString from "@/lib/client/unescapeString"; import { useRouter } from "next/router"; @@ -54,7 +54,7 @@ export default function LinkCard({ link, count, className }: Props) { let shortendURL; try { - shortendURL = new URL(link.url).host.toLowerCase(); + shortendURL = new URL(link.url || "").host.toLowerCase(); } catch (error) { console.log(error); } @@ -124,7 +124,8 @@ export default function LinkCard({ link, count, className }: Props) { setExpandDropdown(false); }; - const url = isValidUrl(link.url) ? new URL(link.url) : undefined; + const url = + isValidUrl(link.url || "") && link.url ? new URL(link.url) : undefined; const formattedDate = new Date(link.createdAt as string).toLocaleString( "en-US", @@ -230,7 +231,7 @@ export default function LinkCard({ link, count, className }: Props) { ) : undefined} */} { e.stopPropagation(); diff --git a/components/LinkPreview.tsx b/components/LinkPreview.tsx index c81e46e2..c07600ee 100644 --- a/components/LinkPreview.tsx +++ b/components/LinkPreview.tsx @@ -2,7 +2,7 @@ import { faFolder, faLink } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import Image from "next/image"; import { faCalendarDays } from "@fortawesome/free-regular-svg-icons"; -import isValidUrl from "@/lib/client/isValidUrl"; +import isValidUrl from "@/lib/shared/isValidUrl"; import A from "next/link"; import unescapeString from "@/lib/client/unescapeString"; import { Link } from "@prisma/client"; diff --git a/components/Modal/Link/AddOrEditLink.tsx b/components/Modal/Link/AddOrEditLink.tsx index 79f69793..207c2b9e 100644 --- a/components/Modal/Link/AddOrEditLink.tsx +++ b/components/Modal/Link/AddOrEditLink.tsx @@ -44,6 +44,7 @@ export default function AddOrEditLink({ activeLink || { name: "", url: "", + type: "", description: "", tags: [], screenshotPath: "", @@ -139,10 +140,10 @@ export default function AddOrEditLink({ {method === "UPDATE" ? (
- + {link.url}
@@ -153,7 +154,7 @@ export default function AddOrEditLink({

Address (URL)

setLink({ ...link, url: e.target.value })} placeholder="e.g. http://example.com/" /> diff --git a/components/PublicPage/PublicLinkCard.tsx b/components/PublicPage/PublicLinkCard.tsx index b31190ed..eeb03baf 100644 --- a/components/PublicPage/PublicLinkCard.tsx +++ b/components/PublicPage/PublicLinkCard.tsx @@ -2,7 +2,7 @@ import { faChevronRight } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import Image from "next/image"; import { Link as LinkType, Tag } from "@prisma/client"; -import isValidUrl from "@/lib/client/isValidUrl"; +import isValidUrl from "@/lib/shared/isValidUrl"; import unescapeString from "@/lib/client/unescapeString"; import { TagIncludingLinkCount } from "@/types/global"; import Link from "next/link"; @@ -17,7 +17,7 @@ type Props = { }; export default function LinkCard({ link, count }: Props) { - const url = isValidUrl(link.url) ? new URL(link.url) : undefined; + const url = link.url && isValidUrl(link.url) ? new URL(link.url) : undefined; const formattedDate = new Date( link.createdAt as unknown as string @@ -68,10 +68,10 @@ export default function LinkCard({ link, count }: Props) {

{formattedDate}

ยท

{url ? url.host : link.url} diff --git a/lib/client/isValidUrl.ts b/lib/shared/isValidUrl.ts similarity index 100% rename from lib/client/isValidUrl.ts rename to lib/shared/isValidUrl.ts diff --git a/pages/api/v1/links/[id]/archive/index.ts b/pages/api/v1/links/[id]/archive/index.ts index 1fce3ff1..6c82aede 100644 --- a/pages/api/v1/links/[id]/archive/index.ts +++ b/pages/api/v1/links/[id]/archive/index.ts @@ -2,6 +2,7 @@ import type { NextApiRequest, NextApiResponse } from "next"; import urlHandler from "@/lib/api/urlHandler"; import { prisma } from "@/lib/api/db"; import verifyUser from "@/lib/api/verifyUser"; +import isValidUrl from "@/lib/shared/isValidUrl"; const RE_ARCHIVE_LIMIT = Number(process.env.RE_ARCHIVE_LIMIT) || 5; @@ -41,7 +42,13 @@ export default async function links(req: NextApiRequest, res: NextApiResponse) { } minutes or create a new one.`, }); - urlHandler(link.id, link.url, user.id); + if (link.url && isValidUrl(link.url)) { + urlHandler(link.id, link.url, user.id); + return res.status(200).json({ + response: "Link is not a webpage to be archived.", + }); + } + return res.status(200).json({ response: "Link is being archived.", }); diff --git a/pages/links/[id].tsx b/pages/links/[id].tsx index a28b45d2..5ab22069 100644 --- a/pages/links/[id].tsx +++ b/pages/links/[id].tsx @@ -11,7 +11,7 @@ import Image from "next/image"; import ColorThief, { RGBColor } from "colorthief"; import { useTheme } from "next-themes"; import unescapeString from "@/lib/client/unescapeString"; -import isValidUrl from "@/lib/client/isValidUrl"; +import isValidUrl from "@/lib/shared/isValidUrl"; import DOMPurify from "dompurify"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faBoxesStacked, faFolder } from "@fortawesome/free-solid-svg-icons"; diff --git a/pages/public/links/[id].tsx b/pages/public/links/[id].tsx index 15aec435..5f774a69 100644 --- a/pages/public/links/[id].tsx +++ b/pages/public/links/[id].tsx @@ -11,7 +11,7 @@ import Image from "next/image"; import ColorThief, { RGBColor } from "colorthief"; import { useTheme } from "next-themes"; import unescapeString from "@/lib/client/unescapeString"; -import isValidUrl from "@/lib/client/isValidUrl"; +import isValidUrl from "@/lib/shared/isValidUrl"; import DOMPurify from "dompurify"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faBoxesStacked, faFolder } from "@fortawesome/free-solid-svg-icons";