| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 | <template>	<modal title="Add Song To Queue">		<div slot="body">			<aside class="menu" v-if="loggedIn && $parent.type === 'community'">				<ul class="menu-list">					<li v-for="(playlist, index) in playlists" :key="index">						<a							href="#"							target="_blank"							v-on:click="$parent.editPlaylist(playlist._id)"							>{{ playlist.displayName }}</a						>						<div class="controls">							<a								href="#"								v-on:click="selectPlaylist(playlist._id)"								v-if="!isPlaylistSelected(playlist._id)"							>								<i class="material-icons">panorama_fish_eye</i>							</a>							<a								href="#"								v-on:click="unSelectPlaylist()"								v-if="isPlaylistSelected(playlist._id)"							>								<i class="material-icons">lens</i>							</a>						</div>					</li>				</ul>				<br />			</aside>			<div class="control is-grouped">				<p class="control is-expanded">					<input						class="input"						type="text"						placeholder="YouTube Query"						v-model="querySearch"						autofocus						@keyup.enter="submitQuery()"					/>				</p>				<p class="control">					<a						class="button is-info"						v-on:click="submitQuery()"						href="#"						>Search</a					>				</p>			</div>			<div class="control is-grouped" v-if="$parent.type === 'official'">				<p class="control is-expanded">					<input						class="input"						type="text"						placeholder="YouTube Playlist URL"						v-model="importQuery"						@keyup.enter="importPlaylist()"					/>				</p>				<p class="control">					<a						class="button is-info"						v-on:click="importPlaylist()"						href="#"						>Import</a					>				</p>			</div>			<table class="table" v-if="queryResults.length > 0">				<tbody>					<tr v-for="(result, index) in queryResults" :key="index">						<td>							<img :src="result.thumbnail" />						</td>						<td>{{ result.title }}</td>						<td>							<a								class="button is-success"								v-on:click="addSongToQueue(result.id)"								href="#"								>Add</a							>						</td>					</tr>				</tbody>			</table>		</div>	</modal></template><script>import { mapState } from "vuex";import { Toast } from "vue-roaster";import Modal from "./Modal.vue";import io from "../../io";export default {	data() {		return {			querySearch: "",			queryResults: [],			playlists: [],			privatePlaylistQueueSelected: null,			importQuery: ""		};	},	computed: mapState({		loggedIn: state => state.user.auth.loggedIn	}),	methods: {		isPlaylistSelected(playlistId) {			return this.privatePlaylistQueueSelected === playlistId;		},		selectPlaylist(playlistId) {			if (this.$parent.type === "community") {				this.privatePlaylistQueueSelected = playlistId;				this.$parent.privatePlaylistQueueSelected = playlistId;				this.$parent.addFirstPrivatePlaylistSongToQueue();			}		},		unSelectPlaylist() {			if (this.$parent.type === "community") {				this.privatePlaylistQueueSelected = null;				this.$parent.privatePlaylistQueueSelected = null;			}		},		addSongToQueue(songId) {			if (this.$parent.type === "community") {				this.socket.emit(					"stations.addToQueue",					this.$parent.station._id,					songId,					data => {						if (data.status !== "success")							Toast.methods.addToast(								`Error: ${data.message}`,								8000							);						else Toast.methods.addToast(`${data.message}`, 4000);					}				);			} else {				this.socket.emit("queueSongs.add", songId, data => {					if (data.status !== "success")						Toast.methods.addToast(`Error: ${data.message}`, 8000);					else Toast.methods.addToast(`${data.message}`, 4000);				});			}		},		importPlaylist() {			Toast.methods.addToast(				"Starting to import your playlist. This can take some time to do.",				4000			);			this.socket.emit(				"queueSongs.addSetToQueue",				this.importQuery,				res => {					Toast.methods.addToast(res.message, 4000);				}			);		},		submitQuery() {			let query = this.querySearch;			if (query.indexOf("&index=") !== -1) {				query = query.split("&index=");				query.pop();				query = query.join("");			}			if (query.indexOf("&list=") !== -1) {				query = query.split("&list=");				query.pop();				query = query.join("");			}			this.socket.emit("apis.searchYoutube", query, res => {				// check for error				const { data } = res;				this.queryResults = [];				for (let i = 0; i < data.items.length; i += 1) {					this.queryResults.push({						id: data.items[i].id.videoId,						url: `https://www.youtube.com/watch?v=${this.id}`,						title: data.items[i].snippet.title,						thumbnail: data.items[i].snippet.thumbnails.default.url					});				}			});		}	},	mounted() {		io.getSocket(socket => {			this.socket = socket;			this.socket.emit("playlists.indexForUser", res => {				if (res.status === "success") this.playlists = res.data;			});			this.privatePlaylistQueueSelected = this.$parent.privatePlaylistQueueSelected;		});	},	components: { Modal }};</script><style lang="scss" scoped>@import "styles/global.scss";tr td {	vertical-align: middle;	img {		width: 55px;	}}.table {	margin-bottom: 0;}</style>
 |