Show data loading status in admin menu

This commit is contained in:
Sam Becker 2025-04-05 16:50:20 -05:00
parent 5a97b8f7c2
commit b30cdc90d6
4 changed files with 29 additions and 10 deletions

View File

@ -25,6 +25,7 @@ import IconFolder from '@/components/icons/IconFolder';
import IconSignOut from '@/components/icons/IconSignOut'; import IconSignOut from '@/components/icons/IconSignOut';
import IconLock from '@/components/icons/IconLock'; import IconLock from '@/components/icons/IconLock';
import { IoMdCheckboxOutline } from 'react-icons/io'; import { IoMdCheckboxOutline } from 'react-icons/io';
import Spinner from '@/components/Spinner';
export default function AdminAppMenu({ export default function AdminAppMenu({
active, active,
@ -40,6 +41,8 @@ export default function AdminAppMenu({
uploadsCount = 0, uploadsCount = 0,
tagsCount = 0, tagsCount = 0,
recipesCount = 0, recipesCount = 0,
hasAdminData,
isLoadingAdminData,
selectedPhotoIds, selectedPhotoIds,
startUpload, startUpload,
setSelectedPhotoIds, setSelectedPhotoIds,
@ -154,11 +157,18 @@ export default function AdminAppMenu({
return ( return (
<MoreMenu <MoreMenu
header={<div className="flex items-center select-none"> header={<div className="flex items-center select-none">
<IconLock <span className="inline-flex items-center justify-center w-5 mr-2">
size={15} {!hasAdminData && isLoadingAdminData
className="inline-block w-5 mr-2" ? <Spinner
narrow className="translate-x-[1px] translate-y-[1px]"
/> size={13}
/>
:<IconLock
size={16}
className="translate-x-[1px] translate-y-[0.5px]"
narrow
/>}
</span>
<span className="grow">Admin menu</span> <span className="grow">Admin menu</span>
</div>} </div>}
icon={<div className={clsx( icon={<div className={clsx(

View File

@ -127,6 +127,7 @@ export default function CommandKClient({
clearAuthStateAndRedirectIfNecessary, clearAuthStateAndRedirectIfNecessary,
isCommandKOpen: isOpen, isCommandKOpen: isOpen,
startUpload, startUpload,
photosCountTotal,
photosCountHidden, photosCountHidden,
uploadsCount, uploadsCount,
tagsCount, tagsCount,
@ -465,20 +466,20 @@ export default function CommandKClient({
}); });
} }
adminSection.items.push({ adminSection.items.push({
label: 'Manage Photos', label: `Manage Photos (${photosCountTotal})`,
annotation: <IconLock narrow />, annotation: <IconLock narrow />,
path: PATH_ADMIN_PHOTOS, path: PATH_ADMIN_PHOTOS,
}); });
if (tagsCount) { if (tagsCount) {
adminSection.items.push({ adminSection.items.push({
label: 'Manage Tags', label: `Manage Tags (${tagsCount})`,
annotation: <IconLock narrow />, annotation: <IconLock narrow />,
path: PATH_ADMIN_TAGS, path: PATH_ADMIN_TAGS,
}); });
} }
if (recipesCount) { if (recipesCount) {
adminSection.items.push({ adminSection.items.push({
label: 'Manage Recipes', label: `Manage Recipes (${recipesCount})`,
annotation: <IconLock narrow />, annotation: <IconLock narrow />,
path: PATH_ADMIN_RECIPES, path: PATH_ADMIN_RECIPES,
}); });

View File

@ -45,6 +45,8 @@ export type AppStateContextType = {
isCheckingAuth?: boolean isCheckingAuth?: boolean
adminUpdateTimes?: Date[] adminUpdateTimes?: Date[]
registerAdminUpdate?: () => void registerAdminUpdate?: () => void
hasAdminData?: boolean
isLoadingAdminData?: boolean
refreshAdminData?: () => void refreshAdminData?: () => void
updateAdminData?: (updatedData: Partial<AdminData>) => void updateAdminData?: (updatedData: Partial<AdminData>) => void
selectedPhotoIds?: string[] selectedPhotoIds?: string[]

View File

@ -129,7 +129,11 @@ export default function AppStateProvider({
}, [auth, authError]); }, [auth, authError]);
const isUserSignedIn = Boolean(userEmail); const isUserSignedIn = Boolean(userEmail);
const { data: adminData, mutate: refreshAdminData } = useSWR( const {
data: adminData,
mutate: refreshAdminData,
isLoading: isLoadingAdminData,
} = useSWR(
isUserSignedIn ? 'getAdminData' : null, isUserSignedIn ? 'getAdminData' : null,
getAdminDataAction, getAdminDataAction,
); );
@ -212,9 +216,11 @@ export default function AppStateProvider({
// ADMIN // ADMIN
adminUpdateTimes, adminUpdateTimes,
registerAdminUpdate, registerAdminUpdate,
...adminData,
hasAdminData: Boolean(adminData),
isLoadingAdminData,
refreshAdminData, refreshAdminData,
updateAdminData, updateAdminData,
...adminData,
selectedPhotoIds, selectedPhotoIds,
setSelectedPhotoIds, setSelectedPhotoIds,
isPerformingSelectEdit, isPerformingSelectEdit,