From d32fa39aab77b87332d6cc2645cf4f2274ce9517 Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Mon, 21 Apr 2025 17:11:06 -0500 Subject: [PATCH] Add sections to admin menus --- src/admin/AdminAppMenu.tsx | 33 ++++++++++++++++++---------- src/admin/AdminPhotoMenu.tsx | 20 ++++++++--------- src/components/more/MoreMenu.tsx | 33 +++++++++++++++++++--------- src/components/more/MoreMenuItem.tsx | 4 +++- 4 files changed, 58 insertions(+), 32 deletions(-) diff --git a/src/admin/AdminAppMenu.tsx b/src/admin/AdminAppMenu.tsx index cfd61fe8..c6a09b40 100644 --- a/src/admin/AdminAppMenu.tsx +++ b/src/admin/AdminAppMenu.tsx @@ -29,6 +29,7 @@ import { IoMdCheckboxOutline } from 'react-icons/io'; import Spinner from '@/components/Spinner'; import IconBroom from '@/components/icons/IconBroom'; import InsightsIndicatorDot from './insights/InsightsIndicatorDot'; +import MoreMenuItem from '@/components/more/MoreMenuItem'; export default function AdminAppMenu({ active, @@ -60,17 +61,21 @@ export default function AdminAppMenu({ const showAppInsightsLink = photosCountTotal > 0 && !isAltPressed; - const items: ComponentProps['items'] = [{ + const sectionUpload: ComponentProps[] = []; + const sectionMain: ComponentProps[] = []; + const sectionSignOut: ComponentProps[] = []; + + sectionUpload.push({ label: 'Upload Photos', icon: , action: startUpload, - }]; + }); if (uploadsCount) { - items.push({ + sectionMain.push({ label: 'Uploads', annotation: `${uploadsCount}`, icon: @@ -100,7 +105,7 @@ export default function AdminAppMenu({ }); } if (photosCountTotal) { - items.push({ + sectionMain.push({ label: 'Manage Photos', ...photosCountTotal && { annotation: `${photosCountTotal}`, @@ -113,7 +118,7 @@ export default function AdminAppMenu({ }); } if (tagsCount) { - items.push({ + sectionMain.push({ label: 'Manage Tags', annotation: `${tagsCount}`, icon: , action: () => signOutAction().then(clearAuthStateAndRedirectIfNecessary), @@ -235,7 +242,11 @@ export default function AdminAppMenu({ '[&>*>*]:translate-y-[6px]', !animateMenuClose && '[&>*>*]:duration-300', )} - items={items} + sections={[ + sectionUpload, + sectionMain, + sectionSignOut, + ]} ariaLabel="Admin Menu" /> ); diff --git a/src/admin/AdminPhotoMenu.tsx b/src/admin/AdminPhotoMenu.tsx index b5545924..3d3b7822 100644 --- a/src/admin/AdminPhotoMenu.tsx +++ b/src/admin/AdminPhotoMenu.tsx @@ -31,7 +31,7 @@ export default function AdminPhotoMenu({ revalidatePhoto, includeFavorite = true, ...props -}: Omit, 'items'> & { +}: Omit, 'sections'> & { photo: Photo revalidatePhoto?: RevalidatePhoto includeFavorite?: boolean @@ -43,8 +43,8 @@ export default function AdminPhotoMenu({ const shouldRedirectFav = isPathFavs(path) && isFav; const shouldRedirectDelete = pathForPhoto({ photo: photo.id }) === path; - const items = useMemo(() => { - const items: ComponentProps[] = [{ + const sections = useMemo(() => { + const sectionMain: ComponentProps[] = [{ label: 'Edit', icon: revalidatePhoto?.(photo.id)), }); } - items.push({ + sectionMain.push({ label: 'Download', icon: Sync @@ -90,7 +90,7 @@ export default function AdminPhotoMenu({ action: () => syncPhotoAction(photo.id) .then(() => revalidatePhoto?.(photo.id)), }); - items.push({ + const sectionDelete = [{ label: 'Delete', icon: : null diff --git a/src/components/more/MoreMenu.tsx b/src/components/more/MoreMenu.tsx index fb41cc03..da930930 100644 --- a/src/components/more/MoreMenu.tsx +++ b/src/components/more/MoreMenu.tsx @@ -11,7 +11,7 @@ import { FiMoreHorizontal } from 'react-icons/fi'; import MoreMenuItem from './MoreMenuItem'; export default function MoreMenu({ - items, + sections, icon, header, className, @@ -24,7 +24,7 @@ export default function MoreMenu({ onOpen, ...props }: { - items: ComponentProps[] + sections: ComponentProps[][] icon?: ReactNode header?: ReactNode className?: string @@ -71,7 +71,7 @@ export default function MoreMenu({ 'z-10', 'min-w-[8rem]', 'component-surface', - 'p-1', + 'py-1', 'shadow-lg', 'data-[side=top]:dark:shadow-[0_0px_40px_rgba(0,0,0,0.6)]', 'data-[side=bottom]:dark:shadow-[0_10px_40px_rgba(0,0,0,0.6)]', @@ -86,13 +86,26 @@ export default function MoreMenu({ )}> {header} } - {items.map(props => - , - )} +
+ {sections.map((section, index) => +
+ {section.map(props => +
+ +
, + )} +
, + )} +
diff --git a/src/components/more/MoreMenuItem.tsx b/src/components/more/MoreMenuItem.tsx index 9a86cf44..e4354da0 100644 --- a/src/components/more/MoreMenuItem.tsx +++ b/src/components/more/MoreMenuItem.tsx @@ -110,7 +110,9 @@ export default function MoreMenuItem({ styleAs="link-without-hover" className="translate-y-[1px]" > - {labelComplex ?? label} + + {labelComplex ?? label} + {annotation && {annotation}