From c34de7c1f675ea72d0ff357fb66d0c80fd318223 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Tue, 3 Nov 2026 07:12:54 +0100 Subject: [PATCH] Simplify the workspace base picker Co-authored-by: Tianyu Yang --- packages/app/e2e/browser/changes-pane.spec.ts | 5 ++- packages/app/src/git/diff-pane.tsx | 37 ++++++++------- .../src/git/workspace-base-branch-picker.tsx | 45 ++++++------------- packages/app/src/i18n/resources/ar.ts | 3 -- packages/app/src/i18n/resources/en.ts | 3 -- packages/app/src/i18n/resources/es.ts | 3 -- packages/app/src/i18n/resources/fr.ts | 3 -- packages/app/src/i18n/resources/ja.ts | 3 -- packages/app/src/i18n/resources/ko.ts | 3 -- packages/app/src/i18n/resources/pt-BR.ts | 3 -- packages/app/src/i18n/resources/ru.ts | 3 -- packages/app/src/i18n/resources/zh-CN.ts | 3 -- 12 files changed, 39 insertions(+), 75 deletions(-) diff --git a/packages/app/e2e/browser/changes-pane.spec.ts b/packages/app/e2e/browser/changes-pane.spec.ts index 2e8353035c..7818cd8733 100644 --- a/packages/app/e2e/browser/changes-pane.spec.ts +++ b/packages/app/e2e/browser/changes-pane.spec.ts @@ -367,6 +367,7 @@ test("Changes lets a compact workspace change its base in a sheet", async ({ pag await page.screenshot({ path: testInfo.outputPath("compact-base-picker.png") }); await release.click(); await expect(picker).toContainText("release"); + await page.screenshot({ path: testInfo.outputPath("compact-base-selected.png") }); }); test("Changes shows a failed base selection and lets the user retry", async ({ page }) => { @@ -392,7 +393,9 @@ test("Changes shows a failed base selection and lets the user retry", async ({ p await expect(picker).toContainText("release"); }); -test("Changes asks to update a host without the base-branch capability", async ({ page }) => { +test("Changes shows the base as text on a host without the base-branch capability", async ({ + page, +}) => { let baseRequests = 0; await page.routeWebSocket(daemonWsRoutePattern(), (browser) => { const server = browser.connectToServer(); diff --git a/packages/app/src/git/diff-pane.tsx b/packages/app/src/git/diff-pane.tsx index 5f370dfea8..d4a7d43ea8 100644 --- a/packages/app/src/git/diff-pane.tsx +++ b/packages/app/src/git/diff-pane.tsx @@ -19,6 +19,7 @@ import type { Theme } from "@/styles/theme"; import { useIsCompactFormFactor } from "@/constants/layout"; import { AlignJustify, + ArrowRight, ChevronDown, Columns2, ExternalLink, @@ -202,6 +203,7 @@ const foregroundMutedIconColorMapping = (theme: Theme) => ({ color: theme.colors const ThemedLoadingSpinner = withUnistyles(LoadingSpinner); const ThemedAlignJustify = withUnistyles(AlignJustify); +const ThemedArrowRight = withUnistyles(ArrowRight); const ThemedColumns2 = withUnistyles(Columns2); const ThemedPilcrow = withUnistyles(Pilcrow); const ThemedWrapText = withUnistyles(WrapText); @@ -471,7 +473,8 @@ interface ChangesPullRequestLinkModel extends Pick - → - {model.baseBranchPicker} + {model.baseRef ? ( + <> + + + + ) : null} {model.pullRequest ? ( @@ -1914,15 +1929,8 @@ export function ChangesSurface({ const changesHeaderModel = useMemo( () => buildChangesHeaderModel({ - baseBranchPicker: ( - - ), + baseRef: baseRef ?? null, + isWorktree: isManagedWorktree(status), branchName: currentBranchName, committedDescription: committedDiffDescription, compact: isMobile, @@ -2012,7 +2020,6 @@ export function ChangesSurface({ } const styles = StyleSheet.create((theme) => ({ - baseArrow: { color: theme.colors.foregroundMuted }, container: { flex: 1, minHeight: 0, diff --git a/packages/app/src/git/workspace-base-branch-picker.tsx b/packages/app/src/git/workspace-base-branch-picker.tsx index 0c8f627bd0..cf260e90d6 100644 --- a/packages/app/src/git/workspace-base-branch-picker.tsx +++ b/packages/app/src/git/workspace-base-branch-picker.tsx @@ -8,12 +8,10 @@ import { StyleSheet, withUnistyles } from "react-native-unistyles"; import type { Theme } from "@/styles/theme"; import { Combobox, ComboboxItem, type ComboboxProps } from "@/components/ui/combobox"; import { ToolbarLabelSelectTrigger } from "@/components/ui/toolbar-label-trigger"; -import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { LoadingSpinner } from "@/components/ui/loading-spinner"; import { Button } from "@/components/ui/button"; import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime"; import { useSessionStore } from "@/stores/session-store"; -import { useToast } from "@/contexts/toast-context"; import { useDebouncedValue } from "@/hooks/use-debounced-value"; import { invalidateCheckoutGitQueriesForClient } from "./query-keys"; @@ -21,7 +19,7 @@ interface Props { serverId: string; workspaceId?: string | null; cwd: string; - baseRef: string | null; + baseRef: string; isWorktree: boolean; } @@ -48,7 +46,6 @@ export function WorkspaceBaseBranchPicker({ (state) => state.sessions[serverId]?.serverInfo?.features?.workspaceBaseBranch === true, ); const queryClient = useQueryClient(); - const toast = useToast(); const anchorRef = useRef(null); const [open, setOpen] = useState(false); const [search, setSearch] = useState(""); @@ -78,7 +75,6 @@ export function WorkspaceBaseBranchPicker({ }, onSuccess: async () => { setOpen(false); - toast.show(t("workspace.git.diff.baseBranch.saved")); await invalidateCheckoutGitQueriesForClient(queryClient, { serverId, cwd }); }, }); @@ -88,22 +84,15 @@ export function WorkspaceBaseBranchPicker({ ); const error = mutation.error ?? branches.error; const title = t("workspace.git.diff.baseBranch.title"); - const label = baseRef ? refLabel(baseRef).replace(/^origin\//, "") : title; - const hint = supported - ? t("workspace.git.diff.baseBranch.hint") - : t("workspace.git.diff.baseBranch.updateHost"); + const label = refLabel(baseRef).replace(/^origin\//, ""); const { reset, mutate, isPending } = mutation; const { refetch, isError } = branches; const handleOpen = useCallback(() => { - if (!supported) { - toast.error(t("workspace.git.diff.baseBranch.updateHost")); - return; - } reset(); setSearch(""); setOpen(true); - }, [reset, supported, toast, t]); + }, [reset]); const handleSelect = useCallback( (ref: string) => { if (!isPending) mutate(ref); @@ -150,26 +139,18 @@ export function WorkspaceBaseBranchPicker({ return ( - - - - - - {hint} - - +