import { getCalendarPagination } from "@/service/schedule/schedule"; import { ChevronLeft, ChevronRight } from "lucide-react"; import { useTranslations } from "next-intl"; import Image from "next/image"; import { useParams } from "next/navigation"; 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 = () => { 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); const [month, setMonth] = useState(currentMonth); const [year, setYear] = useState(currentYear); const t = useTranslations("LandingPage"); const params = useParams(); const locale = params?.locale; const monthNames = [ t("january", { defaultValue: "January" }), t("february", { defaultValue: "February" }), t("march", { defaultValue: "March" }), "April", t("may", { defaultValue: "May" }), t("june", { defaultValue: "June" }), t("july", { defaultValue: "July" }), t("august", { defaultValue: "August" }), "September", t("october", { defaultValue: "October" }), "November", t("december", { defaultValue: "December" }), ]; const fetchData = async () => { try { const res = await getCalendarPagination(100, 0); const data = res?.data?.data; const contentData = data?.content; setEvents(contentData || []); if (contentData && contentData.length > 0) { setSelectedEvent(contentData[0]); } } catch (error) { console.error("Error fetching calendar events:", error); } }; useEffect(() => { fetchData(); }, []); const firstDayOfMonth = new Date(year, month, 1); const lastDayOfMonth = new Date(year, month + 1, 0); const daysInMonth = lastDayOfMonth.getDate(); const startingDayOfWeek = firstDayOfMonth.getDay(); const adjustedStartingDay = startingDayOfWeek === 0 ? 6 : startingDayOfWeek - 1; const generateCalendarDays = () => { const days = []; for (let i = 0; i < adjustedStartingDay; i++) { days.push(null); } for (let day = 1; day <= daysInMonth; day++) { days.push(day); } while (days.length < 42) { days.push(null); } return days; }; const calendarDays = generateCalendarDays(); const getDateFromString = (dateString: string) => { try { const date = new Date(dateString); if (date.getMonth() === month && date.getFullYear() === year) { return date.getDate(); } return null; } catch { return null; } }; 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"; } }; 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"; } }; const eventDates = events .map((event) => getDateFromString(event.startDate)) .filter((date) => date !== null); const handlePreviousMonth = () => { if (month === 0) { setMonth(11); setYear((y) => y - 1); } else { setMonth((m) => m - 1); } }; const handleNextMonth = () => { if (month === 11) { setMonth(0); setYear((y) => y + 1); } else { setMonth((m) => m + 1); } }; return ( <> {locale === "in" && (

{t("calendar", { defaultValue: "Calendar" })}

{monthNames[month]} {year}
{["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"].map((d) => (
{d}
))} {calendarDays.map((day, index) => { const isToday = day === currentDate && month === currentMonth && year === currentYear; return (
{day}
); })}

{t("eventList", { defaultValue: "Event List" })}

{events?.length === 0 ? (
{t("noEvent", { defaultValue: "No Event" })}
) : ( 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}
{event.title}
{formatDateRange(event.startDate, event.endDate)}
)) )}

{t("eventDetails", { defaultValue: "Event Details" })}

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

{selectedEvent.title}

{t("date", { defaultValue: "Date" })} {formatDateRange( selectedEvent.startDate, selectedEvent.endDate )}

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

{/*
*/}
) : (
{t("selectEvent", { defaultValue: "Select Event" })}
)}
)} ); }; export default EventCalender;