From 3b7ef6541a4030798efc276d461f3fe5e7a80fde Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Sun, 2 Mar 2025 23:42:41 -0600 Subject: [PATCH] Wire up initial recipe paths --- src/photo/PhotoGridSidebar.tsx | 60 +++++++++++++++++++++------------- src/recipe/PhotoRecipe.tsx | 31 +++++++++++------- src/recipe/RecipeModal.tsx | 7 ++-- src/recipe/index.ts | 41 ++++++++++++----------- src/tag/PhotoTags.tsx | 13 ++++++-- 5 files changed, 93 insertions(+), 59 deletions(-) diff --git a/src/photo/PhotoGridSidebar.tsx b/src/photo/PhotoGridSidebar.tsx index b8ca861e..5af0a37c 100644 --- a/src/photo/PhotoGridSidebar.tsx +++ b/src/photo/PhotoGridSidebar.tsx @@ -21,6 +21,8 @@ import { safelyParseFormattedHtml, } from '@/utility/html'; import { clsx } from 'clsx/lite'; +import { convertTagToRecipe, isTagRecipe } from '@/recipe'; +import PhotoRecipe from '@/recipe/PhotoRecipe'; export default function PhotoGridSidebar({ tags, @@ -51,35 +53,47 @@ export default function PhotoGridSidebar({ className="text-icon translate-y-[1px]" />} items={tagsIncludingHidden.map(({ tag, count }) => { - switch (tag) { - case TAG_FAVS: - return ; - case TAG_HIDDEN: - return ; - default: - return ; + } else { + switch (tag) { + case TAG_FAVS: + return ; + case TAG_HIDDEN: + return ; + default: + return ; + } } })} /> diff --git a/src/recipe/PhotoRecipe.tsx b/src/recipe/PhotoRecipe.tsx index 81b9a4d5..fe1b4fed 100644 --- a/src/recipe/PhotoRecipe.tsx +++ b/src/recipe/PhotoRecipe.tsx @@ -1,4 +1,4 @@ -import { pathForTag } from '@/app/paths'; +import { pathForRecipe } from '@/app/paths'; import EntityLink, { EntityLinkExternalProps, } from '@/components/primitives/EntityLink'; @@ -25,8 +25,13 @@ export default function PhotoRecipe({ } + href={pathForRecipe(recipe)} + icon={} className={className} type={type} badged={badged} @@ -34,15 +39,17 @@ export default function PhotoRecipe({ prefetch={prefetch} hoverEntity={countOnHover} /> - + {recipeOnClick && + } ); } diff --git a/src/recipe/RecipeModal.tsx b/src/recipe/RecipeModal.tsx index 78b0a452..5c6576a3 100644 --- a/src/recipe/RecipeModal.tsx +++ b/src/recipe/RecipeModal.tsx @@ -2,7 +2,7 @@ import Modal from '@/components/Modal'; import { useAppState } from '@/state/AppState'; -import PhotoRecipeOGTile from './PhotoRecipeOGTile'; +import PhotoRecipeGrid from './PhotoRecipeGrid'; export default function ShareModals() { const { @@ -15,7 +15,10 @@ export default function ShareModals() { onClose={() => setRecipeModalProps?.(undefined)} container={false} > - + setRecipeModalProps?.(undefined), + }}/> ; } } diff --git a/src/recipe/index.ts b/src/recipe/index.ts index 7fbc7f1c..9499a3b5 100644 --- a/src/recipe/index.ts +++ b/src/recipe/index.ts @@ -1,13 +1,8 @@ import { absolutePathForRecipe, absolutePathForRecipeImage } from '@/app/paths'; -import { Photo, photoQuantityText } from '@/photo'; +import { descriptionForPhotoSet, Photo, photoQuantityText } from '@/photo'; import { PhotoDateRange } from '@/photo'; -import { - descriptionForTaggedPhotos, - isTagFavs, - isTagHidden, - Tags, -} from '../tag'; -import { convertStringToArray, parameterize } from '@/utility/string'; +import { Tags } from '../tag'; +import { parameterize } from '@/utility/string'; import { capitalizeWords } from '@/utility/string'; import { FujifilmRecipe } from '@/platforms/fujifilm/recipe'; import { FilmSimulation } from '@/simulation'; @@ -21,8 +16,11 @@ export interface RecipeProps { exposure?: string } +export const isTagRecipe = (tag: string) => + (new RegExp(`^${KEY_RECIPE}-?`).test(tag)); + export const convertTagsToRecipes = (tags: Tags) => - tags.filter(({ tag }) => tag.startsWith(KEY_RECIPE)) + tags.filter(({ tag }) => isTagRecipe(tag)) .map(({ tag }) => convertTagToRecipe(tag)); export const convertRecipeToTag = (recipe: string) => @@ -34,15 +32,6 @@ export const convertTagToRecipe = (tag: string) => export const formatRecipe = (recipe?: string) => capitalizeWords(recipe?.replaceAll('-', ' ')); -export const getValidationMessageForTags = (tags?: string) => { - const reservedTags = (convertStringToArray(tags) ?? []) - .filter(tag => isTagFavs(tag) || isTagHidden(tag)) - .map(tag => tag.toLocaleUpperCase()); - return reservedTags.length - ? `Reserved tags: ${reservedTags.join(', ').toLocaleLowerCase()}` - : undefined; -}; - export const titleForRecipe = ( recipe: string, photos:Photo[] = [], @@ -52,6 +41,20 @@ export const titleForRecipe = ( photoQuantityText(explicitCount ?? photos.length), ].join(' '); +export const descriptionForRecipePhotos = ( + photos: Photo[] = [], + dateBased?: boolean, + explicitCount?: number, + explicitDateRange?: PhotoDateRange, +) => + descriptionForPhotoSet( + photos, + undefined, + dateBased, + explicitCount, + explicitDateRange, + ); + export const generateMetaForRecipe = ( recipe: string, photos: Photo[], @@ -61,6 +64,6 @@ export const generateMetaForRecipe = ( url: absolutePathForRecipe(recipe), title: titleForRecipe(recipe, photos, explicitCount), description: - descriptionForTaggedPhotos(photos, true, explicitCount, explicitDateRange), + descriptionForRecipePhotos(photos, true, explicitCount, explicitDateRange), images: absolutePathForRecipeImage(recipe), }); diff --git a/src/tag/PhotoTags.tsx b/src/tag/PhotoTags.tsx index 802f76ee..9b0a3217 100644 --- a/src/tag/PhotoTags.tsx +++ b/src/tag/PhotoTags.tsx @@ -3,6 +3,8 @@ import { isTagFavs } from '.'; import FavsTag from './FavsTag'; import { EntityLinkExternalProps } from '@/components/primitives/EntityLink'; import { Fragment } from 'react'; +import { convertTagToRecipe, isTagRecipe } from '@/recipe'; +import PhotoRecipe from '@/recipe/PhotoRecipe'; export default function PhotoTags({ tags, @@ -15,9 +17,14 @@ export default function PhotoTags({
{tags.map(tag => - {isTagFavs(tag) - ? - : } + {isTagRecipe(tag) + ? console.log('clicked'), + }} /> + : isTagFavs(tag) + ? + : } )}
);