Rename core film types

This commit is contained in:
Sam Becker 2025-03-29 22:58:04 -05:00
parent 535f2180c2
commit 763cc4de14
31 changed files with 87 additions and 89 deletions

View File

@ -24,7 +24,7 @@ const getPhotosNearIdCachedCached = cache((
) =>
getPhotosNearIdCached(
photoId,
{ simulation, limit: RELATED_GRID_PHOTOS_TO_SHOW + 2 },
{ film: simulation, limit: RELATED_GRID_PHOTOS_TO_SHOW + 2 },
));
interface PhotoFilmSimulationProps {
@ -43,7 +43,7 @@ export async function generateMetadata({
const title = titleForPhoto(photo);
const description = descriptionForPhoto(photo);
const images = absolutePathForPhotoImage(photo);
const url = absolutePathForPhoto({ photo, simulation: film });
const url = absolutePathForPhoto({ photo, film: film });
return {
title,
@ -73,14 +73,14 @@ export default async function PhotoFilmPage({
if (!photo) { redirect(PATH_ROOT); }
const { count, dateRange } = await getPhotosMetaCached({ simulation: film });
const { count, dateRange } = await getPhotosMetaCached({ film: film });
return (
<PhotoDetailPage {...{
photo,
photos,
photosGrid,
simulation: film,
film: film,
indexNumber,
count,
dateRange,

View File

@ -16,7 +16,7 @@ export const generateStaticParams = staticallyGenerateCategoryIfConfigured(
'films',
'image',
getUniqueFilmSimulations,
simulations => simulations.map(({ simulation }) => ({ simulation })),
simulations => simulations.map(({ film: simulation }) => ({ simulation })),
);
export async function GET(
@ -32,7 +32,7 @@ export async function GET(
] = await Promise.all([
getPhotosCached({
limit: MAX_PHOTOS_TO_SHOW_PER_CATEGORY,
simulation: film,
film: film,
}),
getIBMPlexMono(),
getImageResponseCacheControlHeaders(),

View File

@ -16,7 +16,7 @@ export const generateStaticParams = staticallyGenerateCategoryIfConfigured(
'films',
'page',
getUniqueFilmSimulations,
simulations => simulations.map(({ simulation }) => ({ simulation })),
films => films.map(({ film }) => ({ film })),
);
interface FilmSimulationProps {

View File

@ -49,7 +49,7 @@ export default async function GridPage() {
cameras,
lenses,
tags,
simulations,
films: simulations,
recipes,
focalLengths,
}}

View File

@ -16,7 +16,7 @@ import { Metadata } from 'next/types';
import { ThemeProvider } from 'next-themes';
import Nav from '@/app/Nav';
import Footer from '@/app/Footer';
import CommandK from '@/app/CommandK';
import CommandK from '@/cmdk/CommandK';
import SwrConfigClient from '@/state/SwrConfigClient';
import AdminBatchEditPanel from '@/admin/AdminBatchEditPanel';
import ShareModals from '@/share/ShareModals';

View File

@ -32,7 +32,7 @@ export default async function OGOverviewPage() {
.catch(() => []),
getPhotosCached({ limit: 1, camera })
.catch(() => []),
getPhotosCached({ limit: 1, simulation })
getPhotosCached({ limit: 1, film: simulation })
.catch(() => []),
getPhotosCached({ limit: 1, focal })
.catch(() => []),

View File

@ -59,7 +59,7 @@ export default async function HomePage() {
lenses,
tags,
recipes,
simulations,
films: simulations,
focalLengths,
}}
/>

View File

@ -121,7 +121,7 @@ export const pathForPhoto = ({
camera,
lens,
tag,
simulation,
film: simulation,
focal,
recipe,
}: PhotoPathParams) => {
@ -330,7 +330,7 @@ export const getPathComponents = (pathname = ''): {
),
tag,
camera,
simulation,
film: simulation,
focal,
};
};
@ -340,7 +340,7 @@ export const getEscapePath = (pathname?: string) => {
photoId,
tag,
camera,
simulation,
film: simulation,
focal,
} = getPathComponents(pathname);

View File

@ -80,7 +80,7 @@ export const getCountsForCategories = async () => {
return acc;
}, {} as Record<string, number>),
filmSimulations: filmSimulations.reduce((acc, filmSimulation) => {
acc[filmSimulation.simulation] = filmSimulation.count;
acc[filmSimulation.film] = filmSimulation.count;
return acc;
}, {} as Record<string, number>),
focalLengths: focalLengths.reduce((acc, focalLength) => {

View File

@ -39,7 +39,7 @@ export interface PhotoSetCategory {
lens?: Lens
tag?: string
recipe?: string
simulation?: FilmSimulation
film?: FilmSimulation
focal?: number
}
@ -48,7 +48,7 @@ export interface PhotoSetCategories {
lenses: Lenses
tags: Tags
recipes: Recipes
simulations: FilmSimulations
films: FilmSimulations
focalLengths: FocalLengths
}
@ -80,9 +80,7 @@ export const sortCategoriesByCount = <T extends { count: number }>(
const convertCategoryKeysToCategoryNames =
(categoryKeys: CategoryKeys): (keyof PhotoSetCategories)[] => {
return categoryKeys.map(key => {
return key === 'films'
? 'simulations'
: key === 'focal-lengths'
return key === 'focal-lengths'
? 'focalLengths'
: key;
});

View File

@ -1,7 +1,7 @@
import CommandKClient from '@/components/cmdk/CommandKClient';
import CommandKClient from './CommandKClient';
import { getPhotosMetaCached } from '@/photo/cache';
import { photoQuantityText } from '@/photo';
import { ADMIN_DEBUG_TOOLS_ENABLED } from './config';
import { ADMIN_DEBUG_TOOLS_ENABLED } from '../app/config';
import { getDataForCategories } from '@/category/data';
export default async function CommandK() {
@ -11,7 +11,7 @@ export default async function CommandK() {
lenses,
tags,
recipes,
filmSimulations,
films,
focalLengths,
] = await Promise.all([
getPhotosMetaCached()
@ -24,7 +24,7 @@ export default async function CommandK() {
cameras={cameras}
lenses={lenses}
tags={tags}
simulations={filmSimulations}
films={films}
recipes={recipes}
focalLengths={focalLengths}
showDebugTools={ADMIN_DEBUG_TOOLS_ENABLED}

View File

@ -31,11 +31,11 @@ import {
pathForPhoto,
pathForRecipe,
pathForTag,
} from '../../app/paths';
import Modal from '../Modal';
} from '../app/paths';
import Modal from '../components/Modal';
import { clsx } from 'clsx/lite';
import { useDebounce } from 'use-debounce';
import Spinner from '../Spinner';
import Spinner from '../components/Spinner';
import { usePathname, useRouter } from 'next/navigation';
import { useTheme } from 'next-themes';
import { BiDesktop, BiLockAlt, BiMoon, BiSun } from 'react-icons/bi';
@ -59,20 +59,20 @@ import * as VisuallyHidden from '@radix-ui/react-visually-hidden';
import InsightsIndicatorDot from '@/admin/insights/InsightsIndicatorDot';
import { PhotoSetCategories } from '@/category';
import { formatCameraText } from '@/camera';
import { labelForFilmSimulation } from '@/platforms/fujifilm/simulation';
import { labelForFilm } from '@/platforms/fujifilm/simulation';
import { formatFocalLength } from '@/focal';
import { formatRecipe } from '@/recipe';
import IconLens from '../icons/IconLens';
import IconLens from '../components/icons/IconLens';
import { formatLensText } from '@/lens';
import IconTag from '../icons/IconTag';
import IconCamera from '../icons/IconCamera';
import IconPhoto from '../icons/IconPhoto';
import IconRecipe from '../icons/IconRecipe';
import IconFocalLength from '../icons/IconFocalLength';
import IconFilm from '../icons/IconFilm';
import IconLock from '../icons/IconLock';
import IconTag from '../components/icons/IconTag';
import IconCamera from '../components/icons/IconCamera';
import IconPhoto from '../components/icons/IconPhoto';
import IconRecipe from '../components/icons/IconRecipe';
import IconFocalLength from '../components/icons/IconFocalLength';
import IconFilm from '../components/icons/IconFilm';
import IconLock from '../components/icons/IconLock';
import useVisualViewportHeight from '@/utility/useVisualViewport';
import useMaskedScroll from '../useMaskedScroll';
import useMaskedScroll from '../components/useMaskedScroll';
const DIALOG_TITLE = 'Global Command-K Menu';
const DIALOG_DESCRIPTION = 'For searching photos, views, and settings';
@ -112,7 +112,7 @@ export default function CommandKClient({
lenses,
tags,
recipes,
simulations,
films,
focalLengths,
showDebugTools,
footer,
@ -335,11 +335,11 @@ export default function CommandKClient({
case 'films': return {
heading: 'Film Simulations',
accessory: <IconFilm size={14} />,
items: simulations.map(({ simulation, count }) => ({
label: labelForFilmSimulation(simulation).medium,
items: films.map(({ film, count }) => ({
label: labelForFilm(film).medium,
annotation: formatCount(count),
annotationAria: formatCountDescriptive(count),
path: pathForFilmSimulation(simulation),
path: pathForFilmSimulation(film),
})),
};
case 'focal-lengths': return {
@ -355,7 +355,7 @@ export default function CommandKClient({
}
})
.filter(Boolean) as CommandKSection[]
, [tagsIncludingHidden, cameras, lenses, recipes, simulations, focalLengths]);
, [tagsIncludingHidden, cameras, lenses, recipes, films, focalLengths]);
const clientSections: CommandKSection[] = [{
heading: 'Theme',

View File

@ -1,7 +1,7 @@
import { clsx } from 'clsx/lite';
import { Command } from 'cmdk';
import { ReactNode } from 'react';
import Spinner from '../Spinner';
import Spinner from '../components/Spinner';
export default function CommandKItem({
label,

View File

@ -20,7 +20,7 @@ export default function FilmHeader({
}) {
return (
<PhotoHeader
simulation={simulation}
film={simulation}
entity={<PhotoFilm {...{ simulation }} />}
entityDescription={descriptionForFilmSimulationPhotos(
photos, undefined, count, dateRange)}

View File

@ -21,7 +21,7 @@ export default function FilmOverview({
cacheKey: `simulation-${simulation}`,
photos,
count,
simulation,
film: simulation,
header: <FilmHeader {...{
simulation,
photos,

View File

@ -1,4 +1,4 @@
import { labelForFilmSimulation } from '@/platforms/fujifilm/simulation';
import { labelForFilm } from '@/platforms/fujifilm/simulation';
import PhotoFilmIcon from './PhotoFilmIcon';
import { pathForFilmSimulation } from '@/app/paths';
import { FilmSimulation } from '.';
@ -20,7 +20,7 @@ export default function PhotoFilm({
countOnHover?: number
recipe?: FujifilmRecipe
} & EntityLinkExternalProps) {
const { small, medium, large } = labelForFilmSimulation(simulation);
const { small, medium, large } = labelForFilm(simulation);
return (
<EntityLink

View File

@ -1,5 +1,5 @@
/* eslint-disable max-len */
import { labelForFilmSimulation } from '@/platforms/fujifilm/simulation';
import { labelForFilm } from '@/platforms/fujifilm/simulation';
import { CSSProperties } from 'react';
import { FilmSimulation } from '.';
@ -22,7 +22,7 @@ export default function PhotoFilmIcon({
className={className}
style={style}
aria-description={simulation
? labelForFilmSimulation(simulation).large
? labelForFilm(simulation).large
: 'Film Simulation'}
width={INTRINSIC_WIDTH * height / INTRINSIC_HEIGHT}
height={height}

View File

@ -12,6 +12,6 @@ export const getPhotosFilmSimulationDataCached = ({
limit?: number,
}) =>
Promise.all([
getPhotosCached({ simulation, limit }),
getPhotosMetaCached({ simulation }),
getPhotosCached({ film: simulation, limit }),
getPhotosMetaCached({ film: simulation }),
]);

View File

@ -10,44 +10,44 @@ import {
} from '@/app/paths';
import {
FujifilmSimulation,
labelForFilmSimulation,
labelForFilm,
} from '@/platforms/fujifilm/simulation';
export type FilmSimulation = FujifilmSimulation;
export type FilmSimulationWithCount = {
simulation: FilmSimulation
film: FilmSimulation
count: number
}
export type FilmSimulations = FilmSimulationWithCount[]
export const sortFilmSimulations = (
simulations: FilmSimulations,
) => simulations.sort(sortFilmSimulationsWithCount);
export const sortFilms = (
films: FilmSimulations,
) => films.sort(sortFilmsWithCount);
export const sortFilmSimulationsWithCount = (
export const sortFilmsWithCount = (
a: FilmSimulationWithCount,
b: FilmSimulationWithCount,
) => {
const aLabel = labelForFilmSimulation(a.simulation).large;
const bLabel = labelForFilmSimulation(b.simulation).large;
const aLabel = labelForFilm(a.film).large;
const bLabel = labelForFilm(b.film).large;
return aLabel.localeCompare(bLabel);
};
export const titleForFilmSimulation = (
simulation: FilmSimulation,
film: FilmSimulation,
photos: Photo[],
explicitCount?: number,
) => [
labelForFilmSimulation(simulation).large,
labelForFilm(film).large,
photoQuantityText(explicitCount ?? photos.length),
].join(' ');
export const shareTextForFilmSimulation = (
simulation: FilmSimulation,
film: FilmSimulation,
) =>
`Photos shot on Fujifilm ${labelForFilmSimulation(simulation).large}`;
`Photos shot on Fujifilm ${labelForFilm(film).large}`;
export const descriptionForFilmSimulationPhotos = (
photos: Photo[],
@ -64,20 +64,20 @@ export const descriptionForFilmSimulationPhotos = (
);
export const generateMetaForFilmSimulation = (
simulation: FilmSimulation,
film: FilmSimulation,
photos: Photo[],
explicitCount?: number,
explicitDateRange?: PhotoDateRange,
) => ({
url: absolutePathForFilmSimulation(simulation),
title: titleForFilmSimulation(simulation, photos, explicitCount),
url: absolutePathForFilmSimulation(film),
title: titleForFilmSimulation(film, photos, explicitCount),
description: descriptionForFilmSimulationPhotos(
photos,
true,
explicitCount,
explicitDateRange,
),
images: absolutePathForFilmSimulationImage(simulation),
images: absolutePathForFilmSimulationImage(film),
});
export const photoHasFilmSimulationData = (photo: Photo) =>

View File

@ -3,7 +3,7 @@ import ImageCaption from './components/ImageCaption';
import ImagePhotoGrid from './components/ImagePhotoGrid';
import ImageContainer from './components/ImageContainer';
import {
labelForFilmSimulation,
labelForFilm,
} from '@/platforms/fujifilm/simulation';
import PhotoFilmIcon from
'@/film/PhotoFilmIcon';
@ -41,7 +41,7 @@ export default function FilmImageResponse({
height={height * .081}
style={{ transform: `translateY(${height * .001}px)`}}
/>,
title: labelForFilmSimulation(simulation).medium.toLocaleUpperCase(),
title: labelForFilm(simulation).medium.toLocaleUpperCase(),
}} />
</ImageContainer>
);

View File

@ -32,7 +32,7 @@ export default function InfinitePhotoScroll({
tag,
camera,
lens,
simulation,
film: simulation,
wrapMoreButtonInGrid,
useCachedPhotos = true,
includeHiddenPhotos,
@ -73,7 +73,7 @@ export default function InfinitePhotoScroll({
camera,
lens,
tag,
simulation,
film: simulation,
}, warmOnly)
, [
useCachedPhotos,

View File

@ -22,7 +22,7 @@ export default function PhotoDetailPage({
tag,
camera,
lens,
simulation,
film: simulation,
recipe,
focal,
indexNumber,
@ -149,7 +149,7 @@ export default function PhotoDetailPage({
selectedPhoto={photo}
tag={tag}
camera={camera}
simulation={simulation}
film={simulation}
focal={focal}
animateOnFirstLoadOnly
/>}

View File

@ -48,7 +48,7 @@ export default function PhotoGridSidebar({
cameras,
lenses,
tags,
simulations,
films: simulations,
recipes,
focalLengths,
} = categories;
@ -199,7 +199,7 @@ export default function PhotoGridSidebar({
icon={<IconFilm size={15} />}
maxItems={maxItemsPerCategory}
items={simulations
.map(({ simulation, count }) =>
.map(({ film: simulation, count }) =>
<PhotoFilm
key={simulation}
simulation={simulation}

View File

@ -464,7 +464,7 @@ export default function PhotoLarge({
tag={shouldShareTag ? primaryTag : undefined}
camera={shouldShareCamera ? camera : undefined}
lens={shouldShareLens ? lens : undefined}
simulation={shouldShareSimulation
film={shouldShareSimulation
? photo.filmSimulation
: undefined}
recipe={shouldShareRecipe

View File

@ -47,7 +47,7 @@ export const getWheresFromOptions = (
tag,
camera,
lens,
simulation,
film: simulation,
recipe,
focal,
} = options;

View File

@ -417,7 +417,7 @@ export const getUniqueFilmSimulations = async () =>
ORDER BY film_simulation ASC
`.then(({ rows }): FilmSimulations => rows
.map(({ film_simulation, count }) => ({
simulation: film_simulation as FilmSimulation,
film: film_simulation as FilmSimulation,
count: parseInt(count, 10),
})))
, 'getUniqueFilmSimulations');

View File

@ -225,8 +225,8 @@ const ALL_POSSIBLE_FILM_SIMULATION_LABELS = Object
export const isStringFilmSimulation = (simulation: string) =>
ALL_POSSIBLE_FILM_SIMULATION_LABELS.includes(simulation.toLocaleLowerCase());
export const labelForFilmSimulation = (simulation: FujifilmSimulation) =>
FILM_SIMULATION_LABELS[simulation];
export const labelForFilm = (film: FujifilmSimulation) =>
FILM_SIMULATION_LABELS[film];
export const getFujifilmSimulationFromMakerNote = (
bytes: Buffer,

View File

@ -15,7 +15,7 @@ import {
generateRecipeText,
RecipeProps,
} from '.';
import { labelForFilmSimulation } from '@/platforms/fujifilm/simulation';
import { labelForFilm } from '@/platforms/fujifilm/simulation';
import { TbChecklist } from 'react-icons/tb';
import CopyButton from '@/components/CopyButton';
import { pathForRecipe } from '@/app/paths';
@ -147,7 +147,7 @@ export default function PhotoRecipeOverlay({
<div className="col-span-8">
{renderDataSquare(
<div className="flex items-center gap-1.5">
{labelForFilmSimulation(simulation).medium.toLocaleUpperCase()}
{labelForFilm(simulation).medium.toLocaleUpperCase()}
<PhotoFilm
contrast="frosted"
simulation={simulation}

View File

@ -8,7 +8,7 @@ import {
} from '@/utility/string';
import { FujifilmRecipe } from '@/platforms/fujifilm/recipe';
import { FilmSimulation } from '@/film';
import { labelForFilmSimulation } from '@/platforms/fujifilm/simulation';
import { labelForFilm } from '@/platforms/fujifilm/simulation';
export type RecipeWithCount = {
recipe: string
@ -62,7 +62,7 @@ export const generateRecipeText = ({
abbreviate?: boolean,
) => {
const lines = [
`${labelForFilmSimulation(simulation).small.toLocaleUpperCase()}`,
`${labelForFilm(simulation).small.toLocaleUpperCase()}`,
// eslint-disable-next-line max-len
`${formatWhiteBalance(recipe).toLocaleUpperCase()} ${formatWhiteBalanceColor(recipe)}`,
];

View File

@ -20,7 +20,7 @@ export default function ShareModals() {
camera,
lens,
tag,
simulation,
film: simulation,
recipe,
focal,
} = shareModalProps;
@ -30,7 +30,7 @@ export default function ShareModals() {
photo,
tag,
camera,
simulation,
film: simulation,
recipe,
focal,
}} />;

View File

@ -21,7 +21,7 @@ export const getSharePathFromShareModalProps = ({
lens,
tag,
recipe,
simulation,
film: simulation,
focal,
}: ShareModalProps) => {
if (photo) {