'use client'; import { useState } from 'react'; import { type Wishlist, type Item, itemsApi } from '@/lib/api'; import ImageUpload from '@/components/image-upload'; import RichTextEditor from '@/components/RichTextEditor'; import ItemCard from './ItemCard'; import ItemForm from './ItemForm'; interface WishlistCardProps { wishlist: Wishlist; itemCount: number; onUpdate: (id: string, data: Partial) => Promise; onDelete: (id: string) => Promise; onMoveUp: (id: string) => Promise; onMoveDown: (id: string) => Promise; isFirst: boolean; isLast: boolean; onItemsChange: () => void; } export default function WishlistCard({ wishlist, itemCount, onUpdate, onDelete, onMoveUp, onMoveDown, isFirst, isLast, onItemsChange, }: WishlistCardProps) { const [editingId, setEditingId] = useState(null); const [editForm, setEditForm] = useState({ name: '', slug: '', description: '', preferences: '', imageUrl: '', isPublic: true, }); const [editError, setEditError] = useState(''); const [isWishlistImageUploading, setIsWishlistImageUploading] = useState(false); const [expandedWishlistId, setExpandedWishlistId] = useState(null); const [wishlistItems, setWishlistItems] = useState([]); const [editingItemId, setEditingItemId] = useState(null); const [showAddItemForm, setShowAddItemForm] = useState(false); const [newItemError, setNewItemError] = useState(''); const startEditing = () => { setEditingId(wishlist.id); setEditForm({ name: wishlist.name, slug: wishlist.slug, description: wishlist.description || '', preferences: wishlist.preferences || '', imageUrl: wishlist.imageUrl || '', isPublic: wishlist.isPublic, }); setEditError(''); }; const cancelEditing = () => { setEditingId(null); setEditError(''); }; const handleEditNameChange = (name: string) => { setEditForm((prev) => ({ ...prev, name, slug: name .toLowerCase() .replace(/[^a-z0-9]+/g, '-') .replace(/^-|-$/g, ''), })); }; const handleUpdateWishlist = async (e: React.FormEvent) => { e.preventDefault(); setEditError(''); try { await onUpdate(wishlist.id, editForm); setEditingId(null); } catch (error: any) { setEditError(error.message || 'Failed to update wishlist'); } }; const toggleWishlistExpand = async () => { if (expandedWishlistId === wishlist.id) { setExpandedWishlistId(null); } else { setExpandedWishlistId(wishlist.id); const items = await itemsApi.getAll(wishlist.id); setWishlistItems(items); } }; const handleCreateItem = async (itemData: Partial) => { setNewItemError(''); try { await itemsApi.create(wishlist.id, itemData); setShowAddItemForm(false); const items = await itemsApi.getAll(wishlist.id); setWishlistItems(items); onItemsChange(); } catch (error: any) { setNewItemError(error.message || 'Failed to create item'); throw error; } }; const handleUpdateItem = async (itemData: Partial) => { if (!editingItemId) return; try { await itemsApi.update(editingItemId, itemData); setEditingItemId(null); const items = await itemsApi.getAll(wishlist.id); setWishlistItems(items); onItemsChange(); } catch (error: any) { alert(error.message || 'Failed to update item'); throw error; } }; const handleDeleteItem = async (itemId: string) => { if (!confirm('Are you sure you want to delete this item?')) return; try { await itemsApi.delete(itemId); const items = await itemsApi.getAll(wishlist.id); setWishlistItems(items); onItemsChange(); } catch (error) { alert('Failed to delete item'); } }; const handleMoveItemUp = async (itemId: string) => { const currentIndex = wishlistItems.findIndex((item) => item.id === itemId); if (currentIndex <= 0) return; try { await itemsApi.reorder(itemId, currentIndex - 1); const updatedItems = await itemsApi.getAll(wishlist.id); setWishlistItems(updatedItems); } catch (error: any) { alert(error?.message || 'Failed to reorder item'); } }; const handleMoveItemDown = async (itemId: string) => { const currentIndex = wishlistItems.findIndex((item) => item.id === itemId); if (currentIndex === -1 || currentIndex === wishlistItems.length - 1) return; try { await itemsApi.reorder(itemId, currentIndex + 1); const updatedItems = await itemsApi.getAll(wishlist.id); setWishlistItems(updatedItems); } catch (error: any) { alert(error?.message || 'Failed to reorder item'); } }; const editingItem = wishlistItems.find((item) => item.id === editingItemId); return (
{editError && (
{editError}
)}
{/* Arrow buttons on the left */}
{editingId === wishlist.id ? ( // Inline Edit Mode
setEditForm((prev) => ({ ...prev, imageUrl: url })) } onUploadStateChange={setIsWishlistImageUploading} type="wishlist" label="Wishlist Image" />
handleEditNameChange(e.target.value)} className="text-lg font-bold px-2 py-1 border-2 border-indigo-500 rounded focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:bg-gray-700 dark:text-white flex-1" placeholder="Wishlist name" />
setEditForm((prev) => ({ ...prev, slug: e.target.value })) } className="text-base px-2 py-1 border border-gray-300 dark:border-gray-600 rounded focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:bg-gray-700 dark:text-white w-full" placeholder="url-slug" />