'use client'; import { useCalendarApp, ScheduleXCalendar } from '@schedule-x/react'; import { createViewWeek } from '@schedule-x/calendar'; import { createEventsServicePlugin } from '@schedule-x/events-service'; import { createDragAndDropPlugin } from '@schedule-x/drag-and-drop'; import '@/calendar-theme.css'; import { MouseEventHandler, useEffect, useState } from 'react'; import App from '@/components/app'; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger, } from '@/components/ui/context-menu'; import { PlusCircle, Trash } from 'lucide-react'; import { format, parse } from 'date-fns'; import PostDialog, { today } from '@/components/postDialog'; function closestChild(children: any, clientX: number, clientY: number) { let closestElement = null; let closestDistance = Infinity; for (let child of children) { const childRect = child.getBoundingClientRect(); const dx = Math.abs(clientX - (childRect.left + childRect.width / 2)); const dy = Math.abs(clientY - (childRect.top + childRect.height / 2)); const distance = Math.sqrt(dx * dx + dy * dy); if (distance < closestDistance) { closestDistance = distance; closestElement = child; } } return closestElement; } function CalendarApp() { const eventsService = useState(() => createEventsServicePlugin())[0]; const dragAndDrop = useState(() => createDragAndDropPlugin())[0]; const [eventCount, setEventCount] = useState(0); const calendar = useCalendarApp({ views: [createViewWeek()], events: [], plugins: [eventsService, dragAndDrop], isDark: true, }); const [newPostDialogOpen, setNewPostDialogOpen] = useState(false); const [date, setDate] = useState(today); const [selected, setSelected] = useState(null); const handleDialog: MouseEventHandler = (event) => { const target = event.target as HTMLElement; if (target.className === 'sx__time-grid-event-time') { const id = target.parentElement?.parentElement?.getAttribute( 'data-event-id' ); setSelected(id); setDate( parse( calendar.events.get(parseInt(id || ''))?.start || '', 'y-MM-dd hh:mm', new Date() ) ); } else { setSelected(null); try { const dayElement = target.closest('.sx__time-grid-day'); const dayText = dayElement ? dayElement.getAttribute('aria-label') : null; const hourElement = closestChild( target.parentElement?.children[0].children || [], event.clientX, event.clientY ); if (!dayText || !hourElement) { event.preventDefault(); } else { const toDate = parse( (dayText || '') + ' ' + (hourElement?.textContent || ''), 'MMMM dd, yyyy h a', new Date() ); if (toDate instanceof Date && !isNaN(toDate.getTime())) setDate(toDate); } } catch {} } }; return (
{ calendar.events.add(e); setEventCount(eventCount + 1); }} eventId={eventCount} /> { setNewPostDialogOpen(true); }} > {' '}

New post

{selected ? ( { if (selected) { calendar.events.remove( parseInt(selected) ); } }} className="" > {' '}

Delete

) : ( '' )}
); } export default CalendarApp;