import React, { useState } from 'react' import { Button, ButtonVariation, Color, Container, FlexExpander, Icon, Layout, SplitButton, StringSubstitute, Text, useToaster } from '@harness/uicore' import { useMutate } from 'restful-react' import { Case, Else, Match, Render, Truthy } from 'react-jsx-match' import { Menu, PopoverPosition, Icon as BIcon } from '@blueprintjs/core' import cx from 'classnames' import ReactTimeago from 'react-timeago' import type { EnumMergeMethod, EnumPullReqState, OpenapiMergePullReq, OpenapiStatePullReqRequest, TypesPullReq } from 'services/code' import { useStrings } from 'framework/strings' import { CodeIcon, GitInfoProps, PullRequestFilterOption, PullRequestState } from 'utils/GitUtils' import { getErrorMessage } from 'utils/Utils' import ReviewSplitButton from 'components/Changes/ReviewSplitButton/ReviewSplitButton' import css from './PullRequestActionsBox.module.scss' interface PullRequestActionsBoxProps extends Pick { onPRStateChanged: () => void } interface PRMergeOption { method: EnumMergeMethod | 'close' title: string desc: string disabled?: boolean } export const PullRequestActionsBox: React.FC = ({ repoMetadata, pullRequestMetadata, onPRStateChanged }) => { const { getString } = useStrings() const { showError } = useToaster() const { mutate: mergePR, loading } = useMutate({ verb: 'POST', path: `/api/v1/repos/${repoMetadata.path}/+/pullreq/${pullRequestMetadata.number}/merge` }) const { mutate: updatePRState, loading: loadingState } = useMutate({ verb: 'POST', path: `/api/v1/repos/${repoMetadata.path}/+/pullreq/${pullRequestMetadata.number}/state` }) const mergeable = pullRequestMetadata.merge_check_status === 'mergeable' const isDraft = pullRequestMetadata.is_draft const mergeOptions: PRMergeOption[] = [ { method: 'squash', title: getString('pr.mergeOptions.squashAndMerge'), desc: getString('pr.mergeOptions.squashAndMergeDesc'), disabled: true }, { method: 'merge', title: getString('pr.mergeOptions.createMergeCommit'), desc: getString('pr.mergeOptions.createMergeCommitDesc') }, { method: 'rebase', title: getString('pr.mergeOptions.rebaseAndMerge'), desc: getString('pr.mergeOptions.rebaseAndMergeDesc'), disabled: true }, { method: 'close', title: getString('pr.mergeOptions.close'), desc: getString('pr.mergeOptions.closeDesc') } ] const [mergeOption, setMergeOption] = useState(mergeOptions[1]) if (pullRequestMetadata.state === PullRequestFilterOption.MERGED) { return } return ( {getString( isDraft ? 'prState.draftHeading' : mergeable === false ? 'pr.cantBeMerged' : 'pr.branchHasNoConflicts' )}