@@ -141,7 +253,7 @@
href=""
:aria-label="labels.restart"
class="left floated timer discrete start"
- @click.prevent="setCurrentTime(0)"
+ @click.prevent="emit('touch-progress', 0)"
>{{ currentTimeFormatted }}
{{ durationFormatted }}
@@ -154,11 +266,11 @@
@@ -169,7 +281,7 @@
:title="labels.play"
:aria-label="labels.play"
class="control"
- @click.prevent.stop="resumePlayback"
+ @click.prevent.stop="resume"
>
@@ -179,7 +291,7 @@
:title="labels.pause"
:aria-label="labels.pause"
class="control"
- @click.prevent.stop="pausePlayback"
+ @click.prevent.stop="pause"
>
@@ -189,7 +301,7 @@
:aria-label="labels.next"
class="control"
:disabled="hasNext || null"
- @click.prevent.stop="$store.dispatch('queue/next')"
+ @click.prevent.stop="next"
>
@@ -211,7 +323,7 @@
-
diff --git a/front/src/components/audio/Player.vue b/front/src/components/audio/Player.vue
index 73b87ab9f..047d5b72a 100644
--- a/front/src/components/audio/Player.vue
+++ b/front/src/components/audio/Player.vue
@@ -334,6 +334,7 @@ import onKeyboardShortcut from '~/composables/onKeyboardShortcut'
import { useThrottleFn, useTimeoutFn, useToggle } from '@vueuse/core'
import { computed, watch } from 'vue'
import { useGettext } from 'vue3-gettext'
+import useQueue from '~/composables/useQueue'
export default {
components: {
@@ -357,17 +358,7 @@ export default {
store.commit('ui/queueFocused', ['queue', 'player'].indexOf(store.state.ui.queueFocused) > -1 ? null : 'player')
}
- const shuffledMessage = $pgettext('Content/Queue/Message', 'Queue shuffled!')
- const shuffle = useThrottleFn(() => {
- if (queueIsEmpty.value) return
- useTimeoutFn(async () => {
- await store.dispatch('queue/shuffle')
- store.commit('ui/addMessage', {
- content: shuffledMessage,
- date: new Date()
- })
- }, 100)
- }, 101, false)
+ const { shuffle } = useQueue()
const seek = (step) => {
if (step > 0) {
diff --git a/front/src/composables/usePlayer.ts b/front/src/composables/usePlayer.ts
new file mode 100644
index 000000000..4791efcc4
--- /dev/null
+++ b/front/src/composables/usePlayer.ts
@@ -0,0 +1,47 @@
+import { useStore } from "~/store"
+import { computed } from "vue"
+
+export default () => {
+ const store = useStore()
+ const looping = computed(() => store.state.player.looping)
+ const playing = computed(() => store.state.player.playing)
+ const loading = computed(() => store.state.player.isLoadingAudio)
+ const errored = computed(() => store.state.player.errored)
+ const focused = computed(() => store.state.ui.queueFocused === 'player')
+
+ const volume = computed(() => store.state.player.volume)
+
+ const duration = computed(() => store.state.player.duration)
+ const currentTime = computed(() => store.state.player.currentTime)
+
+ const durationFormatted = computed(() => store.getters['player/durationFormatted'])
+ const currentTimeFormatted = computed(() => store.getters['player/currentTimeFormatted'])
+
+ const progress = computed(() => store.getters['player/progress'])
+ const bufferProgress = computed(() => store.state.player.bufferProgress)
+
+ const pause = () => store.dispatch('player/pausePlayback')
+ const resume = () => store.dispatch('player/resumePlayback')
+
+ return {
+ looping,
+ playing,
+ loading,
+ errored,
+ focused,
+
+ volume,
+
+ duration,
+ currentTime,
+
+ durationFormatted,
+ currentTimeFormatted,
+
+ progress,
+ bufferProgress,
+
+ pause,
+ resume
+ }
+}
\ No newline at end of file
diff --git a/front/src/composables/useQueue.ts b/front/src/composables/useQueue.ts
new file mode 100644
index 000000000..ab88e957f
--- /dev/null
+++ b/front/src/composables/useQueue.ts
@@ -0,0 +1,107 @@
+import { useTimeoutFn, useThrottleFn } from "@vueuse/core"
+import { useTimeAgo, useNow } from '@vueuse/core'
+import { useGettext } from "vue3-gettext"
+import { useStore } from "~/store"
+import { ref, computed } from "vue"
+import { Track } from "~/types"
+import { sum } from 'lodash-es'
+
+export default () => {
+ const store = useStore()
+ const { $pgettext } = useGettext()
+
+ const currentTrack = computed(() => store.getters['queue/currentTrack'])
+ const currentIndex = computed(() => store.state.queue.currentIndex)
+ const hasNext = computed(() => store.getters['queue/hasNext'])
+ const isEmpty = computed(() => store.getters['queue/isEmpty'])
+
+ const removeTrack = (index: number) => store.dispatch('queue/cleanTrack', index)
+ const clear = () => store.dispatch('queue/clean')
+
+ const next = () => store.dispatch('queue/next')
+ const previous = () => store.dispatch('queue/previous')
+
+ const focused = computed(() => store.state.ui.queueFocused === 'queue')
+
+ //
+ // Track list
+ //
+ const tracksChangeBuffer = ref