diff --git a/app/components/ui/MusicPlayer.tsx b/app/components/ui/MusicPlayer.tsx index 34e0e9cd..71adb3ea 100644 --- a/app/components/ui/MusicPlayer.tsx +++ b/app/components/ui/MusicPlayer.tsx @@ -66,11 +66,38 @@ function matchesRoute(pathname: string | null | undefined, route: string): boole return pathname === route || pathname.startsWith(route + "/"); } +/** localStorage key remembering that the user expanded the player. */ +const PLAYER_EXPANDED_KEY = "pco-player-expanded"; + export function MusicPlayer() { const [playing, setPlaying] = useState(false); const [volume, setVolume] = useState(0.5); const [progress, setProgress] = useState(0); - const [collapsed, setCollapsed] = useState(false); + // Collapsed by default: expanded, the floating pill sits over interactive + // content (on /trade it covers the OTHER MARKETS table header; on /markets + // the table edge), and an unlabeled transport strip reads as broken UI to + // anyone who doesn't know it's a radio. Start as one small labeled button; + // remember the user's expand across pages (effect below — reading + // localStorage in the initializer would risk an SSR hydration mismatch). + const [collapsed, setCollapsed] = useState(true); + + useEffect(() => { + try { + if (localStorage.getItem(PLAYER_EXPANDED_KEY) === "1") setCollapsed(false); + } catch { + // localStorage unavailable — stay collapsed + } + }, []); + + const expand = useCallback(() => { + setCollapsed(false); + try { localStorage.setItem(PLAYER_EXPANDED_KEY, "1"); } catch {} + }, []); + + const collapse = useCallback(() => { + setCollapsed(true); + try { localStorage.removeItem(PLAYER_EXPANDED_KEY); } catch {} + }, []); const audioRef = useRef(null); const containerRef = useRef(null); @@ -198,18 +225,21 @@ export function MusicPlayer() { {collapsed ? ( ) : ( -
+
{/* Play / Pause */} - @@ -245,7 +275,7 @@ export function MusicPlayer() { {/* Collapse */}