authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-03-03 09:55:52-08:00
committergravatar for jmarminge@gmail.comJulius Marminge <jmarminge@gmail.com> 2026-03-03 10:01:18-08:00
log93af851dc53e950673dacc1fb79c2bd95a8b6a9d
treed1b80f4a1d1af8d0460749381d3fe6f000c27279
parentfabb3e07348eb864d6a2c33234db1afb59c7e310

type


3 files changed, 27 insertions(+), 11 deletions(-)

apps/web/src/components/BranchToolbar.logic.ts+5-3
......@@ -1,10 +1,12 @@
11import type { GitBranch } from "@t3tools/contracts";
22
3export type EnvMode = "local" | "worktree";
4
35export function resolveDraftEnvModeAfterBranchChange(input: {
46 nextWorktreePath: string | null;
57 currentWorktreePath: string | null;
6 effectiveEnvMode: "local" | "worktree";
7}): "local" | "worktree" {
8 effectiveEnvMode: EnvMode;
9}): EnvMode {
810 const { nextWorktreePath, currentWorktreePath, effectiveEnvMode } = input;
911 if (nextWorktreePath) {
1012 return "worktree";
......@@ -16,7 +18,7 @@ export function resolveDraftEnvModeAfterBranchChange(input: {
1618}
1719
1820export function resolveBranchToolbarValue(input: {
19 envMode: "local" | "worktree";
21 envMode: EnvMode;
2022 activeWorktreePath: string | null;
2123 activeThreadBranch: string | null;
2224 currentGitBranch: string | null;
apps/web/src/components/BranchToolbar.tsx+4-4
......@@ -5,14 +5,14 @@ import { newCommandId } from "../lib/utils";
55import { readNativeApi } from "../nativeApi";
66import { useComposerDraftStore } from "../composerDraftStore";
77import { useStore } from "../store";
8import { resolveDraftEnvModeAfterBranchChange } from "./BranchToolbar.logic";
8import { EnvMode, resolveDraftEnvModeAfterBranchChange } from "./BranchToolbar.logic";
99import { BranchToolbarBranchSelector } from "./BranchToolbarBranchSelector";
1010import { Button } from "./ui/button";
1111
1212interface BranchToolbarProps {
1313 threadId: ThreadId;
14 envMode: "local" | "worktree";
15 onEnvModeChange: (mode: "local" | "worktree") => void;
14 envMode: EnvMode;
15 onEnvModeChange: (mode: EnvMode) => void;
1616 envLocked: boolean;
1717 onComposerFocusRequest?: () => void;
1818}
......@@ -38,7 +38,7 @@ export default function BranchToolbar({
3838 const activeWorktreePath = serverThread?.worktreePath ?? draftThread?.worktreePath ?? null;
3939 const branchCwd = activeWorktreePath ?? activeProject?.cwd ?? null;
4040 const hasServerThread = serverThread !== undefined;
41 const effectiveEnvMode: "local" | "worktree" =
41 const effectiveEnvMode: EnvMode =
4242 activeWorktreePath || (!hasServerThread && draftThread?.envMode === "worktree")
4343 ? "worktree"
4444 : envMode;
apps/web/src/components/BranchToolbarBranchSelector.tsx+18-4
......@@ -2,13 +2,22 @@ import type { GitBranch } from "@t3tools/contracts";
22import { useQuery, useQueryClient } from "@tanstack/react-query";
33import { useVirtualizer } from "@tanstack/react-virtual";
44import { ChevronDownIcon } from "lucide-react";
5import { useCallback, useEffect, useMemo, useOptimistic, useRef, useState, useTransition } from "react";
5import {
6 useCallback,
7 useEffect,
8 useMemo,
9 useOptimistic,
10 useRef,
11 useState,
12 useTransition,
13} from "react";
614
715import { gitBranchesQueryOptions, gitQueryKeys, invalidateGitQueries } from "../lib/gitReactQuery";
816import { readNativeApi } from "../nativeApi";
917import {
1018 dedupeRemoteBranchesWithLocalMatches,
1119 deriveLocalBranchNameFromRemoteRef,
20 EnvMode,
1221 resolveBranchToolbarValue,
1322} from "./BranchToolbar.logic";
1423import { Button } from "./ui/button";
......@@ -28,7 +37,7 @@ interface BranchToolbarBranchSelectorProps {
2837 activeThreadBranch: string | null;
2938 activeWorktreePath: string | null;
3039 branchCwd: string | null;
31 effectiveEnvMode: "local" | "worktree";
40 effectiveEnvMode: EnvMode;
3241 envLocked: boolean;
3342 onSetThreadBranch: (branch: string | null, worktreePath: string | null) => void;
3443 onComposerFocusRequest?: () => void;
......@@ -40,7 +49,7 @@ function toBranchActionErrorMessage(error: unknown): string {
4049
4150function getBranchTriggerLabel(input: {
4251 activeWorktreePath: string | null;
43 effectiveEnvMode: "local" | "worktree";
52 effectiveEnvMode: EnvMode;
4453 resolvedActiveBranch: string | null;
4554}): string {
4655 const { activeWorktreePath, effectiveEnvMode, resolvedActiveBranch } = input;
......@@ -215,7 +224,12 @@ export function BranchToolbarBranchSelector({
215224 };
216225
217226 useEffect(() => {
218 if (effectiveEnvMode !== "worktree" || activeWorktreePath || activeThreadBranch || !currentGitBranch) {
227 if (
228 effectiveEnvMode !== "worktree" ||
229 activeWorktreePath ||
230 activeThreadBranch ||
231 !currentGitBranch
232 ) {
219233 return;
220234 }
221235 onSetThreadBranch(currentGitBranch, null);