import { useCallback, useMemo, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { CircleDot, CircleCheckBig } from "lucide-react"; import { particlePath } from "@/lib/particle-path"; import { ParticleListView } from "@/features/particles/particle-list-view"; import { VideoAudioToggle } from "@/components/video-audio-toggle"; import { ComposeOverlay } from "./compose/compose-overlay"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { useStreamParticles } from "@/hooks/use-stream-particles"; import { useStreamKeyboardNav } from "@/hooks/use-stream-keyboard-nav"; /** * Route-level component for /:networkId (index). * Shows root-level particles for the selected network. */ export default function NetworkRoot() { const { networkId } = useParams(); const navigate = useNavigate(); const path = particlePath(networkId!, []); const { streams, isLoading } = useStreamParticles(path); const [composeActive, setComposeActive] = useState(false); const [statusTab, setStatusTab] = useState<"open" | "closed">("open"); const filteredStreams = useMemo( () => streams.filter((s) => s.status === statusTab), [streams, statusTab], ); const { selectedIndex } = useStreamKeyboardNav({ streams: filteredStreams, enabled: !composeActive, onNavigate: useCallback( (streamId: string) => navigate(`/${networkId}/${streamId}`), [navigate, networkId], ), }); return (