diff --git a/src/app/(static)/grid/page.tsx b/src/app/(static)/grid/page.tsx index d1946e6d..7734bb0a 100644 --- a/src/app/(static)/grid/page.tsx +++ b/src/app/(static)/grid/page.tsx @@ -1,6 +1,6 @@ import MorePhotos from '@/components/MorePhotos'; import SiteGrid from '@/components/SiteGrid'; -import { generateImageMetaForPhoto, getPhotosLimitForQuery } from '@/photo'; +import { generateOgImageMetaForPhotos, getPhotosLimitForQuery } from '@/photo'; import PhotoGrid from '@/photo/PhotoGrid'; import PhotosEmptyState from '@/photo/PhotosEmptyState'; import { getPhotos, getPhotosCount } from '@/services/postgres'; @@ -10,7 +10,7 @@ export const runtime = 'edge'; export async function generateMetadata(): Promise { const photos = await getPhotos(); - return generateImageMetaForPhoto(photos[0]); + return generateOgImageMetaForPhotos(photos); } export default async function GridPage({ diff --git a/src/app/(static)/page.tsx b/src/app/(static)/page.tsx index 43c75b58..82503125 100644 --- a/src/app/(static)/page.tsx +++ b/src/app/(static)/page.tsx @@ -1,13 +1,19 @@ import AnimateItems from '@/components/AnimateItems'; import MorePhotos from '@/components/MorePhotos'; import SiteGrid from '@/components/SiteGrid'; -import { getPhotosLimitForQuery } from '@/photo'; +import { generateOgImageMetaForPhotos, getPhotosLimitForQuery } from '@/photo'; import PhotoLarge from '@/photo/PhotoLarge'; import PhotosEmptyState from '@/photo/PhotosEmptyState'; import { getPhotos, getPhotosCount } from '@/services/postgres'; +import { Metadata } from 'next'; export const runtime = 'edge'; +export async function generateMetadata(): Promise { + const photos = await getPhotos(); + return generateOgImageMetaForPhotos(photos); +} + export default async function HomePage({ searchParams, }: { diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 765d74ae..79ce5152 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -23,13 +23,10 @@ export const metadata: Metadata = { openGraph: { title: SITE_TITLE, description: SITE_DESCRIPTION, - images: '/home-image', }, twitter: { title: SITE_TITLE, description: SITE_DESCRIPTION, - images: '/home-image', - card: 'summary_large_image', }, icons: [{ url: '/favicon.ico', diff --git a/src/photo/image-response/HomeImageResponse.tsx b/src/photo/image-response/HomeImageResponse.tsx index c0dc510d..5c90ee79 100644 --- a/src/photo/image-response/HomeImageResponse.tsx +++ b/src/photo/image-response/HomeImageResponse.tsx @@ -14,6 +14,10 @@ export default function HomeImageResponse({ height: number fontFamily: string }) { + const grid = photos.length >= 12 + ? { colCount: 4, rowCount: 3 } + : { colCount: 3, rowCount: 2 }; + return (
photo - ? { - openGraph: { - images: absoluteRouteForPhotoImage(photo), - }, - twitter: { - card: 'summary_large_image', - images: absoluteRouteForPhotoImage(photo), - }, +export const generateOgImageMetaForPhotos = (photos: Photo[]): Metadata => { + if (photos.length >= 6) { + // Show multiple photos once a 3x2 grid is available + return { + openGraph: { + images: ABSOLUTE_ROUTE_FOR_HOME_IMAGE, + }, + twitter: { + card: 'summary_large_image', + images: ABSOLUTE_ROUTE_FOR_HOME_IMAGE, + }, + }; + } else if (photos.length > 0) { + // Otherwise show the first photo + const photo = photos[0]; + return { + openGraph: { + images: absoluteRouteForPhotoImage(photo), + }, + twitter: { + card: 'summary_large_image', + images: absoluteRouteForPhotoImage(photo), + }, + }; } - : {}; + // If there are no photos, refrain from showing an OG image + return {}; +}; const PHOTO_ID_FORWARDING_TABLE: Record = JSON.parse( process.env.PHOTO_ID_FORWARDING_TABLE || '{}' diff --git a/src/site/routes.ts b/src/site/routes.ts index 08197e63..5e72f109 100644 --- a/src/site/routes.ts +++ b/src/site/routes.ts @@ -5,6 +5,8 @@ export const ROUTE_ADMIN_UPLOAD = '/admin/uploads'; export const ROUTE_ADMIN_UPLOAD_BLOB_HANDLER = '/admin/uploads/blob'; +export const ABSOLUTE_ROUTE_FOR_HOME_IMAGE = `${BASE_URL}/home-image`; + export const routeForPhoto = (photo: Photo, share?: boolean) => share ? `/p/${photo.idShort}/share`