import React, { useState } from 'react' import PropTypes from 'prop-types' import { useDispatch } from 'react-redux' import { useTranslate } from 'react-admin' import { IconButton, Menu, MenuItem } from '@material-ui/core' import { makeStyles } from '@material-ui/core/styles' import MoreVertIcon from '@material-ui/icons/MoreVert' import { addTracks, setTrack } from '../audioplayer' import { openAddToPlaylist } from '../dialogs/dialogState' import subsonic from '../subsonic' import StarButton from './StarButton' const useStyles = makeStyles({ noWrap: { whiteSpace: 'nowrap', }, menu: { visibility: (props) => (props.visible ? 'visible' : 'hidden'), }, }) const SongContextMenu = ({ resource, record, showStar, onAddToPlaylist, visible, }) => { const classes = useStyles({ visible }) const dispatch = useDispatch() const translate = useTranslate() const [anchorEl, setAnchorEl] = useState(null) const options = { playNow: { label: 'resources.song.actions.playNow', action: (record) => dispatch(setTrack(record)), }, addToQueue: { label: 'resources.song.actions.addToQueue', action: (record) => dispatch(addTracks({ [record.id]: record })), }, addToPlaylist: { label: 'resources.song.actions.addToPlaylist', action: (record) => dispatch( openAddToPlaylist({ selectedIds: [record.mediaFileId || record.id], onSuccess: (id) => onAddToPlaylist(id), }) ), }, download: { label: 'resources.song.actions.download', action: (record) => subsonic.download(record.id), }, } const handleClick = (e) => { setAnchorEl(e.currentTarget) e.stopPropagation() } const handleClose = (e) => { setAnchorEl(null) e.stopPropagation() } const handleItemClick = (e) => { e.preventDefault() setAnchorEl(null) const key = e.target.getAttribute('value') options[key].action(record) e.stopPropagation() } const open = Boolean(anchorEl) return ( {showStar && ( )} {Object.keys(options).map((key) => ( {translate(options[key].label)} ))} ) } SongContextMenu.propTypes = { resource: PropTypes.string, record: PropTypes.object, onAddToPlaylist: PropTypes.func, visible: PropTypes.bool, showStar: PropTypes.bool, } SongContextMenu.defaultProps = { onAddToPlaylist: () => {}, visible: true, showStar: true, addLabel: true, } export default SongContextMenu