diff --git a/src/app/film/[simulation]/page.tsx b/src/app/film/[simulation]/page.tsx index cc98546d..d770a01a 100644 --- a/src/app/film/[simulation]/page.tsx +++ b/src/app/film/[simulation]/page.tsx @@ -1,4 +1,4 @@ -import { GRID_THUMBNAILS_TO_SHOW_MAX } from '@/photo'; +import { INFINITE_SCROLL_GRID_PHOTO_INITIAL } from '@/photo'; import { FilmSimulation, generateMetaForFilmSimulation } from '@/simulation'; import FilmSimulationOverview from '@/simulation/FilmSimulationOverview'; import { getPhotosFilmSimulationDataCached } from '@/simulation/data'; @@ -20,7 +20,7 @@ export async function generateMetadata({ { count, dateRange }, ] = await getPhotosFilmSimulationDataCachedCached({ simulation, - limit: GRID_THUMBNAILS_TO_SHOW_MAX, + limit: INFINITE_SCROLL_GRID_PHOTO_INITIAL, }); const { @@ -55,7 +55,7 @@ export default async function FilmSimulationPage({ { count, dateRange }, ] = await getPhotosFilmSimulationDataCachedCached({ simulation, - limit: GRID_THUMBNAILS_TO_SHOW_MAX, + limit: INFINITE_SCROLL_GRID_PHOTO_INITIAL, }); return ( diff --git a/src/app/film/[simulation]/share/page.tsx b/src/app/film/[simulation]/share/page.tsx index 76c3aab5..5f72b3c4 100644 --- a/src/app/film/[simulation]/share/page.tsx +++ b/src/app/film/[simulation]/share/page.tsx @@ -1,4 +1,4 @@ -import { GRID_THUMBNAILS_TO_SHOW_MAX } from '@/photo'; +import { INFINITE_SCROLL_GRID_PHOTO_INITIAL } from '@/photo'; import { FilmSimulation, generateMetaForFilmSimulation } from '@/simulation'; import FilmSimulationOverview from '@/simulation/FilmSimulationOverview'; import FilmSimulationShareModal from '@/simulation/FilmSimulationShareModal'; @@ -7,7 +7,10 @@ import { Metadata } from 'next/types'; import { cache } from 'react'; const getPhotosFilmSimulationDataCachedCached = - cache(getPhotosFilmSimulationDataCached); + cache((simulation: FilmSimulation) => getPhotosFilmSimulationDataCached({ + simulation, + limit: INFINITE_SCROLL_GRID_PHOTO_INITIAL, + })); interface FilmSimulationProps { params: { simulation: FilmSimulation } @@ -19,10 +22,7 @@ export async function generateMetadata({ const [ photos, { count, dateRange }, - ] = await getPhotosFilmSimulationDataCachedCached({ - simulation, - limit: GRID_THUMBNAILS_TO_SHOW_MAX, - }); + ] = await getPhotosFilmSimulationDataCachedCached(simulation); const { url, @@ -54,10 +54,7 @@ export default async function Share({ const [ photos, { count, dateRange }, - ] = await getPhotosFilmSimulationDataCachedCached({ - simulation, - limit: GRID_THUMBNAILS_TO_SHOW_MAX, - }); + ] = await getPhotosFilmSimulationDataCachedCached(simulation); return <> diff --git a/src/app/grid/page.tsx b/src/app/grid/page.tsx index a13f7e88..aa5b2328 100644 --- a/src/app/grid/page.tsx +++ b/src/app/grid/page.tsx @@ -1,9 +1,8 @@ import { - INFINITE_SCROLL_INITIAL_GRID, + INFINITE_SCROLL_GRID_PHOTO_INITIAL, generateOgImageMetaForPhotos, } from '@/photo'; import PhotosEmptyState from '@/photo/PhotosEmptyState'; -import { MAX_PHOTOS_TO_SHOW_OG } from '@/image-response'; import { Metadata } from 'next/types'; import PhotoGridSidebar from '@/photo/PhotoGridSidebar'; import { getPhotoSidebarData } from '@/photo/data'; @@ -14,12 +13,12 @@ import { PATH_GRID } from '@/site/paths'; export const dynamic = 'force-static'; -const getPhotosCached = cache(getPhotos); +const getPhotosCached = cache(() => getPhotos({ + limit: INFINITE_SCROLL_GRID_PHOTO_INITIAL, +})); export async function generateMetadata(): Promise { - const photos = await getPhotosCached({ - limit: MAX_PHOTOS_TO_SHOW_OG, - }) + const photos = await getPhotosCached() .catch(() => []); return generateOgImageMetaForPhotos(photos); } @@ -32,7 +31,8 @@ export default async function GridPage() { cameras, simulations, ] = await Promise.all([ - getPhotosCached({ limit: INFINITE_SCROLL_INITIAL_GRID }).catch(() => []), + getPhotosCached() + .catch(() => []), ...getPhotoSidebarData(), ]); diff --git a/src/app/og/page.tsx b/src/app/og/page.tsx index 5acab88d..295c90cd 100644 --- a/src/app/og/page.tsx +++ b/src/app/og/page.tsx @@ -1,6 +1,6 @@ import { - INFINITE_SCROLL_INITIAL_GRID, - INFINITE_SCROLL_MULTIPLE_GRID, + INFINITE_SCROLL_GRID_PHOTO_INITIAL, + INFINITE_SCROLL_GRID_PHOTO_MULTIPLE, } from '@/photo'; import { getPhotosCached, getPhotosCountCached } from '@/photo/cache'; import StaggeredOgPhotos from '@/photo/StaggeredOgPhotos'; @@ -11,7 +11,7 @@ export default async function GridPage() { photos, count, ] = await Promise.all([ - getPhotosCached({ limit: INFINITE_SCROLL_INITIAL_GRID }), + getPhotosCached({ limit: INFINITE_SCROLL_GRID_PHOTO_INITIAL }), getPhotosCountCached(), ]); @@ -22,7 +22,7 @@ export default async function GridPage() {
} diff --git a/src/app/p/[photoId]/layout.tsx b/src/app/p/[photoId]/layout.tsx index a70b4329..4cd5f51b 100644 --- a/src/app/p/[photoId]/layout.tsx +++ b/src/app/p/[photoId]/layout.tsx @@ -1,5 +1,5 @@ import { - GRID_THUMBNAILS_TO_SHOW_MAX, + RELATED_GRID_PHOTOS_TO_SHOW, descriptionForPhoto, titleForPhoto, } from '@/photo'; @@ -34,7 +34,7 @@ export async function generateMetadata({ }:PhotoProps): Promise { const { photo } = await getPhotosNearIdCachedCached( photoId, - GRID_THUMBNAILS_TO_SHOW_MAX + 2, + RELATED_GRID_PHOTOS_TO_SHOW + 2, ); if (!photo) { return {}; } @@ -68,7 +68,7 @@ export default async function PhotoPage({ }: PhotoProps & { children: React.ReactNode }) { const { photos, photo } = await getPhotosNearIdCachedCached( photoId, - GRID_THUMBNAILS_TO_SHOW_MAX + 2, + RELATED_GRID_PHOTOS_TO_SHOW + 2, ); if (!photo) { redirect(PATH_ROOT); } @@ -83,8 +83,8 @@ export default async function PhotoPage({ photosGrid={photos.slice( isPhotoFirst ? 1 : 2, isPhotoFirst - ? GRID_THUMBNAILS_TO_SHOW_MAX + 1 - : GRID_THUMBNAILS_TO_SHOW_MAX + 2, + ? RELATED_GRID_PHOTOS_TO_SHOW + 1 + : RELATED_GRID_PHOTOS_TO_SHOW + 2, )} /> ; diff --git a/src/app/p/[photoId]/share/page.tsx b/src/app/p/[photoId]/share/page.tsx index b150f8e8..4b8e6c73 100644 --- a/src/app/p/[photoId]/share/page.tsx +++ b/src/app/p/[photoId]/share/page.tsx @@ -1,5 +1,4 @@ -import { GRID_THUMBNAILS_TO_SHOW_MAX } from '@/photo'; -import { getPhotosNearIdCachedCached } from '@/photo/cache'; +import { getPhotoCached } from '@/photo/cache'; import PhotoShareModal from '@/photo/PhotoShareModal'; import { PATH_ROOT } from '@/site/paths'; import { redirect } from 'next/navigation'; @@ -9,12 +8,7 @@ export default async function Share({ }: { params: { photoId: string } }) { - const { photo } = await getPhotosNearIdCachedCached( - photoId, - // Matching common query from photo detail page - // in order to reuse cached results - GRID_THUMBNAILS_TO_SHOW_MAX + 2, - ); + const photo = await getPhotoCached(photoId); if (!photo) { return redirect(PATH_ROOT); } diff --git a/src/app/page.tsx b/src/app/page.tsx index 973f6263..8fc3e845 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,6 +1,6 @@ import { - INFINITE_SCROLL_INITIAL_HOME, - INFINITE_SCROLL_MULTIPLE_HOME, + INFINITE_SCROLL_LARGE_PHOTO_INITIAL, + INFINITE_SCROLL_LARGE_PHOTO_MULTIPLE, generateOgImageMetaForPhotos, } from '@/photo'; import PhotosEmptyState from '@/photo/PhotosEmptyState'; @@ -29,7 +29,7 @@ export default async function HomePage() { photosCount, ] = await Promise.all([ getPhotosCached({ - limit: INFINITE_SCROLL_INITIAL_HOME, + limit: INFINITE_SCROLL_LARGE_PHOTO_INITIAL, }) .catch(() => []), getPhotosCount() @@ -42,8 +42,8 @@ export default async function HomePage() { {photosCount > photos.length && } : diff --git a/src/app/shot-on/[make]/[model]/page.tsx b/src/app/shot-on/[make]/[model]/page.tsx index 3b911eda..ee065416 100644 --- a/src/app/shot-on/[make]/[model]/page.tsx +++ b/src/app/shot-on/[make]/[model]/page.tsx @@ -1,28 +1,28 @@ import { Metadata } from 'next/types'; -import { CameraProps, getCameraFromParams } from '@/camera'; +import { CameraProps } from '@/camera'; import { generateMetaForCamera } from '@/camera/meta'; -import { - GRID_THUMBNAILS_TO_SHOW_MAX, - INFINITE_SCROLL_INITIAL_GRID, -} from '@/photo'; +import { INFINITE_SCROLL_GRID_PHOTO_INITIAL } from '@/photo'; import { getPhotosCameraDataCached } from '@/camera/data'; import CameraOverview from '@/camera/CameraOverview'; import { cache } from 'react'; -const getPhotosCameraDataCachedCached = cache(getPhotosCameraDataCached); +const getPhotosCameraDataCachedCached = cache(( + make: string, + model: string, +) => getPhotosCameraDataCached( + make, + model, + INFINITE_SCROLL_GRID_PHOTO_INITIAL, +)); export async function generateMetadata({ - params, + params: { make, model }, }: CameraProps): Promise { - const camera = getCameraFromParams(params); - const [ photos, { count, dateRange }, - ] = await getPhotosCameraDataCachedCached({ camera, - limit: GRID_THUMBNAILS_TO_SHOW_MAX, - }); + ] = await getPhotosCameraDataCachedCached(make, model); const { url, @@ -48,16 +48,14 @@ export async function generateMetadata({ }; } -export default async function CameraPage({ params }: CameraProps) { - const camera = getCameraFromParams(params); - +export default async function CameraPage({ + params: { make, model }, +}: CameraProps) { const [ photos, { count, dateRange }, - ] = await getPhotosCameraDataCachedCached({ camera, - limit: INFINITE_SCROLL_INITIAL_GRID, - }); + ] = await getPhotosCameraDataCachedCached(make, model); return ( diff --git a/src/app/shot-on/[make]/[model]/share/page.tsx b/src/app/shot-on/[make]/[model]/share/page.tsx index dac32b58..37c52345 100644 --- a/src/app/shot-on/[make]/[model]/share/page.tsx +++ b/src/app/shot-on/[make]/[model]/share/page.tsx @@ -1,33 +1,29 @@ -import { - CameraProps, - cameraFromPhoto, - getCameraFromParams, -} from '@/camera'; +import { CameraProps } from '@/camera'; import CameraShareModal from '@/camera/CameraShareModal'; import { generateMetaForCamera } from '@/camera/meta'; import { Metadata } from 'next/types'; -import { - GRID_THUMBNAILS_TO_SHOW_MAX, - INFINITE_SCROLL_INITIAL_GRID, -} from '@/photo'; +import { INFINITE_SCROLL_GRID_PHOTO_INITIAL } from '@/photo'; import { getPhotosCameraDataCached } from '@/camera/data'; import CameraOverview from '@/camera/CameraOverview'; import { cache } from 'react'; -const getPhotosCameraDataCachedCached = cache(getPhotosCameraDataCached); +const getPhotosCameraDataCachedCached = cache(( + make: string, + model: string, +) => getPhotosCameraDataCached( + make, + model, + INFINITE_SCROLL_GRID_PHOTO_INITIAL, +)); export async function generateMetadata({ - params, + params: { make, model }, }: CameraProps): Promise { - const camera = getCameraFromParams(params); - const [ photos, { count, dateRange }, - ] = await getPhotosCameraDataCachedCached({ camera, - limit: GRID_THUMBNAILS_TO_SHOW_MAX, - }); + ] = await getPhotosCameraDataCachedCached(make, model); const { url, @@ -53,18 +49,12 @@ export async function generateMetadata({ }; } -export default async function Share({ params }: CameraProps) { - const cameraFromParams = getCameraFromParams(params); - +export default async function Share({ params: { make, model } }: CameraProps) { const [ photos, { count, dateRange }, - ] = await getPhotosCameraDataCachedCached({ - camera: cameraFromParams, - limit: INFINITE_SCROLL_INITIAL_GRID, - }); - - const camera = cameraFromPhoto(photos[0], cameraFromParams); + camera, + ] = await getPhotosCameraDataCachedCached(make, model); return <> diff --git a/src/app/tag/[tag]/page.tsx b/src/app/tag/[tag]/page.tsx index 2b23d7e1..39f1de9f 100644 --- a/src/app/tag/[tag]/page.tsx +++ b/src/app/tag/[tag]/page.tsx @@ -1,4 +1,4 @@ -import { GRID_THUMBNAILS_TO_SHOW_MAX } from '@/photo'; +import { INFINITE_SCROLL_GRID_PHOTO_INITIAL } from '@/photo'; import { PATH_ROOT } from '@/site/paths'; import { generateMetaForTag } from '@/tag'; import TagOverview from '@/tag/TagOverview'; @@ -7,7 +7,8 @@ import type { Metadata } from 'next'; import { redirect } from 'next/navigation'; import { cache } from 'react'; -const getPhotosTagDataCachedCached = cache(getPhotosTagDataCached); +const getPhotosTagDataCachedCached = cache((tag: string) => + getPhotosTagDataCached({ tag, limit: INFINITE_SCROLL_GRID_PHOTO_INITIAL})); interface TagProps { params: { tag: string } @@ -21,10 +22,7 @@ export async function generateMetadata({ const [ photos, { count, dateRange }, - ] = await getPhotosTagDataCachedCached({ - tag, - limit: GRID_THUMBNAILS_TO_SHOW_MAX, - }); + ] = await getPhotosTagDataCachedCached(tag); if (photos.length === 0) { return {}; } @@ -60,10 +58,7 @@ export default async function TagPage({ const [ photos, { count, dateRange }, - ] = await getPhotosTagDataCachedCached({ - tag, - limit: GRID_THUMBNAILS_TO_SHOW_MAX, - }); + ] = await getPhotosTagDataCachedCached(tag); if (photos.length === 0) { redirect(PATH_ROOT); } diff --git a/src/app/tag/[tag]/share/page.tsx b/src/app/tag/[tag]/share/page.tsx index 43041221..3cacbb43 100644 --- a/src/app/tag/[tag]/share/page.tsx +++ b/src/app/tag/[tag]/share/page.tsx @@ -1,4 +1,4 @@ -import { GRID_THUMBNAILS_TO_SHOW_MAX } from '@/photo'; +import { INFINITE_SCROLL_GRID_PHOTO_INITIAL } from '@/photo'; import { generateMetaForTag } from '@/tag'; import TagOverview from '@/tag/TagOverview'; import TagShareModal from '@/tag/TagShareModal'; @@ -6,7 +6,8 @@ import { getPhotosTagDataCached } from '@/tag/data'; import type { Metadata } from 'next'; import { cache } from 'react'; -const getPhotosTagDataCachedCached = cache(getPhotosTagDataCached); +const getPhotosTagDataCachedCached = cache((tag: string) => + getPhotosTagDataCached({ tag, limit: INFINITE_SCROLL_GRID_PHOTO_INITIAL })); interface TagProps { params: { tag: string } @@ -20,10 +21,7 @@ export async function generateMetadata({ const [ photos, { count, dateRange }, - ] = await getPhotosTagDataCachedCached({ - tag, - limit: GRID_THUMBNAILS_TO_SHOW_MAX, - }); + ] = await getPhotosTagDataCachedCached(tag); const { url, @@ -57,10 +55,7 @@ export default async function Share({ const [ photos, { count, dateRange }, - ] = await getPhotosTagDataCachedCached({ - tag, - limit: GRID_THUMBNAILS_TO_SHOW_MAX, - }); + ] = await getPhotosTagDataCachedCached(tag); return <> diff --git a/src/camera/data.ts b/src/camera/data.ts index cd094429..b90a19f5 100644 --- a/src/camera/data.ts +++ b/src/camera/data.ts @@ -1,17 +1,22 @@ -import { Camera } from '.'; +import { cameraFromPhoto, getCameraFromParams } from '.'; import { getPhotosCached, getPhotosCameraMetaCached, } from '@/photo/cache'; -export const getPhotosCameraDataCached = ({ - camera, - limit, -}: { - camera: Camera, - limit?: number, -}) => - Promise.all([ +export const getPhotosCameraDataCached = async ( + make: string, + model: string, + limit: number, +) => { + const camera = getCameraFromParams({ make, model }); + return Promise.all([ getPhotosCached({ camera, limit }), getPhotosCameraMetaCached(camera), - ]); + ]) + .then(([photos, meta]) => [ + photos, + meta, + cameraFromPhoto(photos[0], camera), + ] as const); +}; diff --git a/src/photo/PhotoGridInfinite.tsx b/src/photo/PhotoGridInfinite.tsx index 339604a4..63a8cc6e 100644 --- a/src/photo/PhotoGridInfinite.tsx +++ b/src/photo/PhotoGridInfinite.tsx @@ -1,7 +1,7 @@ 'use client'; import { Camera } from '@/camera'; -import { INFINITE_SCROLL_MULTIPLE_GRID } from '.'; +import { INFINITE_SCROLL_GRID_PHOTO_MULTIPLE } from '.'; import InfinitePhotoScroll from './InfinitePhotoScroll'; import PhotoGrid from './PhotoGrid'; import { FilmSimulation } from '@/simulation'; @@ -25,7 +25,7 @@ export default function PhotoGridInfinite({