/* * 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 from 'react' import { Avatar, Container, Layout, StringSubstitute, Text } from '@harnessio/uicore' import { Icon, IconName } from '@harnessio/icons' import { Color, FontVariation } from '@harnessio/design-system' import { defaultTo } from 'lodash-es' import { Case, Falsy, Match, Truthy } from 'react-jsx-match' import { CodeIcon, GitInfoProps, MergeStrategy } from 'utils/GitUtils' import { useStrings } from 'framework/strings' import type { TypesPullReqActivity } from 'services/code' import type { CommentItem } from 'components/CommentBox/CommentBox' import { PullRequestSection } from 'utils/Utils' import { CommentType, LabelActivity, ReviewerAddActivity } from 'components/DiffViewer/DiffViewerUtils' import { useAppContext } from 'AppContext' import { CommitActions } from 'components/CommitActions/CommitActions' import { PipeSeparator } from 'components/PipeSeparator/PipeSeparator' import { TimePopoverWithLocal } from 'utils/timePopoverLocal/TimePopoverWithLocal' import { Label } from 'components/Label/Label' import { GitRefLink } from 'components/GitRefLink/GitRefLink' import css from './Conversation.module.scss' interface SystemCommentProps extends Pick { commentItems: CommentItem[] repoMetadataPath?: string } interface MergePayload { merge_sha: string merge_method: string rules_bypassed: boolean } interface ReviewerAddActivityPayload { reviewer_type: ReviewerAddActivity } //ToDo : update all comment options with the correct payload type and remove Unknown export const SystemComment: React.FC = ({ pullReqMetadata, commentItems, repoMetadataPath }) => { const { getString } = useStrings() const payload = commentItems[0].payload const type = payload?.type const { routes } = useAppContext() switch (type) { case CommentType.MERGE: { return ( {pullReqMetadata.merger?.display_name}, source: ( {pullReqMetadata.source_branch} ), target: ( {pullReqMetadata.target_branch} ), bypassed: (payload?.payload as MergePayload)?.rules_bypassed, mergeSha: ( ), time: ( ) }} /> ) } case CommentType.REVIEW_SUBMIT: { return ( {payload?.author?.display_name}, state: (payload?.payload as Unknown)?.decision, time: ( ) }} /> ) } case CommentType.BRANCH_UPDATE: { return ( {(payload?.payload as Unknown)?.forced ? ( {payload?.author?.display_name} ), gitRef: ( ), oldCommit: ( ), newCommit: ( ) }} /> ) : ( {payload?.author?.display_name} ), commit: ( ) }} /> )} ) } case CommentType.BRANCH_DELETE: case CommentType.BRANCH_RESTORE: { const isSourceBranchDeleted = type === CommentType.BRANCH_DELETE return ( {payload?.author?.display_name} ), commit: ( ) }} /> ) } case CommentType.STATE_CHANGE: { const openFromDraft = (payload?.payload as Unknown)?.old_draft === true && (payload?.payload as Unknown)?.new_draft === false const changedToDraft = (payload?.payload as Unknown)?.old_draft === false && (payload?.payload as Unknown)?.new_draft === true return ( {payload?.author?.display_name}, old: {(payload?.payload as Unknown)?.old}, new: {(payload?.payload as Unknown)?.new} }} /> ) } case CommentType.TITLE_CHANGE: { return ( {payload?.author?.display_name}, old: ( {(payload?.payload as Unknown)?.old} ), new: {(payload?.payload as Unknown)?.new} }} /> ) } case CommentType.LABEL_MODIFY: { return ( {payload?.author?.display_name} {getString('labels.applied')} {payload?.author?.display_name} {getString('labels.updated')} {payload?.author?.display_name} {getString('labels.removed')} ) } case CommentType.REVIEWER_ADD: { const mentionId = payload?.metadata?.mentions?.ids?.[0] ?? 0 const mentionDisplayName = payload?.mentions?.[mentionId]?.display_name ?? '' return ( {payload?.author?.display_name}, reviewer: {mentionDisplayName} }} /> {payload?.author?.display_name}, reviewer: {mentionDisplayName} }} /> {mentionDisplayName} }} /> ) } case CommentType.REVIEWER_DELETE: { const mentionId = payload?.metadata?.mentions?.ids?.[0] ?? 0 const mentionDisplayName = payload?.mentions?.[mentionId]?.display_name ?? '' return ( {payload?.author?.display_name} }} /> {payload?.author?.display_name}, reviewer: {mentionDisplayName} }} /> ) } default: { // eslint-disable-next-line no-console console.warn('Unable to render system type activity', commentItems) return ( {type} ) } } } const generateReviewDecisionIcon = ( reviewDecision: string ): { name: IconName color: string | undefined size: number | undefined icon: IconName iconProps?: { color?: Color } } => { let icon: IconName = 'dot' let color: Color | undefined = undefined let size: number | undefined = undefined switch (reviewDecision) { case 'changereq': icon = 'main-issue-filled' color = Color.ORANGE_700 size = 18 break case 'approved': icon = 'execution-success' size = 18 color = Color.GREEN_700 break } const name = icon return { name, color, size, icon, ...(color ? { iconProps: { color } } : undefined) } }