import { useMemo } from 'react'; import { useWebSocket } from './useWebSocket'; import type { Agent, Share, FleetAlert, PoolStatus, AIActivityEntry } from '../types'; /** * Selector hooks reduce re-renders by only returning the specific slice of WS data. * Components that only need agents won't re-render when shares/alerts update. */ export function useAgents(): Agent[] { const ctx = useWebSocket(); return useMemo(() => ctx.agents || [], [ctx.agents]); } export function useRecentShares(): Share[] { const ctx = useWebSocket(); return useMemo(() => ctx.recentShares || [], [ctx.recentShares]); } export function useFleetAlerts(): FleetAlert[] { const ctx = useWebSocket(); return useMemo(() => ctx.fleetAlerts || [], [ctx.fleetAlerts]); } export function usePoolStatus(): PoolStatus[] { const ctx = useWebSocket(); return useMemo(() => ctx.poolStatus || [], [ctx.poolStatus]); } export function useAIActivity(): AIActivityEntry[] { const ctx = useWebSocket(); return useMemo(() => ctx.aiActivity || [], [ctx.aiActivity]); } export function useAgentLogs(): Record { const ctx = useWebSocket(); return useMemo(() => ctx.agentLogs || {}, [ctx.agentLogs]); } export function useCommandResults() { const ctx = useWebSocket(); return useMemo(() => ctx.commandResults || [], [ctx.commandResults]); } export function usePolicyAcks() { const ctx = useWebSocket(); return useMemo(() => ctx.policyAcks || [], [ctx.policyAcks]); } export function useConnectionStatus(): boolean { const ctx = useWebSocket(); return ctx.isConnected; } export function useSendDashboardMessage() { const ctx = useWebSocket(); return ctx.sendDashboardMessage; } /** * Selector for a single agent by ID. * Re-renders only when that specific agent changes. */ export function useAgent(agentId: string): Agent | undefined { const agents = useAgents(); return useMemo(() => agents.find((a) => a.id === agentId), [agents, agentId]); }