addons/isl/src/comments/InlineCommentContent.tsxblame
View source
b69ab311/**
b69ab312 * Copyright (c) Meta Platforms, Inc. and affiliates.
b69ab313 *
b69ab314 * This source code is licensed under the MIT license found in the
b69ab315 * LICENSE file in the root directory of this source tree.
b69ab316 */
b69ab317
b69ab318import type {DiffComment, SuggestedChange} from 'isl/src/types';
b69ab319
b69ab3110import * as stylex from '@stylexjs/stylex';
b69ab3111import {Badge} from 'isl-components/Badge';
b69ab3112import {Column, Row} from 'isl-components/Flex';
b69ab3113import {Icon} from 'isl-components/Icon';
b69ab3114import {AvatarImg} from 'isl/src/Avatar';
b69ab3115import {ArchivedReasonType, ArchivedStateType, CodePatchSuggestionStatus} from 'isl/src/types';
b69ab3116
b69ab3117const styles = stylex.create({
b69ab3118 avatarColumn: {
b69ab3119 flexShrink: 0,
b69ab3120 },
b69ab3121 avatar: {
b69ab3122 marginBlock: '5px',
b69ab3123 },
b69ab3124 commentColumn: {
b69ab3125 gap: 1,
b69ab3126 },
b69ab3127 commentAuthorRow: {
b69ab3128 gap: 6,
b69ab3129 },
b69ab3130 commentAuthor: {
b69ab3131 lineHeight: '17px',
b69ab3132 textWrap: 'nowrap',
b69ab3133 opacity: 0.75,
b69ab3134 },
b69ab3135 versionAbbr: {
b69ab3136 opacity: 0.5,
b69ab3137 whiteSpace: 'nowrap',
b69ab3138 },
b69ab3139 primaryBadge: {
b69ab3140 backgroundColor: 'var(--button-primary-background)',
b69ab3141 color: 'var(--button-primary-foreground)',
b69ab3142 },
b69ab3143 suggestionBadge: {
b69ab3144 gap: '2px',
b69ab3145 },
b69ab3146});
b69ab3147
b69ab3148function getSuggestionBadgeLabel(
b69ab3149 suggestedChange: SuggestedChange | undefined,
b69ab3150): {text: string; isPrimary: boolean} | undefined {
b69ab3151 if (suggestedChange?.patch == null) {
b69ab3152 return undefined;
b69ab3153 }
b69ab3154 if (suggestedChange.status === CodePatchSuggestionStatus.Declined) {
b69ab3155 return {text: 'Rejected', isPrimary: false};
b69ab3156 }
b69ab3157 if (suggestedChange.archivedState === ArchivedStateType.ARCHIVED) {
b69ab3158 switch (suggestedChange.archivedReason) {
b69ab3159 case ArchivedReasonType.APPLIED_IN_EDITOR:
b69ab3160 return {text: 'Applied Inline', isPrimary: true};
b69ab3161 case ArchivedReasonType.APPLIED_MERGED:
b69ab3162 case ArchivedReasonType.APPLIED_STACKED_DIFF:
b69ab3163 return {text: 'Merged', isPrimary: false};
b69ab3164 case ArchivedReasonType.AUTHOR_DISCARDED:
b69ab3165 return {text: 'Rejected', isPrimary: false};
b69ab3166 case ArchivedReasonType.STALE_DIFF_CLOSED:
b69ab3167 case ArchivedReasonType.STALE_FILE_CHANGED:
b69ab3168 return {text: 'Closed', isPrimary: false};
b69ab3169 }
b69ab3170 }
b69ab3171 if (suggestedChange.status === CodePatchSuggestionStatus.Accepted) {
b69ab3172 return {text: 'Accepted', isPrimary: true};
b69ab3173 }
b69ab3174 return {text: 'Suggestion', isPrimary: true};
b69ab3175}
b69ab3176
b69ab3177export function CommentCardBadge({
b69ab3178 label,
b69ab3179 icon,
b69ab3180}: {
b69ab3181 label: {text: string; isPrimary: boolean};
b69ab3182 icon: string;
b69ab3183}) {
b69ab3184 return (
b69ab3185 <Badge xstyle={label.isPrimary && styles.primaryBadge}>
b69ab3186 <Row xstyle={styles.suggestionBadge}>
b69ab3187 <span>
b69ab3188 <Icon icon={icon} size="XS" />
b69ab3189 </span>
b69ab3190 {label.text}
b69ab3191 </Row>
b69ab3192 </Badge>
b69ab3193 );
b69ab3194}
b69ab3195
b69ab3196export default function InlineCommentContent({
b69ab3197 comment,
b69ab3198 isHeadComment = false,
b69ab3199 isHidden = false,
b69ab31100 isLatestVersion = true,
b69ab31101 versionAbbr,
b69ab31102}: {
b69ab31103 comment: DiffComment;
b69ab31104 isHeadComment?: boolean;
b69ab31105 isHidden?: boolean;
b69ab31106 isLatestVersion?: boolean;
b69ab31107 versionAbbr?: string;
b69ab31108}) {
b69ab31109 const label = getSuggestionBadgeLabel(comment.suggestedChange);
b69ab31110 return (
b69ab31111 <Column alignStart xstyle={styles.commentColumn}>
b69ab31112 <Row xstyle={styles.commentAuthorRow}>
b69ab31113 <Column alignStart xstyle={styles.avatarColumn}>
b69ab31114 <AvatarImg
b69ab31115 username={comment.author}
b69ab31116 url={comment.authorAvatarUri}
b69ab31117 xstyle={styles.avatar}
b69ab31118 />
b69ab31119 </Column>
b69ab31120 <div {...stylex.props(styles.commentAuthor)}>{comment.authorName}</div>
b69ab31121 {label && <CommentCardBadge label={label} icon="code" />}
b69ab31122 {isHidden && (
b69ab31123 <CommentCardBadge label={{text: 'Hidden', isPrimary: false}} icon="eye-closed" />
b69ab31124 )}
b69ab31125 {isHeadComment && !isLatestVersion && versionAbbr && (
b69ab31126 <div {...stylex.props(styles.versionAbbr)}>[Original comment on {versionAbbr}]</div>
b69ab31127 )}
b69ab31128 </Row>
b69ab31129 <Row>{comment.content}</Row>
b69ab31130 </Column>
b69ab31131 );
b69ab31132}