zaphyra's git: domsonic

subsonic web-client

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 import { ref, computed, watch } from 'vue'

import type { Track } from '../types'

import { usePlayerStore } from '../store/player'

import { TrackList } from '../components/TrackList.vine'
import { 
  type ConfirmDialogExpose,
  ConfirmDialog
} from '../components/ConfirmDialog.vine'

export const PlayerQueueView = () => {
  const
    playerStore = usePlayerStore(),

    confirmDialog = ref<ConfirmDialogExpose | null>(null),

    tracks = computed(() => playerStore.queue),
    queueIndex = computed(() => playerStore.queueIndex),

    remove = (index: number) => playerStore.removeFromQueue(index),
    shuffle = () => playerStore.shuffleQueue(),
    play = (index: number) => {
      playerStore.setShuffle(false)

      if (index === queueIndex.value)
        return playerStore.playPause()

      return playerStore.playTrackListIndex(index)
    },

    clear = async () => {
      if (!confirmDialog.value)
        return

      const userConfirmed = await confirmDialog.value.open(
        'Clear queue',
        'Do you really want to clear the queue?'
      )

      if (!userConfirmed)
        return

      playerStore.clearQueue()
    }

  return vine`
    <div class="row">
      <span class="main-title flex-grow">
        <Icon icon="queue" />
        Player Queue
      </span>
      <button :disabled="!tracks.length" @click="play">
        <Icon icon="play" /> Play
      </button>
      <button :disabled="!tracks.length" @click="shuffle">
        <Icon icon="shuffle" /> Shuffle
      </button>
      <button :disabled="!tracks.length" @click="clear">
        <Icon icon="trash" /> Clear
      </button>
    </div>

    <TrackList
      v-if="tracks.length"
      :tracks="tracks"
      active-by="index"
      :show-image="true"
    >
      <template #actions="{ index }">
        <DropdownItem
          icon="trash"
          :disabled="index === queueIndex"
          @click="remove(index)"
        >
          Remove
        </DropdownItem>
      </template>
    </TrackList>
    <EmptyIndicator v-else />

    <Teleport to="#dialogBoxes">
      <ConfirmDialog ref="confirmDialog" />
    </Teleport>
  `;
}