prevent type coercion

- remove unused imports
- minor refactors and cleanups
This commit is contained in:
geoffrey45
2022-02-16 15:06:29 +03:00
parent 9972caf7d3
commit 5446b1fe4b
26 changed files with 190 additions and 206 deletions
-2
View File
@@ -58,7 +58,5 @@ class Handler(PatternMatchingEventHandler):
print(event.dest_path) print(event.dest_path)
# if __name__ == '__main__':
watch = OnMyWatch() watch = OnMyWatch()
# watch.run()
+2 -4
View File
@@ -3,11 +3,9 @@ input[type="range"] {
margin-right: 15px; margin-right: 15px;
width: calc(100% - 2px); width: calc(100% - 2px);
height: 0.3rem; height: 0.3rem;
background: rgb(59, 57, 57);
border-radius: 5px; border-radius: 5px;
background-image: linear-gradient($blue, $blue); background-size: 0 100%;
background-size: 0% 100%; background: rgb(59, 57, 57) linear-gradient($blue, $blue) no-repeat;
background-repeat: no-repeat;
} }
/* Input Thumb */ /* Input Thumb */
+9 -9
View File
@@ -154,7 +154,7 @@ button {
} }
.shadow-sm { .shadow-sm {
box-shadow: 0rem 0rem .5rem rgb(0, 0, 0); box-shadow: 0 0 .5rem rgb(0, 0, 0);
} }
.shadow-md { .shadow-md {
@@ -195,46 +195,46 @@ button {
@-webkit-keyframes similarAlbums { @-webkit-keyframes similarAlbums {
0% { 0% {
background-position: 0% 38%; background-position: 0 38%;
} }
50% { 50% {
background-position: 100% 63%; background-position: 100% 63%;
} }
100% { 100% {
background-position: 0% 38%; background-position: 0 38%;
} }
} }
@-moz-keyframes similarAlbums { @-moz-keyframes similarAlbums {
0% { 0% {
background-position: 0% 38%; background-position: 0 38%;
} }
50% { 50% {
background-position: 100% 63%; background-position: 100% 63%;
} }
100% { 100% {
background-position: 0% 38%; background-position: 0 38%;
} }
} }
@-o-keyframes similarAlbums { @-o-keyframes similarAlbums {
0% { 0% {
background-position: 0% 38%; background-position: 0 38%;
} }
50% { 50% {
background-position: 100% 63%; background-position: 100% 63%;
} }
100% { 100% {
background-position: 0% 38%; background-position: 0 38%;
} }
} }
@keyframes similarAlbums { @keyframes similarAlbums {
0% { 0% {
background-position: 0% 38%; background-position: 0 38%;
} }
50% { 50% {
background-position: 100% 63%; background-position: 100% 63%;
} }
100% { 100% {
background-position: 0% 38%; background-position: 0 38%;
} }
} }
+2 -2
View File
@@ -54,7 +54,7 @@ export default {
height: 10rem; height: 10rem;
position: absolute; position: absolute;
background-color: rgb(196, 58, 58); background-color: rgb(196, 58, 58);
box-shadow: 0px 0px 2rem rgb(0, 0, 0); box-shadow: 0 0 2rem rgb(0, 0, 0);
bottom: -10rem; bottom: -10rem;
left: 7rem; left: 7rem;
transform: rotate(45deg) translate(-1rem, -9rem); transform: rotate(45deg) translate(-1rem, -9rem);
@@ -74,7 +74,7 @@ export default {
background-color: $blue; background-color: $blue;
border-radius: 50%; border-radius: 50%;
transform: translateX(-11rem) translateY(7rem); transform: translateX(-11rem) translateY(7rem);
box-shadow: 0px 0px 2rem rgb(0, 0, 0); box-shadow: 0 0 2rem rgb(0, 0, 0);
} }
} }
.bio { .bio {
+4 -6
View File
@@ -85,7 +85,7 @@ export default {
position: absolute; position: absolute;
left: -4.2rem; left: -4.2rem;
top: 3rem; top: 3rem;
box-shadow: 0px 0px 1.5rem rgb(0, 0, 0); box-shadow: 0 0 1.5rem rgb(0, 0, 0);
} }
.rect { .rect {
@@ -96,7 +96,7 @@ export default {
background-color: rgb(196, 58, 58); background-color: rgb(196, 58, 58);
transform: rotate(-45deg) translate(20%, -50%); transform: rotate(-45deg) translate(20%, -50%);
z-index: 1; z-index: 1;
box-shadow: 0px 0px 2rem rgb(0, 0, 0); box-shadow: 0 0 2rem rgb(0, 0, 0);
transition: all 0.5s ease-in-out; transition: all 0.5s ease-in-out;
&:hover { &:hover {
@@ -114,7 +114,7 @@ export default {
background-color: $blue; background-color: $blue;
border-radius: 50%; border-radius: 50%;
transform: translateX(-11rem) translateY(7rem); transform: translateX(-11rem) translateY(7rem);
box-shadow: 0px 0px 2rem rgba(0, 0, 0, 0.164); box-shadow: 0 0 2rem rgba(0, 0, 0, 0.164);
transition: all 0.5s ease-in-out; transition: all 0.5s ease-in-out;
&:hover { &:hover {
@@ -145,9 +145,7 @@ export default {
overflow: hidden; overflow: hidden;
display: flex; display: flex;
align-items: center; align-items: center;
padding: 0 1rem 0 1rem; padding: 0 1rem 0 14rem;
position: relative;
padding-left: 14rem;
.art { .art {
position: absolute; position: absolute;
-1
View File
@@ -26,7 +26,6 @@
</template> </template>
<script setup> <script setup>
import { ref } from "vue";
import "../../assets/css/BottomBar/BottomBar.scss"; import "../../assets/css/BottomBar/BottomBar.scss";
import SongCard from "./SongCard.vue"; import SongCard from "./SongCard.vue";
import Progress from "../shared/Progress.vue"; import Progress from "../shared/Progress.vue";
+1 -1
View File
@@ -11,7 +11,7 @@
<div> <div>
<div class="title ellip">{{ track.title }}</div> <div class="title ellip">{{ track.title }}</div>
<div class="separator no-border"></div> <div class="separator no-border"></div>
<div class="artists ellip" v-if="track.artists[0] != ''"> <div class="artists ellip" v-if="track.artists[0] !== ''">
<span v-for="artist in putCommas(track.artists)" :key="artist">{{ <span v-for="artist in putCommas(track.artists)" :key="artist">{{
artist artist
}}</span> }}</span>
+2 -4
View File
@@ -16,9 +16,8 @@
<input <input
type="text" type="text"
class="search-input" class="search-input"
placeholder="Ctrl + F" placeholder="/"
v-model="query" v-model="query"
@keyup.enter="search()"
/> />
<div class="search-icon image"></div> <div class="search-icon image"></div>
</div> </div>
@@ -109,8 +108,7 @@ export default {
border-radius: $small; border-radius: $small;
background-color: rgb(24, 22, 22); background-color: rgb(24, 22, 22);
padding: $small; padding: $small $small $small 2.25rem;
padding-left: 2.25rem;
.icon { .icon {
position: absolute; position: absolute;
+1 -3
View File
@@ -17,7 +17,6 @@
</template> </template>
<script setup> <script setup>
import { ref } from "vue";
const menus = [ const menus = [
{ {
@@ -71,10 +70,9 @@ const props = defineProps({
} }
.side-nav-container { .side-nav-container {
padding: $small;
color: #fff; color: #fff;
margin-bottom: 1rem; margin-bottom: 1rem;
padding-top: 10px; padding: 10px $small $small;
margin-top: 1rem; margin-top: 1rem;
text-transform: capitalize; text-transform: capitalize;
@@ -132,14 +132,14 @@ export default {
transition: all 0.5s ease-in-out; transition: all 0.5s ease-in-out;
&:hover { &:hover {
background-position: 0%; background-position: 0;
} }
p { p {
margin-left: 1rem; margin-left: 1rem;
font-size: 1.5rem; font-size: 1.5rem;
font-weight: 700; font-weight: 700;
text-shadow: 0px 0px 80px rgb(0, 0, 0); text-shadow: 0 0 80px rgb(0, 0, 0);
} }
} }
</style> </style>
+3 -4
View File
@@ -40,7 +40,7 @@
color: rgb(255, 255, 255); color: rgb(255, 255, 255);
font-size: 0.9rem; font-size: 0.9rem;
border-radius: $smaller; border-radius: $smaller;
box-shadow: 0px 0px 1rem rgba(0, 0, 0, 0.479); box-shadow: 0 0 1rem rgba(0, 0, 0, 0.479);
@include phone-only { @include phone-only {
// border: solid; // border: solid;
@@ -64,12 +64,11 @@
height: 10rem; height: 10rem;
bottom: $small; bottom: $small;
left: $small; left: $small;
padding: $small;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: flex-end; align-items: flex-end;
padding-bottom: 3.5rem; padding: $small $small 3.5rem;
box-shadow: 0px 0px 1.5rem rgba(0, 0, 0, 0.658); box-shadow: 0 0 1.5rem rgba(0, 0, 0, 0.658);
@include phone-only { @include phone-only {
width: calc(100% - 1rem); width: calc(100% - 1rem);
+3 -3
View File
@@ -2,14 +2,14 @@
<div class="r-sidebar"> <div class="r-sidebar">
<div class="grid"> <div class="grid">
<div class="r-content border"> <div class="r-content border">
<div class="r-dash" v-show="current_tab == tabs.home"> <div class="r-dash" v-show="current_tab === tabs.home">
<DashBoard /> <DashBoard />
</div> </div>
<div class="r-search" v-show="current_tab == tabs.search"> <div class="r-search" v-show="current_tab === tabs.search">
<Search /> <Search />
</div> </div>
<div class="r-queue" v-show="current_tab == tabs.queue"> <div class="r-queue" v-show="current_tab === tabs.queue">
<UpNext /> <UpNext />
</div> </div>
</div> </div>
+7 -8
View File
@@ -1,17 +1,17 @@
<template> <template>
<div class="r-tabs"> <div class="r-tabs">
<div v-for="tab in props.tabs" <div v-for="tab in props.tabs"
@click="changeTab(tab)" @click="changeTab(tab)"
:key="tab" :key="tab"
class="image t-item" class="image t-item"
:class="{ active_tab: props.current_tab == tab }, `${tab}`" :class="{ active_tab: props.current_tab === tab }, `${tab}`"
></div> ></div>
<div> <div>
</div> </div>
</div> </div>
</template> </template>
<script setup>import { onMounted } from 'vue'; <script setup>
const props = defineProps({ const props = defineProps({
current_tab: String, current_tab: String,
@@ -21,7 +21,7 @@ const props = defineProps({
const emit = defineEmits(['changeTab']) const emit = defineEmits(['changeTab'])
function changeTab(tab) { function changeTab(tab) {
if (tab == props.current_tab) return; if (tab === props.current_tab) return;
emit('changeTab', tab) emit('changeTab', tab)
} }
@@ -41,8 +41,7 @@ function changeTab(tab) {
width: 100%; width: 100%;
height: 2.45rem; height: 2.45rem;
background-size: 1.5rem; background-size: 1.5rem;
border-radius: 0; border-radius: $small 0 0 $small;
border-radius: $small 0 0 $small;
&:hover { &:hover {
background-color: rgba(128, 128, 128, 0.281); background-color: rgba(128, 128, 128, 0.281);
+4 -4
View File
@@ -39,7 +39,7 @@
v-if=" v-if="
!artists.artists.length && !artists.artists.length &&
!tracks.tracks.length && !tracks.tracks.length &&
!albums.albums.length && query.length != 0 !albums.albums.length && query.length !== 0
" "
class="no-res" class="no-res"
> >
@@ -47,7 +47,7 @@
No results for <span class="highlight rounded">{{ query }}</span> No results for <span class="highlight rounded">{{ query }}</span>
</div> </div>
</div> </div>
<div v-else-if="query.length == 0" class="no-res"> <div v-else-if="query.length === 0" class="no-res">
<div class="no-res-text">Find your music 🔍😀</div> <div class="no-res-text">Find your music 🔍😀</div>
</div> </div>
</div> </div>
@@ -123,14 +123,14 @@ export default {
} }
watch(query, (new_query) => { watch(query, (new_query) => {
if (query.value == "" || query.value == " " || query.value.length < 2) { if (query.value === "" || query.value === " " || query.value.length < 2) {
albums.albums = []; albums.albums = [];
artists.artists = []; artists.artists = [];
tracks.tracks = []; tracks.tracks = [];
return; return;
} }
;
searchMusic(new_query).then((res) => { searchMusic(new_query).then((res) => {
albums.albums = res.albums.albums; albums.albums = res.albums.albums;
+4 -3
View File
@@ -36,13 +36,14 @@ export default {
height: 7em; height: 7em;
border-radius: 50%; border-radius: 50%;
margin-bottom: $small; margin-bottom: $small;
background: url("../../assets/images/null.webp");
background-size: 7rem 7rem; background-size: 7rem 7rem;
background: url("../../assets/images/null.webp");
background-size: 100% 100%;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center; background-position: top;
transition: all 0.5s ease-in-out; transition: all 0.5s ease-in-out;
border: solid 1px rgba(5, 5, 5, 0.055); border: solid 1px rgba(5, 5, 5, 0.055);
box-shadow: 0px 0px 80px rgb(0, 0, 0); box-shadow: 0 0 80px rgb(0, 0, 0);
} }
&:hover { &:hover {
+3 -3
View File
@@ -1,5 +1,5 @@
<template> <template>
<tr class="songlist-item" :class="{ current: current.track_id == song.track_id }"> <tr class="songlist-item" :class="{ current: current.track_id === song.track_id }">
<td class="index">{{ index }}</td> <td class="index">{{ index }}</td>
<td class="flex" @click="emitUpdate(song)"> <td class="flex" @click="emitUpdate(song)">
<div <div
@@ -8,7 +8,7 @@
> >
<div <div
class="now-playing-track image" class="now-playing-track image"
v-if="current.track_id == song.track_id" v-if="current.track_id === song.track_id"
:class="{ active: is_playing, not_active: !is_playing }" :class="{ active: is_playing, not_active: !is_playing }"
></div> ></div>
</div> </div>
@@ -22,7 +22,7 @@
</div> </div>
</td> </td>
<td class="song-artists"> <td class="song-artists">
<div class="ellip" v-if="song.artists[0] != ''"> <div class="ellip" v-if="song.artists[0] !== ''">
<span <span
class="artist" class="artist"
v-for="artist in putCommas(song.artists)" v-for="artist in putCommas(song.artists)"
+4 -5
View File
@@ -3,7 +3,7 @@
class="track-item h-1" class="track-item h-1"
@click="playThis(props.track)" @click="playThis(props.track)"
:class="{ :class="{
currentInQueue: current.track_id == props.track.track_id, currentInQueue: current.track_id === props.track.track_id,
}" }"
> >
<div <div
@@ -14,7 +14,7 @@
> >
<div <div
class="now-playing-track image" class="now-playing-track image"
v-if="current.track_id == props.track.track_id" v-if="current.track_id === props.track.track_id"
:class="{ active: is_playing, not_active: !is_playing }" :class="{ active: is_playing, not_active: !is_playing }"
></div> ></div>
</div> </div>
@@ -44,7 +44,7 @@ const putCommas = perks.putCommas;
const is_playing = ref(playAudio.playing); const is_playing = ref(playAudio.playing);
const playThis = (song) => { const playThis = (song) => {
playAudio.playAudio(song.filepath); playAudio.playAudio(song.track_id);
perks.current.value = song; perks.current.value = song;
}; };
@@ -58,11 +58,10 @@ const playThis = (song) => {
.track-item { .track-item {
display: flex; display: flex;
align-items: center; align-items: center;
padding: 0.5rem;
border-radius: 0.5rem; border-radius: 0.5rem;
position: relative; position: relative;
height: 4rem; height: 4rem;
padding-left: 4rem; padding: 0.5rem 0.5rem 0.5rem 4rem;
&:hover { &:hover {
cursor: pointer; cursor: pointer;
+4 -6
View File
@@ -10,13 +10,11 @@ const getAlbumTracks = async (name, artist) => {
); );
if (!res.ok) { if (!res.ok) {
const message = `An error has occured: ${res.status}`; const message = `An error has occurred: ${res.status}`;
throw new Error(message); throw new Error(message);
} }
const data = await res.json(); return await res.json();
return data;
}; };
const getAlbumArtists = async (name, artist) => { const getAlbumArtists = async (name, artist) => {
@@ -30,7 +28,7 @@ const getAlbumArtists = async (name, artist) => {
); );
if (!res.ok) { if (!res.ok) {
const message = `An error has occured: ${res.status}`; const message = `An error has occurred: ${res.status}`;
throw new Error(message); throw new Error(message);
} }
@@ -49,7 +47,7 @@ const getAlbumBio = async (name, artist) => {
); );
if (!res.ok) { if (!res.ok) {
const message = `An error has occured: ${res.status}`; const message = `An error has occurred: ${res.status}`;
throw new Error(message); throw new Error(message);
} }
+12 -12
View File
@@ -1,24 +1,24 @@
let base_uri = "http://0.0.0.0:9876"; let base_uri = "http://0.0.0.0:9876";
const getTracksAndDirs = async (path) => { const getTracksAndDirs = async (path) => {
let url; let url;
const encoded_path = encodeURIComponent(path.replaceAll("/", "|")); const encoded_path = encodeURIComponent(path.replaceAll("/", "|"));
url = url = `${base_uri}/f/${encoded_path}`; url = url = `${base_uri}/f/${encoded_path}`;
const res = await fetch(url); const res = await fetch(url);
if (!res.ok) { if (!res.ok) {
const message = `An error has occured: ${res.status}`; const message = `An error has occurred: ${res.status}`;
throw new Error(message); throw new Error(message);
} }
const data = await res.json(); const data = await res.json();
const songs = data.files; const songs = data.files;
const folders = data.folders; const folders = data.folders;
return { songs, folders }; return {songs, folders};
}; };
export default getTracksAndDirs; export default getTracksAndDirs;
+8 -8
View File
@@ -40,10 +40,10 @@ function updateNext(song_) {
(item) => item.track_id === song_.track_id (item) => item.track_id === song_.track_id
); );
if (index == queue.value.length - 1) { if (index === queue.value.length - 1) {
next.value = queue.value[0]; next.value = queue.value[0];
state.prev.value = queue.value[queue.value.length - 2]; state.prev.value = queue.value[queue.value.length - 2];
} else if (index == 0) { } else if (index === 0) {
next.value = queue.value[1]; next.value = queue.value[1];
} else { } else {
next.value = queue.value[index + 1]; next.value = queue.value[index + 1];
@@ -55,9 +55,9 @@ function updatePrev(song) {
(item) => item.track_id === song.track_id (item) => item.track_id === song.track_id
); );
if (index == 0) { if (index === 0) {
prev.value = queue.value[queue.value.length - 1]; prev.value = queue.value[queue.value.length - 1];
} else if (index == queue.value.length - 1) { } else if (index === queue.value.length - 1) {
prev.value = queue.value[index - 1]; prev.value = queue.value[index - 1];
} else { } else {
prev.value = queue.value[index - 1]; prev.value = queue.value[index - 1];
@@ -81,7 +81,7 @@ const readQueue = () => {
}; };
const updateQueue = async (song, type) => { const updateQueue = async (song, type) => {
playAudio.playAudio(song.filepath); playAudio.playAudio(song.track_id);
let list; let list;
switch (type) { switch (type) {
@@ -151,7 +151,7 @@ window.addEventListener("keydown", (e) => {
switch (e.key) { switch (e.key) {
case "ArrowRight": case "ArrowRight":
if (target.tagName == "INPUT") return; if (target.tagName === "INPUT") return;
{ {
if (!key_down_fired) { if (!key_down_fired) {
@@ -169,7 +169,7 @@ window.addEventListener("keydown", (e) => {
case "ArrowLeft": case "ArrowLeft":
{ {
if (!key_down_fired) { if (!key_down_fired) {
if (target.tagName == "INPUT") return; if (target.tagName === "INPUT") return;
key_down_fired = true; key_down_fired = true;
@@ -186,7 +186,7 @@ window.addEventListener("keydown", (e) => {
case " ": case " ":
{ {
if (!key_down_fired) { if (!key_down_fired) {
if (target.tagName == "INPUT") return; if (target.tagName === "INPUT") return;
e.preventDefault(); e.preventDefault();
key_down_fired = true; key_down_fired = true;
+44 -44
View File
@@ -1,4 +1,4 @@
import { ref } from "@vue/reactivity"; import {ref} from "@vue/reactivity";
import perks from "./perks"; import perks from "./perks";
import media from "./mediaNotification.js"; import media from "./mediaNotification.js";
@@ -11,77 +11,77 @@ const current_time = ref(0);
const playing = ref(state.is_playing); const playing = ref(state.is_playing);
const url = "http://0.0.0.0:8901/"; const url = "http://0.0.0.0:9876/file/";
const playAudio = (path) => { const playAudio = (track_id) => {
const elem = document.getElementsByClassName('progress-bar')[0]; const elem = document.getElementsByClassName('progress-bar')[0];
const bottom_elem = document.getElementsByClassName('progress-bar')[1]; const bottom_elem = document.getElementsByClassName('progress-bar')[1];
const full_path = url + encodeURIComponent(path); const full_path = url + encodeURIComponent(track_id);
new Promise((resolve, reject) => { new Promise((resolve, reject) => {
audio.src = full_path; audio.src = full_path;
audio.oncanplaythrough = resolve; audio.oncanplaythrough = resolve;
audio.onerror = reject; audio.onerror = reject;
})
.then(() => {
audio.play();
perks.focusCurrent()
state.is_playing.value = true;
audio.ontimeupdate = () => {
current_time.value = audio.currentTime;
pos.value = (audio.currentTime / audio.duration) * 1000;
let bg_size = ((audio.currentTime / audio.duration)*100)
elem.style.backgroundSize = `${bg_size}% 100%`;
bottom_elem.style.backgroundSize = `${bg_size}% 100%`;
};
}) })
.catch((err) => console.log(err)); .then(() => {
audio.play().then(() => {
perks.focusCurrent()
state.is_playing.value = true;
}
);
audio.ontimeupdate = () => {
current_time.value = audio.currentTime;
pos.value = (audio.currentTime / audio.duration) * 1000;
let bg_size = ((audio.currentTime / audio.duration) * 100)
elem.style.backgroundSize = `${bg_size}% 100%`;
bottom_elem.style.backgroundSize = `${bg_size}% 100%`;
};
})
.catch((err) => console.log(err));
}; };
function playNext() { function playNext() {
playAudio(perks.next.value.filepath); playAudio(perks.next.value.track_id);
perks.current.value = perks.next.value; perks.current.value = perks.next.value;
media.showMediaNotif(); media.showMediaNotif();
} }
function playPrev() { function playPrev() {
playAudio(state.prev.value.filepath); playAudio(state.prev.value.track_id);
perks.current.value = perks.prev.value; perks.current.value = perks.prev.value;
} }
function seek(position) { function seek(position) {
audio.currentTime = (position / 1000) * audio.duration; audio.currentTime = (position / 1000) * audio.duration;
} }
function playPause() { function playPause() {
if (audio.src === "") { if (audio.src === "") {
playAudio(perks.current.value.filepath); playAudio(perks.current.value.filepath);
} }
if (audio.paused) { if (audio.paused) {
audio.play(); audio.play();
} else { } else {
audio.pause(); audio.pause();
} }
} }
audio.addEventListener("play", () => { audio.addEventListener("play", () => {
state.is_playing.value = true; state.is_playing.value = true;
}); });
audio.addEventListener("pause", () => { audio.addEventListener("pause", () => {
state.is_playing.value = false; state.is_playing.value = false;
}); });
audio.addEventListener("ended", () => { audio.addEventListener("ended", () => {
playNext(); playNext();
}); });
export default { playAudio, playNext, playPrev, playPause, seek, pos, playing, current_time }; export default {playAudio, playNext, playPrev, playPause, seek, pos, playing, current_time};
// TODO // TODO
+35 -35
View File
@@ -3,41 +3,41 @@ import Router from "@/router";
import album from "./album.js"; import album from "./album.js";
import state from "./state.js"; import state from "./state.js";
function toAlbum(title, artist) { async function toAlbum(title, artist) {
state.loading.value = true; state.loading.value = true;
album album
.getAlbumTracks(title, artist) .getAlbumTracks(title, artist)
.then((data) => { .then((data) => {
state.album_song_list.value = data.songs; state.album_song_list.value = data.songs;
state.album_info.value = data.info; state.album_info.value = data.info;
}) })
.then( .then(
album.getAlbumArtists(title, artist).then((data) => { await album.getAlbumArtists(title, artist).then((data) => {
state.album_artists.value = data; state.album_artists.value = data;
}) })
) )
.then( .then(
album.getAlbumBio(title, artist).then((data) => { await album.getAlbumBio(title, artist).then((data) => {
if (data == "None") { if (data === "None") {
state.album_bio.value = null; state.album_bio.value = null;
} else { } else {
state.album_bio.value = data; state.album_bio.value = data;
} }
}) })
) )
.then(() => { .then(() => {
Router.push({ Router.push({
name: "AlbumView", name: "AlbumView",
params: { params: {
album: title, album: title,
artist: artist, artist: artist,
}, },
}); });
state.loading.value = false; state.loading.value = false;
}) })
.catch((error) => { .catch((error) => {
console.log(error); console.log(error);
}); });
} }
export default { export default {
+8 -9
View File
@@ -1,4 +1,4 @@
import { ref, customRef } from 'vue' import {customRef, ref} from 'vue'
const debounce = (fn, delay = 0, immediate = false) => { const debounce = (fn, delay = 0, immediate = false) => {
let timeout let timeout
@@ -14,21 +14,20 @@ const debounce = (fn, delay = 0, immediate = false) => {
const useDebouncedRef = (initialValue, delay, immediate) => { const useDebouncedRef = (initialValue, delay, immediate) => {
const state = ref(initialValue) const state = ref(initialValue)
const debouncedRef = customRef((track, trigger) => ({ return customRef((track, trigger) => ({
get() { get() {
track() track()
return state.value return state.value
}, },
set: debounce( set: debounce(
value => { value => {
state.value = value state.value = value
trigger() trigger()
}, },
delay, delay,
immediate immediate
), ),
})) }))
return debouncedRef
} }
export default useDebouncedRef export default useDebouncedRef
+1 -1
View File
@@ -12,4 +12,4 @@ const emitter = mitt();
const app = createApp(App); const app = createApp(App);
app.use(router); app.use(router);
app.provide('emitter', emitter); app.provide('emitter', emitter);
app.mount('#app'); app.mount('#app');
+2 -2
View File
@@ -19,7 +19,7 @@
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import { onMounted } from "@vue/runtime-core"; import { onMounted } from "@vue/runtime-core";
import { onUnmounted } from "@vue/runtime-core"; import { onUnmounted } from "@vue/runtime-core";
import { watch, ref } from "vue"; import { watch } from "vue";
import Header from "../components/AlbumView/Header.vue"; import Header from "../components/AlbumView/Header.vue";
import AlbumBio from "../components/AlbumView/AlbumBio.vue"; import AlbumBio from "../components/AlbumView/AlbumBio.vue";
@@ -42,7 +42,7 @@ export default {
watch( watch(
() => route.params, () => route.params,
() => { () => {
if (route.name == "AlbumView") { if (route.name === "AlbumView") {
routeLoader.toAlbum(route.params.album, route.params.artist); routeLoader.toAlbum(route.params.album, route.params.artist);
} }
} }
+25 -25
View File
@@ -1,26 +1,26 @@
<template> <template>
<div id="f-view-parent" class="card-dark"> <div id="f-view-parent" class="border rounded card-dark">
<div class="fixed"> <div class="fixed">
<Header :path="path" :first_song="songs[0]" @search="updateQueryString" /> <Header :path="path" :first_song="songs[0]" @search="updateQueryString"/>
</div> </div>
<div id="scrollable" ref="scrollable"> <div id="scrollable" ref="scrollable">
<FolderList :folders="folders" /> <FolderList :folders="folders"/>
<div class="separator" v-if="folders.length && songs.length"></div> <div class="separator" v-if="folders.length && songs.length"></div>
<SongList :songs="songs" /> <SongList :songs="songs"/>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { computed, ref } from "@vue/reactivity"; import {computed, ref} from "@vue/reactivity";
import { useRoute } from "vue-router"; import {useRoute} from "vue-router";
import SongList from "@/components/FolderView/SongList.vue"; import SongList from "@/components/FolderView/SongList.vue";
import FolderList from "@/components/FolderView/FolderList.vue"; import FolderList from "@/components/FolderView/FolderList.vue";
import Header from "@/components/FolderView/Header.vue"; import Header from "@/components/FolderView/Header.vue";
import getTracksAndDirs from "../composables/getFiles.js"; import getTracksAndDirs from "../composables/getFiles.js";
import { onMounted, watch } from "@vue/runtime-core"; import {onMounted, watch} from "@vue/runtime-core";
import state from "@/composables/state.js"; import state from "@/composables/state.js";
export default { export default {
@@ -46,9 +46,9 @@ export default {
if (query.value.length > 1) { if (query.value.length > 1) {
for (let i = 0; i < song_list.value.length; i++) { for (let i = 0; i < song_list.value.length; i++) {
if ( if (
song_list.value[i].title song_list.value[i].title
.toLowerCase() .toLowerCase()
.includes(query.value.toLowerCase()) .includes(query.value.toLowerCase())
) { ) {
songs_.push(song_list.value[i]); songs_.push(song_list.value[i]);
} }
@@ -66,9 +66,9 @@ export default {
if (query.value.length > 1) { if (query.value.length > 1) {
for (let i = 0; i < folders_list.value.length; i++) { for (let i = 0; i < folders_list.value.length; i++) {
if ( if (
folders_list.value[i].name folders_list.value[i].name
.toLowerCase() .toLowerCase()
.includes(query.value.toLowerCase()) .includes(query.value.toLowerCase())
) { ) {
folders_.push(folders_list.value[i]); folders_.push(folders_list.value[i]);
} }
@@ -84,19 +84,19 @@ export default {
const getDirData = (path) => { const getDirData = (path) => {
state.loading.value = true; state.loading.value = true;
getTracksAndDirs(path) getTracksAndDirs(path)
.then((data) => { .then((data) => {
scrollable.value.scrollTop = 0; scrollable.value.scrollTop = 0;
state.folder_song_list.value = data.songs; state.folder_song_list.value = data.songs;
state.folder_list.value = data.folders; state.folder_list.value = data.folders;
state.loading.value = false; state.loading.value = false;
}) })
.then(() => { .then(() => {
setTimeout(() => { setTimeout(() => {
query.value = ""; query.value = "";
}, 100); }, 100);
}); });
}; };
getDirData(path.value); getDirData(path.value);
@@ -130,7 +130,7 @@ export default {
position: relative; position: relative;
padding: 4rem $small 0 $small; padding: 4rem $small 0 $small;
overflow: hidden; overflow: hidden;
margin: 0; margin: $small;
} }
#f-view-parent .fixed { #f-view-parent .fixed {