'use client';
import { memo, useCallback } from 'react';
import {
IconGitCommit,
IconGitPullRequest,
IconGitMerge,
IconGitCherryPick,
IconLoader2,
IconChevronDown,
IconCloudDownload,
IconCloudUpload,
IconAlertTriangle,
} from '@tabler/icons-react';
import { Button } from '@kandev/ui/button';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
DropdownMenuSeparator,
DropdownMenuSub,
DropdownMenuSubTrigger,
DropdownMenuSubContent,
} from '@kandev/ui/dropdown-menu';
import { Tooltip, TooltipContent, TooltipTrigger } from '@kandev/ui/tooltip';
import { useSessionGitStatus } from '@/hooks/domains/session/use-session-git-status';
import { useGitOperations } from '@/hooks/use-git-operations';
import { useGitWithFeedback } from '@/hooks/use-git-with-feedback';
import { useVcsDialogs } from '@/components/vcs/vcs-dialogs';
type VcsSplitButtonProps = {
sessionId: string | null;
baseBranch?: string;
};
const VcsSplitButton = memo(function VcsSplitButton({
sessionId,
baseBranch,
}: VcsSplitButtonProps) {
const gitWithFeedback = useGitWithFeedback();
const gitStatus = useSessionGitStatus(sessionId);
const { pull, push, rebase, merge, isLoading: isGitLoading } =
useGitOperations(sessionId);
const { openCommitDialog, openPRDialog } = useVcsDialogs();
// Check if remote branch tracks current branch
const currentBranch = gitStatus?.branch;
const remoteBranch = gitStatus?.remote_branch;
const hasMatchingUpstream =
remoteBranch && currentBranch && remoteBranch === `origin/${currentBranch}`;
// Uncommitted file stats
const uncommittedFileCount = gitStatus?.files
? Object.keys(gitStatus.files).length
: 0;
const aheadCount = gitStatus?.ahead ?? 0;
const behindCount = gitStatus?.behind ?? 0;
// --- handlers ---
const handlePull = useCallback(() => {
gitWithFeedback(() => pull(), 'Pull');
}, [gitWithFeedback, pull]);
const handlePush = useCallback(
(force = false) => {
gitWithFeedback(
() => push({ force }),
force ? 'Force Push' : 'Push'
);
},
[gitWithFeedback, push]
);
const handleRebase = useCallback(() => {
const targetBranch = baseBranch?.replace(/^origin\//, '') || 'main';
gitWithFeedback(() => rebase(targetBranch), 'Rebase');
}, [gitWithFeedback, rebase, baseBranch]);
const handleMerge = useCallback(() => {
const targetBranch = baseBranch?.replace(/^origin\//, '') || 'main';
gitWithFeedback(() => merge(targetBranch), 'Merge');
}, [gitWithFeedback, merge, baseBranch]);
// --- dynamic primary action ---
const primaryAction =
uncommittedFileCount > 0
? ('commit' as const)
: aheadCount > 0
? ('pr' as const)
: behindCount > 0
? ('rebase' as const)
: ('commit' as const);
const primaryButtonConfig = {
commit: {
icon: