'use client' import { useState, useMemo, useCallback } from 'react' import { Calendar } from '@/components/ui/calendar' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Check, Circle, CircleCheck } from 'lucide-react' import { d2s, getNow, t2d, getCompletedHabitsForDate, isHabitDue, getISODate } from '@/lib/utils' import { useAtom } from 'jotai' import { useHabits } from '@/hooks/useHabits' import { habitsAtom, settingsAtom, completedHabitsMapAtom } from '@/lib/atoms' import { DateTime } from 'luxon' import Linkify from './linkify' import { Habit } from '@/lib/types' export default function HabitCalendar() { const { completePastHabit } = useHabits() const handleCompletePastHabit = useCallback(async (habit: Habit, date: DateTime) => { try { await completePastHabit(habit, date) } catch (error) { console.error('Error completing past habit:', error) } }, [completePastHabit]) const [settings] = useAtom(settingsAtom) const [selectedDate, setSelectedDate] = useState(getNow({ timezone: settings.system.timezone })) const [habitsData] = useAtom(habitsAtom) const habits = habitsData.habits const [completedHabitsMap] = useAtom(completedHabitsMapAtom) // Get completed dates for calendar modifiers const completedDates = useMemo(() => { return new Set(Array.from(completedHabitsMap.keys()).map(date => getISODate({ dateTime: DateTime.fromISO(date), timezone: settings.system.timezone }) )) }, [completedHabitsMap, settings.system.timezone]) return (

Habit Calendar

Calendar e && setSelectedDate(DateTime.fromJSDate(e))} weekStartsOn={settings.system.weekStartDay} className="rounded-md border" modifiers={{ completed: (date) => completedDates.has( getISODate({ dateTime: DateTime.fromJSDate(date), timezone: settings.system.timezone })! ) }} modifiersClassNames={{ completed: 'bg-green-100 text-green-800 font-bold', }} /> {selectedDate ? ( <>Habits for {d2s({ dateTime: selectedDate, timezone: settings.system.timezone, format: "yyyy-MM-dd" })} ) : ( 'Select a date' )} {selectedDate && (
    {habits .filter(habit => isHabitDue({ habit, timezone: settings.system.timezone, date: selectedDate })) .map((habit) => { const habitsForDate = completedHabitsMap.get(getISODate({ dateTime: selectedDate, timezone: settings.system.timezone })) || [] const completionsToday = habitsForDate.filter((h: Habit) => h.id === habit.id).length const isCompleted = completionsToday >= (habit.targetCompletions || 1) return (
  • {habit.name}
    {habit.targetCompletions && ( {completionsToday}/{habit.targetCompletions} )}
  • ) })}
)}
) }