"use client"; import { Disc, ListMusic, Play, Repeat, SkipForward, Sliders, 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, 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 queueTotal = queueList.reduce( (acc, it) => acc + (it.durationMs ?? 0), 0, ); const mediaRef = useStaggerReveal(".media-tile", { stagger: 0.06, y: 16, dependencies: [playing, queueList.length], }); const tone = playing ? "signal" : queueList.length ? "amber" : "signal"; useEffect(() => { ambient.set( tone, playing ? 0.5 : 0.25, playing ? "now playing" : "media idle", ); }, [tone, playing, ambient]); const onPlay = async () => { const u = url.trim(); if (!u) { toast({ title: "Enter a media URL", tone: "vermilion" }); return; } try { await queue.mutateAsync({ url: u, mode: "music" }); setUrl(""); toast({ title: "Queued track", 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.1, 0.1, 0.1, 0.1, 0.1, 0.1]; return (
{/* Top Media Matrix Stage */}
{/* Spatial Grid Header */}

MEDIA FREQUENCY DECK

{playing ? "STREAM_ACTIVE · 48KHZ STEREO" : "DECK_IDLE · STANDBY"}
{playing ? "TRANSMITTING" : "STANDBY"}
{/* Player Core View */}
{/* Vinyl & Visualizer Stage */}
{current?.thumbnailUrl ? (
) : (
)} {playing && (
)}
{/* Current Track Telemetry & Controls */}
{current ? "CURRENT TRANSMISSION" : "DECK UNLOADED"}

{current?.title ?? "No active stream"}

{current?.source ? `Source: ${current.source}` : "Queue a URL below to broadcast"}
{/* Realtime Equalizer preview */}
{/* Interactive Playback Toolbar */}
{/* Ingest & Queue Spatial Deck */}
{/* URL Ingest Box */}
INJECT AUDIO STREAM
setUrl(e.target.value)} placeholder="Paste YouTube or Audio URL..." className="font-mono text-xs" />
{/* Queue List Stage */}
QUEUE STACK ({queueList.length})
Total: {formatDuration(queueTotal)}
{queueList.length > 0 ? ( queueList.map((item, idx) => (
{idx + 1}. {item.title ?? "Unknown Track"}
{formatDuration(item.durationMs ?? 0)}
)) ) : (
NO QUEUED AUDIO IN BUFFER
)}
); }