Files
navidrome/ui/src/artist/MobileArtistDetails.js
T

153 lines
4.1 KiB
JavaScript

import React, { useState } from 'react'
import { Typography, Collapse } from '@material-ui/core'
import { makeStyles } from '@material-ui/core/styles'
import Card from '@material-ui/core/Card'
import CardMedia from '@material-ui/core/CardMedia'
import config from '../config'
import { LoveButton, RatingField } from '../common'
import Lightbox from 'react-image-lightbox'
import subsonic from '../subsonic'
const useStyles = makeStyles(
(theme) => ({
root: {
display: 'flex',
background: ({ img }) => `url(${img})`,
},
bgContainer: {
display: 'flex',
height: '15rem',
width: '100vw',
padding: 'unset',
backdropFilter: 'blur(1px)',
backgroundPosition: '50% 30%',
background: `linear-gradient(to bottom, rgba(52 52 52 / 72%), rgba(21 21 21))`,
},
link: {
margin: '1px',
},
details: {
display: 'flex',
alignItems: 'flex-start',
flexDirection: 'column',
justifyContent: 'center',
marginLeft: '0.5rem',
},
biography: {
display: 'flex',
marginLeft: '3%',
marginRight: '3%',
marginTop: '-2em',
zIndex: '1',
'& p': {
whiteSpace: ({ expanded }) => (expanded ? 'unset' : 'nowrap'),
overflow: 'hidden',
width: '95vw',
textOverflow: 'ellipsis',
},
},
cover: {
width: 151,
boxShadow: '0px 0px 6px 0px #565656',
borderRadius: '5px',
},
artistImage: {
marginLeft: '1em',
maxHeight: '7rem',
backgroundColor: 'inherit',
marginTop: '4rem',
width: '7rem',
minWidth: '7rem',
display: 'flex',
borderRadius: '5em',
},
loveButton: {
top: theme.spacing(-0.2),
left: theme.spacing(0.5),
},
rating: {
marginTop: '5px',
},
artistName: {
wordBreak: 'break-word',
},
}),
{ name: 'NDMobileArtistDetails' }
)
const MobileArtistDetails = ({ artistInfo, biography, record }) => {
const img = subsonic.getCoverArtUrl(record)
const [expanded, setExpanded] = useState(false)
const classes = useStyles({ img, expanded })
const title = record.name
const [isLightboxOpen, setLightboxOpen] = React.useState(false)
const handleOpenLightbox = React.useCallback(() => setLightboxOpen(true), [])
const handleCloseLightbox = React.useCallback(
() => setLightboxOpen(false),
[]
)
return (
<>
<div className={classes.root}>
<div className={classes.bgContainer}>
<Card className={classes.artistImage}>
{artistInfo && (
<CardMedia
className={classes.cover}
image={subsonic.getCoverArtUrl(record, 300)}
onClick={handleOpenLightbox}
title={title}
/>
)}
</Card>
<div className={classes.details}>
<Typography
component="h5"
variant="h5"
className={classes.artistName}
>
{title}
<LoveButton
className={classes.loveButton}
record={record}
resource={'artist'}
size={'small'}
aria-label="love"
color="primary"
/>
</Typography>
{config.enableStarRating && (
<RatingField
record={record}
resource={'artist'}
size={'small'}
className={classes.rating}
/>
)}
</div>
</div>
</div>
<div className={classes.biography}>
<Collapse collapsedHeight={'1.5em'} in={expanded} timeout={'auto'}>
<Typography variant={'body1'} onClick={() => setExpanded(!expanded)}>
<span dangerouslySetInnerHTML={{ __html: biography }} />
</Typography>
</Collapse>
</div>
{isLightboxOpen && (
<Lightbox
imagePadding={50}
animationDuration={200}
imageTitle={record.name}
mainSrc={img}
onCloseRequest={handleCloseLightbox}
/>
)}
</>
)
}
export default MobileArtistDetails