import { IconButton, Image } from '@chakra-ui/react'; import { useState } from 'react'; import { FaAngleLeft, FaAngleRight } from 'react-icons/fa'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import { GalleryCategory, GalleryState, selectNextImage, selectPrevImage, } from 'features/gallery/store/gallerySlice'; import { createSelector } from '@reduxjs/toolkit'; import _ from 'lodash'; import { OptionsState } from 'features/options/store/optionsSlice'; import ImageMetadataViewer from './ImageMetaDataViewer/ImageMetadataViewer'; export const imagesSelector = createSelector( [(state: RootState) => state.gallery, (state: RootState) => state.options], (gallery: GalleryState, options: OptionsState) => { const { currentCategory, currentImage, intermediateImage } = gallery; const { shouldShowImageDetails } = options; const tempImages = gallery.categories[ currentImage ? (currentImage.category as GalleryCategory) : 'result' ].images; const currentImageIndex = tempImages.findIndex( (i) => i.uuid === gallery?.currentImage?.uuid ); const imagesLength = tempImages.length; return { imageToDisplay: intermediateImage ? intermediateImage : currentImage, isIntermediate: Boolean(intermediateImage), viewerImageToDisplay: currentImage, currentCategory, isOnFirstImage: currentImageIndex === 0, isOnLastImage: !isNaN(currentImageIndex) && currentImageIndex === imagesLength - 1, shouldShowImageDetails, shouldShowPrevImageButton: currentImageIndex === 0, shouldShowNextImageButton: !isNaN(currentImageIndex) && currentImageIndex === imagesLength - 1, }; }, { memoizeOptions: { resultEqualityCheck: _.isEqual, }, } ); export default function CurrentImagePreview() { const dispatch = useAppDispatch(); const { isOnFirstImage, isOnLastImage, shouldShowImageDetails, imageToDisplay, isIntermediate, } = useAppSelector(imagesSelector); const [shouldShowNextPrevButtons, setShouldShowNextPrevButtons] = useState(false); const handleCurrentImagePreviewMouseOver = () => { setShouldShowNextPrevButtons(true); }; const handleCurrentImagePreviewMouseOut = () => { setShouldShowNextPrevButtons(false); }; const handleClickPrevButton = () => { dispatch(selectPrevImage()); }; const handleClickNextButton = () => { dispatch(selectNextImage()); }; return (
{imageToDisplay && ( )} {!shouldShowImageDetails && (
{shouldShowNextPrevButtons && !isOnFirstImage && ( } variant="unstyled" onClick={handleClickPrevButton} /> )}
{shouldShowNextPrevButtons && !isOnLastImage && ( } variant="unstyled" onClick={handleClickNextButton} /> )}
)} {shouldShowImageDetails && imageToDisplay && ( )}
); }