addons/isl/src/CommitInfoView/DiffStats.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 {CommitInfo} from '../types';
b69ab319
b69ab3110import * as stylex from '@stylexjs/stylex';
b69ab3111import {ErrorBoundary} from 'isl-components/ErrorNotice';
b69ab3112import {Icon} from 'isl-components/Icon';
b69ab3113import {Tooltip} from 'isl-components/Tooltip';
b69ab3114import {Row} from '../ComponentUtils';
b69ab3115import {T, t} from '../i18n';
b69ab3116import {
b69ab3117 useFetchPendingSignificantLinesOfCode,
b69ab3118 useFetchSignificantLinesOfCode,
b69ab3119} from '../sloc/useFetchSignificantLinesOfCode';
b69ab3120
b69ab3121type Props = {commit: CommitInfo};
b69ab3122const styles = stylex.create({
b69ab3123 locInfo: {
b69ab3124 alignItems: 'center',
b69ab3125 fontWeight: 'bold',
b69ab3126 textTransform: 'lowercase',
b69ab3127 fontSize: '85%',
b69ab3128 opacity: 0.9,
b69ab3129 gap: 'var(--halfpad)',
b69ab3130 },
b69ab3131});
b69ab3132export function LoadingDiffStatsView() {
b69ab3133 return (
b69ab3134 <DiffStatsView>
b69ab3135 <Icon icon="loading" size="XS" />
b69ab3136 <T>lines</T>
b69ab3137 </DiffStatsView>
b69ab3138 );
b69ab3139}
b69ab3140export function DiffStats({commit}: Props) {
b69ab3141 const {slocInfo, isLoading} = useFetchSignificantLinesOfCode(commit);
b69ab3142 const significantLinesOfCode = slocInfo?.sloc;
b69ab3143
b69ab3144 if (isLoading && significantLinesOfCode == null) {
b69ab3145 return <LoadingDiffStatsView />;
b69ab3146 } else if (!isLoading && significantLinesOfCode == null) {
b69ab3147 return null;
b69ab3148 }
b69ab3149 return <ResolvedDiffStatsView significantLinesOfCode={significantLinesOfCode} />;
b69ab3150}
b69ab3151
b69ab3152export function PendingDiffStats() {
b69ab3153 return (
b69ab3154 <ErrorBoundary>
b69ab3155 <PendingDiffStatsView />
b69ab3156 </ErrorBoundary>
b69ab3157 );
b69ab3158}
b69ab3159
b69ab3160export function PendingDiffStatsView() {
b69ab3161 const {slocInfo, isLoading} = useFetchPendingSignificantLinesOfCode();
b69ab3162 const significantLinesOfCode = slocInfo?.sloc;
b69ab3163
b69ab3164 if (isLoading && significantLinesOfCode == null) {
b69ab3165 return <LoadingDiffStatsView />;
b69ab3166 } else if (!isLoading && significantLinesOfCode == null) {
b69ab3167 return null;
b69ab3168 }
b69ab3169 return <ResolvedDiffStatsView significantLinesOfCode={significantLinesOfCode} />;
b69ab3170}
b69ab3171
b69ab3172function ResolvedDiffStatsView({
b69ab3173 significantLinesOfCode,
b69ab3174}: {
b69ab3175 significantLinesOfCode: number | undefined;
b69ab3176}) {
b69ab3177 if (significantLinesOfCode == null) {
b69ab3178 return null;
b69ab3179 }
b69ab3180
b69ab3181 return (
b69ab3182 <DiffStatsView>
b69ab3183 <T replace={{$num: significantLinesOfCode}}>$num lines</T>
b69ab3184 </DiffStatsView>
b69ab3185 );
b69ab3186}
b69ab3187
b69ab3188function DiffStatsView({extras, children}: {extras?: React.ReactNode; children: React.ReactNode}) {
b69ab3189 return (
b69ab3190 <Row xstyle={styles.locInfo}>
b69ab3191 <Icon icon="code" />
b69ab3192 {children}
b69ab3193 <Tooltip
b69ab3194 title={t(
b69ab3195 'This number reflects significant lines of code: non-blank, non-generated additions + deletions',
b69ab3196 )}>
b69ab3197 <Icon icon="info" />
b69ab3198 </Tooltip>
b69ab3199 {extras}
b69ab31100 </Row>
b69ab31101 );
b69ab31102}