All files / track-lists track.jsx

95% Statements 19/20
68.42% Branches 13/19
100% Functions 2/2
95% Lines 19/20

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131                                4x                 11x     11x 11x 11x 11x   11x                 4x                   4x                                           4x               11x 11x 11x 11x 11x   11x           11x                             4x             4x                            
import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
 
import { formatTrackArtist, formatTrackTitle } from './track-utils';
 
/**
 * Creates the track title to display based on track object
 *
 * @param { string } name
 * @param { string } title
 * @param { string } artist
 * @param { string } creator
 * @param { boolean } isAlbum
 *
 * @return { react fragment } trackTitle
 */
const TrackTitle = ({
  name: fileName,
  title,
  albumCreator,
  albumName,
  creator,
  artist,
  isAlbum
}) => {
  Iif (isAlbum) {
    return 'Full album';
  }
  const trackArtist = creator || artist;
  const displayArtist = formatTrackArtist(trackArtist, albumCreator, albumName);
  const titleArtistDelimiter = displayArtist ? ' - ' : null;
  const artistName = displayArtist ? <i className="track-artist">{displayArtist}</i> : null;
 
  return (
    <Fragment>
      {formatTrackTitle(title, fileName)}
      {titleArtistDelimiter}
      {artistName}
    </Fragment>
  );
};
 
TrackTitle.defaultProps = {
  name: '',
  title: '',
  albumCreator: '',
  albumName: '',
  creator: '',
  artist: '',
  isAlbum: false
};
 
TrackTitle.propTypes = {
  name: PropTypes.string,
  title: PropTypes.string,
  albumCreator: PropTypes.oneOfType([
    PropTypes.string,
    PropTypes.shape([])
  ]),
  albumName: PropTypes.string,
  creator: PropTypes.string,
  artist: PropTypes.string,
  isAlbum: PropTypes.bool
};
 
/**
 * Draws track info as button
 *
 * @param bool selected
 * @param function onSelected
 * @param object track
 *
 * @return component
 */
const OneTrack = ({
  selected,
  onSelected,
  thisTrack,
  displayTrackNumbers,
  albumCreator,
  albumName
}) => {
  const { trackNumber, length, formattedLength } = thisTrack;
  const trackProps = { ...thisTrack, albumCreator, albumName };
  const track = parseInt(trackNumber, 10);
  const displayNumber = track > 0 ? track : '-';
  const displayLength = formattedLength || length || '-- : --';
 
  const trackButtonClass = [
    selected ? 'selected' : '',
    'track',
    displayTrackNumbers ? '' : 'no-track-number'
  ].join(' ').trim();
 
  return (
    <button
      type="button"
      data-track-number={trackNumber || 0}
      className={trackButtonClass}
      onClick={onSelected}
      data-event-click-tracking="TrackList|Item"
    >
      <span className="track-number">{displayNumber}</span>
      <span className="track-title"><TrackTitle {...trackProps} /></span>
      <span className="track-length">{displayLength}</span>
    </button>
  );
};
 
OneTrack.defaultProps = {
  selected: false,
  displayTrackNumbers: false,
  albumCreator: '',
  albumName: ''
};
 
OneTrack.propTypes = {
  selected: PropTypes.bool,
  onSelected: PropTypes.func.isRequired,
  thisTrack: PropTypes.shape({}).isRequired,
  displayTrackNumbers: PropTypes.bool,
  albumCreator: PropTypes.oneOfType([
    PropTypes.string,
    PropTypes.array
  ]),
  albumName: PropTypes.string,
  trackIdx: PropTypes.number
};
 
export default OneTrack;