From b5c256eee6c8f2b1e90fd77a972c1a1aee512af2 Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Wed, 26 Feb 2025 23:10:23 -0600 Subject: [PATCH] Refresh admin data on menu open --- src/admin/AdminAppMenu.tsx | 2 ++ src/components/more/MoreMenu.tsx | 14 +++++++++++++- src/state/AppState.ts | 1 + src/state/AppStateProvider.tsx | 7 ++++++- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/admin/AdminAppMenu.tsx b/src/admin/AdminAppMenu.tsx index 5147eecc..af6714a7 100644 --- a/src/admin/AdminAppMenu.tsx +++ b/src/admin/AdminAppMenu.tsx @@ -34,6 +34,7 @@ export default function AdminAppMenu({ tagsCount, selectedPhotoIds, setSelectedPhotoIds, + refreshAdminData, clearAuthStateAndRedirect, } = useAppState(); @@ -116,6 +117,7 @@ export default function AdminAppMenu({ header="Admin menu" icon={} align="start" + onOpen={refreshAdminData} className={clsx( 'border-medium', className, diff --git a/src/components/more/MoreMenu.tsx b/src/components/more/MoreMenu.tsx index 6b134d97..a7fe80c7 100644 --- a/src/components/more/MoreMenu.tsx +++ b/src/components/more/MoreMenu.tsx @@ -1,4 +1,10 @@ -import { ComponentProps, ReactNode, useCallback, useState } from 'react'; +import { + ComponentProps, + ReactNode, + useCallback, + useEffect, + useState, +} from 'react'; import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; import { clsx } from 'clsx/lite'; import { FiMoreHorizontal } from 'react-icons/fi'; @@ -12,6 +18,7 @@ export default function MoreMenu({ buttonClassName, ariaLabel, align = 'end', + onOpen, ...props }: { items: ComponentProps[] @@ -20,6 +27,7 @@ export default function MoreMenu({ className?: string buttonClassName?: string ariaLabel: string + onOpen?: () => void } & ComponentProps){ const [isOpen, setIsOpen] = useState(false); @@ -27,6 +35,10 @@ export default function MoreMenu({ setIsOpen(false); }, [setIsOpen]); + useEffect(() => { + if (isOpen) { onOpen?.(); } + }, [isOpen, onOpen]); + return ( diff --git a/src/state/AppState.ts b/src/state/AppState.ts index 6a24e41c..c0091658 100644 --- a/src/state/AppState.ts +++ b/src/state/AppState.ts @@ -29,6 +29,7 @@ export interface AppStateContext { // ADMIN adminUpdateTimes?: Date[] registerAdminUpdate?: () => void + refreshAdminData?: () => void photosCount?: number photosCountHidden?: number uploadsCount?: number diff --git a/src/state/AppStateProvider.tsx b/src/state/AppStateProvider.tsx index bfb2f658..1124cca4 100644 --- a/src/state/AppStateProvider.tsx +++ b/src/state/AppStateProvider.tsx @@ -96,7 +96,11 @@ export default function AppStateProvider({ }, [auth, authError]); const isUserSignedIn = Boolean(userEmail); - const { data: adminData, error: adminError } = useSWR( + const { + data: adminData, + error: adminError, + mutate: refreshAdminData, + } = useSWR( isUserSignedIn ? 'getAdminData' : null, getAdminDataAction, { refreshInterval: 1000 * 60, @@ -164,6 +168,7 @@ export default function AppStateProvider({ // ADMIN adminUpdateTimes, registerAdminUpdate, + refreshAdminData, photosCount, photosCountHidden, uploadsCount,