nukeop/nuclear

View on GitHub
packages/app/app/components/TagView/index.js

Summary

Maintainability
A
2 hrs
Test Coverage
import React from 'react';
import { Dimmer, Loader } from 'semantic-ui-react';
import { withTranslation } from 'react-i18next';

import TagDescription from './TagDescription';
import TagHeader from './TagHeader';
import TagTopList from './TagTopList';
import TagTopTracks from './TagTopTracks';
import styles from './styles.scss';

@withTranslation('tags')
class TagView extends React.Component {
  constructor(props) {
    super(props);
  }

  componentDidMount () {
    this.props.loadTagInfo(this.props.tag);
  }

  artistInfoSearchByName (artistName) {
    this.props.artistInfoSearchByName(artistName, this.props.history);
  }


  albumInfoSearchByName (albumName) {
    this.props.albumInfoSearchByName(albumName, this.props.history);
  }

  renderTagHeader (tagInfo, topArtists) {
    const { tag } = this.props;
    return <TagHeader tag={tag} tagInfo={tagInfo} topArtists={topArtists} />;
  }

  renderTopArtists (topArtists) {
    return (
      <TagTopList
        topList={topArtists}
        onClick={this.artistInfoSearchByName.bind(this)}
        header={this.props.t('artists')}
      />
    );
  }

  renderTopAlbums (topAlbums) {
    return (
      <TagTopList
        topList={topAlbums}
        onClick={this.albumInfoSearchByName.bind(this)}
        header={this.props.t('albums')}
      />
    );
  }

  renderTagTopTracks (topTracks, addToQueue) {
    return (
      <TagTopTracks
        tracks={topTracks}
        addToQueue={addToQueue}
      />
    );
  }

  renderTopArtistsAndTopAlbums (topArtists, topAlbums) {
    return (
      <div className={styles.lists_container}>
        {this.renderTopArtists(topArtists)}
        {this.renderTopAlbums(topAlbums)}
      </div>
    );
  }

  renderDimmer () {
    const { tag, tags } = this.props;
    return (
      <Dimmer active={typeof tags[tag] === 'undefined' || tags[tag].loading}>
        <Loader />
      </Dimmer>
    );
  }

  render () {
    const { addToQueue, tag, tags } = this.props;
    let tagInfo, topTracks, topAlbums, topArtists;
    if (tags[tag] && tags[tag].loading !== true) {
      tagInfo = tags[tag][0];
      topTracks = tags[tag][1];
      topAlbums = tags[tag][2];
      topArtists = tags[tag][3];
    }
    return (
      <div className={styles.tag_view_container}>
        <Dimmer.Dimmable>
          {this.renderDimmer()}
          {typeof tags[tag] === 'undefined' || tags[tag].loading ? null : (
            <div className={styles.tag_view}>
              {this.renderTagHeader(tagInfo, topArtists)}
              <TagDescription tagInfo={tagInfo} />
              {this.renderTopArtistsAndTopAlbums(topArtists, topAlbums)}
              {this.renderTagTopTracks(topTracks, addToQueue)}
            </div>
          )}
        </Dimmer.Dimmable>
      </div>
    );
  }
}

export default TagView;