diff --git a/bun.lockb b/bun.lockb
index abf32e4..44fe1c3 100755
Binary files a/bun.lockb and b/bun.lockb differ
diff --git a/package.json b/package.json
index ba9e5b0..71d7de2 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,7 @@
"build:proto": "bunx protoc --ts_out ./src/lib/proto/ --proto_path protos protos/*"
},
"devDependencies": {
+ "@iconify-json/lucide": "^1.2.17",
"@sveltejs/adapter-auto": "^3.0.0",
"@sveltejs/kit": "^2.0.0",
"@sveltejs/vite-plugin-svelte": "^4.0.0",
@@ -19,7 +20,7 @@
"bits-ui": "^1.0.0-next.64",
"clsx": "^2.1.1",
"globals": "^15.0.0",
- "lucide-svelte": "^0.460.1",
+ "lucide-svelte": "^0.462.0",
"prettier": "^3.3.2",
"prettier-plugin-svelte": "^3.2.6",
"prettier-plugin-tailwindcss": "^0.6.5",
@@ -30,6 +31,7 @@
"tailwindcss": "^3.4.9",
"tailwindcss-animate": "^1.0.7",
"typescript": "^5.0.0",
+ "unplugin-icons": "^0.20.2",
"vite": "^5.0.3"
},
"dependencies": {
diff --git a/src/app.d.ts b/src/app.d.ts
index da08e6d..a97ca57 100644
--- a/src/app.d.ts
+++ b/src/app.d.ts
@@ -1,3 +1,5 @@
+import 'unplugin-icons/types/svelte';
+
// See https://svelte.dev/docs/kit/types#app.d.ts
// for information about these interfaces
declare global {
diff --git a/src/lib/components/groove/Queue.svelte b/src/lib/components/groove/Queue.svelte
index d9a277f..9781dc2 100644
--- a/src/lib/components/groove/Queue.svelte
+++ b/src/lib/components/groove/Queue.svelte
@@ -64,7 +64,7 @@
+
+
+
+
+
+
{track.name}
+
{track.artistName}
+
+
diff --git a/src/lib/search.svelte.ts b/src/lib/search.svelte.ts
index 72a62b4..35d0a25 100644
--- a/src/lib/search.svelte.ts
+++ b/src/lib/search.svelte.ts
@@ -8,7 +8,7 @@ class SearchState {
filterTracks(tracks: Track[]) {
const fzf = new Fzf(tracks, {
selector: (t) => `${t.name} ${t.artistName}`,
- sort: true,
+ sort: true
});
return fzf.find(this.input);
}
diff --git a/src/routes/tracks/+page.svelte b/src/routes/tracks/+page.svelte
index 7b01150..1002c37 100644
--- a/src/routes/tracks/+page.svelte
+++ b/src/routes/tracks/+page.svelte
@@ -1,61 +1,150 @@
-
- {#each search.input.length > 0 ? (search.filterTracks(data.tracks).map(r => r.item) ?? []) : data.tracks as track (track.hash)}
-
+ {#each data.tracks as track}
+ {
+ e.stopPropagation();
+ e.preventDefault();
+ contextMenuTarget = hash;
+ }}
+ />
{/each}
-
+
+
+ {
+ if (!value) {
+ contextMenuTarget = null;
+ }
+ }}
+>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ e.preventDefault();
+
+ if (contextMenuTarget) {
+ contextMenuTarget = null;
+ }
+ }}
+/>
diff --git a/src/routes/tracks/[hash]/+page.server.ts b/src/routes/tracks/[hash]/+page.server.ts
index 777a6b3..53a3971 100644
--- a/src/routes/tracks/[hash]/+page.server.ts
+++ b/src/routes/tracks/[hash]/+page.server.ts
@@ -7,17 +7,22 @@ import type { PlayTrackResponse, Queue } from '$lib/proto/player';
export const actions = {
play: async ({ params }) => {
- const client = new PlayerClient(protoTransport);
+ try {
+ const client = new PlayerClient(protoTransport);
- const response = await client.playTrack({
- hash: params.hash
- });
+ const response = await client.playTrack({
+ hash: params.hash
+ });
- if (response.response.track === undefined) {
- return fail(500);
+ if (response.response.track === undefined) {
+ return fail(500);
+ }
+
+ return serializable(response.response);
+ } catch (e) {
+ console.log('play error:');
+ console.log(e);
}
-
- return serializable(response.response);
},
'add-to-queue': async ({ params }) => {
const client = new PlayerClient(protoTransport);
diff --git a/vite.config.ts b/vite.config.ts
index bbf8c7d..8911bd4 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,6 +1,12 @@
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
+import Icons from 'unplugin-icons/vite';
export default defineConfig({
- plugins: [sveltekit()]
+ plugins: [
+ sveltekit(),
+ Icons({
+ compiler: 'svelte'
+ })
+ ]
});