From 96f0bb71a9ba4c9a4f6b4df3bfeafe1876e7b889 Mon Sep 17 00:00:00 2001 From: ash1shkumar Date: Sat, 6 Jun 2026 01:13:00 +0530 Subject: [PATCH] refactor: consolidate analytics computation logic --- .../analytics-comp/PerformanceSummary.tsx | 186 ++++++++++++++---- 1 file changed, 150 insertions(+), 36 deletions(-) diff --git a/frontend/app/components/analytics-comp/PerformanceSummary.tsx b/frontend/app/components/analytics-comp/PerformanceSummary.tsx index 48ef34a..01d89af 100644 --- a/frontend/app/components/analytics-comp/PerformanceSummary.tsx +++ b/frontend/app/components/analytics-comp/PerformanceSummary.tsx @@ -1,6 +1,10 @@ "use client"; -export type AnalyticsMetric = "completed" | "assigned"; +import { useMemo } from "react"; + +export type AnalyticsMetric = + | "completed" + | "assigned"; export type MemberPerformance = { id: string; @@ -17,18 +21,73 @@ export type MemberPerformance = { type PerformanceSummaryProps = { members: MemberPerformance[]; metric: AnalyticsMetric; - onMetricChange: (metric: AnalyticsMetric) => void; + onMetricChange: ( + metric: AnalyticsMetric + ) => void; }; +function calculateTotals( + members: MemberPerformance[] +) { + return members.reduce( + (acc, member) => { + acc.completed += + member.completed; + acc.assigned += + member.assigned; + acc.reviews += + member.reviews; + + return acc; + }, + { + completed: 0, + assigned: 0, + reviews: 0, + } + ); +} + +function calculateCompletionRate( + completed: number, + assigned: number +) { + return assigned > 0 + ? Math.round( + (completed / assigned) * + 100 + ) + : 0; +} + export default function PerformanceSummary({ members, metric, onMetricChange, }: PerformanceSummaryProps) { - const completedTotal = members.reduce((sum, member) => sum + member.completed, 0); - const assignedTotal = members.reduce((sum, member) => sum + member.assigned, 0); - const reviewTotal = members.reduce((sum, member) => sum + member.reviews, 0); - const completionRate = Math.round((completedTotal / assignedTotal) * 100); + const analyticsTotals = + useMemo( + () => + calculateTotals( + members + ), + [members] + ); + + const completedTotal = + analyticsTotals.completed; + + const assignedTotal = + analyticsTotals.assigned; + + const reviewTotal = + analyticsTotals.reviews; + + const completionRate = + calculateCompletionRate( + completedTotal, + assignedTotal + ); return (
@@ -37,23 +96,44 @@ export default function PerformanceSummary({

Contribution Analytics

+

- Explore workload balance, delivery velocity, and review activity by sprint. + Explore workload + balance, delivery + velocity, and review + activity by sprint.

-

Completion

-

{completionRate}%

+

+ Completion +

+ +

+ {completionRate}% +

+
-

Completed

-

{completedTotal}

+

+ Completed +

+ +

+ {completedTotal} +

+
-

Reviews

-

{reviewTotal}

+

+ Reviews +

+ +

+ {reviewTotal} +

@@ -62,19 +142,32 @@ export default function PerformanceSummary({

- Task Completion Velocity + Task Completion + Velocity

+

- Toggle between completed work and assigned workload. + Toggle between + completed work and + assigned workload.

- {(["completed", "assigned"] as const).map((item) => ( + {( + [ + "completed", + "assigned", + ] as const + ).map((item) => (
- {members.map((member) => { - const activeValue = member[metric]; - return ( -
-
-
- - {activeValue}% + {members.map( + (member) => { + const activeValue = + member[ + metric + ]; + + return ( +
+
+
+ + + { + activeValue + } + % + +
+ + + {member.name + .split( + " " + )[0]}
- - {member.name.split(" ")[0]} - -
- ); - })} + ); + } + )}
); -} +} \ No newline at end of file