Skip to content
Snippets Groups Projects
PlayButton.vue 2 KiB
Newer Older
<template>
  <div :class="['ui', {'tiny': discrete}, 'buttons']">
    <button title="Add to current queue" @click="add" :class="['ui', {'mini': discrete}, {disabled: playableTracks.length === 0}, 'button']">
      <i class="ui play icon"></i>
      <template v-if="!discrete"><slot>Play</slot></template>
    </button>
    <div v-if="!discrete" class="ui floating dropdown icon button">
      <i class="dropdown icon"></i>
      <div class="menu">
        <div class="item"@click="add"><i class="plus icon"></i> Add to queue</div>
        <div class="item"@click="addNext()"><i class="step forward icon"></i> Play next</div>
        <div class="item"@click="addNext(true)"><i class="arrow down icon"></i> Play now</div>
      </div>
    </div>
  </div>
</template>

<script>
import logger from '@/logging'
import jQuery from 'jquery'

export default {
  props: {
    // we can either have a single or multiple tracks to play when clicked
    tracks: {type: Array, required: false},
    track: {type: Object, required: false},
    discrete: {type: Boolean, default: false}
  },
  created () {
    if (!this.track & !this.tracks) {
      logger.default.error('You have to provide either a track or tracks property')
    }
  },
  mounted () {
    if (!this.discrete) {
      jQuery(this.$el).find('.ui.dropdown').dropdown()
    }
  },
  computed: {
    playableTracks () {
      let tracks
        tracks = [this.track]
      return tracks.filter(e => {
        return e.files.length > 0
      })
    }
  },
  methods: {
    add () {
      this.$store.dispatch('queue/appendMany', {tracks: this.playableTracks})
      this.$store.dispatch('queue/appendMany', {tracks: this.playableTracks, index: this.$store.state.queue.currentIndex + 1})
        this.$store.dispatch('queue/next')
      }
    }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
i {
  cursor: pointer;
}
</style>