From bd0a42ded1439e718b716d4a6c5ba45260e84983 Mon Sep 17 00:00:00 2001 From: FifthWit Date: Mon, 2 Jun 2025 00:11:45 -0500 Subject: [PATCH] Added extra QoL features, a Share button, better mobile design, made it so you can actually scroll on larger movies where you normally couldn't and it'd overflow, lastly made it possible for the text to be highlighted on the detailsmodal --- src/components/overlays/DetailsModal.tsx | 75 +++++++++++++++++++++--- 1 file changed, 67 insertions(+), 8 deletions(-) diff --git a/src/components/overlays/DetailsModal.tsx b/src/components/overlays/DetailsModal.tsx index c0706bc3..8bf542d9 100644 --- a/src/components/overlays/DetailsModal.tsx +++ b/src/components/overlays/DetailsModal.tsx @@ -4,6 +4,7 @@ import { useEffect, useMemo, useRef, useState } from "react"; import { Helmet } from "react-helmet-async"; import { Trans } from "react-i18next"; import { Link } from "react-router-dom"; +import { useCopyToClipboard } from "react-use"; import { getMediaBackdrop, @@ -151,6 +152,8 @@ function DetailsContent({ const enableImageLogos = usePreferencesStore( (state) => state.enableImageLogos, ); + const [, copyToClipboard] = useCopyToClipboard(); + const [hasCopiedShare, setHasCopiedShare] = useState(false); const showProgress = useMemo(() => { if (!data.id) return null; @@ -423,8 +426,31 @@ function DetailsContent({ setShowEpisodeMenu(false); }; + const handleShareClick = () => { + const shareUrl = + data.type === "movie" + ? `${window.location.origin}/media/tmdb-movie-${data.id}-${data.title.toLowerCase().replace(/[^a-z0-9]+/g, "-")}` + : `${window.location.origin}/media/tmdb-tv-${data.id}-${data.title.toLowerCase().replace(/[^a-z0-9]+/g, "-")}`; + + copyToClipboard(shareUrl); + setHasCopiedShare(true); + setTimeout(() => setHasCopiedShare(false), 2000); + }; + return (
+ {/* Share notification popup */} + {hasCopiedShare && ( +
+
+ + + Link copied to clipboard! + +
+
+ )} + {/* Backdrop - Even taller */}
{imdbData?.trailer_url ? ( @@ -537,8 +563,8 @@ function DetailsContent({ )}
-
-
+
+
{!minimal && ( )} -
+
+
+ + {/* Genres on the right side of the button row for larger screens */} {data.genres && data.genres.length > 0 && ( -
+
{data.genres.map((genre, index) => ( + {/* Genres below for small screens */} + {data.genres && data.genres.length > 0 && ( +
+ {data.genres.map((genre, index) => ( + + {genre.name} + + ))} +
+ )} + {/* Two Column Layout - Stacked on Mobile */}
{/* Left Column - Description */} @@ -1097,7 +1156,7 @@ export function DetailsModal(props: { "group -m-[0.705em] rounded-3xl bg-background-main transition-colors duration-300 focus:relative focus:z-10", "max-h-[900px] max-w-[1200px]", "bg-mediaCard-hoverBackground bg-opacity-60 backdrop-filter backdrop-blur-lg shadow-lg overflow-hidden", - detailsData?.type === "movie" || props.minimal + props.minimal ? "h-[90%] md:h-[70%] lg:h-fit w-[90%] md:w-[70%] lg:w-[50%]" : "h-[90%] w-[90%] md:w-[70%] lg:w-[60%]", )} @@ -1109,17 +1168,17 @@ export function DetailsModal(props: { backgroundClass="bg-mediaCard-hoverBackground duration-100" className="rounded-3xl bg-background-main group-hover:opacity-100" /> - +
-
+
{isLoading || !detailsData ? ( ) : (