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 (