From 9fad47fc6556f7fa769fcd1140809641bd593b62 Mon Sep 17 00:00:00 2001 From: m4x809 Date: Sat, 25 Oct 2025 03:26:25 +0200 Subject: [PATCH] Refactor TrackCard and TrackModal components for improved functionality and styling - Replaced hash-based modal opening in TrackCard with state management for better control. - Integrated TrackModal into TrackCard, allowing for direct interaction and improved user experience. - Updated TrackModal to accept props for track data and theme, enhancing its reusability. - Refined styling in both components to maintain visual consistency with dynamic theming. --- src/Components/TrackCard.tsx | 187 ++++++++++++++++--------------- src/Components/TrackModal.tsx | 120 ++++++++++---------- src/app/album/[albumId]/page.tsx | 3 - src/lib/list.ts | 6 - 4 files changed, 155 insertions(+), 161 deletions(-) diff --git a/src/Components/TrackCard.tsx b/src/Components/TrackCard.tsx index 29cf212..c30c35b 100644 --- a/src/Components/TrackCard.tsx +++ b/src/Components/TrackCard.tsx @@ -4,7 +4,7 @@ import { Card, Group, Text, Badge, Box } from "@mantine/core"; import { useState } from "react"; import type { AlbumTheme } from "@/lib/themes"; import type { Track } from "@/lib/ListTypes"; -import { useHash } from "@mantine/hooks"; +import TrackModal from "./TrackModal"; interface TrackCardProps { track: Track; @@ -14,100 +14,103 @@ interface TrackCardProps { export default function TrackCard({ track, index, theme }: TrackCardProps) { const [isHovered, setIsHovered] = useState(false); - const [_hash, setHash] = useHash(); + const [modalOpened, setModalOpened] = useState(false); return ( - setHash(`trackModal_${track.id}`)} - className="backdrop-blur-sm transition-all duration-300" - style={{ - background: isHovered ? theme.card.backgroundHover : theme.card.background, - border: `1px solid ${isHovered ? theme.border.light : theme.card.border}`, - cursor: "pointer", - // transform: isHovered ? "translateY(-2px)" : "translateY(0)", - boxShadow: isHovered ? `0 8px 24px ${theme.primary.DEFAULT}30` : "none", - }} - onMouseEnter={() => setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} - > - - - - {index + 1} - - - {track.label} - - - - - - {track.studioUrl && ( - - Studio - - )} - {track.emilyLive && ( - - Emily Live - - )} - {track.lpLive && ( - - LP Live - - )} + <> + setModalOpened(true)} + className="backdrop-blur-sm transition-all duration-300" + style={{ + background: isHovered ? theme.card.backgroundHover : theme.card.background, + border: `1px solid ${isHovered ? theme.border.light : theme.card.border}`, + cursor: "pointer", + // transform: isHovered ? "translateY(-2px)" : "translateY(0)", + boxShadow: isHovered ? `0 8px 24px ${theme.primary.DEFAULT}30` : "none", + }} + onMouseEnter={() => setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + > + + + + {index + 1} + + + {track.label} + + + + + + {track.studioUrl && ( + + Studio + + )} + {track.emilyLive && ( + + Emily Live + + )} + {track.lpLive && ( + + LP Live + + )} + + + {track.duration} + - - {track.duration} - - - + + setModalOpened(false)} track={track} theme={theme} /> + ); } diff --git a/src/Components/TrackModal.tsx b/src/Components/TrackModal.tsx index e5b19ce..245cb41 100644 --- a/src/Components/TrackModal.tsx +++ b/src/Components/TrackModal.tsx @@ -1,72 +1,53 @@ "use client"; -import { albums } from "@/lib/list"; import { getSongLink } from "@/lib/songLinks"; -import { getThemeColors } from "@/lib/themes"; -import { faApple, faSpotify, faYoutube, faYoutubeSquare, IconDefinition } from "@fortawesome/free-brands-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import type { AlbumTheme } from "@/lib/themes"; +import type { Track } from "@/lib/ListTypes"; import { - ActionIcon, - Anchor, - Box, - Divider, - Grid, - GridCol, - Group, - Modal, - Stack, - Text, - Title, - Tooltip, -} from "@mantine/core"; -import { useDisclosure, useHash } from "@mantine/hooks"; + faApple, + faSpotify, + faYoutube, + faYoutubeSquare, + type IconDefinition, +} from "@fortawesome/free-brands-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { ActionIcon, Box, Divider, Grid, GridCol, Group, Modal, Stack, Text, Title, Tooltip } from "@mantine/core"; import Link from "next/link"; -export default function TrackModal() { - const [hash, setHash] = useHash(); - console.log("🚀 ~ TrackModal.tsx:8 ~ TrackModal ~ hash:", hash); - const close = () => { - setHash(""); - }; +interface TrackModalProps { + opened: boolean; + onClose: () => void; + track: Track; + theme: AlbumTheme; +} - const album = albums.find((album) => { - return album.id === hash.split("_")[1]; - }); - const track = album?.tracks.find((track) => { - return track.id === `${hash.split("_")[1]}_${hash.split("_")[2]}`; - }); - - const songLink = getSongLink(track?.id || ""); - console.log("🚀 ~ TrackModal.tsx:25 ~ TrackModal ~ songLink:", songLink); - - const theme = getThemeColors(album?.id || ""); +export default function TrackModal({ opened, onClose, track, theme }: TrackModalProps) { + const songLink = getSongLink(track.id); return ( - {track?.label} - Studio Version} /> + {track.label} + + Studio Version + + } + /> 0 ? Object.keys(songLink).length : 4}> {songLink && Object.entries(songLink).map(([key, value]) => { @@ -113,11 +94,12 @@ export default function TrackModal() { return ( - {Array.isArray(track?.emilyLive) && ( + {Array.isArray(track.emilyLive) && ( <> - Fan Live Versions} /> + + Fan Live Versions + + } + /> - {track.emilyLive.map((live, idx) => ( + {track.emilyLive.map((live) => ( @@ -148,6 +138,7 @@ export default function TrackModal() { )} - {track?.lpLive && ( + {track.lpLive && ( <> - Linkin Park Live Versions} /> + + Linkin Park Live Versions + + } + /> - {new Date(track?.lpLive.date).toLocaleDateString("en-US", { + {new Date(track.lpLive.date).toLocaleDateString("en-US", { year: "numeric", month: "long", day: "numeric", })} - {track?.lpLive.location} + {track.lpLive.location} diff --git a/src/app/album/[albumId]/page.tsx b/src/app/album/[albumId]/page.tsx index 38dec3f..116525f 100644 --- a/src/app/album/[albumId]/page.tsx +++ b/src/app/album/[albumId]/page.tsx @@ -4,7 +4,6 @@ import { albums } from "../../../lib/list"; import BackButton from "../../../Components/BackButton"; import { getThemeColors } from "@/lib/themes"; import TrackCard from "@/Components/TrackCard"; -import TrackModal from "@/Components/TrackModal"; export function generateStaticParams() { return albums.map((album) => ({ @@ -46,7 +45,6 @@ export default async function AlbumDetail({ params }: { params: Promise<{ albumI viewTransitionName: `album-card-background-${album.id}`, }} > - {/* Back Button */} @@ -57,7 +55,6 @@ export default async function AlbumDetail({ params }: { params: Promise<{ albumI style={{ border: `3px solid ${theme.border.light}`, borderRadius: "8px", - padding: "4px", background: theme.background.secondary, boxShadow: `0 8px 32px ${theme.primary.DEFAULT}40`, viewTransitionName: `album-card-image-${album.id}`, diff --git a/src/lib/list.ts b/src/lib/list.ts index ec728cb..779df4c 100644 --- a/src/lib/list.ts +++ b/src/lib/list.ts @@ -22,12 +22,6 @@ export const albums: Album[] = [ location: "Austin, Texas, USA", author: "Erynn Halvorson", }, - { - url: "https://youtu.be/miQ9Y5UW08dasdasdg", - date: "2025-04-26", - location: "Austin, Texas, USdasdsaA", - author: "Erynn Halvorson", - }, ], lpLive: { url: "https://www.youtube.com/watch?v=DOKcCl6iKaA",