diff --git a/app/api/compare/route.ts b/app/api/compare/route.ts
index b4bdb6f..c2e2168 100644
--- a/app/api/compare/route.ts
+++ b/app/api/compare/route.ts
@@ -77,12 +77,12 @@ function calculateWinner(users: ComparedUserResult[]): {
winner?: {
username: string;
finalScoreDifference: number;
- percentageDifference: number;
+ percentageDifference: number | null;
};
languageWinner?: {
username: string;
finalScoreDifference: number;
- percentageDifference: number;
+ percentageDifference: number | null;
selectedLanguages: string[];
};
} {
@@ -95,28 +95,29 @@ function calculateWinner(users: ComparedUserResult[]): {
const overallLoser =
overallWinner.username === userA.username ? userB : userA;
const overallDifference = Math.abs(userA.finalScore - userB.finalScore);
- const overallPercentage =
- overallLoser.finalScore > 0
- ? (overallDifference / overallLoser.finalScore) * 100
- : 0;
+ const overallPercentage = calculatePercentageDifference(
+ overallDifference,
+ overallLoser.finalScore,
+ );
const result: {
winner: {
username: string;
finalScoreDifference: number;
- percentageDifference: number;
+ percentageDifference: number | null;
};
languageWinner?: {
username: string;
finalScoreDifference: number;
- percentageDifference: number;
+ percentageDifference: number | null;
selectedLanguages: string[];
};
} = {
winner: {
username: overallWinner.username,
finalScoreDifference: Math.round(overallDifference),
- percentageDifference: Math.round(overallPercentage),
+ percentageDifference:
+ overallPercentage === null ? null : Math.round(overallPercentage),
},
};
@@ -132,15 +133,16 @@ function calculateWinner(users: ComparedUserResult[]): {
const languageDifference = Math.abs(
winnerLanguageScores.finalScore - loserLanguageScores.finalScore,
);
- const languagePercentage =
- loserLanguageScores.finalScore > 0
- ? (languageDifference / loserLanguageScores.finalScore) * 100
- : 0;
+ const languagePercentage = calculatePercentageDifference(
+ languageDifference,
+ loserLanguageScores.finalScore,
+ );
result.languageWinner = {
username: languageWinner.username,
finalScoreDifference: Math.round(languageDifference),
- percentageDifference: Math.round(languagePercentage),
+ percentageDifference:
+ languagePercentage === null ? null : Math.round(languagePercentage),
selectedLanguages: winnerLanguageScores.selectedLanguages,
};
}
@@ -148,6 +150,17 @@ function calculateWinner(users: ComparedUserResult[]): {
return result;
}
+function calculatePercentageDifference(
+ difference: number,
+ baseline: number,
+): number | null {
+ if (baseline <= 0) {
+ return difference > 0 ? null : 0;
+ }
+
+ return (difference / baseline) * 100;
+}
+
function createComparisonInsights(
users: ComparedUserResult[],
locale: Locale,
diff --git a/components/home-page-client.tsx b/components/home-page-client.tsx
index 7bcf2fb..59c5917 100644
--- a/components/home-page-client.tsx
+++ b/components/home-page-client.tsx
@@ -26,7 +26,7 @@ type ComparisonData = {
languageWinner?: {
username: string;
finalScoreDifference: number;
- percentageDifference: number;
+ percentageDifference: number | null;
selectedLanguages: string[];
};
insights?: CompareInsights;
diff --git a/components/result-dashboard.tsx b/components/result-dashboard.tsx
index 937ff26..7a98f59 100644
--- a/components/result-dashboard.tsx
+++ b/components/result-dashboard.tsx
@@ -21,7 +21,7 @@ type Props = {
languageWinner?: {
username: string;
finalScoreDifference: number;
- percentageDifference: number;
+ percentageDifference: number | null;
selectedLanguages: string[];
};
insights?: CompareInsights;
@@ -42,6 +42,17 @@ function getGithubProfileUrl(username: string): string {
return `https://github.com/${username}`;
}
+function getPercentageDifference(
+ winnerScore: number,
+ loserScore: number,
+): number | null {
+ if (loserScore <= 0) {
+ return winnerScore > loserScore ? null : 0;
+ }
+
+ return Math.round(((winnerScore - loserScore) / loserScore) * 100);
+}
+
export function ResultDashboard({
user1,
user2,
@@ -88,13 +99,20 @@ export function ResultDashboard({
: winnerFromScores;
const loserUser =
overallWinnerUser === user1 ? user2 : overallWinnerUser === user2 ? user1 : null;
- const winnerDiffPct =
- overallWinnerUser && loserUser && loserUser.finalScore > 0
- ? Math.round(
- ((overallWinnerUser.finalScore - loserUser.finalScore) / loserUser.finalScore) *
- 100,
- )
+ const winnerDiffPct = winner
+ ? winner.percentageDifference
+ : overallWinnerUser && loserUser
+ ? getPercentageDifference(overallWinnerUser.finalScore, loserUser.finalScore)
: 0;
+ const winnerDiffPoints =
+ winner?.finalScoreDifference ??
+ (overallWinnerUser && loserUser
+ ? Math.round(Math.abs(overallWinnerUser.finalScore - loserUser.finalScore))
+ : 0);
+ const winnerLeadValue =
+ winnerDiffPct === null
+ ? t("results.pointsLead", { points: winnerDiffPoints })
+ : `${winnerDiffPct}%`;
const handleCopy = async () => {
try {
@@ -210,7 +228,7 @@ export function ResultDashboard({
);
};
- const renderSignalStats = (user: UserResult) => {
+ const renderSignalStats = (user: UserResult, idx: number) => {
if (!user.signals) return null;
const signalEntries: Array<{ label: string; value: string | number }> = [
@@ -258,7 +276,7 @@ export function ResultDashboard({
];
return (
- {t("banner.leadby")} {winnerDiffPct}% {winnerLeadValue}
- {t("banner.leadby")} {languageWinner.percentageDifference}% + {t("banner.leadby")}{" "} + {languageWinner.percentageDifference === null + ? t("results.pointsLead", { + points: languageWinner.finalScoreDifference, + }) + : `${languageWinner.percentageDifference}%`}
{t("language.winnerNote")}
@@ -449,8 +472,8 @@ export function ResultDashboard({ {t("signals.title")}