Vercel/src/focal/index.ts
Sam Becker 646f32e642
Rich sort controls (#283)
* Generalize app switcher menus

* Organize sort module

* Build configuration for nav sort control

* Refine sort menu styles

* Upgrade next.js

* Reset custom sort when clicking grid/full a second time

* Light up sort button when overridden
2025-07-15 22:43:36 -05:00

79 lines
1.9 KiB
TypeScript

import {
Photo,
PhotoDateRange,
descriptionForPhotoSet,
photoQuantityText,
} from '@/photo';
import {
absolutePathForFocalLength,
absolutePathForFocalLengthImage,
} from '@/app/path';
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 = 0) =>
`${focal}mm`;
export const titleForFocalLength = (
focal: number,
photos: Photo[],
appText: AppTextState,
explicitCount?: number,
) => [
appText.category.focalLengthTitle(formatFocalLength(focal)),
photoQuantityText(explicitCount ?? photos.length, appText),
].join(' ');
export const shareTextFocalLength = (
focal: number,
appText: AppTextState,
) =>
appText.category.focalLengthShare(formatFocalLength(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);