import { useState, useRef, useEffect } from "react"; import FullCalendar from "@fullcalendar/react"; import dayGridPlugin from "@fullcalendar/daygrid"; import timeGridPlugin from "@fullcalendar/timegrid"; import interactionPlugin from "@fullcalendar/interaction"; import { EventInput, DateSelectArg, EventClickArg } from "@fullcalendar/core"; import { Modal } from "../components/ui/modal"; import { useModal } from "../hooks/useModal"; import PageMeta from "../components/common/PageMeta"; import Button from "../components/ui/button/Button"; import InputField from "../components/form/input/InputField"; interface CalendarEvent extends EventInput { extendedProps: { calendar: string; }; } const Calendar: React.FC = () => { const [selectedEvent, setSelectedEvent] = useState( null ); const [eventTitle, setEventTitle] = useState(""); const [eventStartDate, setEventStartDate] = useState(""); const [eventEndDate, setEventEndDate] = useState(""); const [eventLevel, setEventLevel] = useState(""); const [events, setEvents] = useState([]); const calendarRef = useRef(null); const { isOpen, openModal, closeModal } = useModal(); const calendarsEvents = { Danger: "danger", Success: "success", Primary: "primary", Warning: "warning", }; useEffect(() => { // Initialize with some events setEvents([ { id: "1", title: "Event Conf.", start: new Date().toISOString().split("T")[0], extendedProps: { calendar: "Danger" }, }, { id: "2", title: "Meeting", start: new Date(Date.now() + 86400000).toISOString().split("T")[0], extendedProps: { calendar: "Success" }, }, { id: "3", title: "Workshop", start: new Date(Date.now() + 172800000).toISOString().split("T")[0], end: new Date(Date.now() + 259200000).toISOString().split("T")[0], extendedProps: { calendar: "Primary" }, }, ]); }, []); const handleDateSelect = (selectInfo: DateSelectArg) => { resetModalFields(); setEventStartDate(selectInfo.startStr); setEventEndDate(selectInfo.endStr || selectInfo.startStr); openModal(); }; const handleEventClick = (clickInfo: EventClickArg) => { const event = clickInfo.event; setSelectedEvent(event as unknown as CalendarEvent); setEventTitle(event.title); setEventStartDate(event.start?.toISOString().split("T")[0] || ""); setEventEndDate(event.end?.toISOString().split("T")[0] || ""); setEventLevel(event.extendedProps.calendar); openModal(); }; const handleAddOrUpdateEvent = () => { if (selectedEvent) { // Update existing event setEvents((prevEvents) => prevEvents.map((event) => event.id === selectedEvent.id ? { ...event, title: eventTitle, start: eventStartDate, end: eventEndDate, extendedProps: { calendar: eventLevel }, } : event ) ); } else { // Add new event const newEvent: CalendarEvent = { id: Date.now().toString(), title: eventTitle, start: eventStartDate, end: eventEndDate, allDay: true, extendedProps: { calendar: eventLevel }, }; setEvents((prevEvents) => [...prevEvents, newEvent]); } closeModal(); resetModalFields(); }; const resetModalFields = () => { setEventTitle(""); setEventStartDate(""); setEventEndDate(""); setEventLevel(""); setSelectedEvent(null); }; return ( <>
{selectedEvent ? "Edit Event" : "Add Event"}

Plan your next big moment: schedule or edit an event to stay on track

setEventTitle(e.target.value)} />
{Object.entries(calendarsEvents).map(([key, value]) => (
))}
setEventStartDate(e.target.value)} />
setEventEndDate(e.target.value)} />
); }; const renderEventContent = (eventInfo: any) => { const colorClass = `fc-bg-${eventInfo.event.extendedProps.calendar.toLowerCase()}`; return (
{eventInfo.timeText}
{eventInfo.event.title}
); }; export default Calendar;