From bb3bc33e672a9cb0f222dbc1f5f32450d2e50626 Mon Sep 17 00:00:00 2001 From: Lee Robinson Date: Thu, 18 Apr 2024 19:50:09 -0700 Subject: [PATCH] Moar --- components/product/gallery.tsx | 71 ++++++++++++++----------- components/product/variant-selector.tsx | 27 +++++----- 2 files changed, 52 insertions(+), 46 deletions(-) diff --git a/components/product/gallery.tsx b/components/product/gallery.tsx index 0b03557a5..9290f8ea6 100644 --- a/components/product/gallery.tsx +++ b/components/product/gallery.tsx @@ -4,38 +4,39 @@ import { ArrowLeftIcon, ArrowRightIcon } from '@heroicons/react/24/outline'; import { GridTileImage } from 'components/grid/tile'; import { createUrl } from 'lib/utils'; import Image from 'next/image'; -import Link from 'next/link'; -import { usePathname, useSearchParams } from 'next/navigation'; +import { usePathname, useRouter, useSearchParams } from 'next/navigation'; +import { useOptimistic, useTransition } from 'react'; export function Gallery({ images }: { images: { src: string; altText: string }[] }) { + const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); const imageSearchParam = searchParams.get('image'); const imageIndex = imageSearchParam ? parseInt(imageSearchParam) : 0; - - const nextSearchParams = new URLSearchParams(searchParams.toString()); - const nextImageIndex = imageIndex + 1 < images.length ? imageIndex + 1 : 0; - nextSearchParams.set('image', nextImageIndex.toString()); - const nextUrl = createUrl(pathname, nextSearchParams); - - const previousSearchParams = new URLSearchParams(searchParams.toString()); - const previousImageIndex = imageIndex === 0 ? images.length - 1 : imageIndex - 1; - previousSearchParams.set('image', previousImageIndex.toString()); - const previousUrl = createUrl(pathname, previousSearchParams); + const [optimisticIndex, setOptimisticIndex] = useOptimistic(imageIndex); + // eslint-disable-next-line no-unused-vars + const [pending, startTransition] = useTransition(); const buttonClassName = 'h-full px-6 transition-all ease-in-out hover:scale-110 hover:text-black dark:hover:text-white flex items-center justify-center'; + function updateIndex(newIndex: number) { + setOptimisticIndex(newIndex); + const newSearchParams = new URLSearchParams(searchParams.toString()); + newSearchParams.set('image', newIndex.toString()); + router.replace(createUrl(pathname, newSearchParams), { scroll: false }); + } + return ( <>
- {images[imageIndex] && ( + {images[optimisticIndex] && ( {images[imageIndex]?.altText )} @@ -43,23 +44,29 @@ export function Gallery({ images }: { images: { src: string; altText: string }[] {images.length > 1 ? (
- { + startTransition(() => { + updateIndex(optimisticIndex - 1); + }); + }} className={buttonClassName} - scroll={false} > - +
- { + startTransition(() => { + updateIndex(optimisticIndex + 1); + }); + }} className={buttonClassName} - scroll={false} > - +
) : null} @@ -68,18 +75,18 @@ export function Gallery({ images }: { images: { src: string; altText: string }[] {images.length > 1 ? (