"use client"; import { ApiResponse, request, useApi } from "@/hooks/use-api"; import "@schedule-x/theme-shadcn/dist/index.css"; import { useNextCalendarApp, ScheduleXCalendar } from "@schedule-x/react"; import { createEventsServicePlugin } from "@schedule-x/events-service"; import { createDragAndDropPlugin } from "@schedule-x/drag-and-drop"; import { createResizePlugin } from "@schedule-x/resize"; import { createEventRecurrencePlugin } from "@schedule-x/event-recurrence"; import { CalendarEventExternal, createViewDay, createViewWeek, } from "@schedule-x/calendar"; import { useEffect, useState } from "react"; import { format } from "date-fns"; import { Dialog, DialogProps } from "@radix-ui/react-dialog"; import { DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { KeyedMutator } from "swr"; const Planning: React.FC<{ events: CalendarEventExternal[]; mutate?: KeyedMutator>; }> = ({ events, mutate }) => { const plugins = [ createEventsServicePlugin(), createDragAndDropPlugin(), createResizePlugin(), createEventRecurrencePlugin(), ]; const [eventSelected, setEventSelected] = useState(null); const [newEvent, setNewEvent] = useState | null>(null); const handleEventUpdate = async (eventSelected: CalendarEventExternal) => { const event: CalendarEventExternal = { ...eventSelected, start: `${new Date(eventSelected.start).toISOString()}`, end: `${new Date(eventSelected.end).toISOString()}`, }; try { const res = await request(`/events/${event.id}/update`, { method: "PATCH", body: event, requiresAuth: true, csrfToken: false, }); if (res.status === "Error") { console.log("Error"); } if (res.status === "Success") { calendar?.events?.update(eventSelected); } } catch (e) { console.log(e); } }; const calendar = useNextCalendarApp( { theme: "shadcn", views: [createViewDay(), createViewWeek()], defaultView: "week", isDark: true, isResponsive: true, locale: "fr-FR", dayBoundaries: { start: "06:00", end: "00:00", }, events: events.map((event) => ({ ...event, start: format(new Date(event.start), "yyyy-MM-dd HH:mm"), end: format(new Date(event.end), "yyyy-MM-dd HH:mm"), })), callbacks: { onEventClick(event, e) { setEventSelected(event); }, async onEventUpdate(event) { console.log(event); await handleEventUpdate(event); }, }, }, plugins, ); useEffect(() => { calendar?.events.getAll(); }, []); const AddButton: React.FC = () => ( ); return (
{newEvent && ( { setNewEvent((e) => (open ? e : null)); }} event={newEvent} onStartChange={(e) => { const val = e.currentTarget.value; setNewEvent((ev) => { if (ev) return { ...ev, start: val, }; return ev; }); }} onEndChange={(e) => { const val = e.currentTarget.value; setNewEvent((ev) => { if (ev) return { ...ev, end: val, }; return ev; }); }} onAdd={async () => { try { const event: Omit = { ...newEvent, start: `${new Date(newEvent.start).toISOString()}`, end: `${new Date(newEvent.end).toISOString()}`, }; const res = await request( `/events/new`, { method: "POST", body: event, requiresAuth: true, csrfToken: false, }, ); if (res.status === "Error") { console.log("Error"); } if (res.status === "Success") { mutate?.(); console.log("Success"); } } catch (e) { console.log(e); } }} /> )} {eventSelected && ( { setEventSelected((e) => (open ? e : null)); }} event={eventSelected} onStartChange={(e) => { const val = e.currentTarget.value; setEventSelected((ev) => { if (ev) return { ...ev, start: val, }; return ev; }); }} onEndChange={(e) => { const val = e.currentTarget.value; setEventSelected((ev) => { if (ev) return { ...ev, end: val, }; return ev; }); }} onDelete={async () => { calendar?.events?.remove(eventSelected.id); try { const res = await request( `/events/${eventSelected.id}/delete`, { method: "DELETE", body: eventSelected, requiresAuth: false, csrfToken: false, }, ); if (res.status === "Error") { console.log("Error"); } if (res.status === "Success") { console.log("Success"); } } catch (e) { console.log(e); } setEventSelected(null); }} onUpdate={async () => { await handleEventUpdate(eventSelected); setEventSelected(null); }} /> )}
); }; const EventDialog: React.FC< { onEndChange: React.ChangeEventHandler; onStartChange: React.ChangeEventHandler; onDelete?: () => void; onUpdate?: () => void; onAdd?: () => void; event: CalendarEventExternal | Omit; } & DialogProps > = ({ open, onOpenChange, onEndChange, onStartChange, onDelete, onUpdate, onAdd, event, }) => { return ( {event.title} {event.description}
{/* date > new Date() || date < new Date("1900-01-01") } initialFocus /> */}
{onUpdate && ( )} {onDelete && ( )} {onAdd && !onUpdate && !onDelete && ( )}
); }; export default Planning;