import React, { useState, useMemo } from 'react'; import type { MasterGroceryItem } from '../types'; import { EyeIcon } from './icons/EyeIcon'; import { LoadingSpinner } from './LoadingSpinner'; import { SortAscIcon } from './icons/SortAscIcon'; import { SortDescIcon } from './icons/SortDescIcon'; import { CATEGORIES } from '../types'; import { Session } from '@supabase/supabase-js'; import { TrashIcon } from './icons/TrashIcon'; import { UserIcon } from './icons/UserIcon'; import { PlusCircleIcon } from './icons/PlusCircleIcon'; interface WatchedItemsListProps { items: MasterGroceryItem[]; onAddItem: (itemName: string, category: string) => Promise; onRemoveItem: (masterItemId: number) => Promise; session: Session | null; activeListId: number | null; onAddItemToList: (masterItemId: number) => void; } export const WatchedItemsList: React.FC = ({ items, onAddItem, onRemoveItem, session, activeListId, onAddItemToList }) => { const [newItemName, setNewItemName] = useState(''); const [newCategory, setNewCategory] = useState(''); const [isAdding, setIsAdding] = useState(false); const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc'); const [categoryFilter, setCategoryFilter] = useState('all'); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!newItemName.trim() || !newCategory) return; setIsAdding(true); try { await onAddItem(newItemName, newCategory); setNewItemName(''); setNewCategory(''); } catch (error) { // Error is handled in the parent component console.error(error); } finally { setIsAdding(false); } }; const handleSortToggle = () => { setSortOrder(prev => (prev === 'asc' ? 'desc' : 'asc')); }; const availableCategories = useMemo(() => { const cats = new Set(items.map(i => i.category_name).filter((c): c is string => !!c)); return Array.from(cats).sort(); }, [items]); const sortedAndFilteredItems = useMemo(() => { const filteredItems = categoryFilter === 'all' ? items : items.filter(item => item.category_name === categoryFilter); return [...filteredItems].sort((a, b) => { if (sortOrder === 'asc') { return a.name.localeCompare(b.name); } else { return b.name.localeCompare(a.name); } }); }, [items, sortOrder, categoryFilter]); if (!session) { return (

Personalize Your Deals

Please log in to create and manage your personal watchlist.

); } return (

Your Watched Items

{items.length > 0 && ( )} {items.length > 1 && ( )}
setNewItemName(e.target.value)} placeholder="Add item (e.g., Avocados)" className="flex-grow block w-full px-3 py-2 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-brand-primary focus:border-brand-primary sm:text-sm" disabled={isAdding} />
{sortedAndFilteredItems.length > 0 ? (
    {sortedAndFilteredItems.map(item => (
  • {item.name} {item.category_name}
  • ))}
) : (

{categoryFilter === 'all' ? 'Your watchlist is empty. Add items above to start tracking prices.' : `No watched items in the "${categoryFilter}" category.`}

)}
); };