From a16fbd17a8c87b14acdb26ec0d4753ba4b30dca7 Mon Sep 17 00:00:00 2001 From: Ben Senescu <44480372+bensenescu@users.noreply.github.com> Date: Thu, 23 Jul 2026 09:39:28 -0400 Subject: [PATCH] fix(ui): proper loading states for rank tracking list, detail, and dashboard cards (#419) --- src/client/features/dashboard/DashboardPage.tsx | 5 ++++- .../rank-tracking/RankTrackingDomainList.tsx | 13 +++++++++++-- .../p/$projectId/rank-tracking/$configId.tsx | 10 ++++++++-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/client/features/dashboard/DashboardPage.tsx b/src/client/features/dashboard/DashboardPage.tsx index 576799f..fa18ad8 100644 --- a/src/client/features/dashboard/DashboardPage.tsx +++ b/src/client/features/dashboard/DashboardPage.tsx @@ -276,7 +276,10 @@ export function DashboardPage({ projectId }: { projectId: string }) { ); } - if (!activation) { + // Wait for the overview too: rendering cards from `overview === undefined` + // flashes their empty states (and reshuffles the data-first sort) once the + // real data lands. An overview error falls through so the page still loads. + if (!activation || overviewQuery.isPending) { return (
( EMPTY_DOMAIN_LIST_FILTERS, ); - const { data: summaries } = useQuery({ + const { data: summaries, isPending } = useQuery({ queryKey: ["rankTrackingConfigSummaries", projectId], queryFn: () => getRankTrackingConfigSummaries({ data: { projectId } }), }); @@ -106,7 +106,16 @@ export function RankTrackingDomainList({ /> )}
- {allSummaries.length === 0 ? ( + {isPending ? ( +
+ {Array.from({ length: 3 }).map((_, index) => ( +
+
+
+
+ ))} +
+ ) : allSummaries.length === 0 ? (
diff --git a/src/routes/_project/p/$projectId/rank-tracking/$configId.tsx b/src/routes/_project/p/$projectId/rank-tracking/$configId.tsx index a93f029..742fcd0 100644 --- a/src/routes/_project/p/$projectId/rank-tracking/$configId.tsx +++ b/src/routes/_project/p/$projectId/rank-tracking/$configId.tsx @@ -17,7 +17,7 @@ function RankTrackingConfigRoute() { const queryClient = useQueryClient(); const [showConfigModal, setShowConfigModal] = useState(false); - const { data: configs, isLoading } = useQuery({ + const { data: configs, isPending } = useQuery({ queryKey: ["rankTrackingConfigs", projectId], queryFn: () => getRankTrackingConfigs({ data: { projectId } }), }); @@ -40,7 +40,13 @@ function RankTrackingConfigRoute() { }); }; - if (isLoading) return null; + if (isPending) { + return ( +
+ +
+ ); + } if (!config) { return (