import React from 'react'
import PropTypes from 'prop-types'
import { Link } from 'react-admin'
import { withWidth } from '@material-ui/core'
import { useGetHandleArtistClick } from './useGetHandleArtistClick'
import { intersperse } from '../utils/index.js'
import { useDispatch } from 'react-redux'
import { closeExtendedInfoDialog } from '../actions/dialogs.js'
const ALink = withWidth()((props) => {
const { artist, width, ...rest } = props
const artistLink = useGetHandleArtistClick(width)
const dispatch = useDispatch()
return (
{
e.stopPropagation()
dispatch(closeExtendedInfoDialog())
}}
{...rest}
>
{artist.name}
)
})
const parseAndReplaceArtists = (
displayAlbumArtist,
albumArtists,
className,
) => {
let result = []
let lastIndex = 0
albumArtists?.forEach((artist) => {
const index = displayAlbumArtist.indexOf(artist.name, lastIndex)
if (index !== -1) {
// Add text before the artist name
if (index > lastIndex) {
result.push(displayAlbumArtist.slice(lastIndex, index))
}
// Add the artist link
result.push()
lastIndex = index + artist.name.length
}
})
if (lastIndex === 0) {
return []
}
// Add any remaining text after the last artist name
if (lastIndex < displayAlbumArtist.length) {
result.push(displayAlbumArtist.slice(lastIndex))
}
return result
}
export const ArtistLinkField = ({ record, className, limit, source }) => {
const role = source.toLowerCase()
const artists = record['participants']
? record['participants'][role]
: [{ name: record[source], id: record[source + 'Id'] }]
// When showing artists for a track, add any remixers to the list of artists
if (
role === 'artist' &&
record['participants'] &&
record['participants']['remixer']
) {
record['participants']['remixer'].forEach((remixer) => {
artists.push(remixer)
})
}
if (role === 'albumartist') {
const artistsLinks = parseAndReplaceArtists(
record[source],
artists,
className,
)
if (artistsLinks.length > 0) {
return
{artistsLinks}
}
}
// Dedupe artists, only shows the first 3
const seen = new Set()
const dedupedArtists = []
let limitedShow = false
for (const artist of artists ?? []) {
if (!seen.has(artist.id)) {
seen.add(artist.id)
if (dedupedArtists.length < limit) {
dedupedArtists.push(artist)
} else {
limitedShow = true
break
}
}
}
const artistsList = dedupedArtists.map((artist) => (
))
if (limitedShow) {
artistsList.push(...)
}
return <>{intersperse(artistsList, ' • ')}>
}
ArtistLinkField.propTypes = {
limit: PropTypes.number,
record: PropTypes.object,
className: PropTypes.string,
source: PropTypes.string,
}
ArtistLinkField.defaultProps = {
addLabel: true,
limit: 3,
source: 'albumArtist',
}