1import { useMemo } from "react";
2
3import { dedupeRemoteBranchesWithLocalMatches } from "@t3tools/shared/git";
4
5import { useBranches } from "./queries";
6import { useEnvironmentQuery } from "./query";
7import { sourceControlEnvironment } from "./sourceControl";
8import { useVcsActionState } from "./use-vcs-action-state";
9import { useThreadSelection } from "./use-thread-selection";
10import { useSelectedThreadWorktree } from "./use-selected-thread-worktree";
11
12export function useSelectedThreadGitState() {
13 const { selectedThread, selectedThreadProject } = useThreadSelection();
14 const { selectedThreadCwd } = useSelectedThreadWorktree();
15
16 const selectedThreadGitTarget = useMemo(
17 () => ({
18 environmentId: selectedThread?.environmentId ?? null,
19 cwd: selectedThreadCwd,
20 }),
21 [selectedThread?.environmentId, selectedThreadCwd],
22 );
23 const gitActionState = useVcsActionState(selectedThreadGitTarget);
24 const sourceControlDiscovery = useEnvironmentQuery(
25 selectedThread === null
26 ? null
27 : sourceControlEnvironment.discovery({
28 environmentId: selectedThread.environmentId,
29 input: {},
30 }),
31 );
32
33 const selectedThreadBranchTarget = useMemo(
34 () => ({
35 environmentId: selectedThread?.environmentId ?? null,
36 cwd: selectedThreadProject?.workspaceRoot ?? null,
37 query: null,
38 }),
39 [selectedThread?.environmentId, selectedThreadProject?.workspaceRoot],
40 );
41 const selectedThreadBranchState = useBranches(selectedThreadBranchTarget);
42 const selectedThreadBranches = useMemo(
43 () =>
44 dedupeRemoteBranchesWithLocalMatches(selectedThreadBranchState.data?.refs ?? []).filter(
45 (branch) => !branch.isRemote,
46 ),
47 [selectedThreadBranchState.data?.refs],
48 );
49
50 return {
51 gitOperationLabel: gitActionState.currentLabel,
52 sourceControlDiscovery,
53 selectedThreadBranches,
54 selectedThreadBranchesLoading: selectedThreadBranchState.isPending,
55 };
56}