import { watch, ref, computed } from 'vue' import { useRouter, useRoute } from 'vue-router' import { ReplayGainMode } from '../types' import { useMainStore } from '../store/main' import { usePlayerStore } from '../store/player' import { useFavouriteStore } from '../store/favourite' import { formatDuration, isMobile } from '../utils' export const Player = () => { const router = useRouter(), route = useRoute(), mainStore = useMainStore(), playerStore = usePlayerStore(), favouriteStore = useFavouriteStore(), playState = ref(0), track = computed(() => playerStore.track), isRepeat = computed(() => playerStore.repeat), isPlaying = computed(() => playerStore.isPlaying), isMuted = computed(() => (playerStore.volume <= 0)), isShuffle = computed(() => playerStore.shuffle), isFavourite = computed(() => ( !!track.value && favouriteStore.get('track', track.value.id) )), replayGainMode = computed(() => playerStore.replayGainMode), documentTitle = computed(() => ([ track.value?.title, track.value?.artists?.map(a => a.name).join(', ') || track.value?.album, import.meta.env.VITE_APP_NAME, ].filter(Boolean).join(' • '))), onBackgroundClick = (e: MouseEvent) => ( (isMobile()) ? playerStore.playPause() : ( (route.name !== 'queue') ? router.push({ name: 'queue' }) : router.back() ) ), onAlbumClick = () => { const t = playerStore.track if (!t?.albumId) return (route.name === 'album' && String(route.params.id) === String(t.albumId)) ? router.back() : router.push({ name: 'album', params: { id: t.albumId } }) }, formatter = (value: number) => ( `${formatDuration(value)} / ${formatDuration(playerStore.duration)}` ), playPause = () => playerStore.playPause(), back = () => playerStore.back(), next = () => playerStore.next(true), toggleReplayGain = () => playerStore.toggleReplayGain(), toggleRepeat = () => playerStore.toggleRepeat(), toggleShuffle = () => playerStore.toggleShuffle(), toggleFavourite = () => ( (track.value) && favouriteStore.toggle('track', track.value.id) ) watch( () => playerStore.currentTime, currentTime => { playState.value = currentTime }, { immediate: true } ) watch( documentTitle, (value) => { document.title = value }, { immediate: true } ) vineStyle.import.scoped('../style/player.css') return vine`
{{ track.title }}
` }