import { useEffect } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import { useQueryClient } from '@tanstack/react-query'; import { Lock } from 'lucide-react'; import { useLiveParticle } from '@/hooks/use-particle'; import { particlePath } from '@/lib/particle-path'; import { Button } from '@/components/ui/button'; import { StreamView } from '@/features/particles/stream-view'; import { FolderView } from '@/features/particles/folder-view'; /** * Route-level component for /:networkId/*. * Reads params from the router, resolves the particle, and renders * the appropriate view based on particle type. */ export default function ParticleViewResolver() { const { networkId, '*': rest } = useParams(); if (!networkId) throw new Error('ParticleViewResolver requires a :networkId route param'); const segments = (rest ?? '').split('/').filter(Boolean); const path = particlePath(networkId, segments); // path of current container particle const { particle, isLoading, error } = useLiveParticle(path); if (isLoading) { return (

Loading...

); } if (error || !particle) { // Errors here are almost always Firestore permission-denied — the user lost // access to the network or to a custom-visibility particle. The React Router // stays on the dead route, so without an explicit escape the user is stuck. return ; } switch (particle.type) { case 'stream': return ; case 'folder': return ; default: return (

{particle.type} particle: {particle.id}

); } } function InaccessibleParticle() { const navigate = useNavigate(); const queryClient = useQueryClient(); useEffect(() => { // Refresh the networks list so the home page reflects current access. queryClient.invalidateQueries({ queryKey: ['networks'] }); }, [queryClient]); return (

This particle isn't available

It may have been deleted, or your access was removed.

); }