import React, { useState, useMemo } from 'react'; interface CalendarEvent { id: string; date: Date; text: string; color: string; } interface CalendarViewProps { events: CalendarEvent[]; onDateSelect: (date: Date) => void; selectedDate: Date | null; } const EventPill: React.FC<{ text: string; color: string }> = ({ text, color }) => (
{text}
); const CalendarView: React.FC = ({ events, onDateSelect, selectedDate }) => { const [currentMonth, setCurrentMonth] = useState(new Date()); const changeMonth = (amount: number) => { setCurrentMonth((prev) => new Date(prev.getFullYear(), prev.getMonth() + amount, 1)); }; const calendarGrid = useMemo(() => { const year = currentMonth.getFullYear(); const month = currentMonth.getMonth(); const firstDayOfMonth = new Date(year, month, 1).getDay(); const daysInMonth = new Date(year, month + 1, 0).getDate(); const grid = []; let dayCounter = 1; for (let i = 0; i < 6; i++) { // 6 weeks for full display const week = []; for (let j = 0; j < 7; j++) { if ((i === 0 && j < firstDayOfMonth) || dayCounter > daysInMonth) { week.push(null); } else { const date = new Date(year, month, dayCounter); week.push(date); dayCounter++; } } grid.push(week); if (dayCounter > daysInMonth) break; } return grid; }, [currentMonth]); const isSameDay = (d1: Date, d2: Date) => d1.getFullYear() === d2.getFullYear() && d1.getMonth() === d2.getMonth() && d1.getDate() === d2.getDate(); return (

{currentMonth.toLocaleString('id-ID', { month: 'long', year: 'numeric' })}

{['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'].map((day) => (
{day}
))}
{calendarGrid.flat().map((date, index) => { if (!date) { return
; } const isToday = isSameDay(date, new Date()); const isSelected = selectedDate ? isSameDay(date, selectedDate) : false; const dayEvents = events.filter((e) => isSameDay(e.date, date)); return (
onDateSelect(date)} className={`h-24 p-1.5 border rounded-md flex flex-col cursor-pointer transition-colors ${ isSelected ? 'bg-red-100 border-red-300' : 'bg-white hover:bg-gray-100 border-gray-200' }`} > {date.getDate()}
{dayEvents.slice(0, 2).map((event) => ( ))} {dayEvents.length > 2 && (
+{dayEvents.length - 2} lagi
)}
); })}
); }; export default CalendarView;