Skip to content

Commit 470d6df

Browse files
committed
fix: avoid zero balance while rewards sync
1 parent 02c95d8 commit 470d6df

3 files changed

Lines changed: 29 additions & 3 deletions

File tree

apps/web/src/hooks/use-desktop-rewards.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ export function useDesktopRewardsStatus() {
105105
return {
106106
status: rewardsQuery.data ?? createFallbackRewardsStatus(),
107107
loading: rewardsQuery.isLoading,
108+
resolved: rewardsQuery.isFetched,
109+
refreshing: rewardsQuery.isFetching && !rewardsQuery.isLoading,
108110
refresh: rewardsQuery.refetch,
109111
claimTask: claimMutation.mutateAsync,
110112
prepareGithubStarSession: githubStarSessionMutation.mutateAsync,

apps/web/src/layouts/workspace-layout.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,11 @@ function WorkspaceLayoutInner() {
352352
const [showLogoutConfirm, setShowLogoutConfirm] = useState(false);
353353
const [showHelpMenu, setShowHelpMenu] = useState(false);
354354
const [showLangMenu, setShowLangMenu] = useState(false);
355-
const { status: rewardsStatus } = useDesktopRewardsStatus();
355+
const {
356+
status: rewardsStatus,
357+
loading: rewardsStatusLoading,
358+
resolved: rewardsStatusResolved,
359+
} = useDesktopRewardsStatus();
356360
const update = useAutoUpdate();
357361
const [updateDismissed, setUpdateDismissed] = useState(false);
358362
const hasUpdate =
@@ -542,10 +546,16 @@ function WorkspaceLayoutInner() {
542546
const userImage = me?.image ?? session?.user?.image ?? null;
543547
const userInitial = (userName[0] ?? userEmail[0] ?? "U").toUpperCase();
544548
const rewardTaskCountLabel = `${rewardsStatus.progress.claimedCount}/${rewardsStatus.progress.totalCount}`;
549+
const rewardsBalancePending =
550+
cloudConnected &&
551+
!rewardsStatus.cloudBalance &&
552+
(rewardsStatusLoading || !rewardsStatusResolved);
545553
const rewardBalanceValue = rewardsStatus.cloudBalance
546554
? `${rewardsStatus.cloudBalance.totalBalance} ${t("layout.sidebar.balanceUnit")}`
547555
: cloudConnected
548-
? `0 ${t("layout.sidebar.balanceUnit")}`
556+
? rewardsBalancePending
557+
? t("layout.sidebar.balancePlaceholder")
558+
: `0 ${t("layout.sidebar.balanceUnit")}`
549559
: t("layout.sidebar.balancePlaceholder");
550560
const shouldShowRewardsBanner =
551561
cloudConnected &&

apps/web/tests/workspace-layout.test.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,19 @@ describe("WorkspaceLayout", () => {
206206
expect(markup).toContain("Design sync thread");
207207
});
208208

209+
it("shows a syncing placeholder instead of zero balance while rewards are still loading", () => {
210+
const markup = renderWorkspaceLayout(
211+
"/workspace/sessions/sess-1",
212+
undefined,
213+
{
214+
connected: true,
215+
},
216+
);
217+
218+
expect(markup).toContain("layout.sidebar.balancePlaceholder");
219+
expect(markup).not.toContain("0 layout.sidebar.balanceUnit");
220+
});
221+
209222
it("keeps the rewards page route without rendering a main navigation tab", () => {
210223
const markup = renderWorkspaceLayout(
211224
"/workspace/rewards",
@@ -285,7 +298,8 @@ describe("WorkspaceLayout", () => {
285298
expect(markup).not.toContain('data-rewards-card-loading="true"');
286299
expect(markup).toContain('data-sidebar-growth-card="rewards"');
287300
expect(markup).toContain("layout.sidebar.rewardsTitle");
288-
expect(markup).toContain("0 layout.sidebar.balanceUnit");
301+
expect(markup).toContain("layout.sidebar.balancePlaceholder");
302+
expect(markup).not.toContain("0 layout.sidebar.balanceUnit");
289303
});
290304

291305
it("renders a global warning banner on non-remediation pages", () => {

0 commit comments

Comments
 (0)