"use client"; import { Button } from "@/components/ui/button"; import { Slider } from "@/components/ui/slider"; import { shared } from "@/lib/comms"; import { sse } from "@/lib/db/sse-endpoints"; import { ExternalLink, RadioTower } from "lucide-react"; import dynamic from "next/dynamic"; import { useEffect, useRef, useState, type ComponentProps } from "react"; const ReactPIP = dynamic( () => import("@/components/dpip").then((e) => e.DocumentPictureInPicture), { ssr: false, }, ); export function PIP(props: ComponentProps) { return ( (
{isOpen ? Content popped out. : props.children}
)} featureUnavailableRenderer={
{props.children}
} /> ); } export function ClientTracker() { const [connected, setConnected] = useState(0); const player = useRef(null); const tracking = useRef(0); shared.signal( "moderator.volume", (ev) => player.current && (player.current.volume = ev ?? 1), ); useEffect( () => player.current ? sse.donate.subMany({ heartbeat: () => tracking.current++, ping: player.current.play.bind(player.current), }).clean : undefined, [], ); useEffect(() => { const interval = setInterval(() => { setConnected(tracking.current); tracking.current = 0; }, 10000); return () => clearInterval(interval); }, []); return ( ); } export function VolumeChanger() { const [volume, setVolume] = shared.state("moderator.volume"); return (
setVolume(v[0])} />
); }