45 lines
1.3 KiB
TypeScript
45 lines
1.3 KiB
TypeScript
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 };
|
|
}
|