| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 | <template>	<modal title='Add Song To Playlist'>		<div slot='body'>			<h4 class="songTitle">{{ $parent.currentSong.title }}</h4>			<h5 class="songArtist">{{ $parent.currentSong.artists }}</h5>			<aside class="menu">				<p class="menu-label">					Playlists				</p>				<ul class="menu-list">					<li v-for='playlist in playlistsArr'>						<div class='playlist'>							<span class='icon is-small' @click='removeSongFromPlaylist(playlist._id)' v-if='playlists[playlist._id].hasSong'>								<i class="material-icons">playlist_add_check</i>							</span>							<span class='icon' @click='addSongToPlaylist(playlist._id)' v-else>								<i class="material-icons">playlist_add</i>							</span>							{{ playlist.displayName }}						</div>					</li>				</ul>				</aside>		</div>	</modal></template><script>	import { Toast } from 'vue-roaster';	import Modal from './Modal.vue';	import io from '../../io';	import auth from '../../auth';	export default {		data() {			return {				playlists: {},				playlistsArr: [],				songId: null,				song: null			}		},		methods: {			addSongToPlaylist: function (playlistId) {				let _this = this;				this.socket.emit('playlists.addSongToPlaylist', this.$parent.currentSong.songId, playlistId, res => {					Toast.methods.addToast(res.message, 4000);					if (res.status === 'success') {						_this.playlists[playlistId].songs.push(_this.song);					}					_this.recalculatePlaylists();					//this.$parent.modals.addSongToPlaylist = false;				});			},			removeSongFromPlaylist: function (playlistId) {				let _this = this;				this.socket.emit('playlists.removeSongFromPlaylist', _this.songId, playlistId, res => {					Toast.methods.addToast(res.message, 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();					//this.$parent.modals.addSongToPlaylist = false;				});			},			recalculatePlaylists: function() {				let _this = this;				_this.playlistsArr = Object.values(_this.playlists).map((playlist) => {					let hasSong = false;					for (let i = 0; i < playlist.songs.length; i++) {						if (playlist.songs[i].songId === _this.songId) {							hasSong = true;						}					}					playlist.hasSong = hasSong;					_this.playlists[playlist._id] = playlist;					return playlist;				});			}		},		ready: function () {			let _this = this;			this.songId = this.$parent.currentSong.songId;			this.song = this.$parent.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();					}				});			});		},		events: {			closeModal: function () {				this.$parent.modals.addSongToPlaylist = !this.$parent.modals.addSongToPlaylist;			}		},		components: { Modal }	}</script><style type='scss' scoped>	.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>
 |