From 23ded20306c0e7cb8bd5812605ae8f5aacd1b311 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Thu, 9 Jul 2026 00:23:13 +0200 Subject: [PATCH] fix(pages): replace bare auth-gate spinners with a layout-reserving skeleton Introduce a shared PageAuthGate (header + tile skeleton) and adopt it on the top-level pages that flashed a lone centered spinner while auth resolved: mood, measurements, achievements, illness, mental-wellbeing, checkups, cycle, and the labs / medications / custom-metrics / illness detail routes. The auth-resolving frame now reserves the page geometry instead of snapping in after a spinner. --- src/app/achievements/page.tsx | 8 +- src/app/checkups/page.tsx | 8 +- src/app/coach/conversations/page.tsx | 5 +- src/app/coach/plans/page.tsx | 9 +- src/app/custom-metrics/[id]/page.tsx | 8 +- src/app/cycle/page.tsx | 16 +- src/app/illness/[id]/page.tsx | 8 +- src/app/illness/page.tsx | 8 +- src/app/labs/[biomarkerId]/page.tsx | 8 +- src/app/measurements/page.tsx | 9 +- src/app/medications/[id]/page.tsx | 16 +- src/app/mental-wellbeing/page.tsx | 8 +- src/app/mood/page.tsx | 9 +- src/app/notifications/__tests__/page.test.tsx | 10 +- src/app/page-client.tsx | 2 +- src/components/cycle/cycle-view.tsx | 9 +- .../medications/dose-history-add-dialog.tsx | 168 +++++++-------- .../medications/dose-history-ledger.tsx | 2 +- .../medications/intake-edit-dialog.tsx | 110 +++++----- .../medications/intake-history-editable.tsx | 4 +- .../medications/intake-import-dialog.tsx | 84 ++++---- .../medications/log-injection-site-dialog.tsx | 108 +++++----- .../medications/log-intake-dialog.tsx | 200 +++++++++--------- .../medications/side-effects-section.tsx | 2 +- .../medications/take-all-due-dialog.tsx | 48 ++--- .../settings/notifications-section.tsx | 5 +- src/components/settings/sharing-section.tsx | 2 +- src/components/ui/page-auth-gate.tsx | 49 +++++ 28 files changed, 465 insertions(+), 458 deletions(-) create mode 100644 src/components/ui/page-auth-gate.tsx diff --git a/src/app/achievements/page.tsx b/src/app/achievements/page.tsx index dc9724cae..603726acd 100644 --- a/src/app/achievements/page.tsx +++ b/src/app/achievements/page.tsx @@ -13,7 +13,6 @@ import { Heart, KeyRound, Languages, - Loader2, Lock, LogIn, Moon, @@ -33,6 +32,7 @@ import { Progress } from "@/components/ui/progress"; import { Badge } from "@/components/ui/badge"; import { EmptyState } from "@/components/ui/empty-state"; import { PageHeader } from "@/components/ui/page-header"; +import { PageAuthGate } from "@/components/ui/page-auth-gate"; import { QueryErrorCard } from "@/components/ui/query-error-card"; import { useAuth } from "@/hooks/use-auth"; import { useTranslations } from "@/lib/i18n/context"; @@ -277,11 +277,7 @@ export default function AchievementsPage() { }); if (authLoading || (achievementsEnabled && isLoading)) { - return ( -
- -
- ); + return ; } // v1.18.0 — module off ⇒ the surface disappears entirely. The nav entry diff --git a/src/app/checkups/page.tsx b/src/app/checkups/page.tsx index 162843a3c..2105fb54b 100644 --- a/src/app/checkups/page.tsx +++ b/src/app/checkups/page.tsx @@ -1,13 +1,13 @@ "use client"; import { useCallback } from "react"; -import { Loader2 } from "lucide-react"; import { useQueryClient } from "@tanstack/react-query"; import { useAuth } from "@/hooks/use-auth"; import { useMounted } from "@/hooks/use-mounted"; import { usePullToRefresh } from "@/hooks/use-pull-to-refresh"; import { PullToRefreshIndicator } from "@/components/ui/pull-to-refresh-indicator"; +import { PageAuthGate } from "@/components/ui/page-auth-gate"; import { VorsorgeSection } from "@/components/measurement-reminders/vorsorge-section"; import { queryKeys } from "@/lib/query-keys"; @@ -35,11 +35,7 @@ export default function CheckupsPage() { const pull = usePullToRefresh({ onRefresh: refresh }); if (!mounted || isLoading) { - return ( -
- -
- ); + return ; } return ( diff --git a/src/app/coach/conversations/page.tsx b/src/app/coach/conversations/page.tsx index 3c55a37c3..e5df84226 100644 --- a/src/app/coach/conversations/page.tsx +++ b/src/app/coach/conversations/page.tsx @@ -136,7 +136,10 @@ function CoachConversationsBody() { // Surface the sibling Plans ledger — otherwise it is reachable // only from the composer's `+` menu. - - - } +