'use client'; import MoreMenu from '@/components/more/MoreMenu'; import { PATH_ADMIN_CONFIGURATION, PATH_ADMIN_INSIGHTS, PATH_ADMIN_PHOTOS, PATH_ADMIN_RECIPES, PATH_ADMIN_TAGS, PATH_ADMIN_UPLOADS, PATH_GRID_INFERRED, } from '@/app/paths'; import { useAppState } from '@/state/AppState'; import { IoArrowDown, IoArrowUp, IoCloseSharp } from 'react-icons/io5'; import { clsx } from 'clsx/lite'; import AdminAppInfoIcon from './AdminAppInfoIcon'; import { signOutAction } from '@/auth/actions'; import { ComponentProps } from 'react'; import useIsKeyBeingPressed from '@/utility/useIsKeyBeingPressed'; import IconPhoto from '@/components/icons/IconPhoto'; import IconUpload from '@/components/icons/IconUpload'; import IconRecipe from '@/components/icons/IconRecipe'; import IconTag from '@/components/icons/IconTag'; import IconFolder from '@/components/icons/IconFolder'; import IconSignOut from '@/components/icons/IconSignOut'; import IconLock from '@/components/icons/IconLock'; import { IoMdCheckboxOutline } from 'react-icons/io'; export default function AdminAppMenu({ active, animateMenuClose, className, }: { active?: boolean animateMenuClose?: boolean className?: string }) { const { photosCountTotal = 0, uploadsCount = 0, tagsCount = 0, recipesCount = 0, selectedPhotoIds, startUpload, setSelectedPhotoIds, refreshAdminData, clearAuthStateAndRedirect, } = useAppState(); const isSelecting = selectedPhotoIds !== undefined; const isAltPressed = useIsKeyBeingPressed('alt'); const showAppInsightsLink = photosCountTotal > 0 && !isAltPressed; const items: ComponentProps['items'] = [{ label: 'Upload Photos', icon: , action: startUpload, }]; if (uploadsCount) { items.push({ label: 'Uploads', annotation: `${uploadsCount}`, icon: , href: PATH_ADMIN_UPLOADS, }); } if (photosCountTotal) { items.push({ label: 'Manage Photos', ...photosCountTotal && { annotation: `${photosCountTotal}`, }, icon: , href: PATH_ADMIN_PHOTOS, }); } if (tagsCount) { items.push({ label: 'Manage Tags', annotation: `${tagsCount}`, icon: , href: PATH_ADMIN_TAGS, }); } if (recipesCount) { items.push({ label: 'Manage Recipes', annotation: `${recipesCount}`, icon: , href: PATH_ADMIN_RECIPES, }); } if (photosCountTotal) { items.push({ label: isSelecting ? 'Exit Batch Edit' : 'Batch Edit ...', icon: isSelecting ? : , href: PATH_GRID_INFERRED, action: () => { if (isSelecting) { setSelectedPhotoIds?.(undefined); } else { setSelectedPhotoIds?.([]); } if (document.activeElement instanceof HTMLElement) { document.activeElement.blur(); } }, shouldPreventDefault: false, }); } items.push({ label: showAppInsightsLink ? 'App Insights' : 'App Configuration', icon: , href: showAppInsightsLink ? PATH_ADMIN_INSIGHTS : PATH_ADMIN_CONFIGURATION, }, { label: 'Sign Out', icon: , action: () => signOutAction().then(clearAuthStateAndRedirect), }); return ( Admin menu } icon={
} align="start" sideOffset={12} alignOffset={-85} onOpen={refreshAdminData} className={clsx( 'border-medium', className, )} buttonClassName={clsx( 'p-0!', 'w-full h-full', 'flex items-center justify-center', 'hover:bg-transparent dark:hover:bg-transparent', 'active:bg-transparent dark:active:bg-transparent', 'rounded-none focus:outline-none', active ? 'text-black dark:text-white' : 'text-gray-400 dark:text-gray-600', )} buttonClassNameOpen={clsx( 'bg-dim text-main!', '[&>*>*]:translate-y-[6px]', !animateMenuClose && '[&>*>*]:duration-300', )} items={items} ariaLabel="Admin Menu" /> ); }