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>
|