import { ref, nextTick, watch } from 'vue' import { useRouter, useRoute } from 'vue-router' import type { Playlist, Track } from '../types' import { useSubsonicApi } from '../subsonicApi' import { useMainStore } from '../store/main' import { usePlayerStore } from '../store/player' import { usePlaylistStore } from '../store/playlist' import { formatDuration, formatBytes } from '../utils' import { EditPlaylistModal } from '../components/EditPlaylistModal.vine' import { TrackList } from '../components/TrackList.vine' import { type ConfirmDialogExpose, ConfirmDialog } from '../components/ConfirmDialog.vine' export const PlaylistView = ({ id }: { id: string }) => { const router = useRouter(), route = useRoute(), subsonicApi = useSubsonicApi(), mainStore = useMainStore(), playlistStore = usePlaylistStore(), playerStore = usePlayerStore(), playlist = ref(null), showEditModal = ref(false), confirmDialog = ref(null), fetchPlaylist = async () => { try { mainStore.isLoading = true playlist.value = await subsonicApi.getPlaylist(id) } catch (err) { console.error(err) } finally { mainStore.isLoading = false } }, playNow = () => { if (!playlist.value?.tracks?.length) return const currentTrack = playerStore.track if ( currentTrack && ( playlist.value.tracks.some( (t: Track) => t.id === currentTrack.id ) ) ) return playerStore.playPause() return playerStore.playNow(playlist.value.tracks) }, shuffleNow = () => { if (!playlist.value?.tracks) return playerStore.shuffleNow(playlist.value.tracks) nextTick(() => router.push({ name: 'queue' })) }, removeTrack = (index: number) => { if (!playlist.value?.tracks) return playlist.value.tracks.splice(index, 1) return playlistStore.removeTrack(id, index) }, deletePlaylist = async() => { if (!playlist.value || !confirmDialog.value) return const userConfirmed = await confirmDialog.value.open( 'Delete Playlist', `Do you really want to delete the playlist "${playlist.value.name}"?` ) if (!userConfirmed) return await playlistStore.delete(id) router.replace({ name: 'playlists' }) }, openEditModal = () => { showEditModal.value = true }, applyPlaylistUpdate = (updated: Playlist) => { playlist.value = { ...playlist.value, ...updated } playlistStore.update(playlist.value) }, calcPlaylistSize = (): number => ( (!playlist.value?.tracks) ? 0 : (playlist.value.tracks.reduce( (prev, cur) => prev + cur.size, 0 )) ) watch( () => id, fetchPlaylist, { immediate: true } ) return vine` ` }