import { useMemo } from "react"; import { useShallow } from "zustand/shallow"; import type { DaemonServerInfo } from "@/stores/session-store"; import { useSessionStore } from "@/stores/session-store"; export type HostFeatureName = keyof NonNullable; export interface HostFeatureSessionState { sessions: Record< string, | { serverInfo: DaemonServerInfo | null; } | undefined >; } export function hostSupportsFeature( serverInfo: DaemonServerInfo | null | undefined, feature: HostFeatureName, ): boolean { return serverInfo?.features?.[feature] === true; } export function selectHostFeature( state: HostFeatureSessionState, serverId: string, feature: HostFeatureName, ): boolean { return hostSupportsFeature(state.sessions[serverId]?.serverInfo, feature); } export function useHostFeature( serverId: string | null | undefined, feature: HostFeatureName, ): boolean { const normalizedServerId = serverId?.trim() ?? ""; return useSessionStore((state) => selectHostFeature(state, normalizedServerId, feature)); } export function useHostFeatureMap( serverIds: readonly string[], feature: HostFeatureName, ): ReadonlyMap { const flags = useSessionStore( useShallow((state) => serverIds.map((serverId) => selectHostFeature(state, serverId, feature))), ); return useMemo( () => new Map(serverIds.map((serverId, index) => [serverId, flags[index] === true] as const)), [flags, serverIds], ); }