/* * Copyright 2023 Harness, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import React, { useCallback, useMemo, useRef, useState } from 'react' import { Container, Layout, PageBody, Tabs, Text } from '@harnessio/uicore' import { FontVariation } from '@harnessio/design-system' import { Render } from 'react-jsx-match' import { useHistory } from 'react-router-dom' import { compact } from 'lodash-es' import { useAppContext } from 'AppContext' import { useStrings } from 'framework/strings' import { RepositoryPageHeader } from 'components/RepositoryPageHeader/RepositoryPageHeader' import { getErrorMessage, PullRequestSection } from 'utils/Utils' import { CodeIcon } from 'utils/GitUtils' import type { TypesPullReq, RepoRepositoryOutput } from 'services/code' import { LoadingSpinner } from 'components/LoadingSpinner/LoadingSpinner' import { TabTitleWithCount, tabContainerCSS } from 'components/TabTitleWithCount/TabTitleWithCount' import { ExecutionStatus } from 'components/ExecutionStatus/ExecutionStatus' import { useSetPageContainerWidthVar } from 'hooks/useSetPageContainerWidthVar' import { useScrollTop } from 'hooks/useScrollTop' import { PullRequestMetaLine } from './PullRequestMetaLine' import { Conversation } from './Conversation/Conversation' import { Checks } from './Checks/Checks' import { Changes } from '../../components/Changes/Changes' import { PullRequestCommits } from './PullRequestCommits/PullRequestCommits' import { PullRequestTitle } from './PullRequestTitle' import { useGetPullRequestInfo } from './useGetPullRequestInfo' import css from './PullRequest.module.scss' export default function PullRequest() { const history = useHistory() const { getString } = useStrings() const { routes, standalone, routingId } = useAppContext() const { repoMetadata, loading, error, pullReqChecksDecision, showEditDescription, setShowEditDescription, pullReqMetadata, pullReqStats, pullReqCommits, pullRequestId, pullRequestSection, commitSHA, refetchActivities, refetchCommits, retryOnErrorFunc } = useGetPullRequestInfo() const onAddDescriptionClick = useCallback(() => { setShowEditDescription(true) history.replace( routes.toCODEPullRequest({ repoPath: repoMetadata?.path as string, pullRequestId, pullRequestSection: PullRequestSection.CONVERSATION }) ) }, [history, routes, repoMetadata?.path, pullRequestId, setShowEditDescription]) const activeTab = useMemo( () => Object.values(PullRequestSection).find(value => value === pullRequestSection) ? pullRequestSection : PullRequestSection.CONVERSATION, [pullRequestSection] ) const [pullReqChangesCount, setPullReqChangesCount] = useState(0) const domRef = useRef(null) useSetPageContainerWidthVar({ domRef }) useScrollTop() return ( ) : ( '' ) } dataTooltipId="repositoryPullRequest" extraBreadcrumbLinks={ repoMetadata && [ { label: getString('pullRequests'), url: routes.toCODEPullRequests({ repoPath: repoMetadata.path as string }) } ] } /> <> { history.push( routes.toCODEPullRequest({ repoPath: repoMetadata?.path as string, pullRequestId, pullRequestSection: tabId !== PullRequestSection.CONVERSATION ? (tabId as string) : undefined }) ) }} tabList={[ { id: PullRequestSection.CONVERSATION, title: ( ), panel: ( { setShowEditDescription(false) }} pullReqCommits={pullReqCommits} prStats={pullReqStats} showEditDescription={showEditDescription} onCancelEditDescription={() => setShowEditDescription(false)} /> ) }, { id: PullRequestSection.COMMITS, title: ( ), panel: ( ) }, { id: PullRequestSection.FILES_CHANGED, title: ( ), panel: ( {!!repoMetadata && !!pullReqMetadata && !!pullReqStats && ( )} ) }, { id: PullRequestSection.CHECKS, title: ( {pullReqChecksDecision?.count[pullReqChecksDecision?.overallStatus]} ) : null } count={pullReqChecksDecision?.count?.failure || 0} padding={{ left: 'medium' }} /> ), panel: ( ) } ]} /> ) } // TODO: // - Move pullReqChecksDecision to individual component to avoid weird // re-rendering everything in this page during its polling. Use an atom?