diff --git a/apps/mobile/src/features/pull-requests/PullRequestFiles.tsx b/apps/mobile/src/features/pull-requests/PullRequestFiles.tsx index f699e46d6fb0..dc9c765bf506 100644 --- a/apps/mobile/src/features/pull-requests/PullRequestFiles.tsx +++ b/apps/mobile/src/features/pull-requests/PullRequestFiles.tsx @@ -1,3 +1,4 @@ +import type { PullRequestChangeBreakdown } from "@t3tools/contracts"; import { PullRequestSectionHeading } from "./PullRequestSectionHeading"; import { AnimatedLegendList } from "@legendapp/list/reanimated"; import Animated from "react-native-reanimated"; @@ -23,6 +24,33 @@ import { import { usePullRequestFilesViewed } from "./usePullRequestFilesViewed"; import { usePullRequestFileFilter } from "./usePullRequestFileFilter"; +const BREAKDOWN_LABELS = { + code: "Code", + tests: "Tests", + mocks: "Mocks", + generated: "Generated", +} satisfies Record, string>; + +function PullRequestChangeBreakdownLine(props: { + readonly breakdown: NonNullable; +}) { + const parts = (Object.keys(BREAKDOWN_LABELS) as Array).flatMap( + (kind) => { + const { additions, deletions } = props.breakdown[kind]; + return additions === 0 && deletions === 0 + ? [] + : [ + `${BREAKDOWN_LABELS[kind]} +${additions.toLocaleString()} −${deletions.toLocaleString()}`, + ]; + }, + ); + return ( + + {parts.join(" · ")} + + ); +} + function fileDirectory(path: string) { const separator = path.lastIndexOf("/"); return separator < 0 ? "" : path.slice(0, separator); @@ -37,6 +65,9 @@ export function usePullRequestFilesContent(props: { const result = usePullRequestDiff(props.params); const detail = useEnvironmentQuery(composerPullRequests.detail(requestTarget(props.params))); const viewed = usePullRequestFilesViewed(props.params, props.params.commit ? null : detail.data); + const breakdown = useEnvironmentQuery( + props.params.commit ? null : composerPullRequests.changeBreakdown(requestTarget(props.params)), + ).data; const filter = usePullRequestFileFilter(result.parsed); const parsed = filter.parsed; const loading = result.isPending && parsed.kind === "empty" && !result.error; @@ -209,6 +240,7 @@ export function usePullRequestFilesContent(props: { ? `${filter.hiddenCount} test ${filter.hiddenCount === 1 ? "file" : "files"} hidden` : "Test files included"} + {breakdown ? : null}