@@ -10,6 +10,7 @@ import {
1010 useActionState ,
1111 useEffect ,
1212 useOptimistic ,
13+ useRef ,
1314} from 'react' ;
1415import { useFormStatus } from 'react-dom' ;
1516
@@ -175,6 +176,8 @@ export function CartClient<LineItem extends CartLineItem>({
175176 shipping,
176177} : CartProps < LineItem > ) {
177178 const events = useEvents ( ) ;
179+ const requestedLineItemsToDelete = useRef < string [ ] > ( [ ] ) ;
180+ const batchDeleteTimeout = useRef < NodeJS . Timeout | null > ( null ) ;
178181 const [ state , formAction ] = useActionState ( lineItemAction , {
179182 lineItems : cart . lineItems ,
180183 lastResult : null ,
@@ -314,27 +317,47 @@ export function CartClient<LineItem extends CartLineItem>({
314317 lineItem = { lineItem }
315318 onSubmit = { ( formData ) => {
316319 startTransition ( ( ) => {
317- formAction ( formData ) ;
318320 setOptimisticLineItems ( formData ) ;
319321
320322 const intent = formData . get ( 'intent' ) ;
321323
322- if ( intent === 'increment' ) {
323- formData . set ( 'quantity' , '1' ) ;
324-
325- events . onAddToCart ?.( formData ) ;
324+ if ( intent === 'delete' ) {
325+ if ( batchDeleteTimeout . current ) {
326+ clearTimeout ( batchDeleteTimeout . current ) ;
327+ }
328+
329+ batchDeleteTimeout . current = setTimeout ( ( ) => {
330+ startTransition ( ( ) => {
331+ formData . set ( 'id' , requestedLineItemsToDelete . current . join ( ',' ) ) ;
332+ formAction ( formData ) ;
333+ events . onRemoveFromCart ?.( formData ) ;
334+ } ) ;
335+
336+ requestedLineItemsToDelete . current = [ ] ;
337+ } , 1000 ) ;
338+
339+ const id = formData . get ( 'id' ) ;
340+
341+ if ( id ) {
342+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
343+ requestedLineItemsToDelete . current . push ( id as string ) ;
344+ }
326345 }
327346
328- if ( intent === 'decrement ') {
329- formData . set ( 'quantity' , '1' ) ;
347+ if ( intent !== 'delete ') {
348+ formAction ( formData ) ;
330349
331- events . onRemoveFromCart ?. ( formData ) ;
332- }
350+ if ( intent === 'increment' ) {
351+ formData . set ( 'quantity' , '1' ) ;
333352
334- if ( intent === 'delete' ) {
335- formData . set ( 'quantity' , lineItem . quantity . toString ( ) ) ;
353+ events . onAddToCart ?.( formData ) ;
354+ }
355+
356+ if ( intent === 'decrement' ) {
357+ formData . set ( 'quantity' , '1' ) ;
336358
337- events . onRemoveFromCart ?.( formData ) ;
359+ events . onRemoveFromCart ?.( formData ) ;
360+ }
338361 }
339362 } ) ;
340363 } }
0 commit comments