'use client';
import { container } from '@/lib/utils';
import { useCart } from 'components/cart/cart-context';
import { useTransition } from 'react';
import { removeItem, updateItemQuantity } from './actions';
import { CartDiscountForm } from './CartDiscountForm';
import { CartSummary } from './CartSummary';
import { EmptyCartMessage } from './EmptyCartMessage';
import { useCartProcessing } from './hooks/useCartProcessing';
import { BoxesSection } from './sections/BoxesSection';
import { CartHeader } from './sections/CartHeader';
import { CartLoading } from './sections/CartLoading';
import { OrderNotes } from './sections/OrderNotes';
import { ProductsSection } from './sections/ProductsSection';
export default function CartPage() {
const { cart, updateCartItem } = useCart();
const [isPending, startTransition] = useTransition();
const { boxes, standaloneProducts, isGroupingComplete, didInitialProcess } = useCartProcessing(cart);
if (!cart?.lines.length) {
return ;
}
// Show loading state while processing cart items
if (!didInitialProcess || !isGroupingComplete) {
return ;
}
const handleUpdateCartItem = (merchandiseId: string, updateType: 'plus' | 'minus' | 'delete', itemId?: string) => {
// First update the client-side cart state for immediate feedback
updateCartItem(merchandiseId, updateType, itemId);
// Update lastBoxState in localStorage if this is a box item
try {
const boxStateString = localStorage.getItem('lastBoxState');
if (boxStateString) {
const boxState = JSON.parse(boxStateString);
// Check if this item belongs to a box
const cartItem = cart.lines.find(item => {
if (itemId && item.id) {
return item.id === itemId;
}
return item.merchandise.id === merchandiseId;
});
if (cartItem) {
// Check if it's a box item by looking at attributes
const attrs = cartItem.attributes || [];
const boxType = attrs.find(attr => attr.key === '_box_type')?.value;
const boxGroupId = attrs.find(attr => attr.key === '_box_group_id')?.value;
if (boxType && boxGroupId) {
// Find the corresponding item in the stored state
if (boxType === 'item' && boxState.productItems) {
if (updateType === 'delete') {
// Remove the item from productItems
boxState.productItems = boxState.productItems.filter((item: { id: string, variantId: string }) =>
item.id !== cartItem.merchandise.product.id ||
item.variantId !== cartItem.merchandise.id
);
} else {
// Update quantity
const productItem = boxState.productItems.find((item: { id: string, variantId: string }) =>
item.id === cartItem.merchandise.product.id &&
item.variantId === cartItem.merchandise.id
);
if (productItem) {
const newQuantity = updateType === 'plus'
? cartItem.quantity + 1
: Math.max(1, cartItem.quantity - 1);
productItem.quantity = newQuantity;
}
}
// Save updated state back to localStorage
localStorage.setItem('lastBoxState', JSON.stringify(boxState));
}
else if (boxType === 'container' && boxState.boxItems) {
if (updateType === 'delete') {
// Remove the box
boxState.boxItems = boxState.boxItems.filter((item: { id: string }) =>
item.id !== cartItem.merchandise.product.id
);
} else {
// Update quantity
const boxItem = boxState.boxItems.find((item: { id: string }) =>
item.id === cartItem.merchandise.product.id
);
if (boxItem) {
const newQuantity = updateType === 'plus'
? cartItem.quantity + 1
: Math.max(1, cartItem.quantity - 1);
boxItem.quantity = newQuantity;
}
}
// Save updated state back to localStorage
localStorage.setItem('lastBoxState', JSON.stringify(boxState));
}
}
}
}
} catch (error) {
console.error('Error updating box state in localStorage', error);
}
// Then update the server-side cart
startTransition(() => {
if (updateType === 'delete') {
// Call server action to remove item
removeItem({}, merchandiseId, itemId);
} else {
// Find the specific item to update, using both merchandise ID and item ID if provided
let item = cart.lines.find((item: { id?: string, merchandise: { id: string } }) => {
if (itemId && item.id) {
// If we have item ID, use it for more specific matching
return item.id === itemId;
}
// Fall back to merchandise ID only
return item.merchandise.id === merchandiseId;
});
if (item) {
// Calculate new quantity based on the updateType
const newQuantity = updateType === 'plus'
? item.quantity + 1
: Math.max(1, item.quantity - 1);
// Call server action to update quantity
updateItemQuantity({}, { merchandiseId, quantity: newQuantity, itemId });
}
}
});
};
return (
{/* Left Side: Cart Items */}
{/* Boxes Section */}
{/* Standalone Products Section */}
{/* Order Notes */}
{/* Discount Form */}
{/* Right Side: Order Summary */}
);
}