import { useCallback, useState } from "react"; import { useNavigate, useParams, useSearchParams } 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 { ComposeQuotaIndicator } from "./compose/compose-quota-indicator"; 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 [composeActive, setComposeActive] = useState(false); const [searchParams, setSearchParams] = useSearchParams(); const statusTab: "open" | "closed" = searchParams.get("status") === "closed" ? "closed" : "open"; const setStatusTab = (next: "open" | "closed") => { setSearchParams( (prev) => { const params = new URLSearchParams(prev); if (next === "open") params.delete("status"); else params.set("status", next); return params; }, { replace: true }, ); }; const { streams, isLoading, canLoadMore, loadMore } = useStreamParticles(path, { status: statusTab, }); const { selectedIndex } = useStreamKeyboardNav({ streams, enabled: !composeActive, onNavigate: useCallback( (streamId: string) => navigate(`/${networkId}/${streamId}`), [navigate, networkId], ), }); return (
{/* Top bar — stays in place */}
setStatusTab(v === "closed" ? "closed" : "open")} > Open Closed
{/* Scrollable content */}
{!composeActive && (
)}
); } function NetworkRootControls() { return (
↑↓ {" "} Enter {" "} navigate 1–9 {" "} jump Hold ` {" "} to start T {" "} text
); }