import { useMemo } from "react"; import { useLiveParticleChildren } from "@/hooks/use-particle"; import { useAuthStore } from "@/stores/auth-store"; import { parseParticlePath, type ParticlePath } from "@/lib/particle-path"; import type { Particle, StreamProperties } from "@/api/types"; type StreamParticle = Particle & { type: "stream"; properties: StreamProperties }; function useVisibilityScopes(userId?: string, networkId?: string) { return useMemo(() => { const scopes: string[] = []; if (userId) scopes.push(`human:${userId}`); if (networkId) scopes.push(`network:${networkId}`); return scopes; }, [userId, networkId]); } interface UseStreamParticlesResult { streams: StreamParticle[]; isLoading: boolean; networkId: string; } export function useStreamParticles(path: ParticlePath): UseStreamParticlesResult { const { networkId } = parseParticlePath(path); const user = useAuthStore((s) => s.user); const visibilityScopes = useVisibilityScopes(user?.id, networkId); const { children, isLoading } = useLiveParticleChildren( path, { orderByField: "last_child_created_at", orderDirection: "desc", visibilityScopes, } ); const streams = useMemo( () => children.filter((c): c is StreamParticle => c.type === "stream"), [children], ); return { streams, isLoading, networkId }; }