"use client"; import { Disc, Play, Repeat, SkipForward, Square } from "lucide-react"; import { useEffect, useState } from "react"; import { useAmbient } from "@/components/ambient/ambient-context"; import { Equalizer } from "@/components/charts"; import { Button, GlassPanel, Input, toast } from "@/components/primitives"; import { ErrorState, PageTransition, SectionHeader, SkeletonHero, SkeletonPanel, } from "@/components/shared"; import { useMediaLoop, useMediaQueue, useMediaSkip, useMediaState, useMediaStop, useMediaWsSync, } from "@/hooks"; import { useStaggerReveal } from "@/hooks/use-gsap-animation"; import { formatDuration } from "@/lib/format"; import type { MediaState } from "@/lib/types"; import { useWebSocket } from "@/lib/ws/context"; export function MediaView({ initialStatus }: { initialStatus?: MediaState }) { const ws = useWebSocket(); const { data: media, isLoading, error, mutate, } = useMediaState(initialStatus); const queue = useMediaQueue(); const skip = useMediaSkip(); const stop = useMediaStop(); const loop = useMediaLoop(); useMediaWsSync(ws); const ambient = useAmbient(); const [url, setUrl] = useState(""); const playing = media?.playing ?? false; const current = media?.current ?? null; const queueList = media?.queue ?? []; const mediaRef = useStaggerReveal(".media-tile", { stagger: 0.04, y: 8, dependencies: [playing, queueList.length], }); const tone = playing ? "signal" : queueList.length ? "amber" : "signal"; useEffect(() => { ambient.set( tone, playing ? 0.45 : 0.2, playing ? "playing stream" : "media ready", ); }, [tone, playing, ambient]); const onPlay = async () => { const u = url.trim(); if (!u) { toast({ title: "Enter media URL", tone: "vermilion" }); return; } try { await queue.mutateAsync({ url: u, mode: "music" }); setUrl(""); toast({ title: "Track queued", tone: "signal" }); } catch (e) { toast({ title: "Queue failed", description: String(e), tone: "vermilion", }); } }; if (error && !media) return void mutate()} />; if (!media && isLoading) return (
); const mockLevels = playing ? [0.4, 0.7, 0.9, 0.6, 0.8, 0.5, 0.9, 0.7, 0.4, 0.8, 0.6, 0.9] : [0.08, 0.08, 0.08, 0.08, 0.08, 0.08]; return (
{/* Precision Sub-Header Bar */}

Audio Engine · Media Gateway

ENGINE: {playing ? "STREAMING" : "IDLE"}
{/* Media Playback Deck */}
{current?.title ?? "No Active Media Stream"}
{current ? `${formatDuration(current.durationMs ?? 0)} · High Fidelity Stream` : "Queue a track via URL below"}
{/* Controls */}
{/* Quick URL Input */}
setUrl(e.target.value)} className="flex-1 text-xs" />
{/* Spectrum & Queue Grid */}
{queueList.length === 0 ? (
QUEUE EMPTY
) : ( queueList.map((item, idx) => (
{item.title} {formatDuration(item.durationMs ?? 0)}
)) )}
); }