Vercel/app/about/page.tsx
2026-03-13 21:45:34 -05:00

95 lines
2.5 KiB
TypeScript

import AboutPageClient from '@/about/AboutPageClient';
import { getAboutDataCached } from '@/about/data';
import { ABOUT_DESCRIPTION_DEFAULT, SHOW_ABOUT_PAGE } from '@/app/config';
import { PATH_ROOT } from '@/app/path';
import { getDataForCategoriesCached } from '@/category/cache';
import {
getLastModifiedForCategories,
NULL_CATEGORY_DATA,
} from '@/category/data';
import { getPhotosMetaCached } from '@/photo/cache';
import PhotosEmptyState from '@/photo/PhotosEmptyState';
import { getAllPhotoIdsWithUpdatedAt } from '@/photo/query';
import { TAG_FAVS } from '@/tag';
import { safelyParseFormattedHtml } from '@/utility/html';
import { max } from 'date-fns';
import { redirect } from 'next/navigation';
export const dynamic = 'force-static';
export default async function AboutPage() {
if (!SHOW_ABOUT_PAGE) { redirect(PATH_ROOT); }
const [
{
about,
photoAvatar,
photoHero,
},
photosMeta,
photos,
categories,
] = await Promise.all([
getAboutDataCached()
.catch(() => ({
about: undefined,
photoAvatar: undefined,
photoHero: undefined,
})),
getPhotosMetaCached().catch(() => {}),
getAllPhotoIdsWithUpdatedAt().catch(() => []),
getDataForCategoriesCached().catch(() => (NULL_CATEGORY_DATA)),
]);
const description = about?.description || ABOUT_DESCRIPTION_DEFAULT;
const descriptionHtml = description
? <div
className="text-medium [&>*>a]:underline"
dangerouslySetInnerHTML={{
__html: safelyParseFormattedHtml(description),
}}
/>
: undefined;
const {
cameras,
lenses,
albums,
tags,
recipes,
films,
} = categories;
const place = albums
.slice()
.sort((a, b) => b.count - a.count)[0]?.album.location;
const lastModifiedSite = max([
getLastModifiedForCategories(categories, photos),
about?.updatedAt,
].filter(date => date instanceof Date));
return (
(photosMeta?.count ?? 0) > 0
? <AboutPageClient
title={about?.title}
subhead={about?.subhead}
descriptionHtml={descriptionHtml}
photosCount={photosMeta?.count}
photosOldest={photosMeta?.dateRange?.start}
photoAvatar={photoAvatar}
photoHero={photoHero}
camera={cameras[0]?.camera}
lens={lenses[0]?.lens}
recipe={recipes[0]?.recipe}
film={films[0]?.film}
tag={tags.filter(({ tag }) => tag !== TAG_FAVS)[0]?.tag}
place={place}
album={albums[0]?.album}
lastUpdated={lastModifiedSite}
/>
: <PhotosEmptyState />
);
}