'use client'; import { useState, useEffect } from 'react'; import { TaskItem } from './TaskItem'; import { EmptyState } from './EmptyState'; import { Task } from '@/lib/types'; import { getTasks } from '@/lib/api'; import { Card, CardContent } from '@/components/ui/card'; import { motion, AnimatePresence } from 'framer-motion'; import { Search, Filter } from 'lucide-react'; export function TaskList() { const [tasks, setTasks] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [searchTerm, setSearchTerm] = useState(''); const [filter, setFilter] = useState<'all' | 'active' | 'completed'>('all'); // Get user ID from localStorage (in a real app, this would come from auth context) const getUserId = () => { if (typeof window !== 'undefined') { const userStr = localStorage.getItem('user'); if (userStr) { try { const user = JSON.parse(userStr); return user.id; } catch (e) { console.error('Error parsing user from localStorage:', e); return null; } } } return null; }; useEffect(() => { fetchTasks(); }, []); const fetchTasks = async () => { const userId = getUserId(); console.log('Fetching tasks for user ID:', userId); if (!userId) { setError('User not authenticated'); setLoading(false); return; } try { setLoading(true); setError(null); const tasksData = await getTasks(userId); console.log('Tasks fetched successfully:', tasksData); setTasks(tasksData); } catch (err) { console.error('Error fetching tasks:', err); setError('Failed to load tasks. Please try again later.'); } finally { setLoading(false); } }; // Filter tasks based on search term and filter status const filteredTasks = tasks.filter(task => { // Apply search filter const matchesSearch = task.title.toLowerCase().includes(searchTerm.toLowerCase()) || (task.description && task.description.toLowerCase().includes(searchTerm.toLowerCase())); // Apply status filter let matchesFilter = true; if (filter === 'active') { matchesFilter = !task.completed; } else if (filter === 'completed') { matchesFilter = task.completed; } return matchesSearch && matchesFilter; }); // Separate completed and incomplete tasks const completedTasks = filteredTasks.filter(task => task.completed); const incompleteTasks = filteredTasks.filter(task => !task.completed); if (loading) { return (
{[...Array(3)].map((_, index) => (
))}
); } if (error) { return (

{error}

); } if (tasks.length === 0) { return ; } return (
{/* Search and Filter Bar */}
setSearchTerm(e.target.value)} />
{/* Task Summary */}
{filteredTasks.length} {filteredTasks.length === 1 ? 'task' : 'tasks'}
{incompleteTasks.length} pending {completedTasks.length} completed
{/* Incomplete Tasks */} {incompleteTasks.length > 0 && filter !== 'completed' && (

Pending Tasks

{incompleteTasks.map((task, index) => ( ))}
)} {/* Completed Tasks */} {completedTasks.length > 0 && filter !== 'active' && (

Completed Tasks

{completedTasks.map((task, index) => ( ))}
)} {/* No tasks message when filters return empty results */} {filteredTasks.length === 0 && (

No tasks found

{searchTerm ? 'Try adjusting your search terms.' : 'Try selecting a different filter.'}

)}
); }