From 74ab2b6702f05792cb80dfd8b0464900e6ab8402 Mon Sep 17 00:00:00 2001
From: Ido Shamun <1993245+idoshamun@users.noreply.github.com>
Date: Sun, 28 Jun 2026 14:33:58 +0300
Subject: [PATCH] feat(giveback): redesign contribution summary as flat stat
card
Rounded-square avatar with a corner level badge and the money unlocked
as the hero number, replacing the labeled card with a next-reward block.
Internal-only change: the component takes no props, so the page wiring is
untouched.
---
.../GivebackContributionSummary.tsx | 155 +++++++-----------
1 file changed, 57 insertions(+), 98 deletions(-)
diff --git a/packages/shared/src/features/giveback/components/GivebackContributionSummary.tsx b/packages/shared/src/features/giveback/components/GivebackContributionSummary.tsx
index ef7103fa074..85db304a66c 100644
--- a/packages/shared/src/features/giveback/components/GivebackContributionSummary.tsx
+++ b/packages/shared/src/features/giveback/components/GivebackContributionSummary.tsx
@@ -7,7 +7,7 @@ import {
TypographyTag,
TypographyType,
} from '../../../components/typography/Typography';
-import { GiftIcon, InfoIcon } from '../../../components/icons';
+import { InfoIcon } from '../../../components/icons';
import { IconSize } from '../../../components/Icon';
import {
ProfilePicture,
@@ -18,16 +18,15 @@ import { useGivebackContribution } from '../hooks/useGivebackContribution';
import { useContributionActions } from '../hooks/useContributionActions';
import { formatDonationAmount } from '../utils';
-// Personal recap shown above the action catalog: how much the visitor has
-// unlocked for their causes and the next reward they're working toward. No
-// rank, level or leaderboard — the campaign starts from scratch, so this stays
-// a purely personal progress cue.
+// Personal stat card above the action catalog. A rounded-square avatar (matching
+// daily.dev's app tiles) carries identity with a small level badge tucked in its
+// corner; the money you've unlocked is the hero number beside it. Clean and
+// concrete, no floating ring, no game-y framing.
export const GivebackContributionSummary = (): ReactElement => {
const { user } = useAuthContext();
- const { earnedPoints, nextReward, pointsToNext, currentLevel, isPending } =
+ const { earnedPoints, currentLevel, isPending } =
useGivebackContribution(true);
- // Shares the catalog's query key, so this adds no extra request. Sums the
- // visitor's completions across every action into one "actions taken" count.
+ // Shares the catalog's query key, so this adds no extra request.
const { actions, isPending: isActionsPending } = useContributionActions(true);
const actionsTaken = actions.reduce(
(sum, action) => sum + action.userCompletions,
@@ -35,118 +34,78 @@ export const GivebackContributionSummary = (): ReactElement => {
);
if (isPending) {
+ // Matches the flat loaded layout (avatar + stat lines) so it doesn't flash
+ // from a card into a flat row when data lands.
return (
-
-
-
-
+
+
+
+
+
+
+
);
}
return (
-
+
{user && (
-
+
Lvl {currentLevel}
)}
-
-
- Your contribution
-
-
-
-
+ {formatDonationAmount(earnedPoints)}
+
+
+ {!isActionsPending && (
+
+
-
+
+
+
+
+
+
+ It counts the moment you act. We trust you. If something gets
+ rejected, we just subtract it.
+
+
-
-
-
-
- {formatDonationAmount(earnedPoints)}
-
-
- unlocked for your causes
-
-
- {!isActionsPending && (
-
- {actionsTaken} {actionsTaken === 1 ? 'action' : 'actions'} taken
-
+
)}
-
- {nextReward && (
-
-
- Next reward
-
-
-
-
- {nextReward.title}
-
-
-
- {formatDonationAmount(pointsToNext)} to go
-
-
- )}
);
};