import React, { useState } from 'react'; import { Task } from '../types/task'; import TaskCard from './TaskCard'; interface CalendarGridProps { tasks: Task[]; onTaskToggle: (id: string) => void; onTaskEdit: (task: Task) => void; onTaskDelete: (id: string) => void; onAddTask: (date: Date) => void; currentDate: Date; onTaskMove?: (taskId: string, newDate: Date) => void; } const CalendarGrid: React.FC = ({ tasks, onTaskToggle, onTaskEdit, onTaskDelete, onAddTask, currentDate, onTaskMove }) => { const [selectedDate, setSelectedDate] = useState(null); // Generate days for the current week const generateWeekDays = (startDate: Date) => { const days = []; const start = new Date(startDate); start.setDate(start.getDate() - startDate.getDay()); // Start from Sunday for (let i = 0; i < 7; i++) { const day = new Date(start); day.setDate(start.getDate() + i); days.push(day); } return days; }; const weekDays = generateWeekDays(currentDate); // Group tasks by date const groupTasksByDate = (tasks: Task[]) => { const grouped: Record = {}; tasks.forEach(task => { const dateKey = task.date.toISOString().split('T')[0]; if (!grouped[dateKey]) { grouped[dateKey] = []; } grouped[dateKey].push(task); }); return grouped; }; const groupedTasks = groupTasksByDate(tasks); const handleDateClick = (date: Date) => { setSelectedDate(date); onAddTask(date); }; const formatDate = (date: Date) => { return date.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' }); }; const isToday = (date: Date) => { const today = new Date(); return date.toDateString() === today.toDateString(); }; // Handle drag start for task cards const handleDragStart = (e: React.DragEvent, taskId: string, sourceDay: string) => { e.dataTransfer.setData('taskId', taskId); e.dataTransfer.setData('sourceDay', sourceDay); }; // Handle drop on a day const handleDrop = (e: React.DragEvent, targetDay: string) => { e.preventDefault(); const taskId = e.dataTransfer.getData('taskId'); const sourceDay = e.dataTransfer.getData('sourceDay'); if (taskId && sourceDay !== targetDay && onTaskMove) { // Convert targetDay string back to date const targetDate = new Date(targetDay); onTaskMove(taskId, targetDate); } }; // Allow drops on day cells const handleDragOver = (e: React.DragEvent) => { e.preventDefault(); }; return (
{/* Week Navigation */}

{weekDays[0].toLocaleDateString('en-US', { month: 'long', year: 'numeric' })}

{/* Day Headers */}
{weekDays.map((day, index) => (
{day.toLocaleDateString('en-US', { weekday: 'short' })}
{day.getDate()}
))}
{/* Calendar Grid */}
{weekDays.map((day, dayIndex) => { const dayKey = day.toISOString().split('T')[0]; const dayTasks = groupedTasks[dayKey] || []; return (
handleDateClick(day)} onDrop={(e) => handleDrop(e, dayKey)} onDragOver={handleDragOver} >
{day.getDate()}
{dayTasks.map(task => ( handleDragStart(e, task.id, dayKey)} /> ))}
); })}
); }; export default CalendarGrid;