Skip to content

Commit 663ca25

Browse files
committed
fix(miles): leaderboard floor connected user's row at AppHeader value
While Fuul's leaderboard data refreshes more slowly than its per-user totals, the leaderboard could briefly show the connected wallet at fewer miles than the AppHeader badge. Override the user's row points (and their entry in the volume-table miles lookup) with the badge value whenever it's higher, so the leaderboard never reads as less than the header.
1 parent 5f58be5 commit 663ca25

1 file changed

Lines changed: 22 additions & 4 deletions

File tree

src/components/dashboard/LeaderboardTable.tsx

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { formatCurrency, formatNumber } from "@/lib/utils"
3131
import { trimWalletAddress } from "@/lib/analytics/services/leaderboard-transform"
3232
import { FEATURE_FLAGS } from "@/lib/feature-flags"
3333
import { useFuulMilesLeaderboard } from "@/hooks/use-fuul-miles-leaderboard"
34+
import { useUserPoints } from "@/hooks/use-user-points"
3435
import {
3536
TIER_THRESHOLDS,
3637
getTierFromVolume,
@@ -122,19 +123,36 @@ export const LeaderboardTable = ({
122123
return { byPoints, byRefs }
123124
}, [milesLeaderboard])
124125

126+
// AppHeader badge value (per-user Fuul totals — updates faster than the
127+
// leaderboard dataset). When the leaderboard hasn't caught up yet we
128+
// surface the header value as the floor for the connected user's row
129+
// so the leaderboard never shows a smaller number than the badge.
130+
const { points: headerPoints } = useUserPoints()
131+
125132
// Find user in miles leaderboard
126133
const userMilesEntry = useMemo(() => {
127134
if (!userAddr || !milesLeaderboard.length) return null
128135
const trimmed = trimWalletAddress(userAddr.toLowerCase())
129-
return milesLeaderboard.find((e) => e.wallet === trimmed) ?? null
130-
}, [userAddr, milesLeaderboard])
136+
const found = milesLeaderboard.find((e) => e.wallet === trimmed) ?? null
137+
if (!found) return null
138+
if (headerPoints > found.points) {
139+
return { ...found, points: headerPoints }
140+
}
141+
return found
142+
}, [userAddr, milesLeaderboard, headerPoints])
131143

132-
// Wallet-to-miles lookup for volume leaderboard rows
144+
// Wallet-to-miles lookup for volume leaderboard rows. Override the
145+
// connected user's entry with the AppHeader value when it's higher.
133146
const milesByWallet = useMemo(() => {
134147
const map = new Map<string, number>()
135148
for (const e of milesLeaderboard) map.set(e.wallet, e.points)
149+
if (userAddr && headerPoints > 0) {
150+
const trimmed = trimWalletAddress(userAddr.toLowerCase())
151+
const current = map.get(trimmed) ?? 0
152+
if (headerPoints > current) map.set(trimmed, headerPoints)
153+
}
136154
return map
137-
}, [milesLeaderboard])
155+
}, [milesLeaderboard, userAddr, headerPoints])
138156

139157
// Next rank miles (person above user)
140158
const nextMilesRankEntry = useMemo(() => {

0 commit comments

Comments
 (0)