import { AnimatePresence } from 'motion/react'; import { MouseEvent, useMemo, useState } from 'react'; import { Link } from 'react-router-dom'; import styles from './item-detail.module.css'; import { ItemCardControls } from '/@/renderer/components/item-card/item-card-controls'; import { useFastAverageColor } from '/@/renderer/hooks'; import { ActionIcon } from '/@/shared/components/action-icon/action-icon'; import { Badge } from '/@/shared/components/badge/badge'; import { Divider } from '/@/shared/components/divider/divider'; import { Group } from '/@/shared/components/group/group'; import { Image } from '/@/shared/components/image/image'; import { Rating } from '/@/shared/components/rating/rating'; import { Text } from '/@/shared/components/text/text'; import { Album, AlbumArtist, Artist, LibraryItem, Playlist, Song, } from '/@/shared/types/domain-types'; import { stringToColor } from '/@/shared/utils/string-to-color'; interface ItemDetailProps { data: Album | AlbumArtist | Artist | Playlist | Song | undefined; itemHeight: number; itemType: LibraryItem; onClick?: (e: MouseEvent, item: unknown, itemType: LibraryItem) => void; withControls?: boolean; } export const ItemDetail = ({ data, itemType, onClick, withControls }: ItemDetailProps) => { const imageUrl = getImageUrl(data); const [showControls, setShowControls] = useState(false); const { background } = useFastAverageColor({ algorithm: 'simple', src: imageUrl, srcLoaded: false, }); // const tags = [...(data?.genres ?? [])]; const tags = useMemo(() => { if (!data) { return []; } const items: { color?: string; id: string; isLight?: boolean; itemType: LibraryItem; name: string; }[] = []; if ('albumArtists' in data && Array.isArray(data.albumArtists)) { data.albumArtists?.forEach((tag: { id: string; name: string }) => { items.push({ id: tag.id, itemType: LibraryItem.ALBUM_ARTIST, name: tag.name }); }); } if ('genres' in data && Array.isArray(data.genres)) { data.genres?.forEach((tag: { id: string; itemType: LibraryItem; name: string }) => { const { color, isLight } = stringToColor(tag.name); items.push({ ...tag, color, isLight }); }); } // if ('tags' in data && typeof data.tags === 'object') { // console.log('data.tags :>> ', data.tags); // Object.entries(data.tags).forEach(([key, value]) => { // items.push({ id: key, itemType: LibraryItem.TAG, name: value }); // }); // } return items; }, [data]); return (
onClick?.(e, data, itemType)} style={{ backgroundColor: background }} >
withControls && setShowControls(true)} onMouseLeave={() => withControls && setShowControls(false)} > {data?.name} {withControls && showControls && }
{data?.name} {data && 'userRating' in data && ( )} {data && 'userFavorite' in data && ( )}
{tags.map((tag) => ( {tag.name} ))}
); }; const getImageUrl = (data: Album | AlbumArtist | Artist | Playlist | Song | undefined) => { if (data && 'imageUrl' in data) { return data.imageUrl || undefined; } return undefined; };