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 { KeyHint } from '@/components/key-hint'; import { ComposeOverlay } from './compose/compose-overlay'; import { useComposeIntentStore } from '@/stores/compose-intent-store'; 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(); if (!networkId) throw new Error('NetworkRoot requires a :networkId route param'); 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); 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 (