Skip to content
Snippets Groups Projects
PlayButton.vue 2 KiB
Newer Older
  • Learn to ignore specific revisions
  • <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>