feature/share-libs
tsx 51 lines 1.42 KB
Raw
1 import { SongProvider } from "@/models/song-response";
2 import clsx from "clsx";
3 import { useRouter } from "next/navigation";
4 import Image from "next/image";
5
6 export enum SongProviderPath {
7 PLAY = "play",
8 SPLIT = "split",
9 }
10
11 // duplicate skeleton-card.tsx
12 export function SongProviderCard({
13 songProvider,
14 path,
15 }: {
16 songProvider: SongProvider;
17 path: SongProviderPath;
18 }) {
19 const router = useRouter();
20 let queryString = `songProviderId=${songProvider.id}`;
21 if (path === SongProviderPath.PLAY && songProvider.audio_file) {
22 queryString = `audioFileId=${songProvider.audio_file.id}`;
23 }
24 const thumbnailView = songProvider.image_url ? (
25 <Image
26 src={songProvider.image_url}
27 alt={songProvider.name}
28 width="0"
29 height="0"
30 sizes="100vw"
31 className="w-full h-auto aspect-video"
32 />
33 ) : (
34 <div className="h-14 rounded-lg bg-gray-700" />
35 );
36
37 return (
38 <button
39 className={clsx("rounded-2xl bg-gray-900/80 p-4", {
40 "relative overflow-hidden before:absolute before:inset-0 before:-translate-x-full before:animate-[shimmer_1.5s_infinite] before:bg-gradient-to-r before:from-transparent before:via-white/10 before:to-transparent":
41 false,
42 })}
43 onClick={() => router.push(`/${path}?${queryString}`)}
44 >
45 <div className="space-y-3">
46 {thumbnailView}
47 <h3 className="w-11/12">{songProvider.name}</h3>
48 </div>
49 </button>
50 );
51 };