AddSongToQueue.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <template>
  2. <div class="modal is-active">
  3. <div class="modal-background"></div>
  4. <div class="modal-card">
  5. <header class="modal-card-head">
  6. <p class="modal-card-title">Add Songs to Station</p>
  7. <button class="delete" @click="$parent.toggleModal('addSongToQueue')" ></button>
  8. </header>
  9. <section class="modal-card-body">
  10. <aside class='menu' v-if='$parent.$parent.loggedIn'>
  11. <ul class='menu-list'>
  12. <li v-for='playlist in playlists' track-by='$index'>
  13. <a :href='' target='_blank' @click='$parent.editPlaylist(playlist._id)'>{{ playlist.displayName }}</a>
  14. <div class='controls'>
  15. <a href='#' @click='selectPlaylist(playlist._id)' v-if="!isPlaylistSelected(playlist._id)"><i class='material-icons'>panorama_fish_eye</i></a>
  16. <a href='#' @click='unSelectPlaylist()' v-if="isPlaylistSelected(playlist._id)"><i class='material-icons'>lens</i></a>
  17. </div>
  18. </li>
  19. </ul>
  20. <br />
  21. </aside>
  22. <div class="control is-grouped">
  23. <p class="control is-expanded">
  24. <input class="input" type="text" placeholder="YouTube Query" v-model="querySearch">
  25. </p>
  26. <p class="control">
  27. <a class="button is-info" @click="submitQuery()">
  28. Search
  29. </a>
  30. </p>
  31. </div>
  32. <table class="table">
  33. <tbody>
  34. <tr v-for="result in queryResults">
  35. <td>
  36. <img :src="result.thumbnail" />
  37. </td>
  38. <td>{{ result.title }}</td>
  39. <td>
  40. <a class="button is-success" @click="addSongToQueue(result.id)">
  41. Add
  42. </a>
  43. </td>
  44. </tr>
  45. </tbody>
  46. </table>
  47. </section>
  48. </div>
  49. </div>
  50. </template>
  51. <script>
  52. import { Toast } from 'vue-roaster';
  53. import io from '../../io';
  54. export default {
  55. data() {
  56. return {
  57. querySearch: '',
  58. queryResults: [],
  59. playlists: [],
  60. privatePlaylistQueueSelected: null
  61. }
  62. },
  63. methods: {
  64. isPlaylistSelected: function(playlistId) {
  65. console.log(this.privatePlaylistQueueSelected === playlistId);
  66. return this.privatePlaylistQueueSelected === playlistId;
  67. },
  68. selectPlaylist: function (playlistId) {
  69. let _this = this;
  70. if (_this.$parent.type === 'community') {
  71. _this.privatePlaylistQueueSelected = playlistId;
  72. _this.$parent.privatePlaylistQueueSelected = playlistId;
  73. }
  74. },
  75. unSelectPlaylist: function () {
  76. let _this = this;
  77. if (_this.$parent.type === 'community') {
  78. _this.privatePlaylistQueueSelected = null;
  79. _this.$parent.privatePlaylistQueueSelected = null;
  80. }
  81. },
  82. addSongToQueue: function (songId) {
  83. let _this = this;
  84. if (_this.$parent.type === 'community') {
  85. _this.socket.emit('stations.addToQueue', _this.$parent.stationId, songId, data => {
  86. if (data.status !== 'success') {
  87. Toast.methods.addToast(`Error: ${data.message}`, 8000);
  88. } else {
  89. Toast.methods.addToast(`${data.message}`, 4000);
  90. }
  91. });
  92. } else {
  93. _this.socket.emit('queueSongs.add', songId, data => {
  94. if (data.status !== 'success') {
  95. Toast.methods.addToast(`Error: ${data.message}`, 8000);
  96. } else {
  97. Toast.methods.addToast(`${data.message}`, 4000);
  98. }
  99. });
  100. }
  101. },
  102. submitQuery: function () {
  103. let _this = this;
  104. let query = _this.querySearch;
  105. if (query.indexOf('&index=') !== -1) {
  106. query = query.split('&index=');
  107. query.pop();
  108. query = query.join('');
  109. }
  110. if (query.indexOf('&list=') !== -1) {
  111. query = query.split('&list=');
  112. query.pop();
  113. query = query.join('');
  114. }
  115. _this.socket.emit('apis.searchYoutube', query, results => {
  116. results = results.data;
  117. _this.queryResults = [];
  118. for (let i = 0; i < results.items.length; i++) {
  119. _this.queryResults.push({
  120. id: results.items[i].id.videoId,
  121. url: `https://www.youtube.com/watch?v=${this.id}`,
  122. title: results.items[i].snippet.title,
  123. thumbnail: results.items[i].snippet.thumbnails.default.url
  124. });
  125. }
  126. });
  127. }
  128. },
  129. ready: function () {
  130. let _this = this;
  131. io.getSocket((socket) => {
  132. _this.socket = socket;
  133. _this.socket.emit('playlists.indexForUser', res => {
  134. if (res.status === 'success') _this.playlists = res.data;
  135. });
  136. _this.privatePlaylistQueueSelected = _this.$parent.privatePlaylistQueueSelected;
  137. });
  138. },
  139. events: {
  140. closeModal: function() {
  141. this.$parent.toggleModal('addSongToQueue')
  142. }
  143. }
  144. }
  145. </script>