"use client"; import React, { useState, useEffect } from "react"; import FullCalendar from "@fullcalendar/react"; // must go before plugins import dayGridPlugin from "@fullcalendar/daygrid"; import timeGridPlugin from "@fullcalendar/timegrid"; import interactionPlugin, { Draggable } from "@fullcalendar/interaction"; import listPlugin from "@fullcalendar/list"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import ExternalDraggingevent from "./dragging-events"; import { Calendar } from "@/components/ui/calendar"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; import { Plus } from "lucide-react"; import { Checkbox } from "@/components/ui/checkbox"; import { CalendarEvent, CalendarCategory } from "./data" import { EventContentArg, } from '@fullcalendar/core' import EventModal from "./event-modal"; import { useTranslations } from "next-intl"; const wait = () => new Promise((resolve) => setTimeout(resolve, 1000)); interface CalendarViewProps { events: CalendarEvent[]; categories: CalendarCategory[]; } const CalendarView = ({ events, categories }: CalendarViewProps) => { const [selectedCategory, setSelectedCategory] = useState(null); const [selectedEventDate, setSelectedEventDate] = useState(null); const [selectedEvent, setSelectedEvent] = useState(null); const [draggableInitialized, setDraggableInitialized] = useState(false); const t = useTranslations("CalendarApp") // event canvas state const [sheetOpen, setSheetOpen] = useState(false); const [date, setDate] = React.useState(new Date()); const [dragEvents] = useState([ { title: "New Event Planning", id: "101", tag: "business" }, { title: "Meeting", id: "102", tag: "meeting" }, { title: "Generating Reports", id: "103", tag: "holiday" }, { title: "Create New theme", id: "104", tag: "etc" }, ]); useEffect(() => { setSelectedCategory(categories?.map((c) => c.value)); }, [events, categories]); useEffect(() => { const draggableEl = document.getElementById("external-events"); const initDraggable = () => { if (draggableEl) { new Draggable(draggableEl, { itemSelector: ".fc-event", eventData: function (eventEl) { let title = eventEl.getAttribute("title"); let id = eventEl.getAttribute("data"); let event = dragEvents.find((e) => e.id === id); let tag = event ? event.tag : ""; return { title: title, id: id, extendedProps: { calendar: tag, }, }; }, }); } }; if (dragEvents.length > 0) { initDraggable(); } return () => { draggableEl?.removeEventListener("mousedown", initDraggable); }; }, [dragEvents]); // event click const handleEventClick = (arg: any) => { setSelectedEventDate(null); setSheetOpen(true); setSelectedEvent(arg); wait().then(() => (document.body.style.pointerEvents = "auto")); }; // handle close modal const handleCloseModal = () => { setSheetOpen(false); setSelectedEvent(null); setSelectedEventDate(null); }; const handleDateClick = (arg: any) => { setSheetOpen(true); setSelectedEventDate(arg); setSelectedEvent(null); wait().then(() => (document.body.style.pointerEvents = "auto")); }; const handleCategorySelection = (category: string) => { if (selectedCategory && selectedCategory.includes(category)) { setSelectedCategory(selectedCategory.filter((c) => c !== category)); } else { setSelectedCategory([...selectedCategory || [], category]); } }; const handleClassName = (arg: EventContentArg) => { if (arg.event.extendedProps.calendar === "holiday") { return "destructive"; } else if (arg.event.extendedProps.calendar === "business") { return "primary"; } else if (arg.event.extendedProps.calendar === "personal") { return "success"; } else if (arg.event.extendedProps.calendar === "family") { return "info"; } else if (arg.event.extendedProps.calendar === "etc") { return "info"; } else if (arg.event.extendedProps.calendar === "meeting") { return "warning"; } else { return "primary"; } }; const filteredEvents = events?.filter((event) => selectedCategory?.includes(event.extendedProps.calendar) ); return ( <>
{ handleDateClick(s); }} className="rounded-md border w-full p-0 border-none" />

{t("shortDesc")}

{dragEvents.map((event) => ( ))}
{t("filter")}
  • { if (selectedCategory?.length === categories?.length) { setSelectedCategory([]); } else { setSelectedCategory(categories.map((c) => c.value)); } }} />
  • {categories?.map((category) => (
  • handleCategorySelection(category.value)} />
  • ))}
); }; export default CalendarView;