Vercel/src/focal/index.ts
Sam Becker 311d7a77af
Sitemaps (#260)
* Track last modified date for category queries

* Remove unused hidden tags queries

* Add tags to sitemap

* Calculate sitemap validation

* Add remaining categories to sitemap.xml

* Add photos to sitemap.xml

* Finalize sitemap metadata

* Guard against missing dates in sitemap.xml
2025-05-26 12:41:47 -05:00

83 lines
2.0 KiB
TypeScript

import {
Photo,
PhotoDateRange,
descriptionForPhotoSet,
photoQuantityText,
} from '@/photo';
import {
absolutePathForFocalLength,
absolutePathForFocalLengthImage,
} from '@/app/paths';
import { AppTextState } from '@/i18n/state';
import { CategoryQueryMeta } from '@/category';
type FocalLengthWithMeta = { focal: number } & CategoryQueryMeta;
export type FocalLengths = FocalLengthWithMeta[];
export const getFocalLengthFromString = (focalString?: string) => {
const focal = focalString?.match(/^([0-9]+)mm/)?.[1];
return focal ? parseInt(focal, 10) : 0;
};
export const formatFocalLength = (focal?: number) => focal
? formatFocalLengthSafe(focal)
: undefined;
export const formatFocalLengthSafe = (focal = 0) =>
`${focal}mm`;
export const titleForFocalLength = (
focal: number,
photos: Photo[],
appText: AppTextState,
explicitCount?: number,
) => [
appText.category.focalLengthTitle(formatFocalLengthSafe(focal)),
photoQuantityText(explicitCount ?? photos.length, appText),
].join(' ');
export const shareTextFocalLength = (
focal: number,
appText: AppTextState,
) =>
appText.category.focalLengthShare(formatFocalLengthSafe(focal));
export const descriptionForFocalLengthPhotos = (
photos: Photo[],
appText: AppTextState,
dateBased?: boolean,
explicitCount?: number,
explicitDateRange?: PhotoDateRange,
) =>
descriptionForPhotoSet(
photos,
appText,
undefined,
dateBased,
explicitCount,
explicitDateRange,
);
export const generateMetaForFocalLength = (
focal: number,
photos: Photo[],
appText: AppTextState,
explicitCount?: number,
explicitDateRange?: PhotoDateRange,
) => ({
url: absolutePathForFocalLength(focal),
title: titleForFocalLength(focal, photos, appText, explicitCount),
description: descriptionForFocalLengthPhotos(
photos,
appText,
true,
explicitCount,
explicitDateRange,
),
images: absolutePathForFocalLengthImage(focal),
});
export const sortFocalLengths = (focalLengths: FocalLengths) =>
focalLengths.sort((a, b) => a.focal - b.focal);