import React from 'react'; import PropTypes from 'prop-types'; import { useMediaItem } from '../../utils/hooks/'; import { PositiveIntegerOrZero } from '../../utils/helpers/'; import { MediaDurationInfo } from '../../utils/classes/'; import { MediaPlaylistOptions } from '../media-playlist-options/MediaPlaylistOptions'; import { MediaItemDuration, MediaItemPlaylistIndex, itemClassname } from './includes/items/'; import { MediaItem } from './MediaItem'; export function MediaItemAudio(props) { const type = props.type; const [titleComponent, descriptionComponent, thumbnailUrl, UnderThumbWrapper, editMediaComponent, metaComponents, viewMediaComponent] = useMediaItem({ ...props, type }); const _MediaDurationInfo = new MediaDurationInfo(); _MediaDurationInfo.update(props.duration); const duration = _MediaDurationInfo.ariaLabel(); const durationStr = _MediaDurationInfo.toString(); const durationISO8601 = _MediaDurationInfo.ISO8601(); function thumbnailComponent() { const attr = { key: 'item-thumb', href: props.link, title: props.title, tabIndex: '-1', 'aria-hidden': true, className: 'item-thumb' + (!thumbnailUrl ? ' no-thumb' : ''), style: !thumbnailUrl ? null : { backgroundImage: "url('" + thumbnailUrl + "')" }, }; return ( {props.inPlaylistView ? null : ( )} ); } function playlistOrderNumberComponent() { return props.hidePlaylistOrderNumber ? null : ( ); } function playlistOptionsComponent() { let mediaId = props.link.split('=')[1]; mediaId = mediaId.split('&')[0]; return props.hidePlaylistOptions ? null : ( ); } const containerClassname = itemClassname( 'item ' + type + '-item', props.class_name.trim(), props.playlistOrder === props.playlistActiveItem ); const finalClassname = containerClassname + (props.showSelection ? ' with-selection' : '') + (props.isSelected ? ' selected' : '') + (props.hasAnySelection ? ' has-any-selection' : ''); const handleItemClick = (e) => { // If there's any selection active, clicking the item should toggle selection if (props.hasAnySelection && props.onCheckboxChange) { // Check if clicking on the checkbox itself, edit icon, or view icon if (e.target.closest('.item-selection-checkbox') || e.target.closest('.item-edit-icon') || e.target.closest('.item-view-icon')) { return; // Let these elements handle their own clicks } // Prevent all other clicks and toggle selection e.preventDefault(); e.stopPropagation(); props.onCheckboxChange({ target: { checked: !props.isSelected } }); } }; return (
{playlistOrderNumberComponent()}
{props.showSelection && (
e.stopPropagation()}> { props.onCheckboxChange && props.onCheckboxChange(e); }} onClick={(e) => e.stopPropagation()} aria-label="Select media" />
)} {editMediaComponent()} {viewMediaComponent()} {thumbnailComponent()} {titleComponent()} {metaComponents()} {descriptionComponent()} {playlistOptionsComponent()}
); } MediaItemAudio.propTypes = { ...MediaItem.propTypes, type: PropTypes.string.isRequired, duration: PositiveIntegerOrZero, hidePlaylistOptions: PropTypes.bool, hasMediaViewer: PropTypes.bool, hasMediaViewerDescr: PropTypes.bool, playlist_id: PropTypes.string, }; MediaItemAudio.defaultProps = { ...MediaItem.defaultProps, type: 'audio', duration: 0, hidePlaylistOptions: true, hasMediaViewer: false, hasMediaViewerDescr: false, };