diff --git a/src/admin/AdminPhotosSyncClient.tsx b/src/admin/AdminPhotosSyncClient.tsx index c9e89e4e..851c3c50 100644 --- a/src/admin/AdminPhotosSyncClient.tsx +++ b/src/admin/AdminPhotosSyncClient.tsx @@ -6,7 +6,7 @@ import IconGrSync from '@/components/icons/IconGrSync'; import Note from '@/components/Note'; import AdminChildPage from '@/components/AdminChildPage'; import { PATH_ADMIN_PHOTOS } from '@/app/paths'; -import { useRef, useState } from 'react'; +import { useMemo, useRef, useState } from 'react'; import { syncPhotosAction } from '@/photo/actions'; import { useRouter } from 'next/navigation'; import ResponsiveText from '@/components/primitives/ResponsiveText'; @@ -14,6 +14,7 @@ import { LiaBroomSolid } from 'react-icons/lia'; import ProgressButton from '@/components/primitives/ProgressButton'; import ErrorNote from '@/components/ErrorNote'; import { pluralize } from '@/utility/string'; +import { getPhotosSyncStatusText } from '@/photo/sync'; const SYNC_BATCH_SIZE_MAX = 3; @@ -37,6 +38,8 @@ export default function AdminPhotosSyncClient({ const router = useRouter(); + const statusText = useMemo(() => getPhotosSyncStatusText(photos), [photos]); + return (
- {photos.length} - {' '} - {photos.length === 1 ? 'photo' : 'photos'} - {' '} - found + Photos found: {statusText}
Sync to capture newer EXIF fields, improve blur data, {' '} - and use AI to generate missing text (if configured) + and use AI to generate missing text (if configured).
diff --git a/src/admin/AdminPhotosTable.tsx b/src/admin/AdminPhotosTable.tsx index af2459c3..3fc11ace 100644 --- a/src/admin/AdminPhotosTable.tsx +++ b/src/admin/AdminPhotosTable.tsx @@ -16,7 +16,7 @@ import DeletePhotoButton from './DeletePhotoButton'; import { Timezone } from '@/utility/timezone'; import IconHidden from '@/components/icons/IconHidden'; import Tooltip from '@/components/Tooltip'; -import { photoNeedsToBeSynced, photoSyncStatusText } from '@/photo/sync'; +import { photoNeedsToBeSynced, getPhotoSyncStatusText } from '@/photo/sync'; export default function AdminPhotosTable({ photos, @@ -98,7 +98,7 @@ export default function AdminPhotosTable({ {photoNeedsToBeSynced(photo) && photo.syncStatus.isOutdated || photo.syncStatus.missingAiTextFields.length > 0; -export const photoSyncStatusText = (photo: Photo) => { +export const getPhotoSyncStatusText = (photo: Photo) => { const { isOutdated, missingAiTextFields } = photo.syncStatus; const text: string[] = []; if (isOutdated) { @@ -66,3 +66,22 @@ export const photoSyncStatusText = (photo: Photo) => { } return text.join(' and '); }; + +export const getPhotosSyncStatusText = (photos: Photo[]) => { + const statusText = [] as string[]; + + const photosCountOutdated = photos.filter( + photo => photo.syncStatus.isOutdated, + ).length; + const photosCountMissingAiText = photos.filter( + photo => photo.syncStatus.missingAiTextFields.length > 0, + ).length; + + if (photosCountOutdated > 0) { + statusText.push(`${photosCountOutdated} outdated`); + } + if (photosCountMissingAiText > 0) { + statusText.push(`${photosCountMissingAiText} missing AI text`); + } + return statusText.join(', '); +};