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({