, baseBranch?: string) {
const gitWithFeedback = useGitWithFeedback();
const handlePull = useCallback(() => {
gitWithFeedback(() => git.pull(), "Pull");
}, [gitWithFeedback, git]);
const handlePush = useCallback(
(force = false) => {
gitWithFeedback(() => git.push({ force }), force ? "Force Push" : "Push");
},
[gitWithFeedback, git],
);
const handleRebase = useCallback(() => {
const targetBranch = baseBranch?.replace(/^origin\//, "") || "main";
gitWithFeedback(() => git.rebase(targetBranch), "Rebase");
}, [gitWithFeedback, git, baseBranch]);
const handleMerge = useCallback(() => {
const targetBranch = baseBranch?.replace(/^origin\//, "") || "main";
gitWithFeedback(() => git.merge(targetBranch), "Merge");
}, [gitWithFeedback, git, baseBranch]);
return { handlePull, handlePush, handleRebase, handleMerge };
}
const VcsSplitButton = memo(function VcsSplitButton({
sessionId,
baseBranch,
buttonSize = "sm",
className,
}: VcsSplitButtonProps) {
const git = useSessionGit(sessionId);
const { openCommitDialog, openPRDialog } = useVcsDialogs();
const activePR = useActiveTaskPR();
const hasOpenPR = activePR?.state === "open";
const { handlePull, handlePush, handleRebase, handleMerge } = useGitActions(git, baseBranch);
const currentBranch = git.branch;
const remoteBranch = git.remoteBranch;
const hasMatchingUpstream =
remoteBranch && currentBranch && remoteBranch === `origin/${currentBranch}`;
const uncommittedFileCount = git.allFiles.length;
const aheadCount = git.ahead;
const behindCount = git.behind;
const isDisabled = git.isLoading || !sessionId;
const isGitLoading = git.isLoading;
const primaryAction = determinePrimaryAction(
uncommittedFileCount,
aheadCount,
behindCount,
hasOpenPR,
);
const primaryButtonConfig = buildPrimaryButtonConfig({
primaryAction,
uncommittedFileCount,
aheadCount,
behindCount,
baseBranch,
openCommitDialog,
openPRDialog,
handlePush: () => handlePush(false),
handleRebase,
});
const showDivergencePills = primaryAction !== "commit";
return (
{primaryButtonConfig.tooltip}
);
});
export { VcsSplitButton };