"use client";
import { useTranslation } from "react-i18next";
import {
IconAlertTriangle,
IconCloudDownload,
IconCloudUpload,
IconGitCherryPick,
IconGitMerge,
IconGitPullRequest,
} from "@tabler/icons-react";
import {
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuSub,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
} from "@kandev/ui/dropdown-menu";
import { AHEAD_MARK, BEHIND_MARK, DEFAULT_BASE_BRANCH } from "./vcs-constants";
import { RemoteContributionActionItems } from "@/components/task/remote-contribution-action-items";
function StandardPushDropdownItems({
disabled,
hasUpstream,
aheadCount,
pushDisabled,
onPush,
disabledTitle,
}: {
disabled: boolean;
hasUpstream: boolean;
aheadCount: number;
pushDisabled: boolean;
onPush: (force: boolean) => void;
disabledTitle: string;
}) {
const { t } = useTranslation();
return (
{t("integrations:push")}
{hasUpstream && aheadCount > 0 && (
{AHEAD_MARK}
{aheadCount}
)}
onPush(false)}
disabled={disabled || pushDisabled}
title={pushDisabled ? disabledTitle : undefined}
>
{t("integrations:push")}
onPush(true)}
disabled={disabled || pushDisabled}
title={pushDisabled ? disabledTitle : undefined}
>
{t("integrations:forcePush")}
);
}
function ContributionDropdownItems({
disabled,
replaceDisabled,
useDisabled,
onReplaceContribution,
onUseContribution,
onViewPRVersion,
onCompareVersions,
replaceLabelKey,
useLabelKey,
viewLabelKey,
replaceDescriptionKey,
useDescriptionKey,
prNumber,
}: {
disabled: boolean;
replaceDisabled: boolean;
useDisabled: boolean;
onReplaceContribution: () => void;
onUseContribution: () => void;
onViewPRVersion: () => void;
onCompareVersions?: () => void;
replaceLabelKey?: string;
useLabelKey?: string;
viewLabelKey?: string;
replaceDescriptionKey?: string;
useDescriptionKey?: string;
prNumber?: number;
}) {
return (
<>
>
);
}
export type VcsDropdownItemsProps = {
disabled: boolean;
baseBranch?: string;
hasUpstream: boolean;
behindCount: number;
aheadCount: number;
pushDisabled: boolean;
pullDisabled: boolean;
pushDisabledReason?: string;
pullDisabledReason?: string;
showContributionResolution: boolean;
replaceDisabled: boolean;
useDisabled: boolean;
onPR: () => void;
onPull: () => void;
onPush: (force: boolean) => void;
onReplaceContribution: () => void;
onUseContribution: () => void;
onViewPRVersion: () => void;
onCompareVersions?: () => void;
prNumber?: number;
onRebase: () => void;
onMerge: () => void;
};
export function VcsDropdownItems({
disabled,
baseBranch,
hasUpstream,
behindCount,
aheadCount,
pushDisabled,
pullDisabled,
pushDisabledReason,
pullDisabledReason,
showContributionResolution,
replaceDisabled,
useDisabled,
onPR,
onPull,
onPush,
onReplaceContribution,
onUseContribution,
onViewPRVersion,
onCompareVersions,
prNumber,
onRebase,
onMerge,
}: VcsDropdownItemsProps) {
const { t } = useTranslation();
const pushDisabledTitle = pushDisabledReason ?? t("task:divergedActionsUnavailable");
const pullDisabledTitle = pullDisabledReason ?? t("task:divergedActionsUnavailable");
return (
{t("integrations:createPr")}
{t("integrations:pull")}
{hasUpstream && behindCount > 0 && (
{BEHIND_MARK}
{behindCount}
)}
{!showContributionResolution && (
)}
{showContributionResolution && (
)}
{t("integrations:rebase")}
{t("integrations:ontoBranch", { branch: baseBranch || DEFAULT_BASE_BRANCH })}
{t("integrations:merge")}
{t("integrations:fromBranch", { branch: baseBranch || DEFAULT_BASE_BRANCH })}
);
}