| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 | 
							- <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",
 
- 				false,
 
- 				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>
 
 
  |