import React from 'react'; import { ChevronLeft, ChevronRight, Check } from 'lucide-react'; import { useThemeContext } from '../contexts/ThemeContext'; import { Habit } from '../types'; interface CalendarProps { currentMonth: Date; habits: Habit[]; onChangeMonth: (direction: 'prev' | 'next') => void; getDaysInMonth: (year: number, month: number) => number; getCompletedHabitsForDate: (date: string) => Habit[]; onToggleHabit: (habitId: number, date: string) => void; } export const Calendar: React.FC = ({ currentMonth, habits, onChangeMonth, getDaysInMonth, getCompletedHabitsForDate, onToggleHabit }) => { const { theme } = useThemeContext(); const daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; const getFirstDayOfMonth = (year: number, month: number) => { const date = new Date(year, month, 1); return date.getDay() === 0 ? 6 : date.getDay() - 1; }; // Helper function to format date to YYYY-MM-DD const formatDate = (date: Date): string => { return date.toISOString().split('T')[0]; }; // Get today's date in YYYY-MM-DD format const today = new Date(); today.setHours(0, 0, 0, 0); const todayStr = formatDate(today); const handleToggleHabit = async (e: React.MouseEvent, habitId: number, date: string) => { e.stopPropagation(); await onToggleHabit(habitId, date); }; return (

{currentMonth.toLocaleString('default', { month: 'long', year: 'numeric' })}

{daysOfWeek.map(day => (
{day}
))} {(() => { const year = currentMonth.getFullYear(); const month = currentMonth.getMonth(); const firstDayOfMonth = getFirstDayOfMonth(year, month); const daysInMonth = getDaysInMonth(year, month); const daysInPrevMonth = getDaysInMonth(year, month - 1); const days = []; // Previous month days for (let i = 0; i < firstDayOfMonth; i++) { const day = daysInPrevMonth - firstDayOfMonth + i + 1; const date = formatDate(new Date(year, month - 1, day)); days.push({ date, dayNumber: day, isCurrentMonth: false }); } // Current month days for (let i = 1; i <= daysInMonth; i++) { const date = formatDate(new Date(year, month, i)); days.push({ date, dayNumber: i, isCurrentMonth: true }); } // Next month days const remainingDays = 42 - days.length; for (let i = 1; i <= remainingDays; i++) { const date = formatDate(new Date(year, month + 1, i)); days.push({ date, dayNumber: i, isCurrentMonth: false }); } return days.map(({ date, dayNumber, isCurrentMonth }) => { const completedHabits = getCompletedHabitsForDate(date); const incompleteHabits = habits.filter(habit => !habit.completedDates.includes(date)); const isToday = date === todayStr; return (
{dayNumber} {habits.length > 0 && (
0 ? 'bg-[#2ecc71] dark:bg-[#2ecc71] shadow-sm shadow-[#2ecc7150]' : `bg-[#e9e9e8] dark:bg-[#393939]` } `} > {completedHabits.length}/{habits.length}
{completedHabits.length > 0 && (
✓ Completed
    {completedHabits.map(habit => (
  • {habit.name}
  • ))}
)} {incompleteHabits.length > 0 && (
○ Pending
    {incompleteHabits.map(habit => (
  • {habit.name}
  • ))}
)}
)}
); }); })()}
); };