diff --git a/apps/web/src/components/pullRequest/PullRequestCodeTab.tsx b/apps/web/src/components/pullRequest/PullRequestCodeTab.tsx index caadd569b9c5f7baf28572fb37704e99d64e12b4..d531259e5781a1b616c10d6461635ebde93e4d3a 100644 --- a/apps/web/src/components/pullRequest/PullRequestCodeTab.tsx +++ b/apps/web/src/components/pullRequest/PullRequestCodeTab.tsx @@ -37,6 +37,7 @@ import { orderDiffFiles } from "./pullRequestFileOrder.logic"; import { buildFileDiffRenderKey, fnv1a32, + getDiffLineStat, getRenderablePatch, resolveDiffThemeName, resolveFileDiffPath, @@ -596,6 +597,23 @@ function PullRequestCodeTab({ ), [loadedSlices], ); + const sourceFileStats = useMemo( + () => + new Map( + parsedSlices.flatMap((parsed) => + parsed?.kind === "files" + ? parsed.files.map( + (file, index) => + [ + buildFileDiffRenderKey(file), + getDiffLineStat([parsed.sourceFiles[index] ?? file]), + ] as const, + ) + : [], + ), + ), + [parsedSlices], + ); const fileKeys = useMemo(() => items.map((item) => item.id), [items]); const collapsedFileKeys = useMemo( () => new Set(items.filter((item) => item.collapsed === true).map((item) => item.id)), @@ -811,12 +829,8 @@ function PullRequestCodeTab({ const renderHeaderMetadata = useCallback( (item: CodeViewItem) => { if (item.type !== "diff") return null; - let additions = 0; - let deletions = 0; - for (const hunk of item.fileDiff.hunks) { - additions += hunk.additionLines; - deletions += hunk.deletionLines; - } + let { additions, deletions } = + sourceFileStats.get(item.id) ?? getDiffLineStat([item.fileDiff]); const path = resolveFileDiffPath(item.fileDiff); if (additions === 0 && deletions === 0) { const withheld = omittedFileStats.get(path); @@ -864,7 +878,7 @@ function PullRequestCodeTab({ ); }, - [omittedFileStats], + [omittedFileStats, sourceFileStats], ); const diffViewOptions = useMemo(