11"use client" ;
22
3- import React from "react" ;
3+ import React , { useState } from "react" ;
44import Image from "next/image" ;
55import { toast } from "sonner" ;
66import { Button } from "../ui/button" ;
@@ -21,12 +21,18 @@ const CartItem = ({ cartItem, isCheckout, index }: Props) => {
2121
2222 const queryClient = useQueryClient ( ) ;
2323
24+ const [ quantity , setQuantity ] = useState ( cartItem . quantity || 0 ) ;
25+
26+ const [ isChangeLoading , setIsChangeLoading ] = useState ( false ) ;
27+
2428 const { mutate : removeItem , isPending } = useMutation ( {
2529 mutationKey : [ "remove-cart-item" ] ,
2630 mutationFn : deleteCartItem ,
2731 onSuccess : ( ) => {
2832 toast . success ( "Item removed from cart." ) ;
2933
34+ setQuantity ( 0 ) ;
35+
3036 queryClient . invalidateQueries ( {
3137 queryKey : [ "get-cart-item" ] ,
3238 } ) ;
@@ -41,6 +47,8 @@ const CartItem = ({ cartItem, isCheckout, index }: Props) => {
4147 const { mutate : onQuantityChange , isPending : isLoading } = useMutation ( {
4248 mutationKey : [ "update-quantity" , cartItem . id ] ,
4349 mutationFn : async ( { task } : { task : "add" | "minus" } ) => {
50+ setIsChangeLoading ( true ) ;
51+
4452 if (
4553 cartItem . availableItem ?. numInStocks &&
4654 task === "add" &&
@@ -53,6 +61,10 @@ const CartItem = ({ cartItem, isCheckout, index }: Props) => {
5361 return ;
5462 }
5563
64+ task === "add"
65+ ? setQuantity ( ( prev ) => prev + 1 )
66+ : setQuantity ( ( prev ) => prev - 1 ) ;
67+
5668 await updateCartItem ( { cartItemId : cartItem . id , task } ) ;
5769 } ,
5870 onSuccess : ( ) => {
@@ -61,9 +73,13 @@ const CartItem = ({ cartItem, isCheckout, index }: Props) => {
6173 } ) ;
6274
6375 isCheckout && router . refresh ( ) ;
76+
77+ setIsChangeLoading ( false ) ;
6478 } ,
6579 onError : ( err ) => {
6680 toast . error ( err . message || "Something went wrong" ) ;
81+
82+ setIsChangeLoading ( false ) ;
6783 } ,
6884 } ) ;
6985
@@ -111,19 +127,19 @@ const CartItem = ({ cartItem, isCheckout, index }: Props) => {
111127 < Button
112128 className = "text-lg font-semibold"
113129 variant = "outline"
114- disabled = { isPending || isLoading }
130+ disabled = { isPending || isLoading || isChangeLoading }
115131 onClick = { ( ) => onQuantityChange ( { task : "minus" } ) }
116132 data-cy = { `cart-item-${ index } -minus` }
117133 >
118134 -
119135 </ Button >
120136
121- < div className = "px-3 font-semibold" > { cartItem . quantity } </ div >
137+ < div className = "px-3 font-semibold" > { quantity } </ div >
122138
123139 < Button
124140 className = "text-lg font-semibold"
125141 variant = "outline"
126- disabled = { isPending || isLoading }
142+ disabled = { isPending || isLoading || isChangeLoading }
127143 onClick = { ( ) => onQuantityChange ( { task : "add" } ) }
128144 data-cy = { `cart-item-${ index } -add` }
129145 >
0 commit comments