'use client'; import { useState } from 'react'; import { motion } from 'framer-motion'; import { Check, Trash2, Calendar, Clock, Edit } from 'lucide-react'; import { Task } from '@/lib/types'; import { toggleTaskCompletion, deleteTask } from '@/lib/api'; import { DeleteConfirmModal } from './DeleteConfirmModal'; import { Card } from '@/components/ui/card'; import { useRouter } from 'next/navigation'; import { showToast } from '@/lib/toast'; interface TaskItemProps { task: Task; onTaskUpdated: () => void; onTaskDeleted: () => void; } // Custom circular checkbox component with animation const CircularCheckbox = ({ checked, onChange, disabled }: { checked: boolean; onChange: () => void; disabled?: boolean }) => { return ( ); }; export function TaskItem({ task, onTaskUpdated, onTaskDeleted }: TaskItemProps) { const router = useRouter(); const [isDeleting, setIsDeleting] = useState(false); const [showDeleteModal, setShowDeleteModal] = useState(false); const [localTask, setLocalTask] = useState(task); // Get user ID from localStorage or context (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; }; const handleToggleCompletion = async () => { const userId = getUserId(); if (!userId) { console.error('User ID not found'); return; } try { const updatedTask = await toggleTaskCompletion(userId, localTask.id); setLocalTask(updatedTask); onTaskUpdated(); showToast.success(updatedTask.completed ? 'Task completed!' : 'Task reopened'); } catch (error) { console.error('Error toggling task completion:', error); showToast.error('Failed to update task status'); } }; const handleDeleteConfirm = async () => { const userId = getUserId(); if (!userId) { console.error('User ID not found'); return; } try { setIsDeleting(true); await deleteTask(userId, localTask.id); onTaskDeleted(); showToast.success('Task deleted successfully'); setShowDeleteModal(false); } catch (error) { console.error('Error deleting task:', error); showToast.error('Failed to delete task'); setIsDeleting(false); } }; const handleEdit = () => { router.push(`/tasks/${task.id}`); }; return ( <> {localTask.title} {localTask.is_ai_generated && ( AI )} {localTask.description && ( {localTask.description} )} Created: {new Date(localTask.created_at).toLocaleDateString()} {localTask.due_date && ( Due: {new Date(localTask.due_date).toLocaleDateString()} )} {localTask.updated_at !== localTask.created_at && ( Edited )} setShowDeleteModal(true)} disabled={isDeleting} className="p-2 text-gray-400 hover:text-red-400 hover:bg-red-900/30 rounded-lg transition-colors" > setShowDeleteModal(false)} onConfirm={handleDeleteConfirm} taskTitle={localTask.title} loading={isDeleting} /> > ); }
{localTask.title} {localTask.is_ai_generated && ( AI )}
{localTask.description}