From b30cdc90d6f967a0f6647ffc89e5890588b5bd8a Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Sat, 5 Apr 2025 16:50:20 -0500 Subject: [PATCH] Show data loading status in admin menu --- src/admin/AdminAppMenu.tsx | 20 +++++++++++++++----- src/cmdk/CommandKClient.tsx | 7 ++++--- src/state/AppState.ts | 2 ++ src/state/AppStateProvider.tsx | 10 ++++++++-- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/admin/AdminAppMenu.tsx b/src/admin/AdminAppMenu.tsx index 2f53d0a1..ff3cbf2e 100644 --- a/src/admin/AdminAppMenu.tsx +++ b/src/admin/AdminAppMenu.tsx @@ -25,6 +25,7 @@ import IconFolder from '@/components/icons/IconFolder'; import IconSignOut from '@/components/icons/IconSignOut'; import IconLock from '@/components/icons/IconLock'; import { IoMdCheckboxOutline } from 'react-icons/io'; +import Spinner from '@/components/Spinner'; export default function AdminAppMenu({ active, @@ -40,6 +41,8 @@ export default function AdminAppMenu({ uploadsCount = 0, tagsCount = 0, recipesCount = 0, + hasAdminData, + isLoadingAdminData, selectedPhotoIds, startUpload, setSelectedPhotoIds, @@ -154,11 +157,18 @@ export default function AdminAppMenu({ return ( - + + {!hasAdminData && isLoadingAdminData + ? + :} + Admin menu } icon={
, path: PATH_ADMIN_PHOTOS, }); if (tagsCount) { adminSection.items.push({ - label: 'Manage Tags', + label: `Manage Tags (${tagsCount})`, annotation: , path: PATH_ADMIN_TAGS, }); } if (recipesCount) { adminSection.items.push({ - label: 'Manage Recipes', + label: `Manage Recipes (${recipesCount})`, annotation: , path: PATH_ADMIN_RECIPES, }); diff --git a/src/state/AppState.ts b/src/state/AppState.ts index c7da18b3..c3bae9a1 100644 --- a/src/state/AppState.ts +++ b/src/state/AppState.ts @@ -45,6 +45,8 @@ export type AppStateContextType = { isCheckingAuth?: boolean adminUpdateTimes?: Date[] registerAdminUpdate?: () => void + hasAdminData?: boolean + isLoadingAdminData?: boolean refreshAdminData?: () => void updateAdminData?: (updatedData: Partial) => void selectedPhotoIds?: string[] diff --git a/src/state/AppStateProvider.tsx b/src/state/AppStateProvider.tsx index f83d0cc9..d5b3290a 100644 --- a/src/state/AppStateProvider.tsx +++ b/src/state/AppStateProvider.tsx @@ -129,7 +129,11 @@ export default function AppStateProvider({ }, [auth, authError]); const isUserSignedIn = Boolean(userEmail); - const { data: adminData, mutate: refreshAdminData } = useSWR( + const { + data: adminData, + mutate: refreshAdminData, + isLoading: isLoadingAdminData, + } = useSWR( isUserSignedIn ? 'getAdminData' : null, getAdminDataAction, ); @@ -212,9 +216,11 @@ export default function AppStateProvider({ // ADMIN adminUpdateTimes, registerAdminUpdate, + ...adminData, + hasAdminData: Boolean(adminData), + isLoadingAdminData, refreshAdminData, updateAdminData, - ...adminData, selectedPhotoIds, setSelectedPhotoIds, isPerformingSelectEdit,