import { router, usePathname } from "expo-router"; import { useCallback, useMemo } from "react"; import { SidebarHeaderRow } from "@/components/sidebar/sidebar-header-row"; import { resolvePluginIcon } from "./icons"; import { useInstalledPlugins } from "./registry"; import { buildPluginSurfaceRoute, hostIdFromPathname } from "./routes"; import { groupPluginSidebarContributions, getPreferredPluginContributionHost, rememberPluginContributionHost, type PluginSidebarGroup, type PluginSidebarTarget, } from "./sidebar-groups"; function selectTarget( group: PluginSidebarGroup, currentHostId: string | null, ): PluginSidebarTarget { const current = group.targets.find((target) => target.plugin.serverId === currentHostId); if (current) return current; const rememberedHostId = getPreferredPluginContributionHost(group.key); const remembered = group.targets.find((target) => target.plugin.serverId === rememberedHostId); return remembered ?? group.targets[0]; } export function PluginSidebarItems({ onBeforeNavigate }: { onBeforeNavigate?: () => void }) { const plugins = useInstalledPlugins(); const pathname = usePathname(); const groups = useMemo(() => groupPluginSidebarContributions(plugins), [plugins]); const currentHostId = hostIdFromPathname(pathname); return groups.map((group) => ( )); } function PluginSidebarItemRow({ group, currentHostId, pathname, onBeforeNavigate, }: { group: PluginSidebarGroup; currentHostId: string | null; pathname: string; onBeforeNavigate?: () => void; }) { const target = selectTarget(group, currentHostId); const route = buildPluginSurfaceRoute(target.plugin.serverId, group.pluginId, { kind: "sidebar", id: group.contributionId, }); const isActive = group.targets.some( (candidate) => pathname === buildPluginSurfaceRoute(candidate.plugin.serverId, group.pluginId, { kind: "sidebar", id: group.contributionId, }), ); const navigate = useCallback(() => { rememberPluginContributionHost(group.key, target.plugin.serverId); onBeforeNavigate?.(); router.push(route); }, [group.key, onBeforeNavigate, route, target.plugin.serverId]); return ( ); }