From 763cc4de14ef33519926211ad418a9d5d1c400a9 Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Sat, 29 Mar 2025 22:58:04 -0500 Subject: [PATCH] Rename core film types --- app/film/[film]/[photoId]/page.tsx | 8 ++--- app/film/[film]/image/route.tsx | 4 +-- app/film/[film]/page.tsx | 2 +- app/grid/page.tsx | 2 +- app/layout.tsx | 2 +- app/og/sample/page.tsx | 2 +- app/page.tsx | 2 +- src/app/paths.ts | 6 ++-- src/category/data.ts | 2 +- src/category/index.ts | 12 +++---- src/{app => cmdk}/CommandK.tsx | 8 ++--- src/{components => }/cmdk/CommandKClient.tsx | 36 ++++++++++---------- src/{components => }/cmdk/CommandKItem.tsx | 2 +- src/film/FilmHeader.tsx | 2 +- src/film/FilmOverview.tsx | 2 +- src/film/PhotoFilm.tsx | 4 +-- src/film/PhotoFilmIcon.tsx | 4 +-- src/film/data.ts | 4 +-- src/film/index.ts | 32 ++++++++--------- src/image-response/FilmImageResponse.tsx | 4 +-- src/photo/InfinitePhotoScroll.tsx | 4 +-- src/photo/PhotoDetailPage.tsx | 4 +-- src/photo/PhotoGridSidebar.tsx | 4 +-- src/photo/PhotoLarge.tsx | 2 +- src/photo/db/index.ts | 2 +- src/photo/db/query.ts | 2 +- src/platforms/fujifilm/simulation.ts | 4 +-- src/recipe/PhotoRecipeOverlay.tsx | 4 +-- src/recipe/index.ts | 4 +-- src/share/ShareModals.tsx | 4 +-- src/share/index.ts | 2 +- 31 files changed, 87 insertions(+), 89 deletions(-) rename src/{app => cmdk}/CommandK.tsx (79%) rename src/{components => }/cmdk/CommandKClient.tsx (95%) rename src/{components => }/cmdk/CommandKItem.tsx (97%) diff --git a/app/film/[film]/[photoId]/page.tsx b/app/film/[film]/[photoId]/page.tsx index b0144da9..610e077e 100644 --- a/app/film/[film]/[photoId]/page.tsx +++ b/app/film/[film]/[photoId]/page.tsx @@ -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 ( 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(), diff --git a/app/film/[film]/page.tsx b/app/film/[film]/page.tsx index cbf340a5..86aa1771 100644 --- a/app/film/[film]/page.tsx +++ b/app/film/[film]/page.tsx @@ -16,7 +16,7 @@ export const generateStaticParams = staticallyGenerateCategoryIfConfigured( 'films', 'page', getUniqueFilmSimulations, - simulations => simulations.map(({ simulation }) => ({ simulation })), + films => films.map(({ film }) => ({ film })), ); interface FilmSimulationProps { diff --git a/app/grid/page.tsx b/app/grid/page.tsx index f6d8aad3..d53f49f6 100644 --- a/app/grid/page.tsx +++ b/app/grid/page.tsx @@ -49,7 +49,7 @@ export default async function GridPage() { cameras, lenses, tags, - simulations, + films: simulations, recipes, focalLengths, }} diff --git a/app/layout.tsx b/app/layout.tsx index 6f933459..be93992a 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -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'; diff --git a/app/og/sample/page.tsx b/app/og/sample/page.tsx index 8ad17f15..fbf24bf9 100644 --- a/app/og/sample/page.tsx +++ b/app/og/sample/page.tsx @@ -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(() => []), diff --git a/app/page.tsx b/app/page.tsx index 39e9797d..4a952ca4 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -59,7 +59,7 @@ export default async function HomePage() { lenses, tags, recipes, - simulations, + films: simulations, focalLengths, }} /> diff --git a/src/app/paths.ts b/src/app/paths.ts index 0b53b05b..1e93f3be 100644 --- a/src/app/paths.ts +++ b/src/app/paths.ts @@ -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); diff --git a/src/category/data.ts b/src/category/data.ts index 7485033c..30c646e4 100644 --- a/src/category/data.ts +++ b/src/category/data.ts @@ -80,7 +80,7 @@ export const getCountsForCategories = async () => { return acc; }, {} as Record), filmSimulations: filmSimulations.reduce((acc, filmSimulation) => { - acc[filmSimulation.simulation] = filmSimulation.count; + acc[filmSimulation.film] = filmSimulation.count; return acc; }, {} as Record), focalLengths: focalLengths.reduce((acc, focalLength) => { diff --git a/src/category/index.ts b/src/category/index.ts index 5a446fc1..37097f18 100644 --- a/src/category/index.ts +++ b/src/category/index.ts @@ -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,11 +80,9 @@ export const sortCategoriesByCount = ( const convertCategoryKeysToCategoryNames = (categoryKeys: CategoryKeys): (keyof PhotoSetCategories)[] => { return categoryKeys.map(key => { - return key === 'films' - ? 'simulations' - : key === 'focal-lengths' - ? 'focalLengths' - : key; + return key === 'focal-lengths' + ? 'focalLengths' + : key; }); }; diff --git a/src/app/CommandK.tsx b/src/cmdk/CommandK.tsx similarity index 79% rename from src/app/CommandK.tsx rename to src/cmdk/CommandK.tsx index af1d9413..c1e7f01a 100644 --- a/src/app/CommandK.tsx +++ b/src/cmdk/CommandK.tsx @@ -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} diff --git a/src/components/cmdk/CommandKClient.tsx b/src/cmdk/CommandKClient.tsx similarity index 95% rename from src/components/cmdk/CommandKClient.tsx rename to src/cmdk/CommandKClient.tsx index 9fbcbb88..7240f8a4 100644 --- a/src/components/cmdk/CommandKClient.tsx +++ b/src/cmdk/CommandKClient.tsx @@ -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: , - 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', diff --git a/src/components/cmdk/CommandKItem.tsx b/src/cmdk/CommandKItem.tsx similarity index 97% rename from src/components/cmdk/CommandKItem.tsx rename to src/cmdk/CommandKItem.tsx index 94d34455..907094c0 100644 --- a/src/components/cmdk/CommandKItem.tsx +++ b/src/cmdk/CommandKItem.tsx @@ -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, diff --git a/src/film/FilmHeader.tsx b/src/film/FilmHeader.tsx index 22fa2d0b..7af43c1f 100644 --- a/src/film/FilmHeader.tsx +++ b/src/film/FilmHeader.tsx @@ -20,7 +20,7 @@ export default function FilmHeader({ }) { return ( } entityDescription={descriptionForFilmSimulationPhotos( photos, undefined, count, dateRange)} diff --git a/src/film/FilmOverview.tsx b/src/film/FilmOverview.tsx index 49e91bce..90432496 100644 --- a/src/film/FilmOverview.tsx +++ b/src/film/FilmOverview.tsx @@ -21,7 +21,7 @@ export default function FilmOverview({ cacheKey: `simulation-${simulation}`, photos, count, - simulation, + film: simulation, header: Promise.all([ - getPhotosCached({ simulation, limit }), - getPhotosMetaCached({ simulation }), + getPhotosCached({ film: simulation, limit }), + getPhotosMetaCached({ film: simulation }), ]); diff --git a/src/film/index.ts b/src/film/index.ts index a1eb7876..98ad1925 100644 --- a/src/film/index.ts +++ b/src/film/index.ts @@ -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) => diff --git a/src/image-response/FilmImageResponse.tsx b/src/image-response/FilmImageResponse.tsx index 19e41683..56287002 100644 --- a/src/image-response/FilmImageResponse.tsx +++ b/src/image-response/FilmImageResponse.tsx @@ -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(), }} /> ); diff --git a/src/photo/InfinitePhotoScroll.tsx b/src/photo/InfinitePhotoScroll.tsx index b1a2a48e..cc9ebcfc 100644 --- a/src/photo/InfinitePhotoScroll.tsx +++ b/src/photo/InfinitePhotoScroll.tsx @@ -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, diff --git a/src/photo/PhotoDetailPage.tsx b/src/photo/PhotoDetailPage.tsx index 9c876a36..6f529bc5 100644 --- a/src/photo/PhotoDetailPage.tsx +++ b/src/photo/PhotoDetailPage.tsx @@ -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 />} diff --git a/src/photo/PhotoGridSidebar.tsx b/src/photo/PhotoGridSidebar.tsx index 3ebcb764..095dbf20 100644 --- a/src/photo/PhotoGridSidebar.tsx +++ b/src/photo/PhotoGridSidebar.tsx @@ -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={} maxItems={maxItemsPerCategory} items={simulations - .map(({ simulation, count }) => + .map(({ film: simulation, count }) => 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'); diff --git a/src/platforms/fujifilm/simulation.ts b/src/platforms/fujifilm/simulation.ts index 5dce5078..45d45287 100644 --- a/src/platforms/fujifilm/simulation.ts +++ b/src/platforms/fujifilm/simulation.ts @@ -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, diff --git a/src/recipe/PhotoRecipeOverlay.tsx b/src/recipe/PhotoRecipeOverlay.tsx index e35a3b6b..876784e1 100644 --- a/src/recipe/PhotoRecipeOverlay.tsx +++ b/src/recipe/PhotoRecipeOverlay.tsx @@ -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({
{renderDataSquare(
- {labelForFilmSimulation(simulation).medium.toLocaleUpperCase()} + {labelForFilm(simulation).medium.toLocaleUpperCase()} { const lines = [ - `${labelForFilmSimulation(simulation).small.toLocaleUpperCase()}`, + `${labelForFilm(simulation).small.toLocaleUpperCase()}`, // eslint-disable-next-line max-len `${formatWhiteBalance(recipe).toLocaleUpperCase()} ${formatWhiteBalanceColor(recipe)}`, ]; diff --git a/src/share/ShareModals.tsx b/src/share/ShareModals.tsx index 94824957..92dd1895 100644 --- a/src/share/ShareModals.tsx +++ b/src/share/ShareModals.tsx @@ -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, }} />; diff --git a/src/share/index.ts b/src/share/index.ts index 5e8165b0..fb33b224 100644 --- a/src/share/index.ts +++ b/src/share/index.ts @@ -21,7 +21,7 @@ export const getSharePathFromShareModalProps = ({ lens, tag, recipe, - simulation, + film: simulation, focal, }: ShareModalProps) => { if (photo) {