diff --git a/hooks/usePrevious.js b/hooks/usePrevious.js new file mode 100644 index 0000000..c6248de --- /dev/null +++ b/hooks/usePrevious.js @@ -0,0 +1,11 @@ +import { useRef, useEffect } from "react"; + +export default function usePrevious(value) { + const ref = useRef(); + + useEffect(() => { + ref.current = value; + }, [value]); + + return ref.current; +} \ No newline at end of file diff --git a/pages/store/item/[slug].js b/pages/store/item/[slug].js index 6912ebb..76f2d8d 100644 --- a/pages/store/item/[slug].js +++ b/pages/store/item/[slug].js @@ -1,4 +1,4 @@ -import React, {useState} from 'react' +import React, {useState, useEffect} from 'react' import Head from 'next/head' import Router from 'next/router' import {FormController, IntegerInput, Button} from '~/components/form' @@ -10,6 +10,7 @@ import Modal from '~/components/modal' import useCart, {useSetCart} from '~/hooks/useCart' import styles from './style.module.css' +import usePrevious from '~/hooks/usePrevious' Item.getInitialProps = async function({ctx: {axios, query: {slug}}}){ const {data: item} = await axios.get(`/api/items/by-slug/${slug}`) @@ -33,7 +34,16 @@ export default function Item({item}){ // Pick first one with featured flag or 0 const featuredIndex = item.images.reduce((p, im, i) => ((p !== undefined) ? p : (im.featured ? i : undefined)), undefined) || 0 const [selectedIndex, setSelected] = useState(featuredIndex); + const lastImage = usePrevious(selectedIndex); const [imageModalVisible, setImageModalVisible] = useState(false); + const [imageChanged, setImageChanged] = useState(false); + + useEffect(() => { + if (selectedIndex !== lastImage) + setImageChanged(true); + else + setImageChanged(false); + }, [selectedIndex, lastImage]); const numInCart = cart?.items?.find(i => i.item.uuid === item.uuid)?.count || 0 @@ -67,8 +77,8 @@ export default function Item({item}){ {item.images && item.images.length > 1 &&
{item.images.map((image, index) => ( - - + + setSelected(index)} className={index === selectedIndex ? styles.selectedImage : undefined} @@ -84,10 +94,12 @@ export default function Item({item}){
- - - setImageModalVisible(true)} /> - + {!imageChanged && ( + + + setImageModalVisible(true)} /> + + )}