import { getCalendarPagination } from "@/service/schedule/schedule"; import React, { useEffect, useState } from "react"; interface CalendarItem { id: number; title: string; description: string; assignedTo: string; assignedToLevel: string; startDate: string; endDate: string; isActive: boolean; createdById: number; createdByName: string; thumbnailUrl: string; createdAt: string; updatedAt: string; } const EventCalender = () => { // Get current date const today = new Date(); const currentMonth = today.getMonth(); const currentYear = today.getFullYear(); const currentDate = today.getDate(); const [events, setEvents] = useState([]); const [selectedEvent, setSelectedEvent] = useState(null); // Month names in Indonesian const monthNames = [ "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember" ]; const fetchData = async () => { try { const res = await getCalendarPagination(100, 0); const data = res?.data?.data; const contentData = data?.content; setEvents(contentData || []); // Set first event as selected by default if (contentData && contentData.length > 0) { setSelectedEvent(contentData[0]); } } catch (error) { console.error("Error fetching calendar events:", error); } }; useEffect(() => { fetchData(); }, []); // Get first day of the month and number of days const firstDayOfMonth = new Date(currentYear, currentMonth, 1); const lastDayOfMonth = new Date(currentYear, currentMonth + 1, 0); const daysInMonth = lastDayOfMonth.getDate(); const startingDayOfWeek = firstDayOfMonth.getDay(); // Convert Sunday (0) to 7 for Monday-first week const adjustedStartingDay = startingDayOfWeek === 0 ? 6 : startingDayOfWeek - 1; // Generate calendar days const generateCalendarDays = () => { const days = []; // Empty cells for days before the first day of month for (let i = 0; i < adjustedStartingDay; i++) { days.push(null); } // Days of the month for (let day = 1; day <= daysInMonth; day++) { days.push(day); } // Fill remaining cells to complete the grid (6 rows × 7 days = 42 cells) while (days.length < 42) { days.push(null); } return days; }; const calendarDays = generateCalendarDays(); // Helper function to extract day from date string const getDateFromString = (dateString: string) => { try { const date = new Date(dateString); if (date.getMonth() === currentMonth && date.getFullYear() === currentYear) { return date.getDate(); } return null; } catch { return null; } }; // Helper function to format date range const formatDateRange = (startDate: string, endDate: string) => { try { const start = new Date(startDate); const end = new Date(endDate); const startDay = start.getDate(); const endDay = end.getDate(); const startMonth = monthNames[start.getMonth()]; const endMonth = monthNames[end.getMonth()]; if (startDay === endDay && startMonth === endMonth) { return `${startDay} ${startMonth}`; } else { return `${startDay} ${startMonth} - ${endDay} ${endMonth}`; } } catch { return "Tanggal tidak valid"; } }; // Helper function to format time range const formatTimeRange = (startDate: string, endDate: string) => { try { const start = new Date(startDate); const end = new Date(endDate); const startTime = start.toLocaleTimeString('id-ID', { hour: '2-digit', minute: '2-digit', timeZone: 'Asia/Jakarta' }); const endTime = end.toLocaleTimeString('id-ID', { hour: '2-digit', minute: '2-digit', timeZone: 'Asia/Jakarta' }); return `${startTime} - ${endTime} WIB`; } catch { return "Waktu tidak tersedia"; } }; // Get event dates for highlighting calendar const eventDates = events .map(event => getDateFromString(event.startDate)) .filter(date => date !== null); return (

KALENDER ACARA

{/* Left Side - Calendar and Event List */}
{/* Mini Calendar */}
{monthNames[currentMonth]} {currentYear}
{["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"].map((d) => (
{d}
))} {calendarDays?.map((day, index) => (
{day}
))}
{/* Event List */}

Daftar Acara

{events?.length === 0 ? (
Tidak ada acara yang tersedia
) : ( events.map((event) => (
setSelectedEvent(event)} className={`flex items-center rounded-xl shadow-sm p-3 cursor-pointer transition-all duration-200 hover:shadow-md ${ selectedEvent?.id === event.id ? "bg-red-100 dark:bg-red-900/20 border-2 border-red-500" : "bg-gray-200 dark:bg-zinc-800 hover:bg-gray-300 dark:hover:bg-zinc-700" }`} > {event.title} { const target = e.target as HTMLImageElement; target.src = "/images/default-event.png"; }} />
{event.title}
{formatDateRange(event.startDate, event.endDate)}
)) )}
{/* Right Side - Event Detail */}

Detail Acara

{selectedEvent ? (
{selectedEvent.title} { const target = e.target as HTMLImageElement; target.src = "/images/default-event.png"; }} />

{selectedEvent.title}

Tanggal: {formatDateRange(selectedEvent.startDate, selectedEvent.endDate)}

{selectedEvent.description || "Tidak ada deskripsi tersedia."}

) : (
Pilih acara untuk melihat detail
)}
); }; export default EventCalender;