From 5af3119096cd58408a6d6a14fefa3bdce270014a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Padez?= Date: Mon, 27 Jul 2026 11:58:02 +0000 Subject: [PATCH] music (web): Favorites hearts in the /music player Wires the web player to the platform's per-user /api/music/favorites (same endpoints the app uses). New useMusicFavorites hook (react-query, shared optimistic cache) + a reusable MusicHeart toggle, placed at: - album header (album) + each track row (track, reveals on row hover, filled favorites stay shown) - album cards in the artist/grid views (album) - artist discography header (artist) - the now-playing player bar (current track) Track key = homePath "Music//"; album/artist keys = music-rel. No dedicated Favorites browsing view yet (hearts only), matching the app. Co-Authored-By: Claude Opus 4.8 --- .../src/MusicPlayer/MusicPlayerHost.tsx | 9 ++++ .../officerdev/src/apps/Music/MusicDetail.tsx | 48 +++++++++++------ .../officerdev/src/apps/Music/MusicHeart.tsx | 43 +++++++++++++++ .../officerdev/src/apps/Music/shared.ts | 6 +++ .../src/apps/Music/useMusicFavorites.ts | 52 +++++++++++++++++++ 5 files changed, 142 insertions(+), 16 deletions(-) create mode 100644 src/workspaces/officerdev/src/apps/Music/MusicHeart.tsx create mode 100644 src/workspaces/officerdev/src/apps/Music/useMusicFavorites.ts diff --git a/src/workspaces/officerdev/src/MusicPlayer/MusicPlayerHost.tsx b/src/workspaces/officerdev/src/MusicPlayer/MusicPlayerHost.tsx index f463a80d..96190a80 100644 --- a/src/workspaces/officerdev/src/MusicPlayer/MusicPlayerHost.tsx +++ b/src/workspaces/officerdev/src/MusicPlayer/MusicPlayerHost.tsx @@ -2,6 +2,8 @@ import { useEffect, useRef, useState } from 'react'; import { useClient } from 'hooks/useClient'; import { Play, Pause, SkipBack, SkipForward, X, Volume2, VolumeX } from 'lucide-react'; import { useSeekBar, SeekBar } from '../apps/FileViewer/renderers/SeekBar'; +import { MusicHeart } from '../apps/Music/MusicHeart'; +import { trackHomePath } from '../apps/Music/shared'; import { useMusicPlayer, type PlayerTrack } from './useMusicPlayer'; // Mounted once in the persistent DashboardLayout (outside ), so it owns the single