"use client"; import { useEffect, useMemo, useState } from "react"; import { TrackByAlbum } from "./spotify-data"; import { api } from "@/trpc/react"; import { quantum } from "ldrs"; import { ring2 } from "ldrs"; import { pulsar } from "ldrs"; import Swiper from "./swiper"; import { SwiperSlide } from "swiper/react"; import AlbumImage from "./album-image"; pulsar.register(); ring2.register(); quantum.register(); export default function AlbumShowcase({ spookify, album, position, tracks, places, lastSpookyImageLoaded, setLastSpookyImageLoaded, }: TrackByAlbum & { spookify: boolean; places: number[]; lastSpookyImageLoaded: number; setLastSpookyImageLoaded: any; }) { const imageSource = album.images[0] ? album.images[0].url : "https://via.placeholder.com/150"; const [showSpookyImage, setShowSpookyImage] = useState(spookify); useEffect(() => { setShowSpookyImage(spookify); }, [spookify]); const entry = api.entry.get.useQuery( { type: "album", name: album.name, image: imageSource, }, { refetchInterval: false, refetchOnReconnect: false, refetchOnWindowFocus: false, }, ); const generateSpookyImage = api.entry.generate.useMutation(); const generateSecondSpookyImage = api.entry.generate.useMutation(); const spookyImageSource = useMemo(() => { const spookyImageMatch = ( (entry.data?.value || generateSpookyImage.data) as null | string )?.match(/]*>/); return spookyImageMatch && spookyImageMatch[1] ? spookyImageMatch[1] : ""; }, [entry.data, generateSpookyImage.data]); const secondEntry = api.entry.get.useQuery( { type: "album", name: album.name, image: spookyImageSource, number: 2, }, { refetchInterval: false, refetchOnReconnect: false, refetchOnWindowFocus: false, }, ); const handleGenerateSpookyImage = async () => { if (!entry.data && !entry.isLoading) { generateSpookyImage.mutate({ entry: { type: "album", name: album.name, image: imageSource, }, }); } }; const handleSecondGenerateSpookyImage = async () => { if (!secondEntry.data && !secondEntry.isLoading && spookyImageSource) { generateSecondSpookyImage.mutate({ entry: { type: "album", name: album.name, image: spookyImageSource, number: 2, }, }); } }; const saveImage = api.entry.save.useMutation(); const saveSecondImage = api.entry.save.useMutation(); useEffect(() => { handleGenerateSpookyImage(); }, [entry.data]); useEffect(() => { handleSecondGenerateSpookyImage(); }, [secondEntry.data, entry.data]); const secondSpookyImageMatch = ( (secondEntry.data?.value || generateSecondSpookyImage?.data || "") as string ).match(/]*>/); const secondSpookyImageSource = secondSpookyImageMatch && secondSpookyImageMatch[1] ? secondSpookyImageMatch[1] : ""; const firstPlace = places[0] || 0; const secondPlace = places[1] || 0; const firstImageError = !!(entry.error || generateSpookyImage.error); const secondImageError = !!( secondEntry.error || generateSecondSpookyImage.error ); return (
setShowSpookyImage(!showSpookyImage)} className="cursor-pointer *:select-none *:drag-none" > {showSpookyImage ? ( = firstPlace || lastSpookyImageLoaded + 1 === firstPlace : true) ) } onQueue={lastSpookyImageLoaded < firstPlace - 1} saveImage={saveImage} setLastSpookyImageLoaded={setLastSpookyImageLoaded} error={firstImageError} /> = secondPlace || lastSpookyImageLoaded + 1 === secondPlace : true) ) } onQueue={lastSpookyImageLoaded < secondPlace - 1} saveImage={saveSecondImage} setLastSpookyImageLoaded={setLastSpookyImageLoaded} error={secondImageError} /> ) : ( = firstPlace || lastSpookyImageLoaded + 1 === firstPlace : true) ) } onQueue={lastSpookyImageLoaded < firstPlace - 1} saveImage={saveImage} setLastSpookyImageLoaded={setLastSpookyImageLoaded} error={firstImageError} /> )}

{album.name}

    {tracks.map((track) => (
  • {track.name}
  • ))}
); }