| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 | <template>	<modal title="Add Song To Playlist">		<template v-slot:body>			<h4 class="songTitle">				{{ currentSong.title }}			</h4>			<h5 class="songArtist">				{{ currentSong.artists }}			</h5>			<aside class="menu">				<p class="menu-label">					Playlists				</p>				<ul class="menu-list">					<li v-for="(playlist, index) in playlistsArr" :key="index">						<div class="playlist">							<span								v-if="playlists[playlist._id].hasSong"								class="icon is-small"								@click="removeSongFromPlaylist(playlist._id)"							>								<i class="material-icons">playlist_add_check</i>							</span>							<span								v-else								class="icon"								@click="addSongToPlaylist(playlist._id)"							>								<i class="material-icons">playlist_add</i>							</span>							{{ playlist.displayName }}						</div>					</li>				</ul>			</aside>		</template>	</modal></template><script>import { mapState } from "vuex";import Toast from "toasters";import Modal from "./Modal.vue";import io from "../../io";export default {	components: { Modal },	data() {		return {			playlists: {},			playlistsArr: [],			songId: null,			song: null		};	},	mounted() {		this.songId = this.currentSong.songId;		this.song = this.currentSong;		io.getSocket(socket => {			this.socket = socket;			this.socket.emit("playlists.indexForUser", res => {				if (res.status === "success") {					res.data.forEach(playlist => {						this.playlists[playlist._id] = playlist;					});					this.recalculatePlaylists();				}			});		});	},	computed: {		...mapState("station", {			currentSong: state => state.currentSong		})	},	methods: {		addSongToPlaylist(playlistId) {			this.socket.emit(				"playlists.addSongToPlaylist",				this.currentSong.songId,				playlistId,				res => {					new Toast({ content: res.message, timeout: 4000 });					if (res.status === "success") {						this.playlists[playlistId].songs.push(this.song);					}					this.recalculatePlaylists();				}			);		},		removeSongFromPlaylist(playlistId) {			this.socket.emit(				"playlists.removeSongFromPlaylist",				this.songId,				playlistId,				res => {					new Toast({ content: res.message, timeout: 4000 });					if (res.status === "success") {						this.playlists[playlistId].songs.forEach(							(song, index) => {								if (song.songId === this.songId)									this.playlists[playlistId].songs.splice(										index,										1									);							}						);					}					this.recalculatePlaylists();				}			);		},		recalculatePlaylists() {			this.playlistsArr = Object.values(this.playlists).map(playlist => {				let hasSong = false;				for (let i = 0; i < playlist.songs.length; i += 1) {					if (playlist.songs[i].songId === this.songId) {						hasSong = true;					}				}				playlist.hasSong = hasSong; // eslint-disable-line no-param-reassign				this.playlists[playlist._id] = playlist;				return playlist;			});		}	}};</script><style lang="scss" scoped>@import "styles/global.scss";.icon.is-small {	margin-right: 10px !important;}.songTitle {	font-size: 22px;	padding: 0 10px;}.songArtist {	font-size: 19px;	font-weight: 200;	padding: 0 10px;}.menu-label {	font-size: 16px;}</style>
 |