client: fix sending multiple requests

on songlist click
This commit is contained in:
geoffrey45
2021-12-22 09:22:22 +03:00
parent 36999d8061
commit 81c8ae8629
7 changed files with 151 additions and 47 deletions
+14 -13
View File
@@ -12,7 +12,7 @@
<PinnedStuff :collapsed="collapsed" /> <PinnedStuff :collapsed="collapsed" />
</div> </div>
<div class="content"> <div class="content">
<router-view @sendQueue="updpateQueue"/> <router-view />
</div> </div>
<div class="r-sidebar"> <div class="r-sidebar">
<Search <Search
@@ -23,7 +23,11 @@
<div class="m-np"> <div class="m-np">
<NowPlaying /> <NowPlaying />
</div> </div>
<UpNext v-model:up_next="up_next" @expandQueue="expandQueue" :queue="queue"/> <UpNext
v-model:up_next="up_next"
@expandQueue="expandQueue"
:queue="queue"
/>
<RecommendedArtist /> <RecommendedArtist />
</div> </div>
</div> </div>
@@ -40,6 +44,8 @@ import NowPlaying from "./components/RightSideBar/NowPlaying.vue";
import UpNext from "./components/RightSideBar/UpNext.vue"; import UpNext from "./components/RightSideBar/UpNext.vue";
import RecommendedArtist from "./components/RightSideBar/Recommendation.vue"; import RecommendedArtist from "./components/RightSideBar/Recommendation.vue";
import perks from "@/composables/perks.js";
export default { export default {
components: { components: {
Navigation, Navigation,
@@ -51,13 +57,10 @@ export default {
}, },
setup() { setup() {
const collapsed = ref(true);
const queue = ref(JSON.parse(localStorage.getItem("queue")) || []); const queue = ref(JSON.parse(localStorage.getItem("queue")) || []);
const updpateQueue = (data)=> { perks.readQueue();
queue.value = data;
}
const collapsed = ref(true);
function toggleNav() { function toggleNav() {
collapsed.value = !collapsed.value; collapsed.value = !collapsed.value;
@@ -82,7 +85,6 @@ export default {
return { return {
toggleNav, toggleNav,
updpateQueue,
collapsed, collapsed,
up_next, up_next,
expandQueue, expandQueue,
@@ -132,9 +134,8 @@ export default {
cursor: pointer; cursor: pointer;
} }
.m-np { // .m-np {
position: absolute; // position: absolute;
bottom: 0; // bottom: 0;
} // }
</style> </style>
+40 -12
View File
@@ -14,7 +14,7 @@
<tr <tr
v-for="song in songs" v-for="song in songs"
:key="song" :key="song"
@click="updateQueue(song.type.name, song.type.id)" @click="updateQueue(song, song.type.name, song.type.id)"
> >
<td :style="{ width: songTitleWidth + 'px' }" class="flex"> <td :style="{ width: songTitleWidth + 'px' }" class="flex">
<div <div
@@ -55,30 +55,58 @@
</template> </template>
<script> <script>
import { ref } from "@vue/reactivity"; import { ref, toRefs } from "@vue/reactivity";
import { onMounted, onUnmounted } from "@vue/runtime-core"; import { onMounted, onUnmounted } from "@vue/runtime-core";
import { playAudio } from "@/composables/playAudio.js"; import { playAudio } from "@/composables/playAudio.js";
import getQueue from "@/composables/getQueue.js"; import getQueue from "@/composables/getQueue.js";
import putCommas from "@/composables/perks.js"; import perks from "@/composables/perks.js";
export default { export default {
props: ["songs"], props: ["songs"],
setup(props, context) { setup(props) {
const song_list = toRefs(props).songs;
const songtitle = ref(null); const songtitle = ref(null);
const songTitleWidth = ref(null); const songTitleWidth = ref(null);
const minWidth = ref(300); const minWidth = ref(300);
const putCommas = perks.putCommas;
const resizeSongTitleWidth = () => { const updateQueue = async (song, type, id) => {
let a = songtitle.value.clientWidth; if (perks.queue.value[0]._id.$oid !== song_list.value[0]._id.$oid) {
const queue = await getQueue(type, id);
localStorage.setItem("queue", JSON.stringify(queue));
perks.queue.value = queue;
}
perks.current.value = song;
localStorage.setItem("current", JSON.stringify(song));
const index = perks.queue.value.findIndex(
(item) => item._id.$oid === song._id.$oid
);
if (index == perks.queue.value.length - 1) {
perks.next.value = perks.queue.value[0];
} else {
perks.next.value = perks.queue.value[index + 1];
}
localStorage.setItem(
"next",
JSON.stringify(perks.queue.value[index + 1])
);
songTitleWidth.value = a > minWidth.value * 4 ? a / 4 : a / 3;
}; };
const updateQueue = async (type, id) => { const resizeSongTitleWidth = () => {
const queue = await getQueue(type, id); try {
context.emit("updateQueue", queue); let a = songtitle.value.clientWidth;
songTitleWidth.value = a > minWidth.value * 4 ? a / 4 : a / 3;
} catch (error) {
return;
}
}; };
onMounted(() => { onMounted(() => {
@@ -101,7 +129,7 @@ export default {
minWidth, minWidth,
playAudio, playAudio,
updateQueue, updateQueue,
putCommas putCommas,
}; };
}, },
}; };
+24 -5
View File
@@ -1,11 +1,20 @@
<template> <template>
<div class="now-playing"> <div class="now-playing">
<div class="art-tags"> <div class="art-tags">
<div class="album-art image"></div> <div
class="album-art image"
:style="{
backgroundImage: `url(&quot;${current.image}&quot;)`,
}"
></div>
<div> <div>
<p id="title" class="ellipsis">I love this bar (remix)</p> <p id="title" class="ellipsis">{{ current.title }}</p>
<hr /> <hr />
<span id="artist">Toby Keith, Morgan Wallen</span> <div id="artist">
<span v-for="artist in putCommas(current.artists)" :key="artist">{{
artist
}}</span>
</div>
</div> </div>
</div> </div>
<div class="controls"> <div class="controls">
@@ -17,7 +26,17 @@
</template> </template>
<script> <script>
export default {}; import { ref } from "@vue/reactivity";
import perks from "../../composables/perks.js";
export default {
setup() {
const current = ref(perks.current);
const putCommas = perks.putCommas;
return { current, putCommas };
},
};
</script> </script>
<style> <style>
@@ -43,7 +62,7 @@ export default {};
border-radius: 0.5rem; border-radius: 0.5rem;
margin-right: 0.5rem; margin-right: 0.5rem;
background-color: #ad1717a8; background-color: #ad1717a8;
background-image: url(../../assets/images/tk.jpg); background-image: url(../../assets/images/null.webp);
} }
.now-playing .art-tags hr { .now-playing .art-tags hr {
+23 -8
View File
@@ -4,11 +4,20 @@
COMING UP NEXT <span class="more" @click="collapse">SEE ALL</span> COMING UP NEXT <span class="more" @click="collapse">SEE ALL</span>
</p> </p>
<div class="main-item h-1"> <div class="main-item h-1">
<div class="album-art image"></div> <div
class="album-art image"
:style="{
backgroundImage: `url(&quot;${next.image}&quot;)`,
}"
></div>
<div class="tags"> <div class="tags">
<p class="title">Hard to forget</p> <p class="title">{{ next.title }}</p>
<hr /> <hr />
<p class="artist">Sam hunt</p> <p class="artist">
<span v-for="artist in putCommas(next.artists)" :key="artist">{{
artist
}}</span>
</p>
</div> </div>
</div> </div>
<div> <div>
@@ -38,19 +47,25 @@
</template> </template>
<script> <script>
import { toRefs } from "@vue/reactivity"; import { ref, toRefs } from "@vue/reactivity";
import putCommas from "@/composables/perks.js"; import perks from "@/composables/perks.js";
export default { export default {
props: ["up_next", "queue"], props: ["up_next"],
setup(props, { emit }) { setup(props, { emit }) {
const is_expanded = toRefs(props).up_next; const is_expanded = toRefs(props).up_next;
const queue = ref(perks.queue);
const next = ref(perks.next);
let collapse = () => { let collapse = () => {
emit("expandQueue"); emit("expandQueue");
}; };
return { collapse, is_expanded, putCommas }; const putCommas = perks.putCommas;
return { collapse, is_expanded, putCommas, queue, next };
}, },
}; };
</script> </script>
-1
View File
@@ -19,7 +19,6 @@ const getQueue = async (type, id) => {
} }
const data = await res.json(); const data = await res.json();
localStorage.setItem("queue", JSON.stringify(data.songs));
return data.songs; return data.songs;
}; };
+48 -1
View File
@@ -1,3 +1,25 @@
import { ref } from "@vue/reactivity";
const current = ref({
title: "Nothing played yet",
artists: ["... blah blah blah"],
});
const next = ref({
title: "Next song shows here",
artists: ["... blah blah blah"],
});
const queue = ref([
{
title: "Nothing played yet",
artists: ["... blah blah blah"],
_id: {
$oid: ""
}
}
]);
const putCommas = (artists) => { const putCommas = (artists) => {
let result = []; let result = [];
@@ -12,4 +34,29 @@ const putCommas = (artists) => {
return result; return result;
}; };
export default putCommas; const doThat = (songs, current) => {
queue.value = songs;
current.value = current;
console.log(queue.value);
};
const readQueue = () => {
const prev_queue = JSON.parse(localStorage.getItem("queue"));
const last_played = JSON.parse(localStorage.getItem("current"));
const next_ = JSON.parse(localStorage.getItem("next"));
if (last_played){
current.value = last_played;
}
if (prev_queue){
queue.value = prev_queue;
}
if (next_){
next.value = next_;
}
}
export default { putCommas, doThat, readQueue, current, queue, next };
+2 -7
View File
@@ -5,7 +5,7 @@
</div> </div>
<div id="scrollable" ref="scrollable"> <div id="scrollable" ref="scrollable">
<FolderList :folders="folders" /> <FolderList :folders="folders" />
<SongList :songs="songs" @updateQueue="updateQueue" /> <SongList :songs="songs" />
</div> </div>
</div> </div>
</template> </template>
@@ -27,7 +27,7 @@ export default {
FolderList, FolderList,
SearchBox, SearchBox,
}, },
setup(props, context) { setup() {
const route = useRoute(); const route = useRoute();
const path = ref(route.params.path); const path = ref(route.params.path);
@@ -39,10 +39,6 @@ export default {
const scrollable = ref(null); const scrollable = ref(null);
const loading = ref(false); const loading = ref(false);
const updateQueue = (queue) => {
context.emit("sendQueue", queue);
};
onMounted(() => { onMounted(() => {
const getPathFolders = (path, last_id) => { const getPathFolders = (path, last_id) => {
loading.value = true; loading.value = true;
@@ -96,7 +92,6 @@ export default {
path, path,
scrollable, scrollable,
loading, loading,
updateQueue,
}; };
}, },
}; };