Add basic show/hide recipe behavior
This commit is contained in:
parent
bd733a285a
commit
78a4d03f6a
@ -32,7 +32,7 @@ import {
|
||||
} from '@/app/config';
|
||||
import AdminPhotoMenuClient from '@/admin/AdminPhotoMenuClient';
|
||||
import { RevalidatePhoto } from './InfinitePhotoScroll';
|
||||
import { useRef } from 'react';
|
||||
import { useRef, useState } from 'react';
|
||||
import useVisible from '@/utility/useVisible';
|
||||
import PhotoDate from './PhotoDate';
|
||||
import { useAppState } from '@/state/AppState';
|
||||
@ -41,6 +41,8 @@ import LoaderButton from '@/components/primitives/LoaderButton';
|
||||
import Tooltip from '@/components/Tooltip';
|
||||
import ZoomControls, { ZoomControlsRef } from '@/components/image/ZoomControls';
|
||||
import PhotoRecipe from './PhotoRecipe';
|
||||
import { TbChecklist } from 'react-icons/tb';
|
||||
import { IoCloseSharp } from 'react-icons/io5';
|
||||
|
||||
export default function PhotoLarge({
|
||||
photo,
|
||||
@ -89,6 +91,8 @@ export default function PhotoLarge({
|
||||
|
||||
const zoomControlsRef = useRef<ZoomControlsRef>(null);
|
||||
|
||||
const [shouldShowRecipe, setShouldShowRecipe] = useState(false);
|
||||
|
||||
const {
|
||||
areZoomControlsShown,
|
||||
arePhotosMatted,
|
||||
@ -165,14 +169,14 @@ export default function PhotoLarge({
|
||||
priority={priority}
|
||||
/>
|
||||
</ZoomControls>
|
||||
{photo.fujifilmRecipe && photo.filmSimulation &&
|
||||
{shouldShowRecipe && photo.fujifilmRecipe && photo.filmSimulation &&
|
||||
<div className={clsx(
|
||||
'absolute inset-0',
|
||||
'flex items-center justify-center',
|
||||
)}>
|
||||
<PhotoRecipe
|
||||
recipe={photo.fujifilmRecipe!}
|
||||
simulation={photo.filmSimulation!}
|
||||
recipe={photo.fujifilmRecipe}
|
||||
simulation={photo.filmSimulation}
|
||||
iso={photo.isoFormatted}
|
||||
exposure={photo.exposureCompensationFormatted}
|
||||
/>
|
||||
@ -289,11 +293,30 @@ export default function PhotoLarge({
|
||||
<li>{photo.exposureCompensationFormatted ?? '0ev'}</li>
|
||||
</ul>
|
||||
{showSimulation && photo.filmSimulation &&
|
||||
<PhotoFilmSimulation
|
||||
simulation={photo.filmSimulation}
|
||||
prefetch={prefetchRelatedLinks}
|
||||
recipe={photo.fujifilmRecipe}
|
||||
/>}
|
||||
<div className="flex items-center gap-2 *:w-auto">
|
||||
<PhotoFilmSimulation
|
||||
simulation={photo.filmSimulation}
|
||||
prefetch={prefetchRelatedLinks}
|
||||
/>
|
||||
{photo.fujifilmRecipe &&
|
||||
<Tooltip content="Fujifilm Recipe">
|
||||
<button
|
||||
onClick={() => setShouldShowRecipe(!shouldShowRecipe)}
|
||||
className={clsx(
|
||||
'text-medium',
|
||||
'border-medium rounded-md',
|
||||
'px-[4px] py-[2.5px] my-[-2.5px]',
|
||||
'hover:bg-dim active:bg-main',
|
||||
)}>
|
||||
{shouldShowRecipe
|
||||
? <IoCloseSharp size={15} />
|
||||
: <TbChecklist
|
||||
className="translate-x-[0.5px]"
|
||||
size={15}
|
||||
/>}
|
||||
</button>
|
||||
</Tooltip>}
|
||||
</div>}
|
||||
</>}
|
||||
<div className={clsx(
|
||||
'flex gap-x-3 gap-y-baseline',
|
||||
|
||||
@ -1,5 +1,3 @@
|
||||
'use client';
|
||||
|
||||
import { labelForFilmSimulation } from '@/platforms/fujifilm/simulation';
|
||||
import PhotoFilmSimulationIcon from './PhotoFilmSimulationIcon';
|
||||
import { pathForFilmSimulation } from '@/app/paths';
|
||||
@ -8,11 +6,7 @@ import { FujifilmRecipe } from '@/platforms/fujifilm/recipe';
|
||||
import EntityLink, {
|
||||
EntityLinkExternalProps,
|
||||
} from '@/components/primitives/EntityLink';
|
||||
import { LuChevronsUpDown } from 'react-icons/lu';
|
||||
import clsx from 'clsx/lite';
|
||||
import { useState } from 'react';
|
||||
import Tooltip from '@/components/Tooltip';
|
||||
import PhotoRecipe from '@/photo/PhotoRecipe';
|
||||
|
||||
export default function PhotoFilmSimulation({
|
||||
simulation,
|
||||
@ -21,8 +15,6 @@ export default function PhotoFilmSimulation({
|
||||
contrast = 'low',
|
||||
prefetch,
|
||||
countOnHover,
|
||||
recipe,
|
||||
className,
|
||||
}: {
|
||||
simulation: FilmSimulation
|
||||
countOnHover?: number
|
||||
@ -31,43 +23,22 @@ export default function PhotoFilmSimulation({
|
||||
} & EntityLinkExternalProps) {
|
||||
const { small, medium, large } = labelForFilmSimulation(simulation);
|
||||
|
||||
const [shouldShowRecipe, setShouldShowRecipe] = useState(false);
|
||||
|
||||
return (
|
||||
<div className={clsx('space-y-baseline', className)}>
|
||||
<div className="flex items-center gap-2 *:w-auto">
|
||||
<EntityLink
|
||||
label={medium}
|
||||
labelSmall={small}
|
||||
href={pathForFilmSimulation(simulation)}
|
||||
icon={<PhotoFilmSimulationIcon
|
||||
simulation={simulation}
|
||||
className={clsx(contrast === 'frosted' && 'text-black')}
|
||||
/>}
|
||||
title={`Film Simulation: ${large}`}
|
||||
type={type}
|
||||
badged={badged}
|
||||
contrast={contrast}
|
||||
prefetch={prefetch}
|
||||
hoverEntity={countOnHover}
|
||||
iconWide
|
||||
/>
|
||||
{recipe &&
|
||||
<Tooltip content="Fujifilm Recipe">
|
||||
<button
|
||||
onClick={() => setShouldShowRecipe(!shouldShowRecipe)}
|
||||
className={clsx(
|
||||
'text-medium',
|
||||
'border-medium rounded-md',
|
||||
'px-[4px] py-[2.5px] my-[-2.5px]',
|
||||
'hover:bg-dim active:bg-main',
|
||||
)}>
|
||||
<LuChevronsUpDown size={15} />
|
||||
</button>
|
||||
</Tooltip>}
|
||||
</div>
|
||||
{recipe && shouldShowRecipe &&
|
||||
<PhotoRecipe {...{ recipe, simulation }} />}
|
||||
</div>
|
||||
<EntityLink
|
||||
label={medium}
|
||||
labelSmall={small}
|
||||
href={pathForFilmSimulation(simulation)}
|
||||
icon={<PhotoFilmSimulationIcon
|
||||
simulation={simulation}
|
||||
className={clsx(contrast === 'frosted' && 'text-black')}
|
||||
/>}
|
||||
title={`Film Simulation: ${large}`}
|
||||
type={type}
|
||||
badged={badged}
|
||||
contrast={contrast}
|
||||
prefetch={prefetch}
|
||||
hoverEntity={countOnHover}
|
||||
iconWide
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user