'use client'; import { useState, useRef, useEffect } from 'react'; import { Plus, Minus } from 'lucide-react'; interface QuantityDisplayProps { itemId: string; currentQuantity: number; onQuantityChange: (newQty: number) => Promise; } export default function QuantityDisplay({ itemId, currentQuantity, onQuantityChange, }: QuantityDisplayProps) { const [isEditing, setIsEditing] = useState(false); const [localQuantity, setLocalQuantity] = useState(currentQuantity); const [isLoading, setIsLoading] = useState(false); const inputRef = useRef(null); useEffect(() => { setLocalQuantity(currentQuantity); }, [currentQuantity]); useEffect(() => { if (isEditing && inputRef.current) { inputRef.current.focus(); inputRef.current.select(); } }, [isEditing]); const handleTapToEdit = () => { setIsEditing(true); }; const handleIncrement = () => { setLocalQuantity(prev => Math.max(0, prev + 1)); }; const handleDecrement = () => { setLocalQuantity(prev => Math.max(0, prev - 1)); }; const handleInputChange = (e: React.ChangeEvent) => { const value = e.target.value; if (value === '' || /^\d+$/.test(value)) { setLocalQuantity(value === '' ? 0 : parseInt(value, 10)); } }; const handleCommit = async () => { if (localQuantity === currentQuantity) { setIsEditing(false); return; } try { setIsLoading(true); await onQuantityChange(localQuantity); setIsEditing(false); } catch (error) { // Revert on error setLocalQuantity(currentQuantity); setIsEditing(false); } finally { setIsLoading(false); } }; const handleCancel = () => { setLocalQuantity(currentQuantity); setIsEditing(false); }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { handleCommit(); } else if (e.key === 'Escape') { handleCancel(); } }; if (isEditing) { return (
); } return ( ); }