Skip to content
Source
Sign inSign up

use-selected-thread-git-state.ts

50 lines1.7 KB

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 } = useThreadSelection();
14 const { selectedThreadCwd } = useSelectedThreadWorktree();
15​
16 const selectedThreadGitTarget = {
17 environmentId: selectedThread?.environmentId ?? null,
18 cwd: selectedThreadCwd,
19 };
20 const gitActionState = useVcsActionState(selectedThreadGitTarget);
21 const sourceControlDiscovery = useEnvironmentQuery(
22 selectedThread === null
23 ? null
24 : sourceControlEnvironment.discovery({
25 environmentId: selectedThread.environmentId,
26 input: {},
27 }),
28 );
29​
30 const selectedThreadBranchTarget = {
31 environmentId: selectedThread?.environmentId ?? null,
32 cwd: selectedThreadCwd,
33 query: null,
34 };
35 const selectedThreadBranchState = useBranches(selectedThreadBranchTarget);
36 const selectedThreadBranches = useMemo(
37 () =>
38 dedupeRemoteBranchesWithLocalMatches(selectedThreadBranchState.data?.refs ?? []).filter(
39 (branch) => !branch.isRemote,
40 ),
41 [selectedThreadBranchState.data?.refs],
42 );
43​
44 return {
45 gitOperationLabel: gitActionState.currentLabel,
46 sourceControlDiscovery,
47 selectedThreadBranches,
48 selectedThreadBranchesLoading: selectedThreadBranchState.isPending,
49 };