import { Card, CardContent, CardMedia, Typography, useMediaQuery, } from '@material-ui/core' import { makeStyles } from '@material-ui/core/styles' import { useTranslate } from 'react-admin' import { useCallback, useState, useEffect } from 'react' import Lightbox from 'react-image-lightbox' import 'react-image-lightbox/style.css' import { CollapsibleComment, DurationField, SizeField } from '../common' import subsonic from '../subsonic' const useStyles = makeStyles( (theme) => ({ root: { [theme.breakpoints.down('xs')]: { padding: '0.7em', minWidth: '20em', }, [theme.breakpoints.up('sm')]: { padding: '1em', minWidth: '32em', }, }, cardContents: { display: 'flex', }, details: { display: 'flex', flexDirection: 'column', }, content: { flex: '2 0 auto', }, coverParent: { [theme.breakpoints.down('xs')]: { height: '8em', width: '8em', minWidth: '8em', }, [theme.breakpoints.up('sm')]: { height: '10em', width: '10em', minWidth: '10em', }, [theme.breakpoints.up('lg')]: { height: '15em', width: '15em', minWidth: '15em', }, backgroundColor: 'transparent', display: 'flex', alignItems: 'center', justifyContent: 'center', }, cover: { objectFit: 'contain', cursor: 'pointer', display: 'block', width: '100%', height: '100%', backgroundColor: 'transparent', transition: 'opacity 0.3s ease-in-out', }, coverLoading: { opacity: 0.5, }, title: { whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', }, }), { name: 'NDPlaylistDetails', }, ) const PlaylistDetails = (props) => { const { record = {} } = props const translate = useTranslate() const classes = useStyles() const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('lg')) const [isLightboxOpen, setLightboxOpen] = useState(false) const [imageLoading, setImageLoading] = useState(false) const [imageError, setImageError] = useState(false) const imageUrl = subsonic.getCoverArtUrl(record, 300, true) const fullImageUrl = subsonic.getCoverArtUrl(record) // Reset image state when playlist changes useEffect(() => { setImageLoading(true) setImageError(false) }, [record.id]) const handleImageLoad = useCallback(() => { setImageLoading(false) setImageError(false) }, []) const handleImageError = useCallback(() => { setImageLoading(false) setImageError(true) }, []) const handleOpenLightbox = useCallback(() => { if (!imageError) { setLightboxOpen(true) } }, [imageError]) const handleCloseLightbox = useCallback(() => setLightboxOpen(false), []) return (
{record.name || translate('ra.page.loading')} {record.songCount ? ( {record.songCount}{' '} {translate('resources.song.name', { smart_count: record.songCount, })} {' · '} {' · '} ) : (   )}
{isLightboxOpen && !imageError && ( )}
) } export default PlaylistDetails