diff --git a/apps/web/src/components/settings/SourceControlSettings.tsx b/apps/web/src/components/settings/SourceControlSettings.tsx index 8c134cae18c15..16d4d042693a9 100644 --- a/apps/web/src/components/settings/SourceControlSettings.tsx +++ b/apps/web/src/components/settings/SourceControlSettings.tsx @@ -2,7 +2,7 @@ import { RefreshIcon } from "~/components/ui/refresh-icon"; import { ChevronDownIcon } from "lucide-react"; import * as Duration from "effect/Duration"; import * as Option from "effect/Option"; -import { useEffect, useState, type ReactNode } from "react"; +import { useState, type ReactNode } from "react"; import type { BackgroundActivitySettings, SourceControlDiscoveryResult, @@ -161,24 +161,31 @@ function itemStatusDot(item: VcsDiscoveryItem | SourceControlProviderDiscoveryIt return "bg-success"; } +function sourceControlItemIcon( + item: VcsDiscoveryItem | SourceControlProviderDiscoveryItem, +): ReactNode { + const host = isProviderDiscoveryItem(item) ? sourceControlClients.find(item.kind) : undefined; + const Icon = isProviderDiscoveryItem(item) + ? host && sourceControlIcon(host) + : VCS_ICONS[item.kind]; + return Icon ? : null; +} + function SourceControlItemMark({ item, }: { readonly item: VcsDiscoveryItem | SourceControlProviderDiscoveryItem; }) { const dotClassName = itemStatusDot(item); - const host = isProviderDiscoveryItem(item) ? sourceControlClients.find(item.kind) : undefined; - const Icon = isProviderDiscoveryItem(item) - ? host && sourceControlIcon(host) - : VCS_ICONS[item.kind]; + const icon = sourceControlItemIcon(item); - if (!Icon) { + if (!icon) { return ; } return ( - + {icon} { - if ( - (item.kind === "git" && searchTargetId === searchableSetting("git-fetch-interval").id) || - searchTargetId === sourceControlHostSettingsSearchId(item.kind) || - (item.kind === "github" && searchTargetId === searchableSetting("github-accounts").id) - ) { - setIsExpanded(true); - } - }, [item.kind, searchTargetId]); + // A search jump to a setting inside this row opens it when the target arrives. + const [seenSearchTargetId, setSeenSearchTargetId] = useState(null); + const targetsThisRow = + (item.kind === "git" && searchTargetId === searchableSetting("git-fetch-interval").id) || + searchTargetId === sourceControlHostSettingsSearchId(item.kind) || + (item.kind === "github" && searchTargetId === searchableSetting("github-accounts").id); + if (targetsThisRow && !isExpanded && seenSearchTargetId !== searchTargetId) { + setIsExpanded(true); + } + if (seenSearchTargetId !== searchTargetId) setSeenSearchTargetId(searchTargetId); return (