import { createContext, useContext, useMemo, type JSX, type ReactNode } from "react"; import type { AgentGUIAgentTarget, AgentGUIAgentTargetInfoRenderer } from "../types"; interface AgentTargetInfoRendererContextValue { renderer: AgentGUIAgentTargetInfoRenderer | null; targetsByAgentTargetId: ReadonlyMap; } const EMPTY_TARGETS_BY_AGENT_TARGET_ID = new Map(); const AgentTargetInfoRendererContext = createContext({ renderer: null, targetsByAgentTargetId: EMPTY_TARGETS_BY_AGENT_TARGET_ID }); export function AgentTargetInfoRendererProvider({ agentTargets, children, renderer }: { agentTargets: readonly AgentGUIAgentTarget[]; children: ReactNode; renderer?: AgentGUIAgentTargetInfoRenderer | null; }): JSX.Element { const value = useMemo(() => { const targetsByAgentTargetId = new Map(); for (const target of agentTargets) { const agentTargetId = target.agentTargetId?.trim() ?? ""; if (agentTargetId && !targetsByAgentTargetId.has(agentTargetId)) { targetsByAgentTargetId.set(agentTargetId, target); } } return { renderer: renderer ?? null, targetsByAgentTargetId }; }, [agentTargets, renderer]); return ( {children} ); } export function useAgentTargetInfoRenderer(): AgentGUIAgentTargetInfoRenderer | null { return useContext(AgentTargetInfoRendererContext).renderer; } export function useAgentTargetInfoTarget( agentTargetId: string | null | undefined ): AgentGUIAgentTarget | null { const normalizedAgentTargetId = agentTargetId?.trim() ?? ""; const { targetsByAgentTargetId } = useContext(AgentTargetInfoRendererContext); return normalizedAgentTargetId ? (targetsByAgentTargetId.get(normalizedAgentTargetId) ?? null) : null; }