'use client' import { useState, useMemo } from 'react' import { ChevronLeft, ChevronRight } from 'lucide-react' import { Button } from '@/components/ui/button' import { cn } from '@/lib/utils' interface MiniCalendarProps { selectedDate: string onSelectDate: (date: string) => void } const WEEKDAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] function getDaysInMonth(year: number, month: number): number { return new Date(year, month + 1, 0).getDate() } function getFirstDayOfMonth(year: number, month: number): number { return new Date(year, month, 1).getDay() } function formatDate(year: number, month: number, day: number): string { return `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}` } export function MiniCalendar({ selectedDate, onSelectDate }: MiniCalendarProps) { const selected = selectedDate ? new Date(selectedDate) : new Date() const [viewYear, setViewYear] = useState(selected.getFullYear()) const [viewMonth, setViewMonth] = useState(selected.getMonth()) const today = new Date() const todayStr = formatDate( today.getFullYear(), today.getMonth(), today.getDate() ) const selectedStr = selectedDate?.split('T')[0]?.split(' ')[0] || todayStr const days = useMemo(() => { const daysInMonth = getDaysInMonth(viewYear, viewMonth) const firstDay = getFirstDayOfMonth(viewYear, viewMonth) const result: (number | null)[] = [] // Leading empty cells for (let i = 0; i < firstDay; i++) { result.push(null) } // Days of month for (let d = 1; d <= daysInMonth; d++) { result.push(d) } return result }, [viewYear, viewMonth]) function prevMonth() { if (viewMonth === 0) { setViewYear(viewYear - 1) setViewMonth(11) } else { setViewMonth(viewMonth - 1) } } function nextMonth() { if (viewMonth === 11) { setViewYear(viewYear + 1) setViewMonth(0) } else { setViewMonth(viewMonth + 1) } } function goToToday() { setViewYear(today.getFullYear()) setViewMonth(today.getMonth()) onSelectDate(todayStr) } const monthLabel = new Date(viewYear, viewMonth).toLocaleDateString('en-US', { month: 'long', year: 'numeric', }) return (
{WEEKDAYS.map((wd) => (
{wd}
))} {days.map((day, idx) => { if (day === null) { return
} const dateStr = formatDate(viewYear, viewMonth, day) const isToday = dateStr === todayStr const isSelected = dateStr === selectedStr return ( ) })}
) }