fix(ui): next/prev image buttons

This commit is contained in:
psychedelicious 2023-05-01 00:02:19 +10:00
parent fecb77e344
commit 29743a9e02
4 changed files with 55 additions and 80 deletions

View File

@ -62,7 +62,6 @@ const CurrentImagePreview = () => {
}} }}
/> />
)} )}
{!shouldShowImageDetails && <NextPrevImageButtons />}
{shouldShowImageDetails && image && 'metadata' in image && ( {shouldShowImageDetails && image && 'metadata' in image && (
<Box <Box
sx={{ sx={{
@ -77,6 +76,7 @@ const CurrentImagePreview = () => {
<ImageMetadataViewer image={image} /> <ImageMetadataViewer image={image} />
</Box> </Box>
)} )}
{!shouldShowImageDetails && <NextPrevImageButtons />}
</Flex> </Flex>
); );
}; };

View File

@ -110,28 +110,6 @@ export const ImageGalleryPanel = () => {
[shouldPinGallery] [shouldPinGallery]
); );
useHotkeys(
'left',
() => {
dispatch(selectPrevImage());
},
{
enabled: !isStaging || activeTabName !== 'unifiedCanvas',
},
[isStaging, activeTabName]
);
useHotkeys(
'right',
() => {
dispatch(selectNextImage());
},
{
enabled: !isStaging || activeTabName !== 'unifiedCanvas',
},
[isStaging, activeTabName]
);
useHotkeys( useHotkeys(
'shift+g', 'shift+g',
() => { () => {

View File

@ -1,18 +1,14 @@
import { ChakraProps, Flex, Grid, IconButton } from '@chakra-ui/react'; import { ChakraProps, Flex, Grid, IconButton } from '@chakra-ui/react';
import { createSelector } from '@reduxjs/toolkit'; import { createSelector } from '@reduxjs/toolkit';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { isEqual } from 'lodash-es'; import { clamp, isEqual } from 'lodash-es';
import { useState } from 'react'; import { useCallback, useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FaAngleLeft, FaAngleRight } from 'react-icons/fa'; import { FaAngleLeft, FaAngleRight } from 'react-icons/fa';
import { gallerySelector } from '../store/gallerySelectors'; import { gallerySelector } from '../store/gallerySelectors';
import { RootState } from 'app/store/store'; import { RootState } from 'app/store/store';
import { selectResultsEntities } from '../store/resultsSlice'; import { imageSelected } from '../store/gallerySlice';
// import { import { useHotkeys } from 'react-hotkeys-hook';
// GalleryCategory,
// selectNextImage,
// selectPrevImage,
// } from '../store/gallerySlice';
const nextPrevButtonTriggerAreaStyles: ChakraProps['sx'] = { const nextPrevButtonTriggerAreaStyles: ChakraProps['sx'] = {
height: '100%', height: '100%',
@ -40,12 +36,32 @@ export const nextPrevImageButtonsSelector = createSelector(
(i) => i === selectedImage.name (i) => i === selectedImage.name
); );
const nextImageIndex = clamp(
currentImageIndex + 1,
0,
state[currentCategory].ids.length - 1
);
const prevImageIndex = clamp(
currentImageIndex - 1,
0,
state[currentCategory].ids.length - 1
);
const nextImageId = state[currentCategory].ids[nextImageIndex];
const prevImageId = state[currentCategory].ids[prevImageIndex];
const nextImage = state[currentCategory].entities[nextImageId];
const prevImage = state[currentCategory].entities[prevImageId];
const imagesLength = state[currentCategory].ids.length; const imagesLength = state[currentCategory].ids.length;
return { return {
isOnFirstImage: currentImageIndex === 0, isOnFirstImage: currentImageIndex === 0,
isOnLastImage: isOnLastImage:
!isNaN(currentImageIndex) && currentImageIndex === imagesLength - 1, !isNaN(currentImageIndex) && currentImageIndex === imagesLength - 1,
nextImage,
prevImage,
}; };
}, },
{ {
@ -59,28 +75,43 @@ const NextPrevImageButtons = () => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const { t } = useTranslation(); const { t } = useTranslation();
const { isOnFirstImage, isOnLastImage } = useAppSelector( const { isOnFirstImage, isOnLastImage, nextImage, prevImage } =
nextPrevImageButtonsSelector useAppSelector(nextPrevImageButtonsSelector);
);
const [shouldShowNextPrevButtons, setShouldShowNextPrevButtons] = const [shouldShowNextPrevButtons, setShouldShowNextPrevButtons] =
useState<boolean>(false); useState<boolean>(false);
const handleCurrentImagePreviewMouseOver = () => { const handleCurrentImagePreviewMouseOver = useCallback(() => {
setShouldShowNextPrevButtons(true); setShouldShowNextPrevButtons(true);
}; }, []);
const handleCurrentImagePreviewMouseOut = () => { const handleCurrentImagePreviewMouseOut = useCallback(() => {
setShouldShowNextPrevButtons(false); setShouldShowNextPrevButtons(false);
}; }, []);
const handleClickPrevButton = () => { const handlePrevImage = useCallback(() => {
dispatch(selectPrevImage()); dispatch(imageSelected(prevImage));
}; }, [dispatch, prevImage]);
const handleClickNextButton = () => { const handleNextImage = useCallback(() => {
dispatch(selectNextImage()); dispatch(imageSelected(nextImage));
}; }, [dispatch, nextImage]);
useHotkeys(
'left',
() => {
handlePrevImage();
},
[prevImage]
);
useHotkeys(
'right',
() => {
handleNextImage();
},
[nextImage]
);
return ( return (
<Flex <Flex
@ -104,7 +135,7 @@ const NextPrevImageButtons = () => {
aria-label={t('accessibility.previousImage')} aria-label={t('accessibility.previousImage')}
icon={<FaAngleLeft size={64} />} icon={<FaAngleLeft size={64} />}
variant="unstyled" variant="unstyled"
onClick={handleClickPrevButton} onClick={handlePrevImage}
boxSize={16} boxSize={16}
sx={nextPrevButtonStyles} sx={nextPrevButtonStyles}
/> />
@ -123,7 +154,7 @@ const NextPrevImageButtons = () => {
aria-label={t('accessibility.nextImage')} aria-label={t('accessibility.nextImage')}
icon={<FaAngleRight size={64} />} icon={<FaAngleRight size={64} />}
variant="unstyled" variant="unstyled"
onClick={handleClickNextButton} onClick={handleNextImage}
boxSize={16} boxSize={16}
sx={nextPrevButtonStyles} sx={nextPrevButtonStyles}
/> />

View File

@ -41,40 +41,6 @@ export const gallerySlice = createSlice({
) => { ) => {
state.selectedImage = action.payload; state.selectedImage = action.payload;
}, },
// selectNextImage: (state) => {
// const { currentImage } = state;
// if (!currentImage) return;
// const tempImages =
// state.categories[currentImage.category as GalleryCategory].images;
// if (currentImage) {
// const currentImageIndex = tempImages.findIndex(
// (i) => i.uuid === currentImage.uuid
// );
// if (currentImageIndex < tempImages.length - 1) {
// const newCurrentImage = tempImages[currentImageIndex + 1];
// state.currentImage = newCurrentImage;
// state.currentImageUuid = newCurrentImage.uuid;
// }
// }
// },
// selectPrevImage: (state) => {
// const { currentImage } = state;
// if (!currentImage) return;
// const tempImages =
// state.categories[currentImage.category as GalleryCategory].images;
// if (currentImage) {
// const currentImageIndex = tempImages.findIndex(
// (i) => i.uuid === currentImage.uuid
// );
// if (currentImageIndex > 0) {
// const newCurrentImage = tempImages[currentImageIndex - 1];
// state.currentImage = newCurrentImage;
// state.currentImageUuid = newCurrentImage.uuid;
// }
// }
// },
setGalleryImageMinimumWidth: (state, action: PayloadAction<number>) => { setGalleryImageMinimumWidth: (state, action: PayloadAction<number>) => {
state.galleryImageMinimumWidth = action.payload; state.galleryImageMinimumWidth = action.payload;
}, },