Move liked tracks state to state/ and recently played merge to player/

This commit is contained in:
2026-09-24 13:58:43 +02:00
parent a54d1ef077
commit 155f0e2b6a
7 changed files with 5 additions and 5 deletions
-45
View File
@@ -1,45 +0,0 @@
import type { LikedTrack, Track } from '$lib/types';
class LikedStore {
entries = $state<Record<string, LikedTrack>>({});
private hydrated = false;
count = $derived(Object.keys(this.entries).length);
list = $derived(Object.values(this.entries).sort((a, b) => b.likedAt - a.likedAt));
hydrate(tracks: LikedTrack[]) {
if (this.hydrated) return;
this.hydrated = true;
this.entries = Object.fromEntries(tracks.map((track) => [track.id, track]));
}
isLiked(id: string): boolean {
return id in this.entries;
}
async toggle(track: Track) {
const id = track.id;
const before = this.entries;
const wasLiked = id in before;
const next = { ...before };
if (wasLiked) delete next[id];
else next[id] = { ...track, likedAt: Date.now() };
this.entries = next;
try {
const res = await fetch('/api/likes', {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({ trackId: id })
});
if (!res.ok) throw new Error('Failed to toggle like');
} catch {
const reverted = { ...this.entries };
if (wasLiked) reverted[id] = before[id];
else delete reverted[id];
this.entries = reverted;
}
}
}
export const liked = new LikedStore();
@@ -0,0 +1,15 @@
import { player } from '$lib/player/player.svelte';
import type { Track } from '$lib/types';
export function mergeRecentlyPlayed(history: Track[], limit: number): Track[] {
const seen = new Set<string>();
const merged: Track[] = [];
for (const track of [...player.recentlyPlayed, ...history]) {
if (seen.has(track.id)) continue;
seen.add(track.id);
merged.push(track);
}
return merged.slice(0, limit);
}