[]
icon?: ReactNode
header?: ReactNode
className?: string
diff --git a/src/components/more/MoreMenuItem.tsx b/src/components/more/MoreMenuItem.tsx
index d623b972..fe54671d 100644
--- a/src/components/more/MoreMenuItem.tsx
+++ b/src/components/more/MoreMenuItem.tsx
@@ -9,6 +9,8 @@ import { downloadFileFromBrowser } from '@/utility/url';
export default function MoreMenuItem({
label,
+ labelComplex,
+ annotation,
icon,
href,
hrefDownloadName,
@@ -17,7 +19,9 @@ export default function MoreMenuItem({
dismissMenu,
shouldPreventDefault = true,
}: {
- label: ReactNode
+ label: string
+ labelComplex?: ReactNode
+ annotation?: string
icon?: ReactNode
href?: string
hrefDownloadName?: string
@@ -48,7 +52,7 @@ export default function MoreMenuItem({
disabled={isLoading}
className={clsx(
'flex items-center h-9',
- 'pl-2 pr-4 py-2 rounded-sm',
+ 'pl-2 pr-3 py-2 rounded-sm',
'select-none hover:outline-hidden',
'hover:bg-gray-100/90 active:bg-gray-200/75',
'dark:hover:bg-gray-800/60 dark:active:bg-gray-900/80',
@@ -92,7 +96,11 @@ export default function MoreMenuItem({
styleAs="link-without-hover"
className="translate-y-[1px]"
>
- {label}
+ {labelComplex ?? label}
+ {annotation &&
+
+ {annotation}
+ }
);
diff --git a/src/photo/PhotoGridSidebar.tsx b/src/photo/PhotoGridSidebar.tsx
index 21c53dae..2288d94a 100644
--- a/src/photo/PhotoGridSidebar.tsx
+++ b/src/photo/PhotoGridSidebar.tsx
@@ -37,11 +37,11 @@ export default function PhotoGridSidebar({
}) {
const { start, end } = dateRangeForPhotos(undefined, photosDateRange);
- const { hiddenPhotosCount } = useAppState();
+ const { photosCountHidden } = useAppState();
const tagsIncludingHidden = useMemo(() =>
- addHiddenToTags(tags, hiddenPhotosCount)
- , [tags, hiddenPhotosCount]);
+ addHiddenToTags(tags, photosCountHidden)
+ , [tags, photosCountHidden]);
return (
diff --git a/src/photo/actions.ts b/src/photo/actions.ts
index b7e71a0f..9b741559 100644
--- a/src/photo/actions.ts
+++ b/src/photo/actions.ts
@@ -22,7 +22,6 @@ import { redirect } from 'next/navigation';
import { deleteFile } from '@/platforms/storage';
import {
getPhotosCached,
- getPhotosMetaCached,
revalidateAdminPaths,
revalidateAllKeysAndPaths,
revalidatePhoto,
@@ -416,10 +415,6 @@ export const streamAiImageQueryAction = async (
export const getImageBlurAction = async (url: string) =>
runAuthenticatedAdminServerAction(() => blurImageFromUrl(url));
-export const getPhotosHiddenMetaCachedAction = async () =>
- runAuthenticatedAdminServerAction(() =>
- getPhotosMetaCached({ hidden: 'only' }));
-
// Public/Private actions
export const getPhotosAction = async (
diff --git a/src/state/AppState.ts b/src/state/AppState.ts
index ebd1f451..8deaa844 100644
--- a/src/state/AppState.ts
+++ b/src/state/AppState.ts
@@ -26,7 +26,10 @@ export interface AppStateContext {
isUserSignedIn?: boolean
adminUpdateTimes?: Date[]
registerAdminUpdate?: () => void
- hiddenPhotosCount?: number
+ photosCount?: number
+ photosCountHidden?: number
+ uploadsCount?: number
+ tagsCount?: number
selectedPhotoIds?: string[]
setSelectedPhotoIds?: Dispatch>
isPerformingSelectEdit?: boolean
diff --git a/src/state/AppStateProvider.tsx b/src/state/AppStateProvider.tsx
index 28dc7455..a961194e 100644
--- a/src/state/AppStateProvider.tsx
+++ b/src/state/AppStateProvider.tsx
@@ -12,11 +12,10 @@ import {
MATTE_PHOTOS,
SHOW_ZOOM_CONTROLS,
} from '@/app/config';
-import { getPhotosHiddenMetaCachedAction } from '@/photo/actions';
import { ShareModalProps } from '@/share';
import { storeTimezoneCookie } from '@/utility/timezone';
-import { getShouldShowInsightsIndicatorAction } from '@/admin/insights/actions';
import { InsightIndicatorStatus } from '@/admin/insights';
+import { getAdminDataAction } from '@/admin/actions';
export default function AppStateProvider({
children,
@@ -44,8 +43,14 @@ export default function AppStateProvider({
useState();
const [adminUpdateTimes, setAdminUpdateTimes] =
useState([]);
- const [hiddenPhotosCount, setHiddenPhotosCount] =
- useState(0);
+ const [photosCount, setPhotosCount] =
+ useState();
+ const [photosCountHidden, setPhotosCountHidden] =
+ useState();
+ const [uploadsCount, setUploadsCount] =
+ useState();
+ const [tagsCount, setTagsCount] =
+ useState();
const [selectedPhotoIds, setSelectedPhotoIds] =
useState();
const [isPerformingSelectEdit, setIsPerformingSelectEdit] =
@@ -70,26 +75,37 @@ export default function AppStateProvider({
const invalidateSwr = useCallback(() => setSwrTimestamp(Date.now()), []);
- const { data, error } = useSWR('getAuth', getAuthAction);
+ const { data: auth, error: authError } = useSWR('getAuth', getAuthAction);
useEffect(() => {
- if (!error) {
- setUserEmail(data?.user?.email ?? undefined);
+ if (!authError) {
+ setUserEmail(auth?.user?.email ?? undefined);
}
- }, [data, error]);
+ }, [auth, authError]);
const isUserSignedIn = Boolean(userEmail);
+
+ const { data: adminData, error: adminError } = useSWR(
+ isUserSignedIn ? 'getAdminData' : null,
+ getAdminDataAction, {
+ refreshInterval: 1000 * 60 * 5,
+ },
+ );
+
useEffect(() => {
if (isUserSignedIn) {
- const timeout = setTimeout(() =>{
- getPhotosHiddenMetaCachedAction()
- .then(({ count }) => setHiddenPhotosCount(count));
- getShouldShowInsightsIndicatorAction()
- .then(setInsightIndicatorStatus);
- }, 100);
- return () => clearTimeout(timeout);
+ if (adminData) {
+ const timeout = setTimeout(() => {
+ setPhotosCount(adminData.countPhotos);
+ setPhotosCountHidden(adminData.countHiddenPhotos);
+ setUploadsCount(adminData.countUploads);
+ setTagsCount(adminData.countTags);
+ setInsightIndicatorStatus(adminData.shouldShowInsightsIndicator);
+ }, 100);
+ return () => clearTimeout(timeout);
+ }
} else {
- setHiddenPhotosCount(0);
+ setPhotosCountHidden(0);
}
- }, [isUserSignedIn]);
+ }, [adminData, adminError, isUserSignedIn]);
const registerAdminUpdate = useCallback(() =>
setAdminUpdateTimes(updates => [...updates, new Date()])
@@ -125,7 +141,10 @@ export default function AppStateProvider({
isUserSignedIn,
adminUpdateTimes,
registerAdminUpdate,
- hiddenPhotosCount,
+ photosCount,
+ photosCountHidden,
+ uploadsCount,
+ tagsCount,
selectedPhotoIds,
setSelectedPhotoIds,
isPerformingSelectEdit,
diff --git a/src/tag/index.ts b/src/tag/index.ts
index 0bd2fb77..29cc8805 100644
--- a/src/tag/index.ts
+++ b/src/tag/index.ts
@@ -105,11 +105,11 @@ export const isPathFavs = (pathname?: string) =>
export const isTagHidden = (tag: string) => tag.toLowerCase() === TAG_HIDDEN;
-export const addHiddenToTags = (tags: Tags, hiddenPhotosCount = 0) => {
- if (hiddenPhotosCount > 0) {
+export const addHiddenToTags = (tags: Tags, photosCountHidden = 0) => {
+ if (photosCountHidden > 0) {
return tags
.filter(({ tag }) => tag === TAG_FAVS)
- .concat({ tag: TAG_HIDDEN, count: hiddenPhotosCount })
+ .concat({ tag: TAG_HIDDEN, count: photosCountHidden })
.concat(tags.filter(({ tag }) => tag !== TAG_FAVS));
} else {
return tags;