'use client' import { useState, useCallback, useMemo } from 'react' import ItemCard from './ItemCard' import SearchBar from './SearchBar' import FilterPanel, { FilterState } from './FilterPanel' import SearchResults from './SearchResults' import { searchItems, getItemsByFilter } from '@/lib/actions' interface Item { id: string title: string description: string | null completed: boolean priority: string dueDate: Date | null tags: any notes: string | null createdAt: Date updatedAt: Date listId: string } interface ItemWithList extends Item { list: { id: string title: string color: string } } interface ListDetailViewProps { listId: string initialItems: Item[] } export default function ListDetailView({ listId, initialItems }: ListDetailViewProps) { const [searchQuery, setSearchQuery] = useState('') const [searchResults, setSearchResults] = useState([]) const [isSearching, setIsSearching] = useState(false) const [filters, setFilters] = useState({ priority: null, completed: null, tags: [], dueDateRange: { start: null, end: null }, sortBy: 'createdAt', sortOrder: 'desc' }) const [filteredItems, setFilteredItems] = useState(initialItems) // Extract all unique tags from items const availableTags = useMemo(() => { const tagSet = new Set() initialItems.forEach(item => { const tags = Array.isArray(item.tags) ? item.tags : [] tags.forEach(tag => { if (typeof tag === 'string') { tagSet.add(tag) } }) }) return Array.from(tagSet).sort() }, [initialItems]) // Handle search const handleSearch = useCallback(async (query: string) => { setSearchQuery(query) if (!query.trim()) { setSearchResults([]) setIsSearching(false) return } setIsSearching(true) try { const results = await searchItems(query, listId) setSearchResults(results as ItemWithList[]) } catch (error) { console.error('Search error:', error) setSearchResults([]) } }, [listId]) // Handle filter changes const handleFiltersChange = useCallback(async (newFilters: FilterState) => { setFilters(newFilters) try { const results = await getItemsByFilter(listId, { priority: newFilters.priority, completed: newFilters.completed, tags: newFilters.tags, dueDateRange: newFilters.dueDateRange, sortBy: newFilters.sortBy, sortOrder: newFilters.sortOrder }) setFilteredItems(results as Item[]) } catch (error) { console.error('Filter error:', error) setFilteredItems(initialItems) } }, [listId, initialItems]) // Determine which items to display const displayItems = searchQuery.trim() ? searchResults : filteredItems const completedItems = displayItems.filter(item => item.completed) const incompleteItems = displayItems.filter(item => !item.completed) return (
{/* Search Bar */} {/* Filter Panel */} {/* Results */} {searchQuery.trim() ? ( ) : (
{/* Incomplete Items */} {incompleteItems.length > 0 && (

To Do ({incompleteItems.length})

{incompleteItems.map((item) => ( ))}
)} {/* Completed Items */} {completedItems.length > 0 && (

Completed ({completedItems.length})

{completedItems.map((item) => ( ))}
)} {/* Empty State */} {displayItems.length === 0 && (

No tasks found

{filters.priority || filters.completed !== null || filters.tags.length > 0 ? 'Try adjusting your filters' : 'Add your first task to get started'}

)}
)}
) }