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 (